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;}
151 cstring(strsize_t size);
160 cstring(strsize_t size,
char fill);
169 void clear(strsize_t offset, strsize_t size);
177 void set(strsize_t offset,
const char *text, strsize_t size);
183 void set(
const char *text);
189 void add(
const char *text);
195 void add(
char character);
213 void inc(strsize_t number);
220 void dec(strsize_t number);
232 cstring *create(strsize_t size,
char fill = 0)
const;
242 virtual int compare(
const char *
string)
const;
244 inline int collate(
const char *
string)
const
245 {
return compare(
string);}
253 bool equal(
const char *
string)
const;
259 virtual void retain(
void);
271 virtual cstring *c_copy(
void)
const;
279 virtual void cow(strsize_t size = 0);
281 strsize_t getStringSize(
void)
const;
287 #if _MSC_VER > 1400 // windows broken dll linkage issue...
288 const static strsize_t npos = ((
strsize_t)-1);
322 String(strsize_t size,
char fill);
331 String(strsize_t size,
const char *format, ...) __PRINTF(3, 4);
346 String(const
char *text, strsize_t size);
354 String(const
char *text, const
char *end);
375 String get(strsize_t offset, strsize_t size = 0) const;
382 int scanf(const
char *format, ...) __SCANF(2, 3);
390 int vscanf(const
char *format, va_list args) __SCANF(2, 0);
397 strsize_t printf(const
char *format, ...) __PRINTF(2, 3);
405 strsize_t vprintf(const
char *format, va_list args) __PRINTF(2, 0);
411 char *c_mem(
void) const;
417 const
char *c_str(
void) const;
424 virtual
bool resize(strsize_t size);
430 void set(const
char *text);
439 void set(strsize_t offset, const
char *text, strsize_t size = 0);
448 void set(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
457 void rset(const
char *text,
char overflow, strsize_t offset, strsize_t size = 0);
463 void add(const
char *text);
469 void add(
char character);
475 void trim(const
char *list);
481 inline
void trim(strsize_t count = 1)
488 void chop(
const char *list);
494 inline void chop(strsize_t count = 1)
501 void strip(
const char *list);
508 bool unquote(
const char *quote);
515 void cut(strsize_t offset, strsize_t size = 0);
523 void paste(strsize_t offset,
const char *text, strsize_t size = 0);
530 void clear(strsize_t offset, strsize_t size = 0);
557 strsize_t ccount(
const char *list)
const;
563 strsize_t count(
void)
const;
569 strsize_t size(
void)
const;
580 strsize_t offset(
const char *
pointer)
const;
587 char at(
int position)
const;
593 const char *begin(
void)
const;
599 const char *end(
void)
const;
607 const char *skip(
const char *list, strsize_t offset = 0)
const;
616 const char *rskip(
const char *list, strsize_t offset = npos)
const;
623 const char *search(
const char *
string,
unsigned instance = 0,
unsigned flags = 0)
const;
625 const char *search(regex& expr,
unsigned instance = 0,
unsigned flags = 0)
const;
627 unsigned replace(
const char *
string,
const char *text = NULL,
unsigned flags = 0);
629 unsigned replace(regex& expr,
const char *text = NULL,
unsigned flags = 0);
637 const char *find(
const char *list, strsize_t offset = 0)
const;
645 const char *rfind(
const char *list, strsize_t offset = npos)
const;
652 void split(
const char *
pointer);
659 void split(strsize_t offset);
666 void rsplit(
const char *
pointer);
673 void rsplit(strsize_t offset);
680 const char *chr(
char character)
const;
688 const char *rchr(
char character)
const;
694 strsize_t len(
void)
const;
706 inline operator const char *()
const
720 bool full(
void)
const;
728 String operator()(
int offset, strsize_t size)
const;
736 {
return operator()(0, size);}
744 {
return operator()(-((
int)offset), 0);}
753 {
return operator()((
int)offset, size);}
762 const char *operator()(
int offset)
const;
769 const char operator[](
int offset)
const;
775 bool operator!()
const;
781 operator bool()
const;
794 String& operator|=(
const char *text);
796 String& operator&=(
const char *text);
803 String& operator+=(
const char *text);
810 String& operator^=(
const char *text);
816 String operator+(
const char *text);
824 String& operator|(
const char *text);
832 String& operator&(
const char *text);
842 bool operator*=(
const char *substring);
844 bool operator*=(regex& expr);
850 String& operator=(
const char *text);
861 String& operator+=(strsize_t number);
872 String& operator-=(strsize_t number);
878 String& operator*=(strsize_t number);
885 bool operator==(
const char *text)
const;
892 bool operator!=(
const char *text)
const;
899 bool operator<(
const char *text)
const;
906 bool operator<=(
const char *text)
const;
913 bool operator>(
const char *text)
const;
920 bool operator>=(
const char *text)
const;
922 inline String& operator<<(
const char *text)
923 {add(text);
return *
this;}
925 inline String& operator<<(
char code)
926 {add(code);
return *
this;}
933 String &operator%(
short& value);
940 String &operator%(
unsigned short& value);
947 String &operator%(
long& value);
954 String &operator%(
unsigned long& value);
961 String &operator%(
double& value);
968 String &operator%(
const char *text);
975 static void swap(String& object1, String& object2);
981 static void fix(String&
object);
987 static void erase(
char *text);
993 static void lower(
char *text);
999 static void upper(
char *text);
1014 static char *token(
char *text,
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL);
1022 static char *skip(
char *text,
const char *list);
1030 static char *rskip(
char *text,
const char *list);
1039 static char *unquote(
char *text,
const char *quote);
1048 static char *rset(
char *buffer,
size_t size,
const char *text);
1058 static char *set(
char *buffer,
size_t size,
const char *text);
1069 static char *set(
char *buffer,
size_t size,
const char *text,
size_t max);
1080 static char *add(
char *buffer,
size_t size,
const char *text);
1092 static char *add(
char *buffer,
size_t size,
const char *text,
size_t max);
1101 static const char *ifind(
const char *text,
const char *key,
const char *optional);
1110 static const char *find(
const char *text,
const char *key,
const char *optional);
1117 static size_t count(
const char *text);
1125 static int compare(
const char *text1,
const char *text2);
1127 static inline int collate(
const char *text1,
const char *text2)
1128 {
return compare(text1, text2);}
1136 static bool equal(
const char *text1,
const char *text2);
1145 static int compare(
const char *text1,
const char *text2,
size_t size);
1154 static bool equal(
const char *text1,
const char *text2,
size_t size);
1162 static int case_compare(
const char *text1,
const char *text2);
1170 static bool eq_case(
const char *text1,
const char *text2);
1179 static int case_compare(
const char *text1,
const char *text2,
size_t size);
1188 static bool eq_case(
const char *text1,
const char *text2,
size_t size);
1197 static char *trim(
char *text,
const char *list);
1206 static char *chop(
char *text,
const char *list);
1215 static char *strip(
char *text,
const char *list);
1225 static char *fill(
char *text,
size_t size,
char character);
1233 static unsigned ccount(
const char *text,
const char *list);
1241 static char *find(
char *text,
const char *list);
1249 static size_t seek(
char *text,
const char *list);
1257 static char *rfind(
char *text,
const char *list);
1264 static char *
dup(
const char *text);
1272 static char *left(
const char *text,
size_t size);
1280 static const char *pos(
const char *text, ssize_t offset);
1282 inline static char *right(
const char *text,
size_t size)
1283 {
return dup(pos(text, -(
signed)size));}
1285 inline static char *
copy(
const char *text,
size_t offset,
size_t len)
1286 {
return left(pos(text, offset), len);}
1288 static void cut(
char *text,
size_t offset,
size_t len);
1290 static void paste(
char *text,
size_t max,
size_t offset,
const char *data,
size_t len = 0);
1304 inline char *
token(
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL)
1305 {
return token(c_mem(), last, list, quote, end);}
1314 {
return strtod(c_mem(),
pointer);}
1323 {
return strtol(c_mem(),
pointer, 0);}
1331 inline static double tod(
const char *text,
char **
pointer = NULL)
1332 {
return strtod(text,
pointer);}
1341 {
return strtol(text,
pointer, 0);}
1351 static size_t b64encode(
char *
string,
const uint8_t *binary,
size_t size,
size_t width = 0);
1360 static size_t b64decode(uint8_t *binary,
const char *
string,
size_t size);
1368 static uint32_t crc24(uint8_t *binary,
size_t size);
1376 static uint16_t crc16(uint8_t *binary,
size_t size);
1385 static unsigned hexdump(
const unsigned char *binary,
char *
string,
const char *format);
1394 static unsigned hexpack(
unsigned char *binary,
const char *
string,
const char *format);
1396 static unsigned hexsize(
const char *format);
1409 #if _MSC_VER > 1400 // windows broken dll linkage issue...
1410 const static size_t header =
sizeof(String::cstring);
1412 static const size_t header;
1416 bool resize(strsize_t size);
1417 void cow(strsize_t adj = 0);
1421 cstring *c_copy(
void)
const;
1429 {set(
object.c_str());}
1444 memstring(
void *memory, strsize_t size,
char fill = 0);
1456 static memstring *create(strsize_t size,
char fill = 0);
1464 static memstring *create(MemoryProtocol *
pager, strsize_t size,
char fill = 0);
1520 inline operator bool()
const
1528 {
return buffer[0] == 0;}
1534 inline operator char *()
1550 {
return buffer[offset];}
1558 {
return buffer + offset;}
1572 {
return strlen(buffer);}
1580 typedef String::regex stringex_t;
1592 template<str
size_t S>
1596 char buffer[
sizeof(cstring) + S];
1625 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1628 #define stricmp(x,y) String::case_compare(x,y)
1632 #define strnicmp(x,y,z) String::case_compare(x,y,z)
1643 inline bool eq(
char const *s1,
char const *s2)
1646 inline bool ne(
char const *s1,
char const *s2)
1656 inline bool eq(
char const *s1,
char const *s2,
size_t size)
1659 inline bool ne(
char const *s1,
char const *s2,
size_t size)
1674 inline bool ne(String &s1, String &s2)
1675 {
return s1.compare(s2) != 0;}
1677 inline bool lt(String &s1,
const char *s2)
1678 {
return s1.compare(s2) < 0;}
1680 inline bool gt(String &s1,
const char *s2)
1681 {
return s1.compare(s2) > 0;}
1683 inline bool le(String &s1,
const char *s2)
1684 {
return s1.compare(s2) <= 0;}
1686 inline bool ge(String &s1,
const char *s2)
1687 {
return s1.compare(s2) >= 0;}
1696 inline bool eq_case(
char const *s1,
char const *s2)
1699 inline bool ne_case(
char const *s1,
char const *s2)
1710 inline bool eq_case(
char const *s1,
char const *s2,
size_t size)
1713 inline String str(
const char *
string)
1714 {
return (String)string;}
1716 inline String str(String&
string)
1717 {
return (String)string;}
1719 inline String str(
short value)
1720 {String temp(16,
"%hd", value);
return temp;}
1722 inline String str(
unsigned short value)
1723 {String temp(16,
"%hu", value);
return temp;}
1725 inline String str(
long value)
1726 {String temp(32,
"%ld", value);
return temp;}
1728 inline String str(
unsigned long value)
1729 {String temp(32,
"%lu", value);
return temp;}
1731 inline String str(
double value)
1732 {String temp(40,
"%f", value);
return temp;}
1734 String str(CharacterProtocol& cp, strsize_t size);
1737 inline void swap<string_t>(string_t& s1, string_t& s2)
1740 class __EXPORT strdup_t
1749 inline strdup_t(
char *str)
1753 {
if(data) ::free(data);}
1755 inline strdup_t& operator=(
char *str)
1756 {
if(data) ::free(data); data = str;
return *
this;}
1758 inline operator bool()
const
1759 {
return data != NULL;}
1761 inline bool operator!()
const
1762 {
return data == NULL;}
1764 inline operator char*()
const
1767 inline const char *c_str(
void)
const
1770 inline const char *operator*()
const
1773 inline char& operator[](
int size)
1774 {
return data[size];}
1776 inline char *operator+(
size_t size)
1777 {
return data + size;}
void operator=(String &object)
Assign a string buffer from another string object.
A common base class for all managed objects.
A base class for reference counted objects.
String left(strsize_t size) const
Convenience method for left of string.
charbuf(const charbuf ©)
Copy constructor.
A common object base class with auto-pointer support.
void swap(T &o1, T &o2)
Convenience function to swap objects.
void release(SharedAccess &object)
Convenience function to unlock shared object through it's protocol.
void operator+=(const char *text)
Concatenate text into the object.
bool equal(const char *string) const
Test if two string values are equal.
virtual int compare(const char *string) const
Compare the values of two string.
A copy-on-write string class that operates by reference count.
Common namespace for all ucommon objects.
static bool eq_case(const char *text1, const char *text2)
Simple case insensitive equal test for strings.
String string_t
A convenience type for string.
void retain(ObjectProtocol *object)
Convenience function to access object retention.
charbuf(const char *text)
Create a character buffer with assigned text.
static void swap(String &object1, String &object2)
Swap the cstring references between two strings.
static long tol(const char *text, char **pointer=((void *) 0))
Convert text to a long value.
stringbuf()
Create an empty instance of a string buffer.
Generic smart pointer class.
void operator=(String &object)
Assign the text of a string to our object.
Mempager managed type factory for pager pool objects.
const char * c_str(void) const
Get character text buffer of string object.
char * operator*()
Get text by object pointer reference.
void set(const char *text)
Set string object to text of a null terminated string.
size_t len(void) const
Get current length of string.
void chop(strsize_t count=1)
Chop trailing characters from text.
A common string class and character string support functions.
String right(strsize_t offset) const
Convenience method for right of string.
size_t size(void) const
Get allocated size of the object.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
Abstract interfaces and support.
const char * operator*() const
Reference raw text buffer by pointer operator.
static const strsize_t npos
A constant for an invalid position value.
void operator=(const char *text)
Assign a string buffer from a null terminated string.
A template to create a character array that can be manipulated as a string.
A string class that uses a cstring buffer that is fixed in memory.
void add(const char *text)
Append null terminated text to our string buffer.
static double tod(const char *text, char **pointer=((void *) 0))
Convert text to a double value.
String copy(strsize_t offset, strsize_t size) const
Convenience method for substring extraction.
unsigned short strsize_t
A convenience class for size of strings.
ObjectProtocol * copy(ObjectProtocol *object)
Convenience function to access object copy.
charbuf()
Create a new character buffer with an empty string.
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.
void operator=(const char *text)
Assign null terminated text to our object.
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
Compare two socket addresses to see if equal.
double tod(char **pointer=((void *) 0))
Convert string to a double value.
stringbuf(const char *text)
Create a string buffer from a null terminated string.
cstring * str
cstring instance our object references.
Generic templates for C++.
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.
T * dup(const T &object)
Convenience function to duplicate object pointer to heap.
char & operator[](size_t offset) const
Array operator to get a character from the object.
bool eq_case(char const *s1, char const *s2)
Compare two null terminated strings if equal ignoring case.
void operator=(const char *text)
Assign null terminated text to the object.
A string class that has a predefined string buffer.