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 long key_longvalue(const char* key,const KeyValValue& def);
00112 virtual size_t key_sizevalue(const char* key,const KeyValValue& def);
00114 DEPRECATED virtual char* key_pcharvalue(const char* key,const KeyValValue& def);
00116 virtual std::string key_stringvalue(const char* key,
00117 const KeyValValue& def);
00119 virtual Ref<DescribedClass> key_describedclassvalue(const char* key,
00120 const KeyValValue& def);
00121
00122 public:
00123 virtual ~KeyVal();
00124
00125
00126
00127
00128
00131 int exists(const char*);
00136 int count(const char* =0);
00138 Ref<KeyValValue> value(const char* = 0,
00139 const KeyValValue& def=KeyValValue());
00141 int booleanvalue(const char* key = 0,
00142 const KeyValValue& def=KeyValValueboolean());
00144 double doublevalue(const char* key = 0,
00145 const KeyValValue& def=KeyValValuedouble());
00147 float floatvalue(const char* key = 0,
00148 const KeyValValue& def=KeyValValuefloat());
00150 char charvalue(const char* key = 0,
00151 const KeyValValue& def=KeyValValuechar());
00153 int intvalue(const char* key = 0,
00154 const KeyValValue& def=KeyValValueint());
00156 long longvalue(const char* key = 0,
00157 const KeyValValue& def=KeyValValuelong());
00159 size_t sizevalue(const char* key = 0,
00160 const KeyValValue& def=KeyValValuesize());
00164 DEPRECATED char* pcharvalue(const char* key = 0,
00165 const KeyValValue& def=KeyValValuestring());
00167 std::string stringvalue(const char* key = 0,
00168 const KeyValValue& def=KeyValValuestring());
00170 Ref<DescribedClass> describedclassvalue(const char* key = 0,
00171 const KeyValValue& def=KeyValValueRefDescribedClass());
00172
00181 int exists(const char* key,int i);
00182 int count(const char* key,int i);
00183 int booleanvalue(const char* key,int i,
00184 const KeyValValue& def=KeyValValueboolean());
00185 double doublevalue(const char* key,int i,
00186 const KeyValValue& def=KeyValValuedouble());
00187 float floatvalue(const char* key,int i,
00188 const KeyValValue& def=KeyValValuefloat());
00189 char charvalue(const char* key,int i,
00190 const KeyValValue& def=KeyValValuechar());
00191 int intvalue(const char* key,int i,
00192 const KeyValValue& def=KeyValValueint());
00193 long longvalue(const char* key,int i,
00194 const KeyValValue& def=KeyValValuelong());
00195 size_t sizevalue(const char* key,int i,
00196 const KeyValValue& def=KeyValValuesize());
00197 DEPRECATED char* pcharvalue(const char* key,int i,
00198 const KeyValValue& def=KeyValValuestring());
00199 std::string stringvalue(const char* key,int i,
00200 const KeyValValue& def=KeyValValuestring());
00201 Ref<DescribedClass> describedclassvalue(const char* key,int,
00202 const KeyValValue& def=KeyValValueRefDescribedClass());
00203
00204 int exists(int i);
00205 int count(int i);
00206 int booleanvalue(int i,
00207 const KeyValValue& def=KeyValValueboolean());
00208 double doublevalue(int i,
00209 const KeyValValue& def=KeyValValuedouble());
00210 float floatvalue(int i,
00211 const KeyValValue& def=KeyValValuefloat());
00212 char charvalue(int i,
00213 const KeyValValue& def=KeyValValuechar());
00214 int intvalue(int i,
00215 const KeyValValue& def=KeyValValueint());
00216 long longvalue(int i,
00217 const KeyValValue& def=KeyValValuelong());
00218 size_t sizevalue(int i,
00219 const KeyValValue& def=KeyValValuesize());
00220 DEPRECATED char* pcharvalue(int i,
00221 const KeyValValue& def=KeyValValuestring());
00222 std::string stringvalue(int i,
00223 const KeyValValue& def=KeyValValuestring());
00224 Ref<DescribedClass> describedclassvalue(int i,
00225 const KeyValValue& def=KeyValValueRefDescribedClass());
00227
00235 int exists(const char*,int,int);
00236 int count(const char*,int,int);
00237 int booleanvalue(const char*,int,int,
00238 const KeyValValue& def=KeyValValueboolean());
00239 double doublevalue(const char* key,int,int,
00240 const KeyValValue& def=KeyValValuedouble());
00241 float floatvalue(const char* key,int,int,
00242 const KeyValValue& def=KeyValValuefloat());
00243 char charvalue(const char* key,int,int,
00244 const KeyValValue& def=KeyValValuechar());
00245 int intvalue(const char* key,int,int,
00246 const KeyValValue& def=KeyValValueint());
00247 long longvalue(const char* key,int,int,
00248 const KeyValValue& def=KeyValValuelong());
00249 size_t sizevalue(const char* key,int,int,
00250 const KeyValValue& def=KeyValValuesize());
00251 DEPRECATED char* pcharvalue(const char* key,int,int,
00252 const KeyValValue& def=KeyValValuestring());
00253 std::string stringvalue(const char* key,int,int,
00254 const KeyValValue& def=KeyValValuestring());
00255 Ref<DescribedClass> describedclassvalue(const char* key,int,int,
00256 const KeyValValue& def=KeyValValueRefDescribedClass());
00257
00258 int exists(int i,int j);
00259 int count(int i,int j);
00260 int booleanvalue(int i,int j,
00261 const KeyValValue& def=KeyValValueboolean());
00262 double doublevalue(int i,int j,
00263 const KeyValValue& def=KeyValValuedouble());
00264 float floatvalue(int i,int j,
00265 const KeyValValue& def=KeyValValuefloat());
00266 char charvalue(int i,int j,
00267 const KeyValValue& def=KeyValValuechar());
00268 int intvalue(int i,int j,
00269 const KeyValValue& def=KeyValValueint());
00270 long longvalue(int i,int j,
00271 const KeyValValue& def=KeyValValuelong());
00272 size_t sizevalue(int i,int j,
00273 const KeyValValue& def=KeyValValuesize());
00274 DEPRECATED char* pcharvalue(int i,int j,
00275 const KeyValValue& def=KeyValValuestring());
00276 std::string stringvalue(int i,int j,
00277 const KeyValValue& def=KeyValValuestring());
00278 Ref<DescribedClass> describedclassvalue(int i,int j,
00279 const KeyValValue& def=KeyValValueRefDescribedClass());
00281
00288 int Va_exists(const char* key,int nindex,...);
00289 int Va_count(const char* key,int nindex,...);
00290 int Va_booleanvalue(const char* key,int nindex,...);
00291 double Va_doublevalue(const char* key,int nindex,...);
00292 float Va_floatvalue(const char* key,int nindex,...);
00293 char Va_charvalue(const char* key,int nindex,...);
00294 int Va_intvalue(const char* key,int nindex,...);
00295 long Va_longvalue(const char* key,int nindex,...);
00296 size_t Va_sizevalue(const char* key,int nindex,...);
00297 DEPRECATED char* Va_pcharvalue(const char* key,int nindex,...);
00298 std::string Va_stringvalue(const char* key,int nindex,...);
00299 Ref<DescribedClass> Va_describedclassvalue(const char* key,int nindex,...);
00301
00303 KeyValError error();
00305 const char* errormsg(KeyValError err);
00307 const char* errormsg();
00309 virtual void errortrace(std::ostream&fp=ExEnv::err0());
00311 virtual void dump(std::ostream&fp=ExEnv::err0());
00312
00314 virtual void print_unseen(std::ostream&fp=ExEnv::out0());
00318 virtual int have_unseen();
00319
00321 void verbose(int v) { verbose_ = v; }
00323 int verbose() const { return verbose_; }
00324 };
00325
00326
00327
00330 class AssignedKeyVal: public KeyVal {
00331 private:
00332 std::map<std::string,Ref<KeyValValue> > _map;
00333
00334 AssignedKeyVal(const AssignedKeyVal&);
00335 void operator=(const AssignedKeyVal&);
00336 protected:
00337 int key_exists(const char*);
00338 Ref<KeyValValue> key_value(const char*,
00339 const KeyValValue& def);
00340 public:
00341 AssignedKeyVal();
00342 ~AssignedKeyVal();
00343
00347 void assign(const char* key, const Ref<KeyValValue>& val);
00348 void assign(const char* key, double val);
00349 void assignboolean(const char* key, int val);
00350 void assign(const char* key, float val);
00351 void assign(const char* key, char val);
00352 void assign(const char* key, int val);
00353 void assign(const char* key, long val);
00354 void assign(const char* key, const char* val);
00355 void assign(const char* key, const Ref<DescribedClass>& val);
00357
00359 void clear();
00360 };
00361
00362
00363
00368 class StringKeyVal: public KeyVal {
00369 private:
00370
00371
00372 std::map<std::string,Ref<KeyValValue> > _map;
00373
00374 StringKeyVal(const StringKeyVal&);
00375 void operator=(const StringKeyVal&);
00376 protected:
00377 StringKeyVal();
00378 int key_exists(const char*);
00379 Ref<KeyValValue> key_value(const char*,
00380 const KeyValValue& def);
00381 public:
00382 virtual ~StringKeyVal();
00384 virtual std::string stringrep(const char *key) = 0;
00387 virtual const char* classname(const char*);
00391 virtual const char* truekeyword(const char*);
00392
00397 virtual void errortrace(std::ostream&fp=ExEnv::err0());
00398 virtual void dump(std::ostream&fp=ExEnv::err0());
00400 };
00401
00406 class AggregateKeyVal : public KeyVal {
00407 private:
00408 enum { MaxKeyVal = 4 };
00409 Ref<KeyVal> kv[MaxKeyVal];
00410 Ref<KeyVal> getkeyval(const char*key);
00411
00412 AggregateKeyVal(const AggregateKeyVal&);
00413 void operator=(const AggregateKeyVal&);
00414 protected:
00415 int key_exists(const char*);
00416 Ref<KeyValValue> key_value(const char*,
00417 const KeyValValue& def);
00418 public:
00426 AggregateKeyVal(const Ref<KeyVal>& keyval1);
00427 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2);
00428 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2,
00429 const Ref<KeyVal>& keyval3);
00430 AggregateKeyVal(const Ref<KeyVal>& keyval1,const Ref<KeyVal>& keyval2,
00431 const Ref<KeyVal>& keyval3, const Ref<KeyVal>& keyval4);
00433 ~AggregateKeyVal();
00434 void errortrace(std::ostream&fp=ExEnv::err0());
00435 void dump(std::ostream&fp=ExEnv::err0());
00436 };
00437
00480 class PrefixKeyVal : public KeyVal {
00481 private:
00482 char* prefix;
00483 Ref<KeyVal> keyval;
00484 void setup(const char*,int,int,int,int,int);
00485 int getnewprefixkey(const char*key,char*newkey);
00486
00487 PrefixKeyVal(const PrefixKeyVal&);
00488 void operator=(const PrefixKeyVal&);
00489 int key_exists(const char*);
00490 Ref<KeyValValue> key_value(const char*,
00491 const KeyValValue& def);
00492 public:
00496 PrefixKeyVal(const Ref<KeyVal>&,int i);
00497 PrefixKeyVal(const Ref<KeyVal>&,int i,int j);
00498 PrefixKeyVal(const Ref<KeyVal>&,int i,int j,int k);
00499 PrefixKeyVal(const Ref<KeyVal>&,int i,int j,int k,int l);
00500 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix);
00501 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i);
00502 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j);
00503 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j,int k);
00504 PrefixKeyVal(const Ref<KeyVal>&,const char*prefix,int i,int j,int k,int l);
00506 ~PrefixKeyVal();
00507 void errortrace(std::ostream&fp=ExEnv::err0());
00508 void dump(std::ostream&fp=ExEnv::err0());
00509 };
00510
00511 class IPV2;
00515 class ParsedKeyVal : public StringKeyVal {
00516 private:
00517 int nfile;
00518 char**file;
00519 int nfp;
00520 IPV2* ipv2;
00521
00522 ParsedKeyVal(const ParsedKeyVal&);
00523 void operator=(const ParsedKeyVal&);
00524 public:
00526 ParsedKeyVal();
00528 ParsedKeyVal(const char*file);
00530 ParsedKeyVal(std::istream&s);
00533 ParsedKeyVal(IPV2*);
00539 ParsedKeyVal(const char*,const Ref<KeyVal>&);
00541 ~ParsedKeyVal();
00542
00545 static void cat_files(const char*,const Ref<KeyVal>&,std::ostream &o);
00546
00548 void read(const char*);
00550 void read(const std::string &);
00552 void read(std::istream&);
00554 void parse_string(const std::string&);
00555
00559 std::string stringrep(const char*);
00560 const char* classname(const char*);
00561 const char* truekeyword(const char*);
00562 void errortrace(std::ostream&fp=ExEnv::err0());
00563 void dump(std::ostream&fp=ExEnv::err0());
00564 void print_unseen(std::ostream&fp=ExEnv::out0());
00565 int have_unseen();
00567 };
00568
00569 }
00570
00571 #endif
00572
00573
00574
00575
00576