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
78class __EXPORT String :
public __PROTOCOL ObjectProtocol
105 __DELETE_COPY(regex);
108 regex(
const char *pattern,
size_t size = 1);
109 regex(
size_t size = 1);
112 size_t offset(
unsigned member);
113 size_t size(
unsigned member);
115 inline size_t members(
void)
const {
119 bool match(
const char *text,
unsigned flags = 0);
121 regex& operator=(
const char *
string);
123 bool operator*=(
const char *
string);
125 operator bool()
const {
126 return object != NULL;
129 bool operator!()
const {
130 return object == NULL;
134 class __EXPORT cstring :
public CountedObject
137 __DELETE_COPY(cstring);
140 virtual void dealloc(
void) __OVERRIDE;
154 cstring(
size_t size);
160 void clear(
size_t offset);
168 void set(
size_t offset,
const char *text,
size_t size);
174 void set(
const char *text);
180 void add(
const char *text);
186 void add(
char character);
198 void inc(
size_t number);
205 void dec(
size_t number);
216 cstring *create(
size_t size)
const;
226 virtual int compare(
const char *
string)
const;
234 bool equal(
const char *
string)
const;
240 virtual void retain(
void) __OVERRIDE;
246 virtual void release(
void) __OVERRIDE;
252 virtual cstring *c_copy(
void)
const;
260 virtual void cow(
size_t size = 0);
262 size_t getStringSize(
void)
const;
265 const static size_t npos = ((size_t)-1);
266 const static char eos =
'\0';
286 String(
size_t size,
const char *format, ...);
293 String(
const char *text);
301 String(
const char *text,
size_t size);
309 String(
const char *text,
const char *end);
316 String(
const String& existing);
330 String get(
size_t offset,
size_t size = 0)
const;
337 int scanf(
const char *format, ...) __SCANF(2, 3);
345 int vscanf(const
char *format, va_list args) __SCANF(2, 0);
352 size_t printf(const
char *format, ...) __PRINTF(2, 3);
360 size_t vprintf(const
char *format, va_list args) __PRINTF(2, 0);
368 inline
char *c_mem() {
376 const char *c_str(
void)
const;
383 virtual bool resize(
size_t size);
389 void set(
const char *text);
398 void set(
size_t offset,
const char *text,
size_t size = 0);
407 void set(
const char *text,
char overflow,
size_t offset,
size_t size = 0);
416 void rset(
const char *text,
char overflow,
size_t offset,
size_t size = 0);
422 void add(
const char *text);
428 void add(
char character);
434 void trim(
const char *list);
440 inline void trim(
size_t count = 1) {
448 void chop(
const char *list);
454 inline void chop(
size_t count = 1) {
462 void strip(
const char *list);
469 bool unquote(
const char *quote);
476 void cut(
size_t offset,
size_t size = 0);
484 void paste(
size_t offset,
const char *text,
size_t size = 0);
490 void clear(
size_t offset);
517 size_t ccount(
const char *list)
const;
523 size_t count(
void)
const;
529 size_t size(
void)
const;
540 size_t offset(
const char *pointer)
const;
547 char at(
int position)
const;
553 const char *begin(
void)
const;
559 const char *end(
void)
const;
567 const char *skip(
const char *list,
size_t offset = 0)
const;
576 const char *rskip(
const char *list,
size_t offset = npos)
const;
583 const char *search(
const char *
string,
unsigned instance = 0,
unsigned flags = 0)
const;
585 const char *search(regex& expr,
unsigned instance = 0,
unsigned flags = 0)
const;
587 unsigned replace(
const char *
string,
const char *text = NULL,
unsigned flags = 0);
589 unsigned replace(regex& expr,
const char *text = NULL,
unsigned flags = 0);
597 const char *find(
const char *list,
size_t offset = 0)
const;
605 const char *rfind(
const char *list,
size_t offset = npos)
const;
612 void split(
const char *pointer);
619 void split(
size_t offset);
621 void fill(
size_t size,
char fill);
628 void rsplit(
const char *pointer);
635 void rsplit(
size_t offset);
642 const char *chr(
char character)
const;
650 const char *rchr(
char character)
const;
656 size_t len(
void)
const;
662 inline operator const char *()
const {
670 inline const char *operator*()
const {
678 bool full(
void)
const;
686 String operator()(
int offset,
size_t size)
const;
693 inline String left(
size_t size)
const {
694 return operator()(0, size);
702 inline String right(
size_t offset)
const {
703 return operator()(-((
int)offset), 0);
712 inline String
copy(
size_t offset,
size_t size)
const {
713 return operator()((
int)offset, size);
723 const char *operator()(
int offset)
const;
730 const char operator[](
int offset)
const;
736 bool operator!()
const;
742 operator bool()
const;
749 String& operator^=(
const String&
object);
755 String& operator|=(
const char *text);
757 String& operator&=(
const char *text);
764 String& operator+=(
const char *text);
771 String& operator^=(
const char *text);
777 const String operator+(
const char *text)
const;
785 String& operator|(
const char *text);
793 String& operator&(
const char *text);
801 String& operator=(
const String&
object);
803 bool operator*=(
const char *substring);
805 bool operator*=(regex& expr);
811 String& operator=(
const char *text);
816 String& operator++(
void);
822 String& operator+=(
size_t number);
827 String& operator--(
void);
833 String& operator-=(
size_t number);
839 String& operator*=(
size_t number);
846 bool operator==(
const char *text)
const;
853 bool operator!=(
const char *text)
const;
860 bool operator<(
const char *text)
const;
867 bool operator<=(
const char *text)
const;
874 bool operator>(
const char *text)
const;
881 bool operator>=(
const char *text)
const;
883 inline String& operator<<(
const char *text) {
884 add(text);
return *
this;
887 inline String& operator<<(
char code) {
888 add(code);
return *
this;
896 String &operator%(
short& value);
903 String &operator%(
unsigned short& value);
910 String &operator%(
long& value);
917 String &operator%(
unsigned long& value);
924 String &operator%(
double& value);
931 String &operator%(
const char *text);
938 static void swap(String& object1, String& object2);
944 static void fix(String&
object);
953 static bool check(
const char *
string,
size_t maximum,
size_t minimum = 0);
959 static void erase(
char *text);
965 static void lower(
char *text);
971 static void upper(
char *text);
986 static char *token(
char *text,
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL);
994 static char *skip(
char *text,
const char *list);
1002 static char *rskip(
char *text,
const char *list);
1011 static char *unquote(
char *text,
const char *quote);
1020 static char *rset(
char *buffer,
size_t size,
const char *text);
1030 static char *set(
char *buffer,
size_t size,
const char *text);
1041 static char *set(
char *buffer,
size_t size,
const char *text,
size_t max);
1052 static char *add(
char *buffer,
size_t size,
const char *text);
1064 static char *add(
char *buffer,
size_t size,
const char *text,
size_t max);
1073 static const char *ifind(
const char *text,
const char *key,
const char *optional);
1082 static const char *find(
const char *text,
const char *key,
const char *optional);
1089 static size_t count(
const char *text);
1097 static int compare(
const char *text1,
const char *text2);
1099 inline static int collate(
const char *text1,
const char *text2) {
1100 return compare(text1, text2);
1109 static bool equal(
const char *text1,
const char *text2);
1118 static int compare(
const char *text1,
const char *text2,
size_t size);
1127 static bool equal(
const char *text1,
const char *text2,
size_t size);
1135 static bool eq_case(
const char *text1,
const char *text2);
1144 static bool eq_case(
const char *text1,
const char *text2,
size_t size);
1153 static char *trim(
char *text,
const char *list);
1162 static char *chop(
char *text,
const char *list);
1171 static char *strip(
char *text,
const char *list);
1181 static char *fill(
char *text,
size_t size,
char character);
1189 static unsigned ccount(
const char *text,
const char *list);
1197 static char *find(
char *text,
const char *list);
1205 static size_t seek(
char *text,
const char *list);
1213 static char *rfind(
char *text,
const char *list);
1220 static char *
dup(
const char *text);
1228 static char *left(
const char *text,
size_t size);
1236 static const char *pos(
const char *text, ssize_t offset);
1238 inline static char *right(
const char *text,
size_t size) {
1239 return dup(pos(text, -(ssize_t)size));
1242 inline static char *
copy(
const char *text,
size_t offset,
size_t len) {
1243 return left(pos(text, (ssize_t)offset), len);
1246 static void cut(
char *text,
size_t offset,
size_t len);
1248 static void paste(
char *text,
size_t max,
size_t offset,
const char *data,
size_t len = 0);
1262 inline char *token(
char **last,
const char *list,
const char *quote = NULL,
const char *end = NULL) {
1263 return token(data(), last, list, quote, end);
1272 inline double tod(
char **pointer = NULL) {
1273 return strtod(data(), pointer);
1282 inline long tol(
char **pointer = NULL) {
1283 return strtol(data(), pointer, 0);
1292 inline static double tod(
const char *text,
char **pointer = NULL) {
1293 return strtod(text, pointer);
1302 inline static long tol(
const char *text,
char **pointer = NULL) {
1303 return strtol(text, pointer, 0);
1312 static String b64(
const uint8_t *binary,
size_t size);
1314 static size_t b64size(
size_t size);
1324 static size_t b64encode(
char *
string,
const uint8_t *binary,
size_t size,
size_t width = 0);
1334 static size_t b64decode(uint8_t *binary,
const char *
string,
size_t size,
bool ws =
false);
1336 static size_t b64count(
const char *str,
bool ws =
false);
1344 static uint32_t crc24(uint8_t *binary,
size_t size);
1352 static uint16_t crc16(uint8_t *binary,
size_t size);
1360 static String hex(
const uint8_t *binary,
size_t size);
1369 static size_t hexdump(
const uint8_t *binary,
char *
string,
const char *format);
1379 static size_t hexpack(uint8_t *binary,
const char *
string,
const char *format);
1381 static size_t hex2bin(
const char *
string, uint8_t *binary,
size_t maxsize,
bool wsflag =
false);
1383 static size_t hexsize(
const char *format);
1385 static size_t hexcount(
const char *str,
bool ws =
false);
1395class __EXPORT memstring :
public String
1398 const static size_t header =
sizeof(String::cstring);
1401 bool resize(
size_t size) __FINAL;
1402 void cow(
size_t adj = 0) __FINAL;
1403 void release(
void) __FINAL;
1406 cstring *c_copy(
void) const __OVERRIDE;
1413 inline
void operator=(String&
object) {
1414 set(
object.c_str());
1421 inline void operator=(
const char *text) {
1430 memstring(
void *memory,
size_t size);
1441 static memstring *create(
size_t size);
1448 static memstring *create(MemoryProtocol *pager,
size_t size);
1478 String::set(buffer, S, text);
1485 String::set(buffer, S,
copy.buffer);
1493 String::set(buffer, S, text);
1502 String::add(buffer, S, text);
1509 inline operator bool()
const {
1518 return buffer[0] == 0;
1525 inline operator char *() {
1544 __THROW_RANGE(
"charbuf offset");
1545 return buffer[offset];
1555 __THROW_RANGE(
"charbuf range");
1556 return buffer + offset;
1571 inline size_t len(
void)
const {
1572 return strlen(buffer);
1581typedef String::regex stringex_t;
1597 char buffer[
sizeof(cstring) + S];
1626 set(
object.c_str());
1636inline bool eq(
char const *s1,
char const *s2) {
1637 return String::equal(s1, s2);
1640inline bool ne(
char const *s1,
char const *s2) {
1641 return !String::equal(s1, s2);
1651inline bool eq(
char const *s1,
char const *s2,
size_t size) {
1652 return String::equal(s1, s2, size);
1655inline bool ne(
char const *s1,
char const *s2,
size_t size) {
1656 return !String::equal(s1, s2, size);
1668inline bool eq(String &s1,
const char *s2) {
1669 return s1.compare(s2) == 0;
1672inline bool ne(String &s1, String &s2) {
1673 return s1.compare(s2) != 0;
1676inline bool lt(String &s1,
const char *s2) {
1677 return s1.compare(s2) < 0;
1680inline bool gt(String &s1,
const char *s2) {
1681 return s1.compare(s2) > 0;
1684inline bool le(String &s1,
const char *s2) {
1685 return s1.compare(s2) <= 0;
1688inline bool ge(String &s1,
const char *s2) {
1689 return s1.compare(s2) >= 0;
1699inline bool eq_case(
char const *s1,
char const *s2)
1702inline bool ne_case(
char const *s1,
char const *s2)
1713inline bool eq_case(
char const *s1,
char const *s2,
size_t size) {
1717inline String str(
const char *
string) {
1718 return (String)string;
1721inline String str(String&
string) {
1722 return (String)string;
1725inline String str(
short value) {
1726 String temp(16,
"%hd", value);
return temp;
1729inline String str(
unsigned short value) {
1730 String temp(16,
"%hu", value);
return temp;
1733inline String str(
long value) {
1734 String temp(32,
"%ld", value);
return temp;
1737inline String str(
unsigned long value) {
1738 String temp(32,
"%lu", value);
return temp;
1741inline String str(
double value) {
1742 String temp(40,
"%f", value);
return temp;
1750class __EXPORT strdup_t
1760 inline strdup_t(
char *str) {
1764 inline ~strdup_t() {
1769 inline strdup_t& operator=(
char *str) {
1776 inline operator bool()
const {
1777 return data !=
nullptr;
1780 inline bool operator!()
const {
1781 return data ==
nullptr;
1784 inline operator char*()
const {
1788 inline const char *c_str(
void)
const {
1792 inline const char *operator*()
const {
1796 inline char& operator[](
int size) {
1800 inline char *operator+(
size_t size) {
Abstract interfaces and support.
Generic templates for C++.
Common namespace for all ucommon objects.
String string_t
A convenience type for string.
T * dup(const T &object)
Convenience function to duplicate object pointer to heap.
bool eq(const struct sockaddr *s1, const struct sockaddr *s2)
Compare two socket addresses to see if equal.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
bool eq_case(char const *s1, char const *s2, size_t size)
Compare two null terminated strings if equal for a specified size ignoring case.
void swap(T &o1, T &o2)
Convenience function to swap objects.
T copy(const T &src)
Convenience function to copy objects.
bool eq_case(char const *s1, char const *s2)
Compare two null terminated strings if equal ignoring case.
A copy-on-write string class that operates by reference count.
size_t len(void) const
Get current length of string.
char & operator[](size_t offset) const
Array operator to get a character from the object.
charbuf()
Create a new character buffer with an empty string.
charbuf(const charbuf ©)
Copy constructor.
size_t size(void) const
Get allocated size of the object.
void operator+=(const char *text)
Concatenate text into the object.
char * operator*()
Get text by object pointer reference.
charbuf(const char *text)
Create a character buffer with assigned text.
bool operator!() const
Test if the object is empty.
char * operator()(size_t offset)
Get a pointer to an offset in the object by expression operator.
void operator=(const char *text)
Assign null terminated text to the object.
A string class that has a predefined string buffer.
void operator=(const char *text)
Assign a string buffer from a null terminated string.
stringbuf()
Create an empty instance of a string buffer.
void operator=(String &object)
Assign a string buffer from another string object.
stringbuf(const char *text)
Create a string buffer from a null terminated string.
A common object base class with auto-pointer support.
A common string class and character string support functions.