00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00040 #ifndef __CONFIGREADER_H__
00041 #define __CONFIGREADER_H__
00042
00043 #include <vector>
00044
00045 #include <stdio.h>
00046
00047
00048 #define CR_DOUBLE 0
00049 #define CR_INT 1
00050 #define CR_STRING 2
00051 #define CR_CHAR 3
00052
00053
00054
00055
00056
00057
00058
00059
00060 #define DVAR(dmapptr) (*((dmapptr)->data.ddata))
00061 #define VDVAR(dmapptr) ((dmapptr)->data.ddata)
00062
00063 #define IVAR(dmapptr) (*((dmapptr)->data.idata))
00064 #define VIVAR(dmapptr) ((dmapptr)->data.idata)
00065
00066 #define CVAR(dmapptr) (*((dmapptr)->data.cdata))
00067 #define SVAR(dmapptr) ((dmapptr)->data.cdata)
00068
00069
00070
00071 #define VARSIZE(dmapptr) ((dmapptr)->veccount)
00072
00073
00074 struct DataMap {
00075 bool cached;
00076 char *fname;
00077 int type;
00078 char *dataname;
00079 uint veccount;
00080 uint vecsize;
00081 union Data {
00082 double *ddata;
00083 int *idata;
00084 char *cdata;
00085 } data;
00086
00087 DataMap ();
00088 ~DataMap ();
00089 };
00090
00091 typedef DataMap *PDataMap;
00092
00093
00094 class ConfigFile {
00095 private:
00096 struct Element {
00097 char *string;
00098 char *data;
00099 int str_size, data_size;
00100
00101 Element ();
00102 Element (const Element& e);
00103 ~Element ();
00104 };
00105
00106 std::vector<Element> elements;
00107
00108 bool AddElement(char *str, char *data);
00109 void DeleteList(void);
00110 void Chomp(char *str);
00111 void ChopUp(char *str);
00112
00113 public:
00114 ConfigFile(void);
00115 ~ConfigFile(void);
00116
00117 bool ReadFile(char *fname);
00118
00119
00120 char *GetNextEntry(char *str);
00121
00122
00123 char *StripFront(char *start);
00124 bool StripTail(char *start);
00125
00126
00127 bool TerminateString(char *start);
00128
00129
00130
00131
00132 char *FindString(char *str);
00133 void Print(FILE *f);
00134 void Print(void) {
00135 Print(stdout);
00136 }
00137
00138 int ReadVector(DataMap *dmap, char *str, int _type);
00139 int ReadString(DataMap *dmap, char *str);
00140 };
00141
00142 class ConfigReader {
00143 private:
00144 std::vector<char *> filelist;
00145 std::vector<ConfigFile> filereaders;
00146
00147 int FindFile(char *fname) {
00148 for(uint i=0; i<filelist.size(); i++)
00149 if (strcmp(filelist[i], fname) == 0) return i;
00150 return -1;
00151 }
00152
00153 ConfigFile *FindReader(char *fname) {
00154 int i = FindFile(fname);
00155 if (i >= 0) return &filereaders[i];
00156 return NULL;
00157 }
00158
00159 bool ReadFile(char *_fname);
00160
00161 char *path;
00162
00163 public:
00164 std::vector<PDataMap> datamap;
00165
00166 ConfigReader(void);
00167 ~ConfigReader(void);
00168
00169
00170 void UpdateFiles(void);
00171
00172
00173 DataMap *FindDataMapping(char *_fname, char *_dataname, int _type);
00174
00175
00176 bool ConfigReader::UpdateDataMap(PDataMap dmap);
00177
00178
00179 DataMap *FindDataMapping(char *_fname, char *_dataname, int _type,
00180 uint _count) {
00181 DataMap *rval = FindDataMapping(_fname, _dataname, _type);
00182 if (rval == NULL)
00183 return rval;
00184 if (rval->veccount < _count)
00185 return NULL;
00186 return rval;
00187 }
00188
00189 void Print(FILE *f);
00190 void Print(void) {
00191 Print(stdout); }
00192
00193 };
00194
00195
00196 extern ConfigReader configreader;
00197
00198
00199 #define CR_DECLARE(varname) static PDataMap varname;
00200
00201 #define CR_SETUP(filename,varname,type) \
00202 varname = \
00203 configreader.FindDataMapping(#filename, #varname, type); \
00204 if (!varname) abort();
00205
00206 #define CR_SETUP_CR(cr,filename,varname,type) \
00207 varname = \
00208 (cr).FindDataMapping("##filename", "##varname",type); \
00209 if (!varname) abort();
00210
00211
00212 #endif
00213