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
01427 static unsigned hexdump(const unsigned char *binary, char *string, const char *format);
01428
01436 static unsigned hexpack(unsigned char *hex, const char *string, const char *format);
01437
01438 static unsigned hexsize(const char *format);
01439 };
01440
01448 class __EXPORT memstring : public string
01449 {
01450 public:
01451 static const size_t header;
01452
01453 private:
01454 bool resize(strsize_t size);
01455 void cow(strsize_t adj = 0);
01456 void release(void);
01457
01458 protected:
01459 cstring *c_copy(void) const;
01460
01461 public:
01466 inline void operator=(string& object)
01467 {set(object.c_str());};
01468
01473 inline void operator=(const char *text)
01474 {set(text);};
01475
01482 memstring(void *memory, strsize_t size, char fill = 0);
01483
01487 ~memstring();
01488
01494 static memstring *create(strsize_t size, char fill = 0);
01495
01502 static memstring *create(mempager *pager, strsize_t size, char fill = 0);
01503 };
01504
01511 class __EXPORT StringFormat
01512 {
01513 protected:
01514 friend class string;
01515 friend class string::cstring;
01516
01517 virtual ~StringFormat();
01518
01525 virtual void put(char *buffer, size_t size) const = 0;
01526
01531 virtual strsize_t getStringSize(void) const = 0;
01532 };
01533
01534
01542 template<size_t S>
01543 class charbuf
01544 {
01545 private:
01546 char buffer[S];
01547
01548 public:
01552 inline charbuf()
01553 {buffer[0] = 0;};
01554
01560 inline charbuf(const char *text)
01561 {string::set(buffer, S, text);};
01562
01567 inline void operator=(const char *text)
01568 {string::set(buffer, S, text);};
01569
01575 inline void operator+=(const char *text)
01576 {string::add(buffer, S, text);};
01577
01582 inline operator bool() const
01583 {return buffer[0];};
01584
01589 inline bool operator!() const
01590 {return buffer[0] == 0;};
01591
01596 inline operator char *()
01597 {return buffer;};
01598
01603 inline char *operator*()
01604 {return buffer;};
01605
01611 inline char operator[](size_t offset) const
01612 {return buffer[offset];};
01613
01619 inline char *operator()(size_t offset)
01620 {return buffer + offset;};
01621
01626 inline size_t size(void) const
01627 {return S;};
01628 };
01629
01640 template<strsize_t S>
01641 class stringbuf : public memstring
01642 {
01643 private:
01644 char buffer[sizeof(cstring) + S];
01645
01646 public:
01650 inline stringbuf() : memstring(buffer, S) {};
01651
01656 inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
01657
01662 inline void operator=(const char *text)
01663 {set(text);};
01664
01669 inline void operator=(string& object)
01670 {set(object.c_str());};
01671 };
01672
01673 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
01674
01681 extern "C" inline int stricmp(const char *string1, const char *string2)
01682 {return string::case_compare(string1, string2);}
01683
01691 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
01692 {return string::case_compare(string1, string2, max);}
01693
01694 #endif
01695
01699 typedef string string_t;
01700
01705 typedef string String;
01706
01713 inline bool eq(char const *s1, char const *s2)
01714 {return String::equal(s1, s2);}
01715
01723 inline bool eq(char const *s1, char const *s2, size_t size)
01724 {return String::equal(s1, s2, size);}
01725
01732 inline bool eq(String &s1, String &s2)
01733 {return String::equal(s1.c_str(), s2.c_str());}
01734
01742 inline bool ieq(char const *s1, char const *s2)
01743 {return String::case_equal(s1, s2);}
01744
01753 inline bool ieq(char const *s1, char const *s2, size_t size)
01754 {return String::case_equal(s1, s2, size);}
01755
01763 inline bool ieq(String &s1, String &s2)
01764 {return String::case_equal(s1.c_str(), s2.c_str());}
01765
01766 END_NAMESPACE
01767
01768 #endif