|
keyval.h00001 // 00002 // keyval.h 00003 // 00004 // Copyright (C) 1996 Limit Point Systems, Inc. 00005 // 00006 // Author: Curtis Janssen <cljanss@limitpt.com> 00007 // Maintainer: LPS 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 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.h> 00036 #include <stdlib.h> 00037 #include <stdarg.h> 00038 00039 #include <util/container/avlmap.h> 00040 #include <util/class/class.h> 00041 #include <util/keyval/keyvalval.h> 00042 00043 namespace sc { 00044 00045 class KeyValKeyword { 00046 private: 00047 char* keyword_; 00048 public: 00049 KeyValKeyword(); 00050 KeyValKeyword(const char* name); 00051 KeyValKeyword(const KeyValKeyword&); 00052 ~KeyValKeyword(); 00053 KeyValKeyword& operator=(const KeyValKeyword&); 00054 int operator==(const KeyValKeyword& ck) const; 00055 int operator<(const KeyValKeyword& ck) const; 00056 int hash() const; 00057 inline int cmp(const KeyValKeyword&ck) const 00058 { 00059 if (!keyword_) { 00060 if (!ck.keyword_) return 0; 00061 return -1; 00062 } 00063 if (!ck.keyword_) return 1; 00064 return strcmp(keyword_,ck.keyword_); 00065 } 00066 inline const char* name() const {return keyword_;} 00067 }; 00068 00091 class KeyVal: public RefCount { 00092 // these classes need to directly access the key_value member 00093 friend class AggregateKeyVal; 00094 friend class PrefixKeyVal; 00095 public: 00096 enum {MaxKeywordLength = 256}; 00097 enum KeyValError { OK, HasNoValue, WrongType, 00098 UnknownKeyword, OperationFailed }; 00099 private: 00100 KeyValError errcod; 00101 // do not allow a copy constructor or assignment 00102 KeyVal(const KeyVal&); 00103 void operator=(const KeyVal&); 00104 protected: 00105 int verbose_; 00106 00107 KeyVal(); 00108 00110 void seterror(KeyValError err); 00112 void seterror(KeyValValue::KeyValValueError err); 00113 00115 virtual int key_exists(const char*) = 0; 00117 virtual int key_count(const char* =0); 00119 virtual Ref<KeyValValue> key_value(const char*, 00120 const KeyValValue& def) = 0; 00122 virtual int key_booleanvalue(const char*,const KeyValValue& def); 00124 virtual double key_doublevalue(const char* key,const KeyValValue& def); 00126 virtual float key_floatvalue(const char* key,const KeyValValue& def); 00128 virtual char key_charvalue(const char* key,const KeyValValue& def); 00130 virtual int key_intvalue(const char* key,const KeyValValue& def); 00132 virtual size_t key_sizevalue(const char* key,const KeyValValue& def); 00134 virtual char* key_pcharvalue(const char* key,const KeyValValue& def); 00136 virtual Ref<DescribedClass> key_describedclassvalue(const char* key, 00137 const KeyValValue& def); 00138 00139 public: 00140 virtual ~KeyVal(); 00141 00142 // For nonindexed things. If a subclass defines one of these, 00143 // then the overloaded functions will be hidden. The key_... functions 00144 // should be overridden instead. 00145 00148 int exists(const char*); 00153 int count(const char* =0); 00155 Ref<KeyValValue> value(const char* = 0, 00156 const KeyValValue& def=KeyValValue()); 00158 int booleanvalue(const char* key = 0, 00159 const KeyValValue& def=KeyValValueboolean()); 00161 double doublevalue(const char* key = 0, 00162 const KeyValValue& def=KeyValValuedouble()); 00164 float floatvalue(const char* key = 0, 00165 const KeyValValue& def=KeyValValuefloat()); 00167 char charvalue(const char* key = 0, 00168 const KeyValValue& def=KeyValValuechar()); 00170 int intvalue(const char* key = 0, 00171 const KeyValValue& def=KeyValValueint()); 00173 size_t sizevalue(const char* key = 0, 00174 const KeyValValue& def=KeyValValuesize()); 00177 char* pcharvalue(const char* key = 0, 00178 const KeyValValue& def=KeyValValuepchar()); 00180 Ref<DescribedClass> describedclassvalue(const char* key = 0, 00181 const KeyValValue& def=KeyValValueRefDescribedClass()); 00182 00183 // For vectors: 00184 int exists(const char*,int); 00185 int count(const char*,int); 00186 int booleanvalue(const char*,int, 00187 const KeyValValue& def=KeyValValueboolean()); 00188 double doublevalue(const char* key,int, 00189 const KeyValValue& def=KeyValValuedouble()); 00190 float floatvalue(const char* key,int, 00191 const KeyValValue& def=KeyValValuefloat()); 00192 char charvalue(const char* key,int, 00193 const KeyValValue& def=KeyValValuechar()); 00194 int intvalue(const char* key,int, 00195 const KeyValValue& def=KeyValValueint()); 00196 size_t sizevalue(const char* key,int, 00197 const KeyValValue& def=KeyValValuesize()); 00198 char* pcharvalue(const char* key,int, 00199 const KeyValValue& def=KeyValValuepchar()); 00200 Ref<DescribedClass> describedclassvalue(const char* key,int, 00201 const KeyValValue& def=KeyValValueRefDescribedClass()); 00202 00203 int exists(int i); 00204 int count(int i); 00205 int booleanvalue(int i, 00206 const KeyValValue& def=KeyValValueboolean()); 00207 double doublevalue(int i, 00208 const KeyValValue& def=KeyValValuedouble()); 00209 float floatvalue(int i, 00210 const KeyValValue& def=KeyValValuefloat()); 00211 char charvalue(int i, 00212 const KeyValValue& def=KeyValValuechar()); 00213 int intvalue(int i, 00214 const KeyValValue& def=KeyValValueint()); 00215 size_t sizevalue(int i, 00216 const KeyValValue& def=KeyValValuesize()); 00217 char* pcharvalue(int i, 00218 const KeyValValue& def=KeyValValuepchar()); 00219 Ref<DescribedClass> describedclassvalue(int i, 00220 const KeyValValue& def=KeyValValueRefDescribedClass()); 00221 00222 // For arrays: 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 Ref<DescribedClass> describedclassvalue(const char* key,int,int, 00240 const KeyValValue& def=KeyValValueRefDescribedClass()); 00241 00242 int exists(int i,int j); 00243 int count(int i,int j); 00244 int booleanvalue(int i,int j, 00245 const KeyValValue& def=KeyValValueboolean()); 00246 double doublevalue(int i,int j, 00247 const KeyValValue& def=KeyValValuedouble()); 00248 float floatvalue(int i,int j, 00249 const KeyValValue& def=KeyValValuefloat()); 00250 char charvalue(int i,int j, 00251 const KeyValValue& def=KeyValValuechar()); 00252 int intvalue(int i,int j, 00253 const KeyValValue& def=KeyValValueint()); 00254 size_t sizevalue(int i,int j, 00255 const KeyValValue& def=KeyValValuesize()); 00256 char* pcharvalue(int i,int j, 00257 const KeyValValue& def=KeyValValuepchar()); 00258 Ref<DescribedClass> describedclassvalue(int i,int j, 00259 const KeyValValue& def=KeyValValueRefDescribedClass()); 00260 00261 // For all else: 00262 int Va_exists(const char*,int,...); 00263 int Va_count(const char*,int,...); 00264 int Va_booleanvalue(const char*,int,...); 00265 double Va_doublevalue(const char* key,int,...); 00266 float Va_floatvalue(const char* key,int,...); 00267 char Va_charvalue(const char* key,int,...); 00268 int Va_intvalue(const char* key,int,...); 00269 size_t Va_sizevalue(const char* key,int,...); 00270 char* Va_pcharvalue(const char* key,int,...); 00271 Ref<DescribedClass> Va_describedclassvalue(const char* key,int,...); 00272 00274 KeyValError error(); 00276 const char* errormsg(KeyValError err); 00278 const char* errormsg(); 00279 00280 virtual void errortrace(std::ostream&fp=ExEnv::err0()); 00281 virtual void dump(std::ostream&fp=ExEnv::err0()); 00282 00284 virtual void print_unseen(std::ostream&fp=ExEnv::out0()); 00288 virtual int have_unseen(); 00289 00291 void verbose(int v) { verbose_ = v; } 00293 int verbose() const { return verbose_; } 00294 }; 00295 00296 00297 00298 // this class allows keyval associations to be set up by the program, 00299 // rather than determined by an external file 00300 class AssignedKeyVal: public KeyVal { 00301 private: 00302 AVLMap<KeyValKeyword,Ref<KeyValValue> > _map; 00303 // do not allow a copy constructor or assignment 00304 AssignedKeyVal(const AssignedKeyVal&); 00305 void operator=(const AssignedKeyVal&); 00306 protected: 00307 int key_exists(const char*); 00308 Ref<KeyValValue> key_value(const char*, 00309 const KeyValValue& def); 00310 public: 00311 AssignedKeyVal(); 00312 ~AssignedKeyVal(); 00313 00314 void assign(const char*, const Ref<KeyValValue>&); 00315 void assign(const char*, double); 00316 void assignboolean(const char*, int); 00317 void assign(const char*, float); 00318 void assign(const char*, char); 00319 void assign(const char*, int); 00320 void assign(const char*, const char*); 00321 void assign(const char*, const Ref<DescribedClass>&); 00322 00323 void clear(); 00324 }; 00325 00326 00327 00328 class StringKeyVal: public KeyVal { 00329 private: 00330 // once a described class is found it is kept here so 00331 // multiple references to it return the same instance 00332 AVLMap<KeyValKeyword,Ref<KeyValValue> > _map; 00333 // do not allow a copy constructor or assignment 00334 StringKeyVal(const StringKeyVal&); 00335 void operator=(const StringKeyVal&); 00336 protected: 00337 StringKeyVal(); 00338 int key_exists(const char*); 00339 Ref<KeyValValue> key_value(const char*, 00340 const KeyValValue& def); 00341 public: 00342 virtual ~StringKeyVal(); 00343 virtual const char* stringvalue(const char *) = 0; 00344 // returns the name of the exact class the object at the keyword 00345 virtual const char* classname(const char*); 00346 // returns a string which is the actual keyword if some sort 00347 // of variable substitution takes place (needed to make multiple 00348 // references to the same object work in input files) 00349 virtual const char* truekeyword(const char*); 00350 00351 virtual void errortrace(std::ostream&fp=ExEnv::err0()); 00352 virtual void dump(std::ostream&fp=ExEnv::err0()); 00353 }; 00354 00355 class AggregateKeyVal : public KeyVal { 00356 private: 00357 enum { MaxKeyVal = 4 }; 00358 Ref<KeyVal> kv[MaxKeyVal]; 00359 Ref<KeyVal> getkeyval(const char*key); 00360 // do not allow a copy constructor or assignment 00361 AggregateKeyVal(const AggregateKeyVal&); 00362 void operator=(const AggregateKeyVal&); 00363 protected: 00364 int key_exists(const char*); 00365 Ref<KeyValValue> key_value(const char*, 00366 const KeyValValue& def); 00367 public: 00368 AggregateKeyVal(const Ref<KeyVal>&); 00369 AggregateKeyVal(const Ref<KeyVal>&,const Ref<KeyVal>&); 00370 AggregateKeyVal(const Ref<KeyVal>&,const Ref<KeyVal>&,const Ref<KeyVal>&); 00371 AggregateKeyVal(const Ref<KeyVal>&,const Ref<KeyVal>&,const Ref<KeyVal>&, 00372 const Ref<KeyVal>&); 00373 ~AggregateKeyVal(); 00374 void errortrace(std::ostream&fp=ExEnv::err0()); 00375 void dump(std::ostream&fp=ExEnv::err0()); 00376 }; 00377 00378 class PrefixKeyVal : public KeyVal { 00379 private: 00380 char* prefix; 00381 Ref<KeyVal> keyval; 00382 void setup(const char*,int,int,int,int,int); 00383 int getnewprefixkey(const char*key,char*newkey); 00384 // do not allow a copy constructor or assignment 00385 PrefixKeyVal(const PrefixKeyVal&); 00386 void operator=(const PrefixKeyVal&); 00387 int key_exists(const char*); 00388 Ref<KeyValValue> key_value(const char*, 00389 const KeyValValue& def); 00390 public: 00391 PrefixKeyVal(const Ref<KeyVal>&,int); 00392 PrefixKeyVal(const Ref<KeyVal>&,int,int); 00393 PrefixKeyVal(const Ref<KeyVal>&,int,int,int); 00394 PrefixKeyVal(const Ref<KeyVal>&,int,int,int,int); 00395 PrefixKeyVal(const Ref<KeyVal>&,const char*); 00396 PrefixKeyVal(const Ref<KeyVal>&,const char*,int); 00397 PrefixKeyVal(const Ref<KeyVal>&,const char*,int,int); 00398 PrefixKeyVal(const Ref<KeyVal>&,const char*,int,int,int); 00399 PrefixKeyVal(const Ref<KeyVal>&,const char*,int,int,int,int); 00400 // old CTOR syntax (use the above instead) 00401 PrefixKeyVal(const char*,const Ref<KeyVal>&); 00402 PrefixKeyVal(const char*,const Ref<KeyVal>&,int); 00403 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int); 00404 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int,int); 00405 PrefixKeyVal(const char*,const Ref<KeyVal>&,int,int,int,int); 00406 ~PrefixKeyVal(); 00407 void errortrace(std::ostream&fp=ExEnv::err0()); 00408 void dump(std::ostream&fp=ExEnv::err0()); 00409 }; 00410 00411 class IPV2; 00415 class ParsedKeyVal : public StringKeyVal { 00416 private: 00417 int nfile; 00418 char**file; 00419 int nfp; 00420 IPV2* ipv2; 00421 // do not allow a copy constructor or assignment 00422 ParsedKeyVal(const ParsedKeyVal&); 00423 void operator=(const ParsedKeyVal&); 00424 public: 00426 ParsedKeyVal(); 00428 ParsedKeyVal(const char*file); 00430 ParsedKeyVal(std::istream&s); 00433 ParsedKeyVal(IPV2*); 00439 ParsedKeyVal(const char*,const Ref<KeyVal>&); 00441 ~ParsedKeyVal(); 00442 00445 static void cat_files(const char*,const Ref<KeyVal>&,std::ostream &o); 00446 00448 void read(const char*); 00450 void read(std::istream&); 00452 void parse_string(const char *); 00453 00454 // Overrides of parent members. 00455 const char* stringvalue(const char*); 00456 const char* classname(const char*); 00457 const char* truekeyword(const char*); 00458 void errortrace(std::ostream&fp=ExEnv::err0()); 00459 void dump(std::ostream&fp=ExEnv::err0()); 00460 void print_unseen(std::ostream&fp=ExEnv::out0()); 00461 int have_unseen(); 00462 }; 00463 00464 } 00465 00466 #endif /* _KeyVal_h */ 00467 00468 // Local Variables: 00469 // mode: c++ 00470 // c-file-style: "CLJ" 00471 // End: Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |