CGR Localization
 All Classes Namespaces Files Functions Variables Macros Pages
configreader.h
1 #ifndef _INCLUDED_CONFIG_READER_H_
2 #define _INCLUDED_CONFIG_READER_H_
3 
4 #include <vector>
5 #include <unistd.h>
6 
7 #include "sstring.h"
8 #include "watch_files.h"
9 
10 
11 struct lua_State;
12 
14 public:
15  enum FileFlags{
16  Optional = 1<<0, // file need not be present for success
17  };
18 
19  class SubTree{
20  ConfigReader *config;
21  CharString base,full;
22  int errors_at_init;
23  public:
24  SubTree(ConfigReader &c,const char *base_exp);
25  SubTree(SubTree &s,const char *base_exp);
26 
27  int getErrors()
28  {return(config->errors - errors_at_init);}
29 
30  protected:
31  const char *getFullExp(const char *exp);
32  public:
33  const char *getStr(const char *exp,const char *default_val=NULL);
34  bool getBool(const char *exp,bool &val);
35  bool getInt (const char *exp,int &val);
36  bool getUInt (const char *exp,unsigned int &val);
37  bool getReal(const char *exp,float &val);
38  bool getReal(const char *exp,double &val);
39  bool getPosReal(const char *exp,float &val);
40  bool getPosReal(const char *exp,double &val);
41  bool getInt (const char *exp,int &val,int _min,int _max);
42  bool getReal(const char *exp,float &val,float _min,float _max);
43  bool getReal(const char *exp,double &val,double _min,double _max);
44 
45  template <class vec_t>
46  bool getVec2f(const char *exp,vec_t &val);
47  template <class vec_t>
48  bool getVec3f(const char *exp,vec_t &val);
49  template <class quaternion_t>
50  bool getQuat4f(const char *exp,quaternion_t &val);
51  template <class range_t>
52  bool getRangeInt(const char *exp,range_t &val);
53  template <class range_t>
54  bool getRangeReal(const char *exp,range_t &val);
55  };
56 protected:
57  class FileHeader{
58  public:
59  CharString filename; // name of file
60  unsigned flags; // flags from FileFlags
61  WatchFiles::Watch watch; // file modification watch
62  public:
63  FileHeader()
64  {}
65  FileHeader(const FileHeader &fh);
66  };
67 
68  std::vector<FileHeader> files; // list of config files to load
69  lua_State *L; // lua interpreter (valid between readFiles() and clear())
70  int errors; // count of errors from get* accesses
71  int num_readfiles_calls;
72  WatchFiles *watch_files; // class used to monitor files for changes
73  bool modified; // true if config files need to be re-read
74  char* path;
75 public:
76  ConfigReader();
77  ConfigReader(const char* _path);
78  ~ConfigReader()
79  {reset();}
80 
81 protected:
82  bool initLua();
83  void closeLua();
84  void clearWatches();
85 public:
86  void close()
87  {closeLua();}
88  void clear()
89  {closeLua(); errors = 0;}
90  void reset();
91  bool isOpen()
92  {return(L != NULL);}
93 
94  void init()
95  {watch_files=NULL; addStandard();}
96  void init(WatchFiles &_watch_files)
97  {watch_files=&_watch_files; addStandard();}
98  void addFile(const char *filename,unsigned flags=0);
99 
100 protected:
101  void showError(int err_code,const char *filename);
102  bool readFile(const char *filename,unsigned flags);
103 public:
104  bool readInit()
105  {return(initLua());}
106  bool readFiles();
107  bool isFileModified();
108 
110  int getGeneration() const
111  {return(num_readfiles_calls);}
112 
116  bool needUpdate(int &client_generation) const;
117 
118  int getErrors()
119  {return(errors);}
120 
121 protected:
122  void eval(const char *exp);
123  void eval(const char *exp_base,const char *exp_ext);
124 public:
125  const char *getStr(const char *exp,const char *default_val=NULL);
126  bool getBool(const char *exp,bool &val);
127  bool getInt (const char *exp,int &val);
128  bool getUInt (const char *exp,unsigned int &val);
129  bool getReal(const char *exp,float &val);
130  bool getReal(const char *exp,double &val);
131  bool getPosReal(const char *exp,float &val);
132  bool getPosReal(const char *exp,double &val);
133  bool getInt (const char *exp,int &val,int _min,int _max);
134  bool getReal(const char *exp,float &val,float _min,float _max);
135  bool getReal(const char *exp,double &val,double _min,double _max);
136 
137  bool set(const char *name,int val);
138  bool set(const char *name,double val);
139 
140 protected:
141  void addStandard();
142 };
143 
144 template <class vec_t>
145 bool ConfigReader::SubTree::getVec2f(const char *exp,vec_t &val)
146 {
147  CharString fexp;
148 
149  fexp.printf("%s.x",exp);
150  if(!getReal(fexp(),val.x)) return(false);
151 
152  fexp.printf("%s.y",exp);
153  if(!getReal(fexp(),val.y)) return(false);
154 
155  return(true);
156 }
157 
158 template <class vec_t>
159 bool ConfigReader::SubTree::getVec3f(const char *exp,vec_t &val)
160 {
161  CharString fexp;
162 
163  fexp.printf("%s.x",exp);
164  if(!getReal(fexp(),val.x)) return(false);
165 
166  fexp.printf("%s.y",exp);
167  if(!getReal(fexp(),val.y)) return(false);
168 
169  fexp.printf("%s.z",exp);
170  if(!getReal(fexp(),val.z)) return(false);
171 
172  return(true);
173 }
174 
175 template <class quaternion_t>
176 bool ConfigReader::SubTree::getQuat4f(const char* exp, quaternion_t& val)
177 {
178  CharString fexp;
179 
180  fexp.printf("%s.w",exp);
181  if(!getReal(fexp(),val.w())) return(false);
182 
183  fexp.printf("%s.x",exp);
184  if(!getReal(fexp(),val.x())) return(false);
185 
186  fexp.printf("%s.y",exp);
187  if(!getReal(fexp(),val.y())) return(false);
188 
189  fexp.printf("%s.z",exp);
190  if(!getReal(fexp(),val.z())) return(false);
191 
192  return(true);
193 }
194 
195 template <class range_t>
196 bool ConfigReader::SubTree::getRangeInt(const char *exp,range_t &val)
197 {
198  CharString fexp;
199 
200  fexp.printf("%s.min",exp);
201  if(!getInt(fexp(),val.min)) return(false);
202 
203  fexp.printf("%s.max",exp);
204  if(!getInt(fexp(),val.max)) return(false);
205 
206  return(true);
207 }
208 
209 template <class range_t>
210 bool ConfigReader::SubTree::getRangeReal(const char *exp,range_t &val)
211 {
212  CharString fexp;
213 
214  fexp.printf("%s.min",exp);
215  if(!getReal(fexp(),val.min)) return(false);
216 
217  fexp.printf("%s.max",exp);
218  if(!getReal(fexp(),val.max)) return(false);
219 
220  return(true);
221 }
222 
223 #endif
bool needUpdate(int &client_generation) const
int getGeneration() const
get generation count in terms of # of readFiles() updates
Definition: configreader.h:110