00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00030 #ifndef _UCOMMON_STRING_H_
00031 #define _UCOMMON_STRING_H_
00032
00033 #ifndef _UCOMMON_MEMORY_H_
00034 #include <ucommon/memory.h>
00035 #endif
00036
00037 #ifndef _UCOMMON_TIMERS_H_
00038 #include <ucommon/timers.h>
00039 #endif
00040
00041 #ifndef _UCOMMON_SOCKET_H_
00042 #include <ucommon/socket.h>
00043 #endif
00044
00045 #include <stdio.h>
00046 #include <string.h>
00047 #include <stdarg.h>
00048
00049 #ifdef HAVE_DIRENT_H
00050 #include <dirent.h>
00051 #endif
00052
00053 NAMESPACE_UCOMMON
00054
00058 typedef unsigned short strsize_t;
00059
00060 class StringFormat;
00061
00072 class __EXPORT string : public Object
00073 {
00074 protected:
00075 friend class StringFormat;
00076
00088 public:
00089 class __EXPORT cstring : public CountedObject
00090 {
00091 public:
00092 #pragma pack(1)
00093 strsize_t max;
00094 strsize_t len;
00095 char fill;
00096 char text[1];
00097 #pragma pack()
00098
00104 cstring(strsize_t size);
00105
00113 cstring(strsize_t size, char fill);
00114
00122 void clear(strsize_t offset, strsize_t size);
00123
00130 void set(strsize_t offset, const char *text, strsize_t size);
00131
00136 void set(const StringFormat& format);
00137
00142 void set(const char *text);
00143
00148 void add(const char *text);
00149
00154 void add(const StringFormat &format);
00155
00160 void add(char character);
00161
00165 void fix(void);
00166
00171 void unfix(void);
00172
00178 void inc(strsize_t number);
00179
00185 void dec(strsize_t number);
00186 };
00187
00188 protected:
00189 cstring *str;
00197 cstring *create(strsize_t size, char fill = 0) const;
00198
00206 virtual int compare(const char *string) const;
00207
00213 bool equal(const char *string) const;
00214
00219 virtual void retain(void);
00220
00225 virtual void release(void);
00226
00231 virtual cstring *c_copy(void) const;
00232
00239 virtual void cow(strsize_t size = 0);
00240
00241 strsize_t getStringSize(void);
00242
00243 public:
00247 static const strsize_t npos;
00248
00252 string();
00253
00258 string(const StringFormat& format);
00259
00264 string(strsize_t size);
00265
00271 string(strsize_t size, char fill);
00272
00279 string(strsize_t size, const char *format, ...) __PRINTF(3, 4);
00280
00285 string(const char *text);
00286
00293 string(const char *text, strsize_t size);
00294
00301 string(const char *text, const char *end);
00302
00308 string(const string& existing);
00309
00314 virtual ~string();
00315
00322 string get(strsize_t offset, strsize_t size = 0) const;
00323
00329 int scanf(const char *format, ...) __SCANF(2, 3);
00330
00337 int vscanf(const char *format, va_list args) __SCANF(2, 0);
00338
00344 strsize_t printf(const char *format, ...) __PRINTF(2, 3);
00345
00352 strsize_t vprintf(const char *format, va_list args) __PRINTF(2, 0);
00353
00358 char *c_mem(void) const;
00359
00364 const char *c_str(void) const;
00365
00371 virtual bool resize(strsize_t size);
00372
00377 void set(const char *text);
00378
00383 void set(const StringFormat& format);
00384
00392 void set(strsize_t offset, const char *text, strsize_t size = 0);
00393
00401 void set(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00402
00410 void rset(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00411
00416 void add(const StringFormat& format);
00417
00418
00423 void add(const char *text);
00424
00429 void add(char character);
00430
00435 void trim(const char *list);
00436
00441 void chop(const char *list);
00442
00447 void strip(const char *list);
00448
00454 bool unquote(const char *quote);
00455
00461 void cut(strsize_t offset, strsize_t size = 0);
00462
00468 void clear(strsize_t offset, strsize_t size = 0);
00469
00473 void clear(void);
00474
00478 void upper(void);
00479
00483 void lower(void);
00484
00490 strsize_t ccount(const char *list) const;
00491
00496 strsize_t count(void) const;
00497
00502 strsize_t size(void) const;
00503
00513 strsize_t offset(const char *pointer) const;
00514
00520 char at(int position) const;
00521
00527 const char *last(const char *list) const;
00528
00534 const char *first(const char *list) const;
00535
00540 const char *begin(void) const;
00541
00546 const char *end(void) const;
00547
00554 const char *skip(const char *list, strsize_t offset = 0) const;
00555
00563 const char *rskip(const char *list, strsize_t offset = npos) const;
00564
00571 const char *find(const char *list, strsize_t offset = 0) const;
00572
00579 const char *rfind(const char *list, strsize_t offset = npos) const;
00580
00586 void split(const char *pointer);
00587
00593 void split(strsize_t offset);
00594
00600 void rsplit(const char *pointer);
00601
00607 void rsplit(strsize_t offset);
00608
00614 const char *chr(char character) const;
00615
00622 const char *rchr(char character) const;
00623
00628 strsize_t len(void);
00629
00634 char fill(void);
00635
00640 inline operator const char *() const
00641 {return c_str();};
00642
00647 inline const char *operator*() const
00648 {return c_str();};
00649
00654 bool full(void) const;
00655
00662 string operator()(int offset, strsize_t size) const;
00663
00671 const char *operator()(int offset) const;
00672
00678 const char operator[](int offset) const;
00679
00684 bool operator!() const;
00685
00690 operator bool() const;
00691
00697 string& operator^=(const string& object);
00698
00704 string& operator^=(const StringFormat& format);
00705
00711 string& operator^=(const char *text);
00712
00718 string& operator+(const char *text);
00719
00725 string& operator+(const StringFormat& format);
00726
00733 string& operator&(const char *text);
00734
00741 string& operator&(const StringFormat& format);
00742
00749 string& operator=(const string& object);
00750
00755 string& operator=(const StringFormat& format);
00756
00761 string& operator=(const char *text);
00762
00766 string& operator++(void);
00767
00772 string& operator+=(strsize_t number);
00773
00777 string& operator--(void);
00778
00783 string& operator-=(strsize_t number);
00784
00790 bool operator==(const char *text) const;
00791
00797 bool operator!=(const char *text) const;
00798
00804 bool operator<(const char *text) const;
00805
00811 bool operator<=(const char *text) const;
00812
00818 bool operator>(const char *text) const;
00819
00825 bool operator>=(const char *text) const;
00826
00833 static int scanf(string& object, const char *format, ...) __SCANF(2, 3);
00834
00841 static strsize_t printf(string& object, const char *format, ...) __PRINTF(2, 3);
00842
00851 static int read(Socket& socket, string& object);
00852
00859 static int write(Socket& socket, string& object);
00860
00869 static int read(FILE *file, string& object);
00870
00877 static int write(FILE *file, string& object);
00878
00887 static bool getline(Socket& socket, string& object);
00888
00896 static bool putline(Socket& socket, string& object);
00897
00906 static bool getline(FILE *file, string& object);
00907
00915 static bool putline(FILE *file, string& object);
00916
00922 static void swap(string& object1, string& object2);
00923
00928 static void fix(string& object);
00929
00934 static void lower(char *text);
00935
00940 static void upper(char *text);
00941
00955 static const char *token(char *text, char **last, const char *list, const char *quote = NULL, const char *end = NULL);
00956
00963 static char *skip(char *text, const char *list);
00964
00971 static char *rskip(char *text, const char *list);
00972
00980 static char *unquote(char *text, const char *quote);
00981
00989 static char *rset(char *buffer, size_t size, const char *text);
00990
00999 static char *set(char *buffer, size_t size, const char *text);
01000
01010 static char *set(char *buffer, size_t size, const char *text, size_t max);
01011
01021 static char *add(char *buffer, size_t size, const char *text);
01022
01033 static char *add(char *buffer, size_t size, const char *text, size_t max);
01034
01042 static const char *ifind(const char *text, const char *key, const char *optional);
01043
01051 static const char *find(const char *text, const char *key, const char *optional);
01052
01058 static size_t count(const char *text);
01059
01066 static int compare(const char *text1, const char *text2);
01067
01074 static bool equal(const char *text1, const char *text2);
01075
01083 static int compare(const char *text1, const char *text2, size_t size);
01084
01092 static bool equal(const char *text1, const char *text2, size_t size);
01093
01100 static int case_compare(const char *text1, const char *text2);
01101
01108 static bool case_equal(const char *text1, const char *text2);
01109
01117 static int case_compare(const char *text1, const char *text2, size_t size);
01118
01126 static bool case_equal(const char *text1, const char *text2, size_t size);
01127
01135 static char *trim(char *text, const char *list);
01136
01144 static char *chop(char *text, const char *list);
01145
01153 static char *strip(char *text, const char *list);
01154
01163 static char *fill(char *text, size_t size, char character);
01164
01171 static unsigned ccount(const char *text, const char *list);
01172
01179 static char *find(char *text, const char *list);
01180
01187 static char *rfind(char *text, const char *list);
01188
01195 static char *first(char *text, const char *list);
01196
01203 static char *last(char *text, const char *list);
01204
01210 static char *dup(const char *text);
01211
01225 inline static const char *token(string& object, char **last, const char *list, const char *quote = NULL, const char *end = NULL)
01226 {return token(object.c_mem(), last, list, quote, end);};
01227
01235 __SCANF(2,0) inline static int vscanf(string& object, const char *format, va_list args)
01236 {return object.vscanf(format, args);}
01237
01245 __PRINTF(2,0) inline static strsize_t vprintf(string& object, const char *format, va_list args)
01246 {return object.vprintf(format, args);}
01247
01253 inline static strsize_t len(string& object)
01254 {return object.len();};
01255
01261 inline static char *mem(string& object)
01262 {return object.c_mem();};
01263
01269 inline static strsize_t size(string& object)
01270 {return object.size();};
01271
01276 inline static void clear(string& object)
01277 {object.clear();};
01278
01285 inline static unsigned ccount(string& object, const char *list)
01286 {return object.ccount(list);};
01287
01293 inline static size_t count(string& object)
01294 {return object.count();};
01295
01300 inline static void upper(string& object)
01301 {object.upper();};
01302
01307 inline static void lower(string& object)
01308 {object.lower();};
01309
01316 inline static bool unquote(string& object, const char *quote)
01317 {return object.unquote(quote);};
01318
01324 inline static void trim(string& object, const char *list)
01325 {object.trim(list);};
01326
01332 inline static void chop(string& object, const char *list)
01333 {object.trim(list);};
01334
01340 inline static void strip(string& object, const char *list)
01341 {object.trim(list);};
01342
01349 inline static const char *find(string& object, const char *list)
01350 {return object.find(list);};
01351
01358 inline static const char *rfind(string& object, const char *list)
01359 {return object.rfind(list);};
01360
01367 inline static const char *first(string& object, const char *list)
01368 {return object.first(list);};
01369
01376 inline static const char *last(string& object, const char *list)
01377 {return object.last(list);};
01378
01385 inline static double tod(string& object, char **pointer = NULL)
01386 {return strtod(mem(object), pointer);};
01387
01394 inline static long tol(string& object, char **pointer = NULL)
01395 {return strtol(mem(object), pointer, 0);};
01396
01403 inline static double tod(const char *text, char **pointer = NULL)
01404 {return strtod(text, pointer);};
01405
01412 inline static long tol(const char *text, char **pointer = NULL)
01413 {return strtol(text, pointer, 0);};
01414 };
01415
01423 class __EXPORT memstring : public string
01424 {
01425 public:
01426 static const size_t header;
01427
01428 private:
01429 bool resize(strsize_t size);
01430 void cow(strsize_t adj = 0);
01431 void release(void);
01432
01433 protected:
01434 cstring *c_copy(void) const;
01435
01436 public:
01441 inline void operator=(string& object)
01442 {set(object.c_str());};
01443
01448 inline void operator=(const char *text)
01449 {set(text);};
01450
01457 memstring(void *memory, strsize_t size, char fill = 0);
01458
01462 ~memstring();
01463
01469 static memstring *create(strsize_t size, char fill = 0);
01470
01477 static memstring *create(mempager *pager, strsize_t size, char fill = 0);
01478 };
01479
01486 class __EXPORT StringFormat
01487 {
01488 protected:
01489 friend class string;
01490 friend class string::cstring;
01491
01492 virtual ~StringFormat();
01493
01500 virtual void put(char *buffer, size_t size) const = 0;
01501
01506 virtual strsize_t getStringSize(void) const = 0;
01507 };
01508
01509
01517 template<size_t S>
01518 class charbuf
01519 {
01520 private:
01521 char buffer[S];
01522
01523 public:
01527 inline charbuf()
01528 {buffer[0] = 0;};
01529
01535 inline charbuf(const char *text)
01536 {string::set(buffer, S, text);};
01537
01542 inline void operator=(const char *text)
01543 {string::set(buffer, S, text);};
01544
01550 inline void operator+=(const char *text)
01551 {string::add(buffer, S, text);};
01552
01557 inline operator bool() const
01558 {return buffer[0];};
01559
01564 inline bool operator!() const
01565 {return buffer[0] == 0;};
01566
01571 inline operator char *()
01572 {return buffer;};
01573
01578 inline char *operator*()
01579 {return buffer;};
01580
01586 inline char operator[](size_t offset) const
01587 {return buffer[offset];};
01588
01594 inline char *operator()(size_t offset)
01595 {return buffer + offset;};
01596
01601 inline size_t size(void) const
01602 {return S;};
01603 };
01604
01615 template<strsize_t S>
01616 class stringbuf : public memstring
01617 {
01618 private:
01619 char buffer[sizeof(cstring) + S];
01620
01621 public:
01625 inline stringbuf() : memstring(buffer, S) {};
01626
01631 inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
01632
01637 inline void operator=(const char *text)
01638 {set(text);};
01639
01644 inline void operator=(string& object)
01645 {set(object.c_str());};
01646 };
01647
01648 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
01649
01656 extern "C" inline int stricmp(const char *string1, const char *string2)
01657 {return string::case_compare(string1, string2);}
01658
01666 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
01667 {return string::case_compare(string1, string2, max);}
01668
01669 #endif
01670
01674 typedef string string_t;
01675
01680 typedef string String;
01681
01682
01683 END_NAMESPACE
01684
01685 #endif