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_CONFIG_H_
00039 #include <ucommon/platform.h>
00040 #endif
00041
00042 #ifndef _UCOMMON_PROTOCOLS_H_
00043 #include <ucommon/protocols.h>
00044 #endif
00045
00046 #ifndef _UCOMMON_OBJECT_H_
00047 #include <ucommon/object.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 #define PGP_B64_WIDTH 64
00059 #define MIME_B64_WIDTH 76
00060
00061 NAMESPACE_UCOMMON
00062
00066 typedef unsigned short strsize_t;
00067
00078 class __EXPORT string : public Object
00079 {
00080 protected:
00092 public:
00093 class __EXPORT cstring : public CountedObject
00094 {
00095 public:
00096 #pragma pack(1)
00097 strsize_t max;
00098 strsize_t len;
00099 char fill;
00100 char text[1];
00101 #pragma pack()
00102
00108 cstring(strsize_t size);
00109
00117 cstring(strsize_t size, char fill);
00118
00126 void clear(strsize_t offset, strsize_t size);
00127
00134 void set(strsize_t offset, const char *text, strsize_t size);
00135
00140 void set(const char *text);
00141
00146 void add(const char *text);
00147
00152 void add(char character);
00153
00157 void fix(void);
00158
00163 void unfix(void);
00164
00170 void inc(strsize_t number);
00171
00177 void dec(strsize_t number);
00178 };
00179
00180 protected:
00181 cstring *str;
00189 cstring *create(strsize_t size, char fill = 0) const;
00190
00198 virtual int compare(const char *string) const;
00199
00205 bool equal(const char *string) const;
00206
00211 virtual void retain(void);
00212
00217 virtual void release(void);
00218
00223 virtual cstring *c_copy(void) const;
00224
00231 virtual void cow(strsize_t size = 0);
00232
00233 strsize_t getStringSize(void);
00234
00235 public:
00239 #if _MSC_VER > 1400 // windows broken dll linkage issue...
00240 const static strsize_t npos = ((strsize_t)-1);
00241 #else
00242 static const strsize_t npos;
00243 #endif
00244
00245
00249 string();
00250
00255 string(long value);
00256
00261 string(double value);
00262
00267 string(strsize_t size);
00268
00274 string(strsize_t size, char fill);
00275
00283 string(strsize_t size, const char *format, ...) __PRINTF(3, 4);
00284
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
00391 void set(strsize_t offset, const char *text, strsize_t size = 0);
00392
00400 void set(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00401
00409 void rset(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00410
00415 void add(const char *text);
00416
00421 void add(char character);
00422
00427 void trim(const char *list);
00428
00433 void chop(const char *list);
00434
00439 void strip(const char *list);
00440
00446 bool unquote(const char *quote);
00447
00453 void cut(strsize_t offset, strsize_t size = 0);
00454
00460 void clear(strsize_t offset, strsize_t size = 0);
00461
00465 void clear(void);
00466
00470 void upper(void);
00471
00475 void lower(void);
00476
00482 strsize_t ccount(const char *list) const;
00483
00488 strsize_t count(void) const;
00489
00494 strsize_t size(void) const;
00495
00505 strsize_t offset(const char *pointer) const;
00506
00512 char at(int position) const;
00513
00519 const char *last(const char *list) const;
00520
00526 const char *first(const char *list) const;
00527
00532 const char *begin(void) const;
00533
00538 const char *end(void) const;
00539
00546 const char *skip(const char *list, strsize_t offset = 0) const;
00547
00555 const char *rskip(const char *list, strsize_t offset = npos) const;
00556
00563 const char *find(const char *list, strsize_t offset = 0) const;
00564
00571 const char *rfind(const char *list, strsize_t offset = npos) const;
00572
00578 void split(const char *pointer);
00579
00585 void split(strsize_t offset);
00586
00592 void rsplit(const char *pointer);
00593
00599 void rsplit(strsize_t offset);
00600
00606 const char *chr(char character) const;
00607
00614 const char *rchr(char character) const;
00615
00620 strsize_t len(void);
00621
00626 char fill(void);
00627
00632 inline operator const char *() const
00633 {return c_str();};
00634
00639 inline const char *operator*() const
00640 {return c_str();};
00641
00646 bool full(void) const;
00647
00654 string operator()(int offset, strsize_t size) const;
00655
00663 const char *operator()(int offset) const;
00664
00670 const char operator[](int offset) const;
00671
00676 bool operator!() const;
00677
00682 operator bool() const;
00683
00689 string& operator^=(const string& object);
00690
00696 string& operator^=(const char *text);
00697
00703 string& operator+(const char *text);
00704
00711 string& operator&(const char *text);
00712
00719 string& operator=(const string& object);
00720
00725 string& operator=(const char *text);
00726
00730 string& operator++(void);
00731
00736 string& operator+=(strsize_t number);
00737
00741 string& operator--(void);
00742
00747 string& operator-=(strsize_t number);
00748
00754 bool operator==(const char *text) const;
00755
00761 bool operator!=(const char *text) const;
00762
00768 bool operator<(const char *text) const;
00769
00775 bool operator<=(const char *text) const;
00776
00782 bool operator>(const char *text) const;
00783
00789 bool operator>=(const char *text) const;
00790
00796 string &operator%(short& value);
00797
00803 string &operator%(unsigned short& value);
00804
00810 string &operator%(long& value);
00811
00817 string &operator%(unsigned long& value);
00818
00824 string &operator%(double& value);
00825
00831 string &operator%(const char *text);
00832
00839 static int scanf(string& object, const char *format, ...) __SCANF(2, 3);
00840
00847 static strsize_t printf(string& object, const char *format, ...) __PRINTF(2, 3);
00848
00854 static void swap(string& object1, string& object2);
00855
00860 static void fix(string& object);
00861
00866 static void lower(char *text);
00867
00872 static void upper(char *text);
00873
00887 static char *token(char *text, char **last, const char *list, const char *quote = NULL, const char *end = NULL);
00888
00895 static char *skip(char *text, const char *list);
00896
00903 static char *rskip(char *text, const char *list);
00904
00912 static char *unquote(char *text, const char *quote);
00913
00921 static char *rset(char *buffer, size_t size, const char *text);
00922
00931 static char *set(char *buffer, size_t size, const char *text);
00932
00942 static char *set(char *buffer, size_t size, const char *text, size_t max);
00943
00953 static char *add(char *buffer, size_t size, const char *text);
00954
00965 static char *add(char *buffer, size_t size, const char *text, size_t max);
00966
00974 static const char *ifind(const char *text, const char *key, const char *optional);
00975
00983 static const char *find(const char *text, const char *key, const char *optional);
00984
00990 static size_t count(const char *text);
00991
00998 static int compare(const char *text1, const char *text2);
00999
01006 static bool equal(const char *text1, const char *text2);
01007
01015 static int compare(const char *text1, const char *text2, size_t size);
01016
01024 static bool equal(const char *text1, const char *text2, size_t size);
01025
01032 static int case_compare(const char *text1, const char *text2);
01033
01040 static bool case_equal(const char *text1, const char *text2);
01041
01049 static int case_compare(const char *text1, const char *text2, size_t size);
01050
01058 static bool case_equal(const char *text1, const char *text2, size_t size);
01059
01067 static char *trim(char *text, const char *list);
01068
01076 static char *chop(char *text, const char *list);
01077
01085 static char *strip(char *text, const char *list);
01086
01095 static char *fill(char *text, size_t size, char character);
01096
01103 static unsigned ccount(const char *text, const char *list);
01104
01111 static char *find(char *text, const char *list);
01112
01119 static char *rfind(char *text, const char *list);
01120
01127 static char *first(char *text, const char *list);
01128
01135 static char *last(char *text, const char *list);
01136
01142 static char *dup(const char *text);
01143
01157 inline static char *token(string& object, char **last, const char *list, const char *quote = NULL, const char *end = NULL)
01158 {return token(object.c_mem(), last, list, quote, end);};
01159
01167 __SCANF(2,0) inline static int vscanf(string& object, const char *format, va_list args)
01168 {return object.vscanf(format, args);}
01169
01177 __PRINTF(2,0) inline static strsize_t vprintf(string& object, const char *format, va_list args)
01178 {return object.vprintf(format, args);}
01179
01185 inline static strsize_t len(string& object)
01186 {return object.len();};
01187
01193 inline static char *mem(string& object)
01194 {return object.c_mem();};
01195
01201 inline static strsize_t size(string& object)
01202 {return object.size();};
01203
01208 inline static void clear(string& object)
01209 {object.clear();};
01210
01217 inline static unsigned ccount(string& object, const char *list)
01218 {return object.ccount(list);};
01219
01225 inline static size_t count(string& object)
01226 {return object.count();};
01227
01232 inline static void upper(string& object)
01233 {object.upper();};
01234
01239 inline static void lower(string& object)
01240 {object.lower();};
01241
01248 inline static bool unquote(string& object, const char *quote)
01249 {return object.unquote(quote);};
01250
01256 inline static void trim(string& object, const char *list)
01257 {object.trim(list);};
01258
01264 inline static void chop(string& object, const char *list)
01265 {object.trim(list);};
01266
01272 inline static void strip(string& object, const char *list)
01273 {object.trim(list);};
01274
01281 inline static const char *find(string& object, const char *list)
01282 {return object.find(list);};
01283
01290 inline static const char *rfind(string& object, const char *list)
01291 {return object.rfind(list);};
01292
01299 inline static const char *first(string& object, const char *list)
01300 {return object.first(list);};
01301
01308 inline static const char *last(string& object, const char *list)
01309 {return object.last(list);};
01310
01317 inline static double tod(string& object, char **pointer = NULL)
01318 {return strtod(mem(object), pointer);};
01319
01326 inline static long tol(string& object, char **pointer = NULL)
01327 {return strtol(mem(object), pointer, 0);};
01328
01335 inline static double tod(const char *text, char **pointer = NULL)
01336 {return strtod(text, pointer);};
01337
01344 inline static long tol(const char *text, char **pointer = NULL)
01345 {return strtol(text, pointer, 0);};
01346
01355 static size_t b64encode(char *string, const uint8_t *binary, size_t size, size_t width = 0);
01356
01364 static size_t b64decode(uint8_t *binary, const char *string, size_t size);
01365
01372 static uint32_t crc24(uint8_t *binary, size_t size);
01373
01380 static uint16_t crc16(uint8_t *binary, size_t size);
01381
01389 static unsigned hexdump(const unsigned char *binary, char *string, const char *format);
01390
01398 static unsigned hexpack(unsigned char *binary, const char *string, const char *format);
01399
01400 static unsigned hexsize(const char *format);
01401 };
01402
01410 class __EXPORT memstring : public string
01411 {
01412 public:
01413 #if _MSC_VER > 1400 // windows broken dll linkage issue...
01414 const static size_t header = sizeof(string::cstring);
01415 #else
01416 static const size_t header;
01417 #endif
01418
01419 private:
01420 bool resize(strsize_t size);
01421 void cow(strsize_t adj = 0);
01422 void release(void);
01423
01424 protected:
01425 cstring *c_copy(void) const;
01426
01427 public:
01432 inline void operator=(string& object)
01433 {set(object.c_str());};
01434
01439 inline void operator=(const char *text)
01440 {set(text);};
01441
01448 memstring(void *memory, strsize_t size, char fill = 0);
01449
01453 ~memstring();
01454
01460 static memstring *create(strsize_t size, char fill = 0);
01461
01468 static memstring *create(MemoryProtocol *pager, strsize_t size, char fill = 0);
01469 };
01470
01478 template<size_t S>
01479 class charbuf
01480 {
01481 private:
01482 char buffer[S];
01483
01484 public:
01488 inline charbuf()
01489 {buffer[0] = 0;};
01490
01496 inline charbuf(const char *text)
01497 {string::set(buffer, S, text);};
01498
01503 inline void operator=(const char *text)
01504 {string::set(buffer, S, text);};
01505
01511 inline void operator+=(const char *text)
01512 {string::add(buffer, S, text);};
01513
01518 inline operator bool() const
01519 {return buffer[0];};
01520
01525 inline bool operator!() const
01526 {return buffer[0] == 0;};
01527
01532 inline operator char *()
01533 {return buffer;};
01534
01539 inline char *operator*()
01540 {return buffer;};
01541
01547 inline char operator[](size_t offset) const
01548 {return buffer[offset];};
01549
01555 inline char *operator()(size_t offset)
01556 {return buffer + offset;};
01557
01562 inline size_t size(void) const
01563 {return S;};
01564 };
01565
01569 typedef string string_t;
01570
01575 typedef string String;
01576
01587 template<strsize_t S>
01588 class stringbuf : public memstring
01589 {
01590 private:
01591 char buffer[sizeof(cstring) + S];
01592
01593 public:
01597 inline stringbuf() : memstring(buffer, S) {};
01598
01603 inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
01604
01609 inline void operator=(const char *text)
01610 {set(text);};
01611
01616 inline void operator=(string& object)
01617 {set(object.c_str());};
01618 };
01619
01620 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
01621
01628 extern "C" inline int stricmp(const char *string1, const char *string2)
01629 {return string::case_compare(string1, string2);}
01630
01638 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
01639 {return string::case_compare(string1, string2, max);}
01640
01641 #endif
01642
01649 inline bool eq(char const *s1, char const *s2)
01650 {return String::equal(s1, s2);}
01651
01659 inline bool eq(char const *s1, char const *s2, size_t size)
01660 {return String::equal(s1, s2, size);}
01661
01668 inline bool eq(String &s1, String &s2)
01669 {return String::equal(s1.c_str(), s2.c_str());}
01670
01678 inline bool ieq(char const *s1, char const *s2)
01679 {return String::case_equal(s1, s2);}
01680
01689 inline bool ieq(char const *s1, char const *s2, size_t size)
01690 {return String::case_equal(s1, s2, size);}
01691
01699 inline bool ieq(String &s1, String &s2)
01700 {return String::case_equal(s1.c_str(), s2.c_str());}
01701
01702 inline String str(const char *string)
01703 {return (String)string;}
01704
01705 inline String str(String& string)
01706 {return (String)string;}
01707
01708 inline String str(short value)
01709 {String temp(16, "%hd", value); return temp;}
01710
01711 inline String str(unsigned short value)
01712 {String temp(16, "%hu", value); return temp;}
01713
01714 inline String str(long value)
01715 {String temp(32, "%ld", value); return temp;}
01716
01717 inline String str(unsigned long value)
01718 {String temp(32, "%lu", value); return temp;}
01719
01720 inline String str(double value)
01721 {String temp(40, "%f", value); return temp;}
01722
01723 String str(CharacterProtocol& cp, strsize_t size);
01724
01725 END_NAMESPACE
01726
01727 #endif