00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00035 #ifndef _UCOMMON_STRING_H_
00036 #define _UCOMMON_STRING_H_
00037
00038 #ifndef _UCOMMON_MEMORY_H_
00039 #include <ucommon/memory.h>
00040 #endif
00041
00042 #ifndef _UCOMMON_TIMERS_H_
00043 #include <ucommon/timers.h>
00044 #endif
00045
00046 #ifndef _UCOMMON_SOCKET_H_
00047 #include <ucommon/socket.h>
00048 #endif
00049
00050 #include <stdio.h>
00051 #include <string.h>
00052 #include <stdarg.h>
00053
00054 #ifdef HAVE_DIRENT_H
00055 #include <dirent.h>
00056 #endif
00057
00058 NAMESPACE_UCOMMON
00059
00063 typedef unsigned short strsize_t;
00064
00065 class StringFormat;
00066
00077 class __EXPORT string : public Object
00078 {
00079 protected:
00080 friend class StringFormat;
00081
00093 public:
00094 class __EXPORT cstring : public CountedObject
00095 {
00096 public:
00097 #pragma pack(1)
00098 strsize_t max;
00099 strsize_t len;
00100 char fill;
00101 char text[1];
00102 #pragma pack()
00103
00109 cstring(strsize_t size);
00110
00118 cstring(strsize_t size, char fill);
00119
00127 void clear(strsize_t offset, strsize_t size);
00128
00135 void set(strsize_t offset, const char *text, strsize_t size);
00136
00141 void set(const StringFormat& format);
00142
00147 void set(const char *text);
00148
00153 void add(const char *text);
00154
00159 void add(const StringFormat &format);
00160
00165 void add(char character);
00166
00170 void fix(void);
00171
00176 void unfix(void);
00177
00183 void inc(strsize_t number);
00184
00190 void dec(strsize_t number);
00191 };
00192
00193 protected:
00194 cstring *str;
00202 cstring *create(strsize_t size, char fill = 0) const;
00203
00211 virtual int compare(const char *string) const;
00212
00218 bool equal(const char *string) const;
00219
00224 virtual void retain(void);
00225
00230 virtual void release(void);
00231
00236 virtual cstring *c_copy(void) const;
00237
00244 virtual void cow(strsize_t size = 0);
00245
00246 strsize_t getStringSize(void);
00247
00248 public:
00252 static const strsize_t npos;
00253
00257 string();
00258
00263 string(const StringFormat& format);
00264
00269 string(strsize_t size);
00270
00276 string(strsize_t size, char fill);
00277
00284 string(strsize_t size, const char *format, ...) __PRINTF(3, 4);
00285
00290 string(const char *text);
00291
00298 string(const char *text, strsize_t size);
00299
00306 string(const char *text, const char *end);
00307
00313 string(const string& existing);
00314
00319 virtual ~string();
00320
00327 string get(strsize_t offset, strsize_t size = 0) const;
00328
00334 int scanf(const char *format, ...) __SCANF(2, 3);
00335
00342 int vscanf(const char *format, va_list args) __SCANF(2, 0);
00343
00349 strsize_t printf(const char *format, ...) __PRINTF(2, 3);
00350
00357 strsize_t vprintf(const char *format, va_list args) __PRINTF(2, 0);
00358
00363 char *c_mem(void) const;
00364
00369 const char *c_str(void) const;
00370
00376 virtual bool resize(strsize_t size);
00377
00382 void set(const char *text);
00383
00388 void set(const StringFormat& format);
00389
00397 void set(strsize_t offset, const char *text, strsize_t size = 0);
00398
00406 void set(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00407
00415 void rset(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00416
00421 void add(const StringFormat& format);
00422
00423
00428 void add(const char *text);
00429
00434 void add(char character);
00435
00440 void trim(const char *list);
00441
00446 void chop(const char *list);
00447
00452 void strip(const char *list);
00453
00459 bool unquote(const char *quote);
00460
00466 void cut(strsize_t offset, strsize_t size = 0);
00467
00473 void clear(strsize_t offset, strsize_t size = 0);
00474
00478 void clear(void);
00479
00483 void upper(void);
00484
00488 void lower(void);
00489
00495 strsize_t ccount(const char *list) const;
00496
00501 strsize_t count(void) const;
00502
00507 strsize_t size(void) const;
00508
00518 strsize_t offset(const char *pointer) const;
00519
00525 char at(int position) const;
00526
00532 const char *last(const char *list) const;
00533
00539 const char *first(const char *list) const;
00540
00545 const char *begin(void) const;
00546
00551 const char *end(void) const;
00552
00559 const char *skip(const char *list, strsize_t offset = 0) const;
00560
00568 const char *rskip(const char *list, strsize_t offset = npos) const;
00569
00576 const char *find(const char *list, strsize_t offset = 0) const;
00577
00584 const char *rfind(const char *list, strsize_t offset = npos) const;
00585
00591 void split(const char *pointer);
00592
00598 void split(strsize_t offset);
00599
00605 void rsplit(const char *pointer);
00606
00612 void rsplit(strsize_t offset);
00613
00619 const char *chr(char character) const;
00620
00627 const char *rchr(char character) const;
00628
00633 strsize_t len(void);
00634
00639 char fill(void);
00640
00645 inline operator const char *() const
00646 {return c_str();};
00647
00652 inline const char *operator*() const
00653 {return c_str();};
00654
00659 bool full(void) const;
00660
00667 string operator()(int offset, strsize_t size) const;
00668
00676 const char *operator()(int offset) const;
00677
00683 const char operator[](int offset) const;
00684
00689 bool operator!() const;
00690
00695 operator bool() const;
00696
00702 string& operator^=(const string& object);
00703
00709 string& operator^=(const StringFormat& format);
00710
00716 string& operator^=(const char *text);
00717
00723 string& operator+(const char *text);
00724
00730 string& operator+(const StringFormat& format);
00731
00738 string& operator&(const char *text);
00739
00746 string& operator&(const StringFormat& format);
00747
00754 string& operator=(const string& object);
00755
00760 string& operator=(const StringFormat& format);
00761
00766 string& operator=(const char *text);
00767
00771 string& operator++(void);
00772
00777 string& operator+=(strsize_t number);
00778
00782 string& operator--(void);
00783
00788 string& operator-=(strsize_t number);
00789
00795 bool operator==(const char *text) const;
00796
00802 bool operator!=(const char *text) const;
00803
00809 bool operator<(const char *text) const;
00810
00816 bool operator<=(const char *text) const;
00817
00823 bool operator>(const char *text) const;
00824
00830 bool operator>=(const char *text) const;
00831
00838 static int scanf(string& object, const char *format, ...) __SCANF(2, 3);
00839
00846 static strsize_t printf(string& object, const char *format, ...) __PRINTF(2, 3);
00847
00856 static int read(Socket& socket, string& object);
00857
00864 static int write(Socket& socket, string& object);
00865
00874 static int read(FILE *file, string& object);
00875
00882 static int write(FILE *file, string& object);
00883
00892 static bool getline(Socket& socket, string& object);
00893
00901 static bool putline(Socket& socket, string& object);
00902
00911 static bool getline(FILE *file, string& object);
00912
00920 static bool putline(FILE *file, string& object);
00921
00927 static void swap(string& object1, string& object2);
00928
00933 static void fix(string& object);
00934
00939 static void lower(char *text);
00940
00945 static void upper(char *text);
00946
00960 static char *token(char *text, char **last, const char *list, const char *quote = NULL, const char *end = NULL);
00961
00968 static char *skip(char *text, const char *list);
00969
00976 static char *rskip(char *text, const char *list);
00977
00985 static char *unquote(char *text, const char *quote);
00986
00994 static char *rset(char *buffer, size_t size, const char *text);
00995
01004 static char *set(char *buffer, size_t size, const char *text);
01005
01015 static char *set(char *buffer, size_t size, const char *text, size_t max);
01016
01026 static char *add(char *buffer, size_t size, const char *text);
01027
01038 static char *add(char *buffer, size_t size, const char *text, size_t max);
01039
01047 static const char *ifind(const char *text, const char *key, const char *optional);
01048
01056 static const char *find(const char *text, const char *key, const char *optional);
01057
01063 static size_t count(const char *text);
01064
01071 static int compare(const char *text1, const char *text2);
01072
01079 static bool equal(const char *text1, const char *text2);
01080
01088 static int compare(const char *text1, const char *text2, size_t size);
01089
01097 static bool equal(const char *text1, const char *text2, size_t size);
01098
01105 static int case_compare(const char *text1, const char *text2);
01106
01113 static bool case_equal(const char *text1, const char *text2);
01114
01122 static int case_compare(const char *text1, const char *text2, size_t size);
01123
01131 static bool case_equal(const char *text1, const char *text2, size_t size);
01132
01140 static char *trim(char *text, const char *list);
01141
01149 static char *chop(char *text, const char *list);
01150
01158 static char *strip(char *text, const char *list);
01159
01168 static char *fill(char *text, size_t size, char character);
01169
01176 static unsigned ccount(const char *text, const char *list);
01177
01184 static char *find(char *text, const char *list);
01185
01192 static char *rfind(char *text, const char *list);
01193
01200 static char *first(char *text, const char *list);
01201
01208 static char *last(char *text, const char *list);
01209
01215 static char *dup(const char *text);
01216
01230 inline static char *token(string& object, char **last, const char *list, const char *quote = NULL, const char *end = NULL)
01231 {return token(object.c_mem(), last, list, quote, end);};
01232
01240 __SCANF(2,0) inline static int vscanf(string& object, const char *format, va_list args)
01241 {return object.vscanf(format, args);}
01242
01250 __PRINTF(2,0) inline static strsize_t vprintf(string& object, const char *format, va_list args)
01251 {return object.vprintf(format, args);}
01252
01258 inline static strsize_t len(string& object)
01259 {return object.len();};
01260
01266 inline static char *mem(string& object)
01267 {return object.c_mem();};
01268
01274 inline static strsize_t size(string& object)
01275 {return object.size();};
01276
01281 inline static void clear(string& object)
01282 {object.clear();};
01283
01290 inline static unsigned ccount(string& object, const char *list)
01291 {return object.ccount(list);};
01292
01298 inline static size_t count(string& object)
01299 {return object.count();};
01300
01305 inline static void upper(string& object)
01306 {object.upper();};
01307
01312 inline static void lower(string& object)
01313 {object.lower();};
01314
01321 inline static bool unquote(string& object, const char *quote)
01322 {return object.unquote(quote);};
01323
01329 inline static void trim(string& object, const char *list)
01330 {object.trim(list);};
01331
01337 inline static void chop(string& object, const char *list)
01338 {object.trim(list);};
01339
01345 inline static void strip(string& object, const char *list)
01346 {object.trim(list);};
01347
01354 inline static const char *find(string& object, const char *list)
01355 {return object.find(list);};
01356
01363 inline static const char *rfind(string& object, const char *list)
01364 {return object.rfind(list);};
01365
01372 inline static const char *first(string& object, const char *list)
01373 {return object.first(list);};
01374
01381 inline static const char *last(string& object, const char *list)
01382 {return object.last(list);};
01383
01390 inline static double tod(string& object, char **pointer = NULL)
01391 {return strtod(mem(object), pointer);};
01392
01399 inline static long tol(string& object, char **pointer = NULL)
01400 {return strtol(mem(object), pointer, 0);};
01401
01408 inline static double tod(const char *text, char **pointer = NULL)
01409 {return strtod(text, pointer);};
01410
01417 inline static long tol(const char *text, char **pointer = NULL)
01418 {return strtol(text, pointer, 0);};
01419 };
01420
01428 class __EXPORT memstring : public string
01429 {
01430 public:
01431 static const size_t header;
01432
01433 private:
01434 bool resize(strsize_t size);
01435 void cow(strsize_t adj = 0);
01436 void release(void);
01437
01438 protected:
01439 cstring *c_copy(void) const;
01440
01441 public:
01446 inline void operator=(string& object)
01447 {set(object.c_str());};
01448
01453 inline void operator=(const char *text)
01454 {set(text);};
01455
01462 memstring(void *memory, strsize_t size, char fill = 0);
01463
01467 ~memstring();
01468
01474 static memstring *create(strsize_t size, char fill = 0);
01475
01482 static memstring *create(mempager *pager, strsize_t size, char fill = 0);
01483 };
01484
01491 class __EXPORT StringFormat
01492 {
01493 protected:
01494 friend class string;
01495 friend class string::cstring;
01496
01497 virtual ~StringFormat();
01498
01505 virtual void put(char *buffer, size_t size) const = 0;
01506
01511 virtual strsize_t getStringSize(void) const = 0;
01512 };
01513
01514
01522 template<size_t S>
01523 class charbuf
01524 {
01525 private:
01526 char buffer[S];
01527
01528 public:
01532 inline charbuf()
01533 {buffer[0] = 0;};
01534
01540 inline charbuf(const char *text)
01541 {string::set(buffer, S, text);};
01542
01547 inline void operator=(const char *text)
01548 {string::set(buffer, S, text);};
01549
01555 inline void operator+=(const char *text)
01556 {string::add(buffer, S, text);};
01557
01562 inline operator bool() const
01563 {return buffer[0];};
01564
01569 inline bool operator!() const
01570 {return buffer[0] == 0;};
01571
01576 inline operator char *()
01577 {return buffer;};
01578
01583 inline char *operator*()
01584 {return buffer;};
01585
01591 inline char operator[](size_t offset) const
01592 {return buffer[offset];};
01593
01599 inline char *operator()(size_t offset)
01600 {return buffer + offset;};
01601
01606 inline size_t size(void) const
01607 {return S;};
01608 };
01609
01620 template<strsize_t S>
01621 class stringbuf : public memstring
01622 {
01623 private:
01624 char buffer[sizeof(cstring) + S];
01625
01626 public:
01630 inline stringbuf() : memstring(buffer, S) {};
01631
01636 inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
01637
01642 inline void operator=(const char *text)
01643 {set(text);};
01644
01649 inline void operator=(string& object)
01650 {set(object.c_str());};
01651 };
01652
01653 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
01654
01661 extern "C" inline int stricmp(const char *string1, const char *string2)
01662 {return string::case_compare(string1, string2);}
01663
01671 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
01672 {return string::case_compare(string1, string2, max);}
01673
01674 #endif
01675
01679 typedef string string_t;
01680
01685 typedef string String;
01686
01693 inline bool eq(char const *s1, char const *s2)
01694 {return String::equal(s1, s2);}
01695
01703 inline bool eq(char const *s1, char const *s2, size_t size)
01704 {return String::equal(s1, s2, size);}
01705
01712 inline bool eq(String &s1, String &s2)
01713 {return String::equal(s1.c_str(), s2.c_str());}
01714
01722 inline bool ieq(char const *s1, char const *s2)
01723 {return String::case_equal(s1, s2);}
01724
01733 inline bool ieq(char const *s1, char const *s2, size_t size)
01734 {return String::case_equal(s1, s2, size);}
01735
01743 inline bool ieq(String &s1, String &s2)
01744 {return String::case_equal(s1.c_str(), s2.c_str());}
01745
01746 END_NAMESPACE
01747
01748 #endif