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...
335 string(const
char *text);
343 string(const
char *text,
strsize_t size);
351 string(const
char *text, const
char *end);
358 string(const
string& existing);
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);
549 strsize_t ccount(
const char *list)
const;
579 char at(
int position)
const;
585 const char *begin(
void)
const;
591 const char *end(
void)
const;
599 const char *skip(
const char *list,
strsize_t offset = 0)
const;
608 const char *rskip(
const char *list,
strsize_t offset = npos)
const;
615 const char *search(
const char *
string,
unsigned instance = 0,
unsigned flags = 0)
const;
617 const char *search(regex& expr,
unsigned instance = 0,
unsigned flags = 0)
const;
619 unsigned replace(
const char *
string,
const char *text = NULL,
unsigned flags = 0);
621 unsigned replace(regex& expr,
const char *text = NULL,
unsigned flags = 0);
629 const char *find(
const char *list,
strsize_t offset = 0)
const;
637 const char *rfind(
const char *list,
strsize_t offset = npos)
const;
644 void split(
const char *
pointer);
658 void rsplit(
const char *
pointer);
672 const char *chr(
char character)
const;
680 const char *rchr(
char character)
const;
698 inline operator const char *()
const
705 inline const char *operator*()
const
712 bool full(
void)
const;
720 string operator()(
int offset,
strsize_t size)
const;
728 {
return operator()(0, size);}
736 {
return operator()(-((
int)offset), 0);}
745 {
return operator()((
int)offset, size);}
754 const char *operator()(
int offset)
const;
761 const char operator[](
int offset)
const;
767 bool operator!()
const;
773 operator bool()
const;
780 string& operator^=(
const string&
object);
786 string& operator|=(
const char *text);
788 string& operator&=(
const char *text);
795 string& operator+=(
const char *text);
802 string& operator^=(
const char *text);
810 string& operator+(
const char *text);
818 string& operator|(
const char *text);
824 string operator^(
const char *text);
833 string& operator&(
const char *text);
841 string& operator=(
const string&
object);
843 bool operator*=(
const char *substring);
845 bool operator*=(regex& expr);
851 string& operator=(
const char *text);
886 bool operator==(
const char *text)
const;
893 bool operator!=(
const char *text)
const;
900 bool operator<(
const char *text)
const;
907 bool operator<=(
const char *text)
const;
914 bool operator>(
const char *text)
const;
921 bool operator>=(
const char *text)
const;
923 inline string& operator<<(
const char *text)
924 {
add(text);
return *
this;}
926 inline string& operator<<(
char code)
927 {
add(code);
return *
this;}
934 string &operator%(
short& value);
941 string &operator%(
unsigned short& value);
948 string &operator%(
long& value);
955 string &operator%(
unsigned long& value);
962 string &operator%(
double& value);
969 string &operator%(
const char *text);
977 static int scanf(
string&
object,
const char *format, ...) __SCANF(2, 3);
985 static
strsize_t printf(
string&
object, const
char *format, ...) __PRINTF(2, 3);
992 static
void swap(
string& object1,
string& object2);
998 static
void fix(
string&
object);
1004 static
void lower(
char *text);
1010 static
void upper(
char *text);
1025 static
char *token(
char *text,
char **last, const
char *list, const
char *quote = NULL, const
char *end = NULL);
1033 static
char *skip(
char *text, const
char *list);
1041 static
char *rskip(
char *text, const
char *list);
1050 static
char *unquote(
char *text, const
char *quote);
1059 static
char *rset(
char *buffer,
size_t size, const
char *text);
1069 static
char *set(
char *buffer,
size_t size, const
char *text);
1080 static
char *set(
char *buffer,
size_t size, const
char *text,
size_t max);
1091 static
char *
add(
char *buffer,
size_t size, const
char *text);
1103 static
char *
add(
char *buffer,
size_t size, const
char *text,
size_t max);
1112 static const
char *ifind(const
char *text, const
char *key, const
char *optional);
1121 static const
char *find(const
char *text, const
char *key, const
char *optional);
1128 static
size_t count(const
char *text);
1136 static
int compare(const
char *text1, const
char *text2);
1138 static inline
int collate(const
char *text1, const
char *text2)
1139 {
return compare(text1, text2);};
1147 static bool equal(
const char *text1,
const char *text2);
1156 static int compare(
const char *text1,
const char *text2,
size_t size);
1165 static bool equal(
const char *text1,
const char *text2,
size_t size);
1173 static int case_compare(
const char *text1,
const char *text2);
1181 static bool case_equal(
const char *text1,
const char *text2);
1190 static int case_compare(
const char *text1,
const char *text2,
size_t size);
1199 static bool case_equal(
const char *text1,
const char *text2,
size_t size);
1208 static char *trim(
char *text,
const char *list);
1217 static char *chop(
char *text,
const char *list);
1226 static char *strip(
char *text,
const char *list);
1236 static char *fill(
char *text,
size_t size,
char character);
1244 static unsigned ccount(
const char *text,
const char *list);
1252 static char *find(
char *text,
const char *list);
1260 static size_t seek(
char *text,
const char *list);
1268 static char *rfind(
char *text,
const char *list);
1275 static char *
dup(
const char *text);
1283 static char *left(
const char *text,
size_t size);
1291 static const char *pos(
const char *text, ssize_t offset);
1293 inline static char *right(
const char *text,
size_t size)
1294 {
return dup(pos(text, -(
signed)size));}
1296 inline static char *
copy(
const char *text,
size_t offset,
size_t len)
1297 {
return left(pos(text, offset), len);}
1299 static void cut(
char *text,
size_t offset,
size_t len);
1301 static void paste(
char *text,
size_t max,
size_t offset,
const char *data,
size_t len = 0);
1316 inline static char *token(
string&
object,
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL)
1317 {
return token(
object.c_mem(), last, list, quote, end);};
1326 __SCANF(2,0) inline static
int vscanf(
string&
object, const
char *format, va_list args)
1327 {
return object.vscanf(format, args);}
1336 __PRINTF(2,0) inline static
strsize_t vprintf(
string&
object, const
char *format, va_list args)
1337 {
return object.vprintf(format, args);}
1345 {
return object.len();};
1352 inline static char *mem(
string&
object)
1353 {
return object.c_mem();};
1361 {
return object.size();};
1367 inline static void clear(
string&
object)
1376 inline static unsigned ccount(
string&
object,
const char *list)
1377 {
return object.ccount(list);};
1384 inline static size_t count(
string&
object)
1385 {
return object.count();}
1388 {
return object.
copy(offset, size);}
1390 inline static string left(
string&
object,
strsize_t size)
1391 {
return object.left(size);}
1393 inline static string right(
string&
object,
strsize_t offset)
1394 {
return object.right(offset);}
1397 {
object.cut(offset, size);}
1399 inline static void paste(
string&
object,
strsize_t offset,
const char *text,
strsize_t size = 0)
1400 {
object.paste(offset, text, size);}
1406 inline static void upper(
string&
object)
1413 inline static void lower(
string&
object)
1422 inline static bool unquote(
string&
object,
const char *quote)
1423 {
return object.unquote(quote);}
1430 inline static void trim(
string&
object,
const char *list)
1431 {
object.trim(list);}
1438 inline static void trim(
string&
object,
strsize_t count = 1)
1439 {
object.trim(count);}
1446 inline static void chop(
string&
object,
const char *list)
1447 {
object.chop(list);}
1454 inline static void chop(
string&
object,
strsize_t count = 1)
1455 {
object.chop(count);}
1462 inline static void strip(
string&
object,
const char *list)
1463 {
object.strip(list);}
1471 inline static const char *find(
string&
object,
const char *list)
1472 {
return object.find(list);}
1474 inline static const char *search(
string&
object,
const char *substring,
unsigned instance = 0,
unsigned flags = 0)
1475 {
return object.search(substring, instance, flags);}
1477 inline static const char *search(
string&
object, regex& expr,
unsigned instance = 0,
unsigned flags = 0)
1478 {
return object.search(expr, instance, flags);}
1480 inline static unsigned replace(
string&
object, regex& expr,
const char *text,
unsigned flags = 0)
1481 {
return object.replace(expr, text, flags);}
1483 inline static unsigned replace(
string&
object,
const char *match,
const char *text,
bool flag =
false)
1484 {
return object.replace(match, text, flag);}
1486 inline static bool search(regex& expr,
const char *text,
unsigned flags = 0)
1487 {
return expr.match(text, flags);}
1495 inline static const char *rfind(
string&
object,
const char *list)
1496 {
return object.rfind(list);}
1504 inline static double tod(
string&
object,
char **
pointer = NULL)
1505 {
return strtod(mem(
object),
pointer);}
1513 inline static long tol(
string&
object,
char **
pointer = NULL)
1514 {
return strtol(mem(
object),
pointer, 0);}
1522 inline static double tod(
const char *text,
char **
pointer = NULL)
1523 {
return strtod(text,
pointer);}
1531 inline static long tol(
const char *text,
char **
pointer = NULL)
1532 {
return strtol(text,
pointer, 0);}
1542 static size_t b64encode(
char *
string,
const uint8_t *binary,
size_t size,
size_t width = 0);
1551 static size_t b64decode(uint8_t *binary,
const char *
string,
size_t size);
1559 static uint32_t crc24(uint8_t *binary,
size_t size);
1567 static uint16_t crc16(uint8_t *binary,
size_t size);
1576 static unsigned hexdump(
const unsigned char *binary,
char *
string,
const char *format);
1585 static unsigned hexpack(
unsigned char *binary,
const char *
string,
const char *format);
1587 static unsigned hexsize(
const char *format);
1600 #if _MSC_VER > 1400 // windows broken dll linkage issue...
1601 const static size_t header =
sizeof(string::cstring);
1603 static const size_t header;
1612 cstring *
c_copy(
void)
const;
1620 {
set(
object.c_str());};
1684 {string::set(buffer, S, text);};
1690 inline void operator=(
const char *text)
1691 {string::set(buffer, S, text);};
1698 inline void operator+=(
const char *text)
1705 inline operator bool()
const
1706 {
return buffer[0];};
1712 inline bool operator!()
const
1713 {
return buffer[0] == 0;};
1719 inline operator char *()
1726 inline char *operator*()
1734 inline char operator[](
size_t offset)
const
1735 {
return buffer[offset];};
1742 inline char *operator()(
size_t offset)
1743 {
return buffer + offset;};
1749 inline size_t size(
void)
const
1758 typedef string::regex stringex_t;
1776 template<str
size_t S>
1780 char buffer[
sizeof(cstring) + S];
1798 inline void operator=(
const char *text)
1805 inline void operator=(
string&
object)
1806 {
set(
object.c_str());};
1809 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1817 extern "C" inline int stricmp(
const char *string1,
const char *string2)
1818 {
return string::case_compare(string1, string2);}
1827 extern "C" inline int strnicmp(
const char *string1,
const char *string2,
size_t max)
1828 {
return string::case_compare(string1, string2, max);}
1838 inline bool eq(
char const *s1,
char const *s2)
1839 {
return String::equal(s1, s2);}
1841 inline bool ne(
char const *s1,
char const *s2)
1842 {
return !String::equal(s1, s2);}
1851 inline bool eq(
char const *s1,
char const *s2,
size_t size)
1852 {
return String::equal(s1, s2, size);}
1854 inline bool ne(
char const *s1,
char const *s2,
size_t size)
1855 {
return !String::equal(s1, s2, size);}
1866 inline bool eq(String &s1,
const char *s2)
1869 inline bool ne(String &s1, String &s2)
1870 {
return s1.compare(s2) != 0;}
1872 inline bool lt(String &s1,
const char *s2)
1873 {
return s1.compare(s2) < 0;}
1875 inline bool gt(String &s1,
const char *s2)
1876 {
return s1.compare(s2) > 0;}
1878 inline bool le(String &s1,
const char *s2)
1879 {
return s1.compare(s2) <= 0;}
1881 inline bool ge(String &s1,
const char *s2)
1882 {
return s1.compare(s2) >= 0;}
1891 inline bool case_eq(
char const *s1,
char const *s2)
1892 {
return String::case_equal(s1, s2);}
1894 inline bool case_ne(
char const *s1,
char const *s2)
1895 {
return !String::case_equal(s1, s2);}
1898 inline bool ieq(
char const *s1,
char const *s2)
1899 {
return String::case_equal(s1, s2);}
1909 inline bool case_eq(
char const *s1,
char const *s2,
size_t size)
1910 {
return String::case_equal(s1, s2, size);}
1912 inline bool ieq(
char const *s1,
char const *s2,
size_t size)
1913 {
return String::case_equal(s1, s2, size);}
1915 inline String str(
const char *
string)
1916 {
return (String)string;}
1918 inline String str(String&
string)
1919 {
return (String)string;}
1921 inline String str(
short value)
1922 {String temp(16,
"%hd", value);
return temp;}
1924 inline String str(
unsigned short value)
1925 {String temp(16,
"%hu", value);
return temp;}
1927 inline String str(
long value)
1928 {String temp(32,
"%ld", value);
return temp;}
1930 inline String str(
unsigned long value)
1931 {String temp(32,
"%lu", value);
return temp;}
1933 inline String str(
double value)
1934 {String temp(40,
"%f", value);
return temp;}
1936 String str(CharacterProtocol& cp,
strsize_t size);
1939 inline void swap<string_t>(string_t& s1, string_t& s2)
1942 class __EXPORT strdup_t
1951 inline strdup_t(
char *str)
1955 {
if(data) ::free(data);}
1957 inline strdup_t& operator=(
char *str)
1958 {
if(data) ::free(data); data = str;
return *
this;}
1960 inline operator bool()
const
1961 {
return data != NULL;}
1963 inline bool operator!()
const
1964 {
return data == NULL;}
1966 inline operator char*()
const
1969 inline const char *c_str(
void)
const
1972 inline const char *operator*()
const
1975 inline char& operator[](
int size)
1976 {
return data[size];}
1978 inline char *operator+(
size_t size)
1979 {
return data + size;}