35 #ifndef _UCOMMON_STRING_H_
36 #define _UCOMMON_STRING_H_
38 #ifndef _UCOMMON_CPR_H_
42 #ifndef _UCOMMON_GENERICS_H_
46 #ifndef _UCOMMON_PROTOCOLS_H_
50 #ifndef _UCOMMON_OBJECT_H_
62 #define PGP_B64_WIDTH 64
63 #define MIME_B64_WIDTH 76
110 regex(
const char *pattern,
size_t slots = 1);
111 regex(
size_t slots = 1);
114 size_t offset(
unsigned member);
115 size_t size(
unsigned member);
117 inline size_t members(
void)
120 bool match(
const char *text,
unsigned flags = 0);
122 regex& operator=(
const char *
string);
124 bool operator*=(
const char *
string);
127 {
return object != NULL;}
130 {
return object == NULL;}
180 void set(
const char *text);
186 void add(
const char *text);
192 void add(
char character);
229 cstring *create(
strsize_t size,
char fill = 0)
const;
239 virtual int compare(
const char *
string)
const;
241 inline int collate(
const char *
string)
const
242 {
return compare(
string);};
250 bool equal(
const char *
string)
const;
256 virtual void retain(
void);
268 virtual cstring *c_copy(
void)
const;
284 #if _MSC_VER > 1400 // windows broken dll linkage issue...
351 String(const
char *text, const
char *end);
379 int scanf(const
char *format, ...) __SCANF(2, 3);
387 int vscanf(const
char *format, va_list args) __SCANF(2, 0);
394 strsize_t printf(const
char *format, ...) __PRINTF(2, 3);
402 strsize_t vprintf(const
char *format, va_list args) __PRINTF(2, 0);
408 char *c_mem(
void) const;
414 const
char *c_str(
void) const;
427 void set(const
char *text);
460 void add(const
char *text);
466 void add(
char character);
472 void trim(const
char *list);
479 {operator+=(count);};
485 void chop(
const char *list);
492 {operator-=(count);};
498 void strip(
const char *list);
505 bool unquote(
const char *quote);
554 strsize_t ccount(
const char *list)
const;
584 char at(
int position)
const;
590 const char *begin(
void)
const;
596 const char *end(
void)
const;
604 const char *skip(
const char *list,
strsize_t offset = 0)
const;
613 const char *rskip(
const char *list,
strsize_t offset = npos)
const;
620 const char *search(
const char *
string,
unsigned instance = 0,
unsigned flags = 0)
const;
622 const char *search(regex& expr,
unsigned instance = 0,
unsigned flags = 0)
const;
624 unsigned replace(
const char *
string,
const char *text = NULL,
unsigned flags = 0);
626 unsigned replace(regex& expr,
const char *text = NULL,
unsigned flags = 0);
634 const char *find(
const char *list,
strsize_t offset = 0)
const;
642 const char *rfind(
const char *list,
strsize_t offset = npos)
const;
649 void split(
const char *
pointer);
663 void rsplit(
const char *
pointer);
677 const char *chr(
char character)
const;
685 const char *rchr(
char character)
const;
703 inline operator const char *()
const
717 bool full(
void)
const;
733 {
return operator()(0, size);}
741 {
return operator()(-((
int)offset), 0);}
750 {
return operator()((
int)offset, size);}
759 const char *operator()(
int offset)
const;
766 const char operator[](
int offset)
const;
772 bool operator!()
const;
778 operator bool()
const;
791 String& operator|=(
const char *text);
793 String& operator&=(
const char *text);
800 String& operator+=(
const char *text);
807 String& operator^=(
const char *text);
813 String operator+(
const char *text);
821 String& operator|(
const char *text);
829 String& operator&(
const char *text);
839 bool operator*=(
const char *substring);
841 bool operator*=(regex& expr);
847 String& operator=(
const char *text);
882 bool operator==(
const char *text)
const;
889 bool operator!=(
const char *text)
const;
896 bool operator<(
const char *text)
const;
903 bool operator<=(
const char *text)
const;
910 bool operator>(
const char *text)
const;
917 bool operator>=(
const char *text)
const;
919 inline String& operator<<(
const char *text)
920 {add(text);
return *
this;}
922 inline String& operator<<(
char code)
923 {add(code);
return *
this;}
930 String &operator%(
short& value);
937 String &operator%(
unsigned short& value);
944 String &operator%(
long& value);
951 String &operator%(
unsigned long& value);
958 String &operator%(
double& value);
965 String &operator%(
const char *text);
972 static void swap(String& object1, String& object2);
978 static void fix(String&
object);
984 static void erase(
char *text);
990 static void lower(
char *text);
996 static void upper(
char *text);
1011 static char *token(
char *text,
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL);
1019 static char *skip(
char *text,
const char *list);
1027 static char *rskip(
char *text,
const char *list);
1036 static char *unquote(
char *text,
const char *quote);
1045 static char *rset(
char *buffer,
size_t size,
const char *text);
1055 static char *set(
char *buffer,
size_t size,
const char *text);
1066 static char *set(
char *buffer,
size_t size,
const char *text,
size_t max);
1077 static char *add(
char *buffer,
size_t size,
const char *text);
1089 static char *add(
char *buffer,
size_t size,
const char *text,
size_t max);
1098 static const char *ifind(
const char *text,
const char *key,
const char *optional);
1107 static const char *find(
const char *text,
const char *key,
const char *optional);
1114 static size_t count(
const char *text);
1122 static int compare(
const char *text1,
const char *text2);
1124 static inline int collate(
const char *text1,
const char *text2)
1125 {
return compare(text1, text2);};
1133 static bool equal(
const char *text1,
const char *text2);
1142 static int compare(
const char *text1,
const char *text2,
size_t size);
1151 static bool equal(
const char *text1,
const char *text2,
size_t size);
1159 static int case_compare(
const char *text1,
const char *text2);
1167 static bool eq_case(
const char *text1,
const char *text2);
1176 static int case_compare(
const char *text1,
const char *text2,
size_t size);
1185 static bool eq_case(
const char *text1,
const char *text2,
size_t size);
1194 static char *trim(
char *text,
const char *list);
1203 static char *chop(
char *text,
const char *list);
1212 static char *strip(
char *text,
const char *list);
1222 static char *fill(
char *text,
size_t size,
char character);
1230 static unsigned ccount(
const char *text,
const char *list);
1238 static char *find(
char *text,
const char *list);
1246 static size_t seek(
char *text,
const char *list);
1254 static char *rfind(
char *text,
const char *list);
1261 static char *
dup(
const char *text);
1269 static char *left(
const char *text,
size_t size);
1277 static const char *pos(
const char *text, ssize_t offset);
1279 inline static char *right(
const char *text,
size_t size)
1280 {
return dup(pos(text, -(
signed)size));}
1282 inline static char *
copy(
const char *text,
size_t offset,
size_t len)
1283 {
return left(pos(text, offset), len);}
1285 static void cut(
char *text,
size_t offset,
size_t len);
1287 static void paste(
char *text,
size_t max,
size_t offset,
const char *data,
size_t len = 0);
1301 inline char *
token(
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL)
1302 {
return token(c_mem(), last, list, quote, end);};
1311 {
return strtod(c_mem(),
pointer);}
1320 {
return strtol(c_mem(),
pointer, 0);}
1328 inline static double tod(
const char *text,
char **
pointer = NULL)
1329 {
return strtod(text,
pointer);}
1338 {
return strtol(text,
pointer, 0);}
1348 static size_t b64encode(
char *
string,
const uint8_t *binary,
size_t size,
size_t width = 0);
1357 static size_t b64decode(uint8_t *binary,
const char *
string,
size_t size);
1365 static uint32_t crc24(uint8_t *binary,
size_t size);
1373 static uint16_t crc16(uint8_t *binary,
size_t size);
1382 static unsigned hexdump(
const unsigned char *binary,
char *
string,
const char *format);
1391 static unsigned hexpack(
unsigned char *binary,
const char *
string,
const char *format);
1393 static unsigned hexsize(
const char *format);
1406 #if _MSC_VER > 1400 // windows broken dll linkage issue...
1407 const static size_t header =
sizeof(string::cstring);
1409 static const size_t header;
1418 cstring *
c_copy(
void)
const;
1490 {String::set(buffer, S, text);}
1496 {String::set(buffer, S, copy.buffer);}
1503 {String::set(buffer, S, text);}
1511 {String::add(buffer, S, text);}
1517 inline operator bool()
const
1525 {
return buffer[0] == 0;}
1531 inline operator char *()
1547 {
return buffer[offset];}
1555 {
return buffer + offset;}
1569 {
return strlen(buffer);}
1577 typedef String::regex stringex_t;
1589 template<str
size_t S>
1593 char buffer[
sizeof(cstring) + S];
1619 {set(
object.c_str());};
1622 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1630 extern "C" inline int stricmp(
const char *string1,
const char *string2)
1631 {
return String::case_compare(string1, string2);}
1640 extern "C" inline int strnicmp(
const char *string1,
const char *string2,
size_t max)
1641 {
return String::case_compare(string1, string2, max);}
1651 inline bool eq(
char const *s1,
char const *s2)
1652 {
return String::equal(s1, s2);}
1654 inline bool ne(
char const *s1,
char const *s2)
1655 {
return !String::equal(s1, s2);}
1664 inline bool eq(
char const *s1,
char const *s2,
size_t size)
1665 {
return String::equal(s1, s2, size);}
1667 inline bool ne(
char const *s1,
char const *s2,
size_t size)
1668 {
return !String::equal(s1, s2, size);}
1682 inline bool ne(String &s1, String &s2)
1683 {
return s1.compare(s2) != 0;}
1685 inline bool lt(String &s1,
const char *s2)
1686 {
return s1.compare(s2) < 0;}
1688 inline bool gt(String &s1,
const char *s2)
1689 {
return s1.compare(s2) > 0;}
1691 inline bool le(String &s1,
const char *s2)
1692 {
return s1.compare(s2) <= 0;}
1694 inline bool ge(String &s1,
const char *s2)
1695 {
return s1.compare(s2) >= 0;}
1704 inline bool eq_case(
char const *s1,
char const *s2)
1707 inline bool ne_case(
char const *s1,
char const *s2)
1718 inline bool eq_case(
char const *s1,
char const *s2,
size_t size)
1721 inline String str(
const char *
string)
1722 {
return (String)string;}
1724 inline String str(String&
string)
1725 {
return (String)string;}
1727 inline String str(
short value)
1728 {String temp(16,
"%hd", value);
return temp;}
1730 inline String str(
unsigned short value)
1731 {String temp(16,
"%hu", value);
return temp;}
1733 inline String str(
long value)
1734 {String temp(32,
"%ld", value);
return temp;}
1736 inline String str(
unsigned long value)
1737 {String temp(32,
"%lu", value);
return temp;}
1739 inline String str(
double value)
1740 {String temp(40,
"%f", value);
return temp;}
1742 String str(CharacterProtocol& cp,
strsize_t size);
1745 inline void swap<string_t>(string_t& s1, string_t& s2)
1748 class __EXPORT strdup_t
1757 inline strdup_t(
char *str)
1761 {
if(data) ::free(data);}
1763 inline strdup_t& operator=(
char *str)
1764 {
if(data) ::free(data); data = str;
return *
this;}
1766 inline operator bool()
const
1767 {
return data != NULL;}
1769 inline bool operator!()
const
1770 {
return data == NULL;}
1772 inline operator char*()
const
1775 inline const char *c_str(
void)
const
1778 inline const char *operator*()
const
1781 inline char& operator[](
int size)
1782 {
return data[size];}
1784 inline char *operator+(
size_t size)
1785 {
return data + size;}