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
00045 #ifndef CCXX_MISC_H_
00046 #define CCXX_MISC_H_
00047
00048 #ifndef CCXX_MISSING_H_
00049 #include <cc++/missing.h>
00050 #endif
00051
00052 #ifndef CCXX_THREAD_H_
00053 #include <cc++/thread.h>
00054 #endif
00055
00056 #define KEYDATA_INDEX_SIZE 97
00057 #define KEYDATA_PAGER_SIZE 512
00058
00059 #if defined(PATH_MAX)
00060 #if PATH_MAX > 512
00061 #define KEYDATA_PATH_SIZE 512
00062 #else
00063 #define KEYDATA_PATH_SIZE PATH_MAX
00064 #endif
00065 #else
00066 #define KEYDATA_PATH_SIZE 256
00067 #endif
00068
00069 #ifdef CCXX_NAMESPACES
00070 namespace ost {
00071 #endif
00072
00073 class __EXPORT Runlist;
00074 class __EXPORT Runable;
00075
00091 class __EXPORT MemPager
00092 {
00093 private:
00094 friend class String;
00095 friend class MemPagerObject;
00096
00097 size_t pagesize;
00098 unsigned int pages;
00099
00100 struct _page {
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 void clean(void);
00168
00172 virtual ~MemPager();
00173
00174 public:
00181 inline int getPages(void)
00182 {return pages;};
00183 };
00184
00194 class __EXPORT StackPager : protected MemPager
00195 {
00196 private:
00197 typedef struct frame {
00198 struct frame *next;
00199 char data[1];
00200 } frame_t;
00201
00202 frame_t *stack;
00203
00204 public:
00210 StackPager(size_t pagesize);
00211
00219 void *push(const void *object, size_t size);
00220
00227 void *push(const char *string);
00228
00234 void *pull(void);
00235
00239 void purge(void);
00240 };
00241
00250 class __EXPORT SharedMemPager : public MemPager, public Mutex
00251 {
00252 protected:
00259 SharedMemPager(size_t pagesize = 4096, const char *name = NULL);
00260
00264 void purge(void);
00265
00272 void* first(size_t size);
00273
00280 void* alloc(size_t size);
00281 };
00282
00283 __EXPORT void endKeydata(void);
00284
00352 class __EXPORT Keydata : protected MemPager
00353 {
00354 public:
00355 #ifdef CCXX_PACKED
00356 #pragma pack(1)
00357 #endif
00358
00359 struct Keyval {
00360 Keyval *next;
00361 char val[1];
00362 };
00363
00364 struct Keysym {
00365 Keysym *next;
00366 Keyval *data;
00367 const char **list;
00368 short count;
00369 char sym[1];
00370 };
00371
00372 struct Define {
00373 const char *keyword;
00374 const 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 struct entry {
00678 const char *id;
00679 entry *next;
00680 void *data;
00681 };
00682
00683 entry *entries[KEYDATA_INDEX_SIZE];
00684
00685 protected:
00686 Assoc();
00687 virtual ~Assoc();
00688
00689 void clear(void);
00690
00691 virtual void *getMemory(size_t size) = 0;
00692
00693 public:
00694 void *getPointer(const char *id) const;
00695 void setPointer(const char *id, void *data);
00696 };
00697
00708 class __EXPORT Runlist : public Mutex
00709 {
00710 private:
00711 Runable *first, *last;
00712
00713 protected:
00714 unsigned limit, used;
00715 void check(void);
00716
00717 public:
00723 Runlist(unsigned count = 1);
00724
00733 bool add(Runable *run);
00734
00741 void del(Runable *run);
00742
00748 void set(unsigned limit);
00749 };
00750
00757 class __EXPORT Runable
00758 {
00759 private:
00760 friend class Runlist;
00761 Runlist *list;
00762 Runable *next, *prev;
00763
00764 protected:
00765 Runable();
00766 virtual ~Runable();
00767
00772 virtual void ready(void) = 0;
00773
00774 public:
00781 bool starting(Runlist *list);
00782
00788 void stoping(void);
00789 };
00790
00791 #ifdef CCXX_NAMESPACES
00792 }
00793 #endif
00794
00795 #endif
00796