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 size = 1);
111 regex(
size_t size = 1);
114 size_t offset(
unsigned member);
115 size_t size(
unsigned member);
117 inline size_t members(
void)
const
120 bool match(
const char *text,
unsigned flags = 0);
122 regex& operator=(
const char *
string);
124 bool operator*=(
const char *
string);
126 operator bool()
const
127 {
return object != NULL;}
129 bool operator!()
const
130 {
return object == NULL;}
148 cstring(strsize_t size);
157 cstring(strsize_t size,
char fill);
166 void clear(strsize_t offset, strsize_t size);
174 void set(strsize_t offset,
const char *text, strsize_t size);
180 void set(
const char *text);
186 void add(
const char *text);
192 void add(
char character);
210 void inc(strsize_t number);
217 void dec(strsize_t number);
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;
276 virtual void cow(strsize_t size = 0);
278 strsize_t getStringSize(
void)
const;
284 #if _MSC_VER > 1400 // windows broken dll linkage issue...
285 const static strsize_t npos = ((
strsize_t)-1);
319 String(strsize_t size,
char fill);
328 String(strsize_t size,
const char *format, ...) __PRINTF(3, 4);
343 String(const
char *text, strsize_t size);
351 String(const
char *text, const
char *end);
372 String get(strsize_t offset, strsize_t size = 0) const;
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;
421 virtual
bool resize(strsize_t size);
427 void set(const
char *text);
436 void set(strsize_t offset, const
char *text, strsize_t size = 0);
445 void set(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
454 void rset(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
460 void add(const
char *text);
466 void add(
char character);
472 void trim(const
char *list);
478 inline
void trim(strsize_t count = 1)
485 void chop(
const char *list);
491 inline void chop(strsize_t count = 1)
498 void strip(
const char *list);
505 bool unquote(
const char *quote);
512 void cut(strsize_t offset, strsize_t size = 0);
520 void paste(strsize_t offset,
const char *text, strsize_t size = 0);
527 void clear(strsize_t offset, strsize_t size = 0);
554 strsize_t ccount(
const char *list)
const;
560 strsize_t count(
void)
const;
566 strsize_t size(
void)
const;
577 strsize_t offset(
const char *
pointer)
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);
656 void split(strsize_t offset);
663 void rsplit(
const char *
pointer);
670 void rsplit(strsize_t offset);
677 const char *chr(
char character)
const;
685 const char *rchr(
char character)
const;
691 strsize_t len(
void)
const;
703 inline operator const char *()
const
717 bool full(
void)
const;
725 String operator()(
int offset, strsize_t size)
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);
858 String& operator+=(strsize_t number);
869 String& operator-=(strsize_t number);
875 String& operator*=(strsize_t number);
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;
1413 bool resize(strsize_t size);
1414 void cow(strsize_t adj = 0);
1418 cstring *c_copy(
void)
const;
1426 {set(
object.c_str());}
1441 memstring(
void *memory, strsize_t size,
char fill = 0);
1453 static memstring *create(strsize_t size,
char fill = 0);
1461 static memstring *create(MemoryProtocol *
pager, strsize_t size,
char fill = 0);
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];
1622 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1625 #define stricmp(x,y) String::case_compare(x,y)
1629 #define strnicmp(x,y,z) String::case_compare(x,y,z)
1640 inline bool eq(
char const *s1,
char const *s2)
1643 inline bool ne(
char const *s1,
char const *s2)
1653 inline bool eq(
char const *s1,
char const *s2,
size_t size)
1656 inline bool ne(
char const *s1,
char const *s2,
size_t size)
1671 inline bool ne(String &s1, String &s2)
1672 {
return s1.compare(s2) != 0;}
1674 inline bool lt(String &s1,
const char *s2)
1675 {
return s1.compare(s2) < 0;}
1677 inline bool gt(String &s1,
const char *s2)
1678 {
return s1.compare(s2) > 0;}
1680 inline bool le(String &s1,
const char *s2)
1681 {
return s1.compare(s2) <= 0;}
1683 inline bool ge(String &s1,
const char *s2)
1684 {
return s1.compare(s2) >= 0;}
1693 inline bool eq_case(
char const *s1,
char const *s2)
1696 inline bool ne_case(
char const *s1,
char const *s2)
1707 inline bool eq_case(
char const *s1,
char const *s2,
size_t size)
1710 inline String str(
const char *
string)
1711 {
return (String)string;}
1713 inline String str(String&
string)
1714 {
return (String)string;}
1716 inline String str(
short value)
1717 {String temp(16,
"%hd", value);
return temp;}
1719 inline String str(
unsigned short value)
1720 {String temp(16,
"%hu", value);
return temp;}
1722 inline String str(
long value)
1723 {String temp(32,
"%ld", value);
return temp;}
1725 inline String str(
unsigned long value)
1726 {String temp(32,
"%lu", value);
return temp;}
1728 inline String str(
double value)
1729 {String temp(40,
"%f", value);
return temp;}
1731 String str(CharacterProtocol& cp, strsize_t size);
1734 inline void swap<string_t>(string_t& s1, string_t& s2)
1737 class __EXPORT strdup_t
1746 inline strdup_t(
char *str)
1750 {
if(data) ::free(data);}
1752 inline strdup_t& operator=(
char *str)
1753 {
if(data) ::free(data); data = str;
return *
this;}
1755 inline operator bool()
const
1756 {
return data != NULL;}
1758 inline bool operator!()
const
1759 {
return data == NULL;}
1761 inline operator char*()
const
1764 inline const char *c_str(
void)
const
1767 inline const char *operator*()
const
1770 inline char& operator[](
int size)
1771 {
return data[size];}
1773 inline char *operator+(
size_t size)
1774 {
return data + size;}
char * operator*()
Get text by object pointer reference.
Abstract interfaces and support.
String string_t
A convenience type for string.
void retain(ObjectProtocol *object)
Convenience function to access object retention.
static bool eq_case(const char *text1, const char *text2)
Simple case insensitive equal test for strings.
A template to create a character array that can be manipulated as a string.
T * dup(const T &object)
Convenience function to duplicate object pointer to heap.
A common base class for all managed objects.
void operator=(const char *text)
Assign null terminated text to our object.
const char * c_str(void) const
Get character text buffer of string object.
static long tol(const char *text, char **pointer=((void *) 0))
Convert text to a long value.
bool eq_case(char const *s1, char const *s2)
Compare two null terminated strings if equal ignoring case.
Generic smart pointer class.
Generic templates for C++.
String copy(strsize_t offset, strsize_t size) const
Convenience method for substring extraction.
A copy-on-write string class that operates by reference count.
const char * operator*() const
Reference raw text buffer by pointer operator.
String right(strsize_t offset) const
Convenience method for right of string.
void operator=(const char *text)
Assign null terminated text to the object.
void add(const char *text)
Append null terminated text to our string buffer.
void chop(strsize_t count=1)
Chop trailing characters from text.
Common namespace for all ucommon objects.
Mempager managed type factory for pager pool objects.
charbuf(const char *text)
Create a character buffer with assigned text.
bool operator!() const
Test if the object is empty.
double tod(char **pointer=((void *) 0))
Convert string to a double value.
void operator=(const char *text)
Assign a string buffer from a null terminated string.
long tol(char **pointer=((void *) 0))
Convert string to a long value.
void release(SharedAccess &object)
Convenience function to unlock shared object through it's protocol.
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.
String left(strsize_t size) const
Convenience method for left of string.
bool equal(const char *string) const
Test if two string values are equal.
unsigned short strsize_t
A convenience class for size of strings.
static const strsize_t npos
A constant for an invalid position value.
charbuf(const charbuf ©)
Copy constructor.
void set(const char *text)
Set string object to text of a null terminated string.
stringbuf()
Create an empty instance of a string buffer.
charbuf()
Create a new character buffer with an empty string.
cstring * str
cstring instance our object references.
void operator=(String &object)
Assign the text of a string to our object.
void operator+=(const char *text)
Concatenate text into the object.
char & operator[](size_t offset) const
Array operator to get a character from the object.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
static void swap(String &object1, String &object2)
Swap the cstring references between two strings.
A string class that has a predefined string buffer.
virtual int compare(const char *string) const
Compare the values of two string.
static double tod(const char *text, char **pointer=((void *) 0))
Convert text to a double value.
A base class for reference counted objects.
void operator=(String &object)
Assign a string buffer from another string object.
A common string class and character string support functions.
char * operator()(size_t offset)
Get a pointer to an offset in the object by expression operator.
stringbuf(const char *text)
Create a string buffer from a null terminated string.
ObjectProtocol * copy(ObjectProtocol *object)
Convenience function to access object copy.
void swap(T &o1, T &o2)
Convenience function to swap objects.
A string class that uses a cstring buffer that is fixed in memory.
size_t size(void) const
Get allocated size of the object.
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
Compare two socket addresses to see if equal.
size_t len(void) const
Get current length of string.
A common object base class with auto-pointer support.