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
00044 #ifndef CCXX_MISC_H_
00045 #define CCXX_MISC_H_
00046
00047 #ifndef CCXX_MISSING_H_
00048 #include <cc++/missing.h>
00049 #endif
00050
00051 #ifndef CCXX_THREAD_H_
00052 #include <cc++/thread.h>
00053 #endif
00054
00055 #define KEYDATA_INDEX_SIZE 97
00056 #define KEYDATA_PAGER_SIZE 512
00057
00058 #if defined(PATH_MAX)
00059 #if PATH_MAX > 512
00060 #define KEYDATA_PATH_SIZE 512
00061 #else
00062 #define KEYDATA_PATH_SIZE PATH_MAX
00063 #endif
00064 #else
00065 #define KEYDATA_PATH_SIZE 256
00066 #endif
00067
00068 #ifdef CCXX_NAMESPACES
00069 namespace ost {
00070 #endif
00071
00072 class __EXPORT Runlist;
00073 class __EXPORT Runable;
00074
00090 class __EXPORT MemPager
00091 {
00092 private:
00093 friend class String;
00094 friend class MemPagerObject;
00095
00096 size_t pagesize;
00097 unsigned int pages;
00098
00099 struct _page
00100 {
00101 struct _page *next;
00102 size_t used;
00103 } *page;
00104
00105 protected:
00115 virtual void* first(size_t size);
00116
00124 virtual void* alloc(size_t size);
00125
00135 char* first(char *str);
00136
00146 char* alloc(const char *str);
00147
00157 MemPager(size_t pagesize = 4096);
00158
00162 void purge(void);
00163
00167 virtual ~MemPager();
00168
00169 public:
00176 inline int getPages(void)
00177 {return pages;};
00178 };
00179
00189 class __EXPORT StackPager : protected MemPager
00190 {
00191 private:
00192 typedef struct frame
00193 {
00194 struct frame *next;
00195 char data[1];
00196 } frame_t;
00197
00198 frame_t *stack;
00199
00200 public:
00206 StackPager(size_t pagesize);
00207
00215 void *push(const void *object, size_t size);
00216
00223 void *push(const char *string);
00224
00230 void *pull(void);
00231
00235 void purge(void);
00236 };
00237
00246 class __EXPORT SharedMemPager : public MemPager, public Mutex
00247 {
00248 protected:
00255 SharedMemPager(size_t pagesize = 4096, const char *name = NULL);
00256
00260 void purge(void);
00261
00268 void* first(size_t size);
00269
00276 void* alloc(size_t size);
00277 };
00278
00347 void endKeydata(void);
00348
00349 class __EXPORT Keydata : protected MemPager
00350 {
00351 public:
00352 #ifdef CCXX_PACKED
00353 #pragma pack(1)
00354 #endif
00355
00356 struct Keyval
00357 {
00358 Keyval *next;
00359 char val[1];
00360 };
00361
00362 struct Keysym
00363 {
00364 Keysym *next;
00365 Keyval *data;
00366 const char **list;
00367 short count;
00368 char sym[1];
00369 };
00370
00371 struct Define
00372 {
00373 char *keyword;
00374 char *value;
00375 };
00376
00377 #ifdef CCXX_PACKED
00378 #pragma pack()
00379 #endif
00380
00381 private:
00382 static std::ifstream *cfgFile;
00383 static char lastpath[KEYDATA_PATH_SIZE + 1];
00384 static int count;
00385 static int sequence;
00386
00387 int link;
00388
00389 Keysym *keys[KEYDATA_INDEX_SIZE];
00390
00397 unsigned getIndex(const char *sym);
00398
00399 protected:
00400 Keysym* getSymbol(const char *sym, bool create);
00401
00402 public:
00414 void load(const char *keypath);
00415
00429 void loadPrefix(const char *prefix, const char *keypath);
00430
00440 void loadFile(const char *filepath, const char *keys = NULL, const char *pre = NULL);
00441
00450 void load(Define *pairs);
00451
00455 Keydata();
00456
00464 Keydata(const char *keypath);
00465
00473 Keydata(Define *pairs, const char *keypath = NULL);
00474
00480 virtual ~Keydata();
00481
00489 void unlink(void);
00490
00499 int getCount(const char *sym);
00500
00508 const char* getFirst(const char *sym);
00509
00517 const char* getLast(const char *sym);
00518
00525 bool isKey(const char *sym);
00526
00534 const char *getString(const char *sym, const char *def = NULL);
00535
00543 long getLong(const char *sym, long def = 0);
00544
00551 bool getBool(const char *key);
00552
00560 double getDouble(const char *key, double def = 0.);
00561
00570 unsigned getIndex(char **data, unsigned max);
00571
00578 unsigned getCount(void);
00579
00588 void setValue(const char *sym, const char *data);
00589
00597 const char * const* getList(const char *sym);
00598
00605 void clrValue(const char *sym);
00606
00611 inline const char *operator[](const char *keyword)
00612 {return getLast(keyword);};
00613
00617 static void end(void);
00618
00623 friend inline void endKeydata(void)
00624 {Keydata::end();};
00625 };
00626
00634 class __EXPORT MemPagerObject
00635 {
00636 public:
00643 inline void *operator new(size_t size, MemPager &pager)
00644 {return pager.alloc(size);};
00645
00652 inline void *operator new[](size_t size, MemPager &pager)
00653 {return pager.alloc(size);};
00654
00658 inline void operator delete(void *) {};
00659
00663 inline void operator delete[](void *) {};
00664 };
00665
00674 class __EXPORT Assoc
00675 {
00676 private:
00677 class __EXPORT entry
00678 {
00679 public:
00680 const char *id;
00681 entry *next;
00682 void *data;
00683 };
00684
00685 entry *entries[KEYDATA_INDEX_SIZE];
00686
00687 protected:
00688 Assoc();
00689 virtual ~Assoc();
00690
00691 void clear(void);
00692
00693 virtual void *getMemory(size_t size) = 0;
00694
00695 public:
00696 void *getPointer(const char *id);
00697 void setPointer(const char *id, void *data);
00698 };
00699
00710 class __EXPORT Runlist : public Mutex
00711 {
00712 private:
00713 Runable *first, *last;
00714
00715 protected:
00716 unsigned limit, used;
00717 void check(void);
00718
00719 public:
00725 Runlist(unsigned count = 1);
00726
00735 bool add(Runable *run);
00736
00743 void del(Runable *run);
00744
00750 void set(unsigned limit);
00751 };
00752
00759 class __EXPORT Runable
00760 {
00761 private:
00762 friend class __EXPORT Runlist;
00763 Runlist *list;
00764 Runable *next, *prev;
00765
00766 protected:
00767 Runable();
00768 virtual ~Runable();
00769
00774 virtual void ready(void) = 0;
00775
00776 public:
00783 bool starting(Runlist *list);
00784
00790 void stoping(void);
00791 };
00792
00793 #ifdef CCXX_NAMESPACES
00794 }
00795 #endif
00796
00797 #endif
00798