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
00047
#ifndef CCXX_MISC_H_
00048
#define CCXX_MISC_H_
00049
00050
#ifndef CCXX_MISSING_H_
00051
#include <cc++/missing.h>
00052
#endif
00053
00054
#ifndef CCXX_THREAD_H_
00055
#include <cc++/thread.h>
00056
#endif
00057
00058 #define KEYDATA_INDEX_SIZE 97
00059 #define KEYDATA_PAGER_SIZE 512
00060
00061
#if defined(PATH_MAX)
00062
#if PATH_MAX > 512
00063
#define KEYDATA_PATH_SIZE 512
00064
#else
00065
#define KEYDATA_PATH_SIZE PATH_MAX
00066
#endif
00067
#else
00068 #define KEYDATA_PATH_SIZE 256
00069
#endif
00070
00071
#ifdef CCXX_NAMESPACES
00072
namespace ost {
00073
#endif
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 len);
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
00346 class __EXPORT Keydata :
protected MemPager
00347 {
00348
public:
00349
#if defined(__GNUC__) || !defined(__hpux)
00350
#pragma pack(1)
00351
#endif
00352
00353 struct Keyval
00354 {
00355 Keyval *next;
00356 char val[1];
00357 };
00358
00359 struct Keysym
00360 {
00361 Keysym *next;
00362 Keyval *data;
00363 const char **list;
00364 short count;
00365 char sym[1];
00366 };
00367
00368 struct Define
00369 {
00370 char *keyword;
00371 char *value;
00372 };
00373
00374
#if defined(__GNUC__) || !defined(__hpux)
00375
#pragma pack()
00376
#endif
00377
00378
private:
00379
static std::ifstream *cfgFile;
00380
static char lastpath[
KEYDATA_PATH_SIZE + 1];
00381
static int count;
00382
static int sequence;
00383
00384
int link;
00385
00386
Keysym *keys[
KEYDATA_INDEX_SIZE];
00387
00394
unsigned getIndex(
const char *sym);
00395
00396
protected:
00397
Keysym* getSymbol(
const char *sym,
bool create);
00398
00399
public:
00412
void load(
const char *keypath,
00413
const char *environment =
"CONFIG_KEYDATA");
00414
00430
void loadPrefix(
const char *prefix,
00431
const char *keypath,
const char *environment =
"CONFIG_KEYDATA");
00432
00442
void loadFile(
const char *filepath,
const char *keys = NULL,
const char *pre = NULL);
00443
00452
void load(
Define *pairs);
00453
00457 Keydata();
00458
00467 Keydata(
const char *keypath,
const char *environment=
"CONFIG_KEYDATA");
00468
00474
virtual ~Keydata();
00475
00483
void unlink(
void);
00484
00493
int getCount(
const char *sym);
00494
00502
const char* getFirst(
const char *sym);
00503
00511
const char* getLast(
const char *sym);
00512
00521
unsigned getIndex(
char **data,
unsigned max);
00522
00529
unsigned getCount(
void);
00530
00539
void setValue(
const char *sym,
const char *data);
00540
00548
const char *
const* getList(
const char *sym);
00549
00556
void clrValue(
const char *sym);
00557
00562 inline const char *operator[](
const char *keyword)
00563 {
return getLast(keyword);};
00564
00568
static void end(
void);
00569
00574 friend inline void endKeydata(
void)
00575 {Keydata::end();};
00576 };
00577
00585 class __EXPORT MemPagerObject
00586 {
00587
public:
00594 inline void *operator new(size_t size, MemPager &pager)
00595 {
return pager.
alloc(size);};
00596
00603 inline void *operator new[](size_t size, MemPager &pager)
00604 {
return pager.
alloc(size);};
00605
00609 inline void operator delete(
void *) {};
00610
00614 inline void operator delete[](
void *) {};
00615 };
00616
00617
#ifdef CCXX_NAMESPACES
00618
}
00619
#endif
00620
00621
#endif
00622