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;}
virtual void cow(strsize_t size=0)
Copy on write operation for cstring.
virtual cstring * c_copy(void) const
Return cstring to use in copy constructors.
void swap(T &o1, T &o2)
Convenience function to swap objects.
cstring * str
cstring instance our object references.
size_t len(void) const
Get current length of string.
int strnicmp(const char *string1, const char *string2, size_t max)
Convenience function for case insensitive null terminated string compare.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
Generic templates for C++.
String string_t
A convenience type for string.
int stricmp(const char *string1, const char *string2)
Convenience function for case insensitive null terminated string compare.
charbuf(const charbuf ©)
Copy constructor.
void operator=(String &object)
Assign the text of a string to our object.
const char * c_str(void) const
Get character text buffer of string object.
stringbuf()
Create an empty instance of a string buffer.
A string class that uses a cstring buffer that is fixed in memory.
unsigned short strsize_t
A convenience class for size of strings.
void set(const char *text)
Set string object to text of a null terminated string.
String left(strsize_t size) const
Convenience method for left of string.
void chop(strsize_t count=1)
Chop trailing characters from text.
char * operator()(size_t offset)
Get a pointer to an offset in the object by expression operator.
String right(strsize_t offset) const
Convenience method for right of string.
cstring * create(strsize_t size, char fill=0) const
Factory create a cstring object of specified size.
virtual int compare(const char *string) const
Compare the values of two string.
void operator=(String &object)
Assign a string buffer from another string object.
const char * operator*() const
Reference raw text buffer by pointer operator.
virtual void release(void)
Decrease retention of our reference counted cstring.
A common string class and character string support functions.
bool eq_case(char const *s1, char const *s2)
Compare two null terminated strings if equal ignoring case.
charbuf(const char *text)
Create a character buffer with assigned text.
A base class for reference counted objects.
static double tod(const char *text, char **pointer=((void *) 0))
Convert text to a double value.
static long tol(const char *text, char **pointer=((void *) 0))
Convert text to a long value.
stringbuf(const char *text)
Create a string buffer from a null terminated string.
char & operator[](size_t offset) const
Array operator to get a character from the object.
virtual bool resize(strsize_t size)
Resize and re-allocate string memory.
void retain(void)
Increase reference count when retained.
A string class that has a predefined string buffer.
void operator=(const char *text)
Assign null terminated text to our object.
ObjectProtocol * copy(ObjectProtocol *object)
Convenience function to access object copy.
void operator=(const char *text)
Assign a string buffer from a null terminated string.
charbuf()
Create a new character buffer with an empty string.
long tol(char **pointer=((void *) 0))
Convert string to a long value.
char * token(char **last, const char *list, const char *quote=((void *) 0), const char *end=((void *) 0))
A thread-safe token parsing routine for strings objects.
char * operator*()
Get text by object pointer reference.
A common object base class with auto-pointer support.
static const strsize_t npos
A constant for an invalid position value.
T * dup(const T &object)
Convenience function to duplicate object pointer to heap.
A copy-on-write string class that operates by reference count.
ObjectProtocol * copy(void)
Retain (increase retention of) object when copying.
A common base class for all managed objects.
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
Compare two socket addresses to see if equal.
void operator+=(const char *text)
Concatenate text into the object.
String copy(strsize_t offset, strsize_t size) const
Convenience method for substring extraction.
void operator--(void)
Decrease retention operator.
bool operator!() const
Test if the object is empty.
Generic smart pointer class.
Mempager managed type factory for pager pool objects.
void release(void)
Decrease reference count when released.
size_t size(void) const
Get allocated size of the object.
Abstract interfaces and support.
void operator=(const char *text)
Assign null terminated text to the object.
double tod(char **pointer=((void *) 0))
Convert string to a double value.
void operator++(void)
Increase retention operator.
A template to create a character array that can be manipulated as a string.