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 #ifndef _util_keyval_keyval_h
00029 #define _util_keyval_keyval_h
00030 #ifdef __GNUG__
00031 #pragma interface
00032 #endif
00033
00034 #include <iostream>
00035 #include <string>
00036 #include <map>
00037
00038 #include <string.h>
00039 #include <stdlib.h>
00040 #include <stdarg.h>
00041
00042 #include <util/class/class.h>
00043 #include <util/keyval/keyvalval.h>
00044
00045 namespace sc {
00046
00069 class KeyVal: public RefCount {
00070
00071 friend class AggregateKeyVal;
00072 friend class PrefixKeyVal;
00073 public:
00074 enum {MaxKeywordLength = 256};
00075 enum KeyValError { OK, HasNoValue, WrongType,
00076 UnknownKeyword, OperationFailed };
00077 private:
00078 KeyValError errcod;
00079
00080 KeyVal(const KeyVal&);
00081 void operator=(const KeyVal&);
00082 protected:
00083 int verbose_;
00084
00085 KeyVal();
00086
00088 void seterror(KeyValError err);
00090 void seterror(KeyValValue::KeyValValueError err);
00091
00093 virtual int key_exists(const char*) = 0;
00095 virtual int key_count(const char* =0);
00097 virtual Ref<KeyValValue> key_value(const char*,
00098 const KeyValValue& def) = 0;
00100 virtual int key_booleanvalue(const char*,const KeyValValue& def);
00102 virtual double key_doublevalue(const char* key,const KeyValValue& def);
00104 virtual float key_floatvalue(const char* key,const KeyValValue& def);
00106 virtual char key_charvalue(const char* key,const KeyValValue& def);
00108 virtual int key_intvalue(const char* key,const KeyValValue& def);
00110 virtual size_t key_sizevalue(const char* key,const KeyValValue& def);
00112 virtual char* key_pcharvalue(const char* key,const KeyValValue& def);
00114 virtual std::string key_stringvalue(const char* key,
00115 const KeyValValue& def);
00117 virtual Ref<DescribedClass> key_describedclassvalue(const char* key,
00118 const KeyValValue& def);
00119
00120 public:
00121 virtual ~KeyVal();
00122
00123
00124
00125
00126
00129 int exists(const char*);
00134 int count(const char* =0);
00136 Ref<KeyValValue> value(const char* = 0,
00137 const KeyValValue& def=KeyValValue());
00139 int booleanvalue(const char* key = 0,
00140 const KeyValValue& def=KeyValValueboolean());
00142 double doublevalue(const char* key = 0,
00143 const KeyValValue& def=KeyValValuedouble());
00145 float floatvalue(const char* key = 0,
00146 const KeyValValue& def=KeyValValuefloat());
00148 char charvalue(const char* key = 0,
00149 const KeyValValue& def=KeyValValuechar());
00151 int intvalue(const char* key = 0,
00152 const KeyValValue& def=KeyValValueint());
00154 size_t sizevalue(const char* key = 0,
00155 const KeyValValue& def=KeyValValuesize());
00158 char* pcharvalue(const char* key = 0,
00159 const KeyValValue& def=KeyValValuepchar());
00161 std::string stringvalue(const char* key = 0,
00162 const KeyValValue& def=KeyValValuestring());
00164 Ref<DescribedClass> describedclassvalue(const char* key = 0,
00165 const KeyValValue& def=KeyValValueRefDescribedClass());
00166
00174 int exists(const char* key,int i);
00175 int count(const char* key,int i);
00176 int booleanvalue(const char* key,int i,
00177 const KeyValValue& def=KeyValValueboolean());
00178 double doublevalue(const char* key,int i,
00179 const KeyValValue& def=KeyValValuedouble());
00180 float floatvalue(const char* key,int i,
00181 const KeyValValue& def=KeyValValuefloat());
00182 char charvalue(const char* key,int i,
00183 const KeyValValue& def=KeyValValuechar());
00184 int intvalue(const char* key,int i,
00185 const KeyValValue& def=KeyValValueint());
00186 size_t sizevalue(const char* key,int i,
00187 const KeyValValue& def=KeyValValuesize());
00188 char* pcharvalue(const char* key,int i,
00189 const KeyValValue& def=KeyValValuepchar());
00190 std::string stringvalue(const char* key,int i,
00191 const KeyValValue& def=KeyValValuestring());
00192 Ref<DescribedClass> describedclassvalue(const char* key,int,
00193 const KeyValValue& def=KeyValValueRefDescribedClass());
00194
00195 int exists(int i);
00196 int count(int i);
00197 int booleanvalue(int i,
00198 const KeyValValue& def=KeyValValueboolean());
00199 double doublevalue(int i,
00200 const KeyValValue& def=KeyValValuedouble());
00201 float floatvalue(int i,
00202 const KeyValValue& def=KeyValValuefloat());
00203 char charvalue(int i,
00204 const KeyValValue& def=KeyValValuechar());
00205 int intvalue(int i,
00206 const KeyValValue& def=KeyValValueint());
00207 size_t sizevalue(int i,
00208 const KeyValValue& def=KeyValValuesize());
00209 char* pcharvalue(int i,
00210 const KeyValValue& def=KeyValValuepchar());
00211 std::string stringvalue(int i,
00212 const KeyValValue& def=KeyValValuestring());
00213 Ref<DescribedClass> describedclassvalue(int i,
00214 const KeyValValue& def=KeyValValueRefDescribedClass());
00216
00223 int exists(const char*,int,int);
00224 int count(const char*,int,int);
00225 int booleanvalue(const char*,int,int,
00226 const KeyValValue& def=KeyValValueboolean());
00227 double doublevalue(const char* key,int,int,
00228 const KeyValValue& def=KeyValValuedouble());
00229 float floatvalue(const char* key,int,int,
00230 const KeyValValue& def=KeyValValuefloat());
00231 char charvalue(const char* key,int,int,
00232 const KeyValValue& def=KeyValValuechar());
00233 int intvalue(const char* key,int,int,
00234 const KeyValValue& def=KeyValValueint());
00235 size_t sizevalue(const char* key,int,int,
00236 const KeyValValue& def=KeyValValuesize());
00237 char* pcharvalue(const char* key,int,int,
00238 const KeyValValue& def=KeyValValuepchar());
00239 std::string stringvalue(const char* key,int,int,
00240 const KeyValValue& def=KeyValValuestring());
00241 Ref<DescribedClass> describedclassvalue(const char* key,int,int,
00242 const KeyValValue& def=KeyValValueRefDescribedClass());
00243
00244 int exists(int i,int j);
00245 int count(int i,int j);
00246 int booleanvalue(int i,int j,
00247 const KeyValValue& def=KeyValValueboolean());
00248 double doublevalue(int i,int j,
00249 const KeyValValue& def=KeyValValuedouble());
00250 float floatvalue(int i,int j,
00251 const KeyValValue& def=KeyValValuefloat());
00252 char charvalue(int i,int j,
00253 const KeyValValue& def=KeyValValuechar());
00254 int intvalue(int i,int j,
00255 const KeyValValue& def=KeyValValueint());
00256 size_t sizevalue(int i,int j,
00257 const KeyValValue& def=KeyValValuesize());
00258 char* pcharvalue(int i,int j,
00259 const KeyValValue& def=KeyValValuepchar());
00260 std::string stringvalue(int i,int j,
00261 const KeyValValue& def=KeyValValuestring());
00262 Ref<DescribedClass> describedclassvalue(int i,int j,
00263 const KeyValValue& def=KeyValValueRefDescribedClass());
00265
00271 int Va_exists(const char* key,int nindex,...);
00272 int Va_count(const char* key,int nindex,...);
00273 int Va_booleanvalue(const char* key,int nindex,...);
00274 double Va_doublevalue(const char* key,int nindex,...);
00275 float Va_floatvalue(const char* key,int nindex,...);
00276 char Va_charvalue(const char* key,int nindex,...);
00277 int Va_intvalue(const char* key,int nindex,...);
00278 size_t Va_sizevalue(const char* key,int nindex,...);
00279 char* Va_pcharvalue(const char* key,int nindex,...);
00280 std::string Va_stringvalue(const char* key,int nindex,...);
00281 Ref<DescribedClass> Va_describedclassvalue(const char* key,int nindex,...);
00283
00285 KeyValError error();
00287 const char* errormsg(KeyValError err);
00289 const char* errormsg();
00291 virtual void errortrace(std::ostream&fp=ExEnv::err0());
00293 virtual void dump(std::ostream&fp=ExEnv::err0());
00294
00296 virtual void print_unseen(std::ostream&fp=ExEnv::out0());
00300 virtual int have_unseen();
00301
00303 void verbose(int v) { verbose_ = v; }
00305 int verbose() const { return verbose_; }
00306 };
00307
00308
00309
00312 class AssignedKeyVal: public KeyVal {
00313 private:
00314 std::map<std::string,Ref<KeyValValue> > _map;
00315
00316 AssignedKeyVal(const AssignedKeyVal&);
00317 void operator=(const AssignedKeyVal&);
00318 protected:
00319 int key_exists(const char*);
00320 Ref<KeyValValue> key_value(const char*,
00321 const KeyValValue& def);
00322 public:
00323 AssignedKeyVal();
00324 ~AssignedKeyVal();
00325
00328 void assign(const char* key, const Ref<KeyValValue>& val);
00329 void assign(const char* key, double val);
00330 void assignboolean(const char* key, int val);
00331 void assign(const char* key, float val);
00332 void assign(const char* key, char val);
00333 void assign(const char* key, int val);
00334 void assign(const char* key, const char* val);
00335 void assign(const char* key, const Ref<DescribedClass>& val);
00337
00339 void clear();
00340 };
00341
00342
00343
00348 class StringKeyVal: public KeyVal {
00349 private:
00350
00351
00352 std::map<std::string,Ref<KeyValValue> > _map;
00353
00354 StringKeyVal(const StringKeyVal&);
00355 void operator=(const StringKeyVal&);
00356 protected:
00357 StringKeyVal();
00358 int key_exists(const char*);
00359 Ref<KeyValValue> key_value(const char*,
00360 const KeyValValue& def);
00361 public:
00362 virtual ~StringKeyVal();
00364 virtual const char* stringrep(const char *key) = 0;
00367 virtual const char* classname(const char*);
00371 virtual const char* truekeyword(const char*);
00372
00374
00375 virtual void errortrace(std::ostream&fp=ExEnv::err0());
00376 virtual void dump(std::ostream&fp=ExEnv::err0());
00378 };
00379
00384 class AggregateKeyVal : public KeyVal {
00385 private:
00386 enum { MaxKeyVal = 4 };
00387 Ref<KeyVal> kv[MaxKeyVal];
00388 Ref<KeyVal> getkeyval(const char*key);
00389
00390 AggregateKeyVal(const AggregateKeyVal&);
00391 void operator=(const AggregateKeyVal&);
00392 protected:
00393 int key_exists(const char*);
00394 Ref<KeyValValue> key_value(const char*,
00395 const KeyValValue& def);
00396 public:
00401 AggregateKeyVal(const Ref<KeyVal>& keyval1);
00402 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2);
00403 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2,
00404 const Ref<KeyVal>& keyval3);
00405 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2,
00406 const Ref<KeyVal>& keyval3, const Ref<KeyVal>& keyval4);
00408 ~AggregateKeyVal();
00409 void errortrace(std::ostream&fp=ExEnv::err0());
00410 void dump(std::ostream&fp=ExEnv::err0());
00411 };
00412
00455 class PrefixKeyVal : public KeyVal {
00456 private:
00457 char* prefix;
00458 Ref<KeyVal> keyval;
00459 void setup(const char*,int,int,int,int,int);
00460 int getnewprefixkey(const char*key,char*newkey);
00461
00462 PrefixKeyVal(const PrefixKeyVal&);
00463 void operator=(const PrefixKeyVal&);
00464 int key_exists(const char*);
00465 Ref<KeyValValue> key_value(const char*,
00466 const KeyValValue& def);
00467 public:
00470 PrefixKeyVal(const Ref<KeyVal>&,int i);
00471 PrefixKeyVal(const Ref<KeyVal>&,int i,int j);
00472 PrefixKeyVal(const Ref<KeyVal>&,int i,int j,int k);
00473 PrefixKeyVal(const Ref<KeyVal>&,int i,int j,int k,int l);
00474 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix);
00475 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i);
00476 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j);
00477 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j,int k);
00478 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j,int k,int l);
00480
00481
00482 PrefixKeyVal(const char*,const Ref<KeyVal>&);
00483 PrefixKeyVal(const char*,const Ref<KeyVal>&,int);
00484 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int);
00485 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int,int);
00486 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int,int,int);
00488 ~PrefixKeyVal();
00489 void errortrace(std::ostream&fp=ExEnv::err0());
00490 void dump(std::ostream&fp=ExEnv::err0());
00491 };
00492
00493 class IPV2;
00497 class ParsedKeyVal : public StringKeyVal {
00498 private:
00499 int nfile;
00500 char**file;
00501 int nfp;
00502 IPV2* ipv2;
00503
00504 ParsedKeyVal(const ParsedKeyVal&);
00505 void operator=(const ParsedKeyVal&);
00506 public:
00508 ParsedKeyVal();
00510 ParsedKeyVal(const char*file);
00512 ParsedKeyVal(std::istream&s);
00515 ParsedKeyVal(IPV2*);
00521 ParsedKeyVal(const char*,const Ref<KeyVal>&);
00523 ~ParsedKeyVal();
00524
00527 static void cat_files(const char*,const Ref<KeyVal>&,std::ostream &o);
00528
00530 void read(const char*);
00532 void read(std::istream&);
00534 void parse_string(const char *);
00535
00537
00538 const char* stringrep(const char*);
00539 const char* classname(const char*);
00540 const char* truekeyword(const char*);
00541 void errortrace(std::ostream&fp=ExEnv::err0());
00542 void dump(std::ostream&fp=ExEnv::err0());
00543 void print_unseen(std::ostream&fp=ExEnv::out0());
00544 int have_unseen();
00546 };
00547
00548 }
00549
00550 #endif
00551
00552
00553
00554
00555