36 #ifndef _UCOMMON_STRING_H_
37 #define _UCOMMON_STRING_H_
39 #ifndef _UCOMMON_CPR_H_
43 #ifndef _UCOMMON_GENERICS_H_
47 #ifndef _UCOMMON_PROTOCOLS_H_
51 #ifndef _UCOMMON_OBJECT_H_
63 #define PGP_B64_WIDTH 64
64 #define MIME_B64_WIDTH 76
110 __DELETE_COPY(regex);
113 regex(
const char *pattern,
size_t size = 1);
114 regex(
size_t size = 1);
117 size_t offset(
unsigned member);
118 size_t size(
unsigned member);
120 inline size_t members(
void)
const
123 bool match(
const char *text,
unsigned flags = 0);
125 regex& operator=(
const char *
string);
127 bool operator*=(
const char *
string);
129 operator bool()
const
130 {
return object != NULL;}
132 bool operator!()
const
133 {
return object == NULL;}
139 __DELETE_COPY(cstring);
142 virtual void dealloc(
void) __OVERRIDE;
157 cstring(strsize_t size);
166 cstring(strsize_t size,
char fill);
175 void clear(strsize_t offset, strsize_t size);
183 void set(strsize_t offset,
const char *text, strsize_t size);
189 void set(
const char *text);
195 void add(
const char *text);
201 void add(
char character);
219 void inc(strsize_t number);
226 void dec(strsize_t number);
238 cstring *create(strsize_t size,
char fill = 0)
const;
248 virtual int compare(
const char *
string)
const;
250 inline int collate(
const char *
string)
const
251 {
return compare(
string);}
259 bool equal(
const char *
string)
const;
265 virtual void retain(
void) __OVERRIDE;
271 virtual
void release(
void) __OVERRIDE;
277 virtual cstring *c_copy(
void) const;
285 virtual
void cow(strsize_t size = 0);
287 strsize_t getStringSize(
void) const;
290 #if _MSC_VER > 1400 // windows broken dll linkage issue...
291 const static strsize_t npos = ((
strsize_t)-1);
292 const static char eos =
'\0';
294 static const strsize_t npos;
295 static const char eos;
327 String(strsize_t size,
char fill);
336 String(strsize_t size,
const char *format, ...) __PRINTF(3, 4);
351 String(const
char *text, strsize_t size);
359 String(const
char *text, const
char *end);
380 String get(strsize_t offset, strsize_t size = 0) const;
387 int scanf(const
char *format, ...) __SCANF(2, 3);
395 int vscanf(const
char *format, va_list args) __SCANF(2, 0);
402 strsize_t printf(const
char *format, ...) __PRINTF(2, 3);
410 strsize_t vprintf(const
char *format, va_list args) __PRINTF(2, 0);
416 char *c_mem(
void) const;
422 const
char *c_str(
void) const;
429 virtual
bool resize(strsize_t size);
435 void set(const
char *text);
444 void set(strsize_t offset, const
char *text, strsize_t size = 0);
453 void set(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
462 void rset(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
468 void add(const
char *text);
474 void add(
char character);
480 void trim(const
char *list);
486 inline
void trim(strsize_t count = 1)
493 void chop(
const char *list);
499 inline void chop(strsize_t count = 1)
506 void strip(
const char *list);
513 bool unquote(
const char *quote);
520 void cut(strsize_t offset, strsize_t size = 0);
528 void paste(strsize_t offset,
const char *text, strsize_t size = 0);
535 void clear(strsize_t offset, strsize_t size = 0);
562 strsize_t ccount(
const char *list)
const;
568 strsize_t count(
void)
const;
574 strsize_t size(
void)
const;
585 strsize_t offset(
const char *
pointer)
const;
592 char at(
int position)
const;
598 const char *begin(
void)
const;
604 const char *end(
void)
const;
612 const char *skip(
const char *list, strsize_t offset = 0)
const;
621 const char *rskip(
const char *list, strsize_t offset = npos)
const;
628 const char *search(
const char *
string,
unsigned instance = 0,
unsigned flags = 0)
const;
630 const char *search(regex& expr,
unsigned instance = 0,
unsigned flags = 0)
const;
632 unsigned replace(
const char *
string,
const char *text = NULL,
unsigned flags = 0);
634 unsigned replace(regex& expr,
const char *text = NULL,
unsigned flags = 0);
642 const char *find(
const char *list, strsize_t offset = 0)
const;
650 const char *rfind(
const char *list, strsize_t offset = npos)
const;
657 void split(
const char *
pointer);
664 void split(strsize_t offset);
671 void rsplit(
const char *
pointer);
678 void rsplit(strsize_t offset);
685 const char *chr(
char character)
const;
693 const char *rchr(
char character)
const;
699 strsize_t len(
void)
const;
711 inline operator const char *()
const
725 bool full(
void)
const;
733 String operator()(
int offset, strsize_t size)
const;
741 {
return operator()(0, size);}
749 {
return operator()(-((
int)offset), 0);}
758 {
return operator()((
int)offset, size);}
767 const char *operator()(
int offset)
const;
774 const char operator[](
int offset)
const;
780 bool operator!()
const;
786 operator bool()
const;
799 String& operator|=(
const char *text);
801 String& operator&=(
const char *text);
808 String& operator+=(
const char *text);
815 String& operator^=(
const char *text);
821 String operator+(
const char *text);
829 String& operator|(
const char *text);
837 String& operator&(
const char *text);
847 bool operator*=(
const char *substring);
849 bool operator*=(regex& expr);
855 String& operator=(
const char *text);
866 String& operator+=(strsize_t number);
877 String& operator-=(strsize_t number);
883 String& operator*=(strsize_t number);
890 bool operator==(
const char *text)
const;
897 bool operator!=(
const char *text)
const;
904 bool operator<(
const char *text)
const;
911 bool operator<=(
const char *text)
const;
918 bool operator>(
const char *text)
const;
925 bool operator>=(
const char *text)
const;
927 inline String& operator<<(
const char *text)
928 {add(text);
return *
this;}
930 inline String& operator<<(
char code)
931 {add(code);
return *
this;}
938 String &operator%(
short& value);
945 String &operator%(
unsigned short& value);
952 String &operator%(
long& value);
959 String &operator%(
unsigned long& value);
966 String &operator%(
double& value);
973 String &operator%(
const char *text);
980 static void swap(String& object1, String& object2);
986 static void fix(String&
object);
995 static bool check(
const char *
string,
size_t maximum,
size_t minimum = 0);
1001 static void erase(
char *text);
1007 static void lower(
char *text);
1013 static void upper(
char *text);
1028 static char *token(
char *text,
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL);
1036 static char *skip(
char *text,
const char *list);
1044 static char *rskip(
char *text,
const char *list);
1053 static char *unquote(
char *text,
const char *quote);
1062 static char *rset(
char *buffer,
size_t size,
const char *text);
1072 static char *set(
char *buffer,
size_t size,
const char *text);
1083 static char *set(
char *buffer,
size_t size,
const char *text,
size_t max);
1094 static char *add(
char *buffer,
size_t size,
const char *text);
1106 static char *add(
char *buffer,
size_t size,
const char *text,
size_t max);
1115 static const char *ifind(
const char *text,
const char *key,
const char *optional);
1124 static const char *find(
const char *text,
const char *key,
const char *optional);
1131 static size_t count(
const char *text);
1139 static int compare(
const char *text1,
const char *text2);
1141 static inline int collate(
const char *text1,
const char *text2)
1142 {
return compare(text1, text2);}
1150 static bool equal(
const char *text1,
const char *text2);
1159 static int compare(
const char *text1,
const char *text2,
size_t size);
1168 static bool equal(
const char *text1,
const char *text2,
size_t size);
1176 static int case_compare(
const char *text1,
const char *text2);
1184 static bool eq_case(
const char *text1,
const char *text2);
1193 static int case_compare(
const char *text1,
const char *text2,
size_t size);
1202 static bool eq_case(
const char *text1,
const char *text2,
size_t size);
1211 static char *trim(
char *text,
const char *list);
1220 static char *chop(
char *text,
const char *list);
1229 static char *strip(
char *text,
const char *list);
1239 static char *fill(
char *text,
size_t size,
char character);
1247 static unsigned ccount(
const char *text,
const char *list);
1255 static char *find(
char *text,
const char *list);
1263 static size_t seek(
char *text,
const char *list);
1271 static char *rfind(
char *text,
const char *list);
1278 static char *
dup(
const char *text);
1286 static char *left(
const char *text,
size_t size);
1294 static const char *pos(
const char *text, ssize_t offset);
1296 inline static char *right(
const char *text,
size_t size)
1297 {
return dup(pos(text, -(ssize_t)size));}
1299 inline static char *
copy(
const char *text,
size_t offset,
size_t len)
1300 {
return left(pos(text, (ssize_t)offset), len);}
1302 static void cut(
char *text,
size_t offset,
size_t len);
1304 static void paste(
char *text,
size_t max,
size_t offset,
const char *data,
size_t len = 0);
1318 inline char *
token(
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL)
1319 {
return token(c_mem(), last, list, quote, end);}
1328 {
return strtod(c_mem(),
pointer);}
1337 {
return strtol(c_mem(),
pointer, 0);}
1345 inline static double tod(
const char *text,
char **
pointer = NULL)
1346 {
return strtod(text,
pointer);}
1355 {
return strtol(text,
pointer, 0);}
1363 static String b64(
const uint8_t *binary,
size_t size);
1373 static size_t b64encode(
char *
string,
const uint8_t *binary,
size_t size,
size_t width = 0);
1382 static size_t b64decode(uint8_t *binary,
const char *
string,
size_t size);
1390 static uint32_t crc24(uint8_t *binary,
size_t size);
1398 static uint16_t crc16(uint8_t *binary,
size_t size);
1406 static String hex(
const unsigned char *binary,
size_t size);
1415 static unsigned hexdump(
const unsigned char *binary,
char *
string,
const char *format);
1424 static unsigned hexpack(
unsigned char *binary,
const char *
string,
const char *format);
1426 static unsigned hexsize(
const char *format);
1439 #if _MSC_VER > 1400 // windows broken dll linkage issue...
1440 const static size_t header =
sizeof(String::cstring);
1442 static const size_t header;
1446 bool resize(strsize_t size);
1447 void cow(strsize_t adj = 0);
1451 cstring *c_copy(
void)
const;
1459 {set(
object.c_str());}
1474 memstring(
void *memory, strsize_t size,
char fill = 0);
1486 static memstring *create(strsize_t size,
char fill = 0);
1494 static memstring *create(MemoryProtocol *
pager, strsize_t size,
char fill = 0);
1550 inline operator bool()
const
1558 {
return buffer[0] == 0;}
1564 inline operator char *()
1580 {
return buffer[offset];}
1588 {
return buffer + offset;}
1602 {
return strlen(buffer);}
1610 typedef String::regex stringex_t;
1622 template<str
size_t S>
1626 char buffer[
sizeof(cstring) + S];
1655 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1658 #define stricmp(x,y) String::case_compare(x,y)
1662 #define strnicmp(x,y,z) String::case_compare(x,y,z)
1673 inline bool eq(
char const *s1,
char const *s2)
1676 inline bool ne(
char const *s1,
char const *s2)
1686 inline bool eq(
char const *s1,
char const *s2,
size_t size)
1689 inline bool ne(
char const *s1,
char const *s2,
size_t size)
1704 inline bool ne(String &s1, String &s2)
1705 {
return s1.compare(s2) != 0;}
1707 inline bool lt(String &s1,
const char *s2)
1708 {
return s1.compare(s2) < 0;}
1710 inline bool gt(String &s1,
const char *s2)
1711 {
return s1.compare(s2) > 0;}
1713 inline bool le(String &s1,
const char *s2)
1714 {
return s1.compare(s2) <= 0;}
1716 inline bool ge(String &s1,
const char *s2)
1717 {
return s1.compare(s2) >= 0;}
1726 inline bool eq_case(
char const *s1,
char const *s2)
1729 inline bool ne_case(
char const *s1,
char const *s2)
1740 inline bool eq_case(
char const *s1,
char const *s2,
size_t size)
1743 inline String str(
const char *
string)
1744 {
return (String)string;}
1746 inline String str(String&
string)
1747 {
return (String)string;}
1749 inline String str(
short value)
1750 {String temp(16,
"%hd", value);
return temp;}
1752 inline String str(
unsigned short value)
1753 {String temp(16,
"%hu", value);
return temp;}
1755 inline String str(
long value)
1756 {String temp(32,
"%ld", value);
return temp;}
1758 inline String str(
unsigned long value)
1759 {String temp(32,
"%lu", value);
return temp;}
1761 inline String str(
double value)
1762 {String temp(40,
"%f", value);
return temp;}
1764 String str(CharacterProtocol& cp, strsize_t size);
1767 inline void swap<string_t>(string_t& s1, string_t& s2)
1770 class __EXPORT strdup_t
1779 inline strdup_t(
char *str)
1783 {
if(data) ::free(data);}
1785 inline strdup_t& operator=(
char *str)
1786 {
if(data) ::free(data); data = str;
return *
this;}
1788 inline operator bool()
const
1789 {
return data != NULL;}
1791 inline bool operator!()
const
1792 {
return data == NULL;}
1794 inline operator char*()
const
1797 inline const char *c_str(
void)
const
1800 inline const char *operator*()
const
1803 inline char& operator[](
int size)
1804 {
return data[size];}
1806 inline char *operator+(
size_t size)
1807 {
return data + size;}
A common string class and character string support functions.
void release(SharedAccess &object)
Convenience function to unlock shared object through it's protocol.
cstring * str
cstring instance our object references.
void add(const char *text)
Append null terminated text to our string buffer.
A base class for reference counted objects.
A string class that has a predefined string buffer.
charbuf(const charbuf ©)
Copy constructor.
const char * c_str(void) const
Get character text buffer of string object.
stringbuf()
Create an empty instance of a string buffer.
void operator+=(const char *text)
Concatenate text into the object.
double tod(char **pointer=((void *) 0))
Convert string to a double value.
void operator=(String &object)
Assign the text of a string to our object.
void operator=(String &object)
Assign a string buffer from another string object.
const char * operator*() const
Reference raw text buffer by pointer operator.
String right(strsize_t offset) const
Convenience method for right of string.
charbuf(const char *text)
Create a character buffer with assigned text.
unsigned short strsize_t
A convenience class for size of strings.
ObjectProtocol * copy(ObjectProtocol *object)
Convenience function to access object copy.
A copy-on-write string class that operates by reference count.
void chop(strsize_t count=1)
Chop trailing characters from text.
static double tod(const char *text, char **pointer=((void *) 0))
Convert text to a double value.
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
Compare two socket addresses to see if equal.
char * operator*()
Get text by object pointer reference.
T * dup(const T &object)
Convenience function to duplicate object pointer to heap.
bool eq_case(char const *s1, char const *s2)
Compare two null terminated strings if equal ignoring case.
size_t len(void) const
Get current length of string.
A common base class for all managed objects.
void set(const char *text)
Set string object to text of a null terminated string.
A common object base class with auto-pointer support.
long tol(char **pointer=((void *) 0))
Convert string to a long value.
size_t size(void) const
Get allocated size of the object.
void swap(T &o1, T &o2)
Convenience function to swap objects.
Generic smart pointer class.
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.
virtual int compare(const char *string) const
Compare the values of two string.
static long tol(const char *text, char **pointer=((void *) 0))
Convert text to a long value.
Common namespace for all ucommon objects.
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.
void retain(ObjectProtocol *object)
Convenience function to access object retention.
static void swap(String &object1, String &object2)
Swap the cstring references between two strings.
bool equal(const char *string) const
Test if two string values are equal.
charbuf()
Create a new character buffer with an empty string.
Mempager managed type factory for pager pool objects.
char * operator()(size_t offset)
Get a pointer to an offset in the object by expression operator.
bool operator!() const
Test if the object is empty.
String string_t
A convenience type for string.
void operator=(const char *text)
Assign null terminated text to our object.
A string class that uses a cstring buffer that is fixed in memory.
stringbuf(const char *text)
Create a string buffer from a null terminated string.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
Abstract interfaces and support.
char & operator[](size_t offset) const
Array operator to get a character from the object.
Generic templates for C++.
String left(strsize_t size) const
Convenience method for left of string.
void operator=(const char *text)
Assign a string buffer from a null terminated string.
String copy(strsize_t offset, strsize_t size) const
Convenience method for substring extraction.
void operator=(const char *text)
Assign null terminated text to the object.