00001
00002
00003 #ifndef __INIPARSER_H
00004 #define __INIPARSER_H
00005
00006 #include <vector>
00007 #include <stdio.h>
00008 #include <float.h>
00009 #include <limits.h>
00010
00011 #ifndef DLLEXPORT
00012 #ifdef WIN32
00013 #define DLLEXPORT __declspec(dllexport)
00014 #else
00015 #define DLLEXPORT
00016 #endif
00017 #endif
00018
00019 class IniParser;
00020
00022
00026 class IniSection {
00027 public:
00028 const char *name;
00029
00035 virtual bool parse(IniParser *parser)=0;
00036
00040 virtual void print(FILE *f) { fprintf(f,"[%s]\n", name); }
00041
00042 virtual ~IniSection(){}
00043 };
00044
00045 #define LOADER_BUFFER_LENGTH 256
00046
00048
00060 class IniParser {
00061 public:
00062
00066 DLLEXPORT IniParser(void *userdata);
00067
00071 DLLEXPORT bool parse(const char *filename);
00072 DLLEXPORT bool wparse(const wchar_t *filename);
00073 DLLEXPORT bool parse(FILE *f);
00074
00078 int getChar();
00079
00084 bool nextToken();
00085
00087 DLLEXPORT void addSection(IniSection *section) { sections.push_back(section); }
00088
00090 FILE *in;
00091
00092 typedef std::vector<IniSection *> IniSectionVector;
00093
00094 IniSectionVector sections;
00095
00097 char buffer[LOADER_BUFFER_LENGTH];
00098
00100 const char *filename;
00101
00105 void printError(const char *err);
00106
00110 void *userdata;
00111
00112 bool readNextSection();
00113
00116 DLLEXPORT bool dumpExampleFile(const char *filename);
00117
00118 private:
00119 int readChar();
00120
00121 int col, line;
00122 };
00123
00124
00130 class ParamSection : public IniSection {
00131 public:
00132 DLLEXPORT ParamSection();
00133 virtual bool parse(IniParser *parser);
00134 virtual void print(FILE *f);
00135
00143 DLLEXPORT void addDoubleParam(const char *name, double *val, double def, double min=-DBL_MAX, double max=DBL_MAX);
00144
00152 DLLEXPORT void addBoolParam(const char *name, bool *val, bool def);
00153
00162 DLLEXPORT void addStringParam(const char *name, char **val, const char *def);
00163
00171 DLLEXPORT void addIntParam(const char *name, int *val, int def, int min = INT_MIN, int max = INT_MAX);
00172
00173 struct ParamVisitor;
00174
00175 struct Param {
00176 const char *name;
00177 virtual ~Param() {}
00178 virtual bool parse(IniParser *parser)=0;
00179 virtual void print(FILE *f)=0;
00180 virtual int visit(ParamVisitor *v)=0;
00181 };
00182
00183 struct DoubleParam : public Param {
00184 double min,max,*val;
00185 virtual bool parse(IniParser *parser);
00186 virtual void print(FILE *f);
00187 virtual int visit(ParamVisitor *v);
00188 };
00189 struct BoolParam : public Param {
00190 bool *val;
00191 virtual bool parse(IniParser *parser);
00192 virtual void print(FILE *f);
00193 virtual int visit(ParamVisitor *v);
00194 };
00195 struct StringParam : public Param {
00196 char **val;
00197 virtual bool parse(IniParser *parser);
00198 virtual void print(FILE *f);
00199 virtual int visit(ParamVisitor *v);
00200 };
00201 struct IntParam : public Param {
00202 int min, max, *val;
00203 virtual bool parse(IniParser *parser);
00204 virtual void print(FILE *f);
00205 virtual int visit(ParamVisitor *v);
00206 };
00207
00208 struct ParamVisitor {
00209 virtual ~ParamVisitor(){}
00210 virtual int doDouble(DoubleParam *p)=0;
00211 virtual int doBool(BoolParam *p)=0;
00212 virtual int doString(StringParam *p)=0;
00213 virtual int doInt(IntParam *p)=0;
00214 };
00215
00216 typedef std::vector<Param *> ParamVector;
00217 ParamVector params;
00218 };
00219
00220 #endif
00221