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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __CCXX_MISC_H__
00042 #define __CCXX_MISC_H__
00043
00044 #ifndef __CCXX_THREAD_H__
00045 #include <cc++/thread.h>
00046 #else
00047 #ifdef __CCXX_NAMESPACE_H__
00048 #include <cc++/macros.h>
00049 #endif
00050 #endif
00051
00052 #include <fstream.h>
00053
00054 #define KEYDATA_INDEX_SIZE 97
00055 #define KEYDATA_PAGER_SIZE 512
00056 #define KEYDATA_PATH_SIZE 256
00057
00058 #pragma pack(1)
00059
00060 typedef struct _keyval
00061 {
00062 struct _keyval *next;
00063 char val[1];
00064 } keyval_t;
00065
00066 typedef struct _keysym
00067 {
00068 struct _keysym *next;
00069 struct _keyval *data;
00070 const char **list;
00071 short count;
00072 char sym[1];
00073 } keysym_t;
00074
00075 typedef struct
00076 {
00077 char *keyword;
00078 char *value;
00079 } KEYDEF;
00080
00081 #pragma pack()
00082
00083 #ifdef __WIN32__
00084 class __EXPORT MemPager;
00085 class __EXPORT SharedMemPager;
00086 class __EXPORT Keydata;
00087 #endif
00088
00104 class MemPager
00105 {
00106 private:
00107 unsigned int pagesize;
00108 unsigned int pages;
00109
00110 struct _page
00111 {
00112 struct _page *next;
00113 int used;
00114 } *page;
00115
00116 protected:
00126 virtual void *first(size_t size);
00127
00135 virtual void *alloc(size_t size);
00136
00146 char *first(char *str);
00147
00157 char *alloc(char *str);
00158
00168 MemPager(int pagesize = 4096);
00169
00173 void purge(void);
00174
00178 virtual ~MemPager();
00179
00180 public:
00187 inline int getPages(void)
00188 {return pages;};
00189 };
00190
00199 class SharedMemPager : public MemPager, public Mutex
00200 {
00201 protected:
00207 SharedMemPager(int pg = 4096);
00208
00212 void purge(void);
00213
00220 void *first(size_t size);
00221
00228 void *alloc(size_t size);
00229 };
00230
00279 class Keydata : protected MemPager
00280 {
00281 private:
00282 static ifstream cfgFile;
00283 static char lastpath[KEYDATA_PATH_SIZE + 1];
00284 static int count, sequence;
00285
00286 int link;
00287
00288 keysym_t *keys[KEYDATA_INDEX_SIZE];
00289
00296 unsigned getIndex(const char *sym);
00297
00298 protected:
00299 keysym_t *getSymbol(const char *sym, bool create);
00300
00312 void Load(const char *keypath,
00313 const char *environment = "CONFIG_KEYDATA");
00314
00323 void Load(KEYDEF *pairs);
00324
00325 public:
00329 Keydata();
00330
00337 Keydata(const char *keypath, const char *environment="CONFIG_KEYDATA");
00338
00344 virtual ~Keydata();
00345
00353 void Unlink(void);
00354
00363 int getCount(const char *sym);
00364
00372 const char *getFirst(const char *sym);
00373
00381 const char *getLast(const char *sym);
00382
00391 int getIndex(char **data, int max);
00392
00401 void setValue(const char *sym, const char *data);
00402
00410 const char * const *getList(const char *sym);
00411
00418 void clrValue(const char *sym);
00419
00424 inline const char *operator[](const char *keyword)
00425 {return getLast(keyword);};
00426
00431 friend void endKeydata(void);
00432 };
00433
00477 class StringTokenizer {
00478 public:
00484 static const char * const SPACE;
00485
00495
00496 class NoSuchElementException { };
00497
00502 class iterator {
00503 friend StringTokenizer;
00504 private:
00505 const StringTokenizer *myTok;
00506 const char *start;
00507 const char *tokEnd;
00508 const char *endp;
00509 char *token;
00510
00511
00512 iterator(const StringTokenizer &tok, const char *end)
00513 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
00514
00515 iterator(const StringTokenizer &tok)
00516 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
00517 ++(*this);
00518 }
00519 public:
00520 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
00521
00522
00523 ~iterator() { if (token) *token='\0'; delete token; }
00524
00528
00529 iterator(const iterator& i) :
00530 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00531 endp(i.endp),token(0) {}
00532
00536
00537 iterator &operator = (const iterator &i) {
00538 myTok = i.myTok;
00539 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
00540 token = 0;
00541 return *this;
00542 }
00543
00547 iterator &operator ++ () THROWS (NoSuchElementException);
00548
00557 const char* operator * () THROWS (NoSuchElementException);
00558
00565 inline char nextDelimiter() const {
00566 return (tokEnd) ? *tokEnd : '\0';
00567 }
00568
00573
00574 inline bool operator == (const iterator &other) const {
00575 return (endp == other.endp);
00576 }
00577
00582
00583 inline bool operator != (const iterator &other) const {
00584 return (endp != other.endp);
00585 }
00586 };
00587 private:
00588 friend iterator;
00589 const char *str;
00590 const char *delim;
00591 bool skipAll, trim;
00592 iterator itEnd;
00593
00594 public:
00633 StringTokenizer (const char *str,
00634 const char *delim,
00635 bool skipAllDelim = false,
00636 bool trim = false);
00637
00647 StringTokenizer (const char *s);
00648
00652 iterator begin() const {
00653 return iterator(*this);
00654 }
00655
00660 void setDelimiters (const char *d) {
00661 delim = d;
00662 }
00663
00668 iterator begin(const char *d) {
00669 delim = d;
00670 return iterator(*this);
00671 }
00672
00676 const iterator& end() const { return itEnd; }
00677 };
00678
00679 #ifdef __CCXX_NAMESPACE_H__
00680 #undef __CCXX_NAMESPACE_H__
00681 #include <cc++/namespace.h>
00682 #endif
00683
00684 #endif
00685