ucommon
string.h
Go to the documentation of this file.
1 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
2 //
3 // This file is part of GNU uCommon C++.
4 //
5 // GNU uCommon C++ is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // GNU uCommon C++ is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with GNU uCommon C++. If not, see <http://www.gnu.org/licenses/>.
17 
35 #ifndef _UCOMMON_STRING_H_
36 #define _UCOMMON_STRING_H_
37 
38 #ifndef _UCOMMON_CPR_H_
39 #include <ucommon/cpr.h>
40 #endif
41 
42 #ifndef _UCOMMON_GENERICS_H_
43 #include <ucommon/generics.h>
44 #endif
45 
46 #ifndef _UCOMMON_PROTOCOLS_H_
47 #include <ucommon/protocols.h>
48 #endif
49 
50 #ifndef _UCOMMON_OBJECT_H_
51 #include <ucommon/object.h>
52 #endif
53 
54 #include <stdio.h>
55 #include <string.h>
56 #include <stdarg.h>
57 
58 #ifdef HAVE_DIRENT_H
59 #include <dirent.h>
60 #endif
61 
62 #define PGP_B64_WIDTH 64
63 #define MIME_B64_WIDTH 76
64 
65 NAMESPACE_UCOMMON
66 
70 typedef unsigned short strsize_t;
71 
82 class __EXPORT string : public ObjectProtocol
83 {
84 protected:
96 public:
97  class __EXPORT cstring : public CountedObject
98  {
99  public:
100 #pragma pack(1)
103  char fill;
104  char text[1];
105 #pragma pack()
106 
112  cstring(strsize_t size);
113 
121  cstring(strsize_t size, char fill);
122 
130  void clear(strsize_t offset, strsize_t size);
131 
138  void set(strsize_t offset, const char *text, strsize_t size);
139 
144  void set(const char *text);
145 
150  void add(const char *text);
151 
156  void add(char character);
157 
161  void fix(void);
162 
167  void unfix(void);
168 
174  void inc(strsize_t number);
175 
181  void dec(strsize_t number);
182  };
183 
184 protected:
193  cstring *create(strsize_t size, char fill = 0) const;
194 
202  virtual int compare(const char *string) const;
203 
204  inline int collate(const char *string) const
205  {return compare(string);};
206 
212  bool equal(const char *string) const;
213 
218  virtual void retain(void);
219 
224  virtual void release(void);
225 
230  virtual cstring *c_copy(void) const;
231 
238  virtual void cow(strsize_t size = 0);
239 
240  strsize_t getStringSize(void);
241 
242 public:
246 #if _MSC_VER > 1400 // windows broken dll linkage issue...
247  const static strsize_t npos = ((strsize_t)-1);
248 #else
249  static const strsize_t npos;
250 #endif
251 
252 
256  string();
257 
262  string(long value);
263 
268  string(double value);
269 
274  string(strsize_t size);
275 
281  string(strsize_t size, char fill);
282 
290  string(strsize_t size, const char *format, ...) __PRINTF(3, 4);
291 
292 
297  string(const char *text);
298 
305  string(const char *text, strsize_t size);
306 
313  string(const char *text, const char *end);
314 
320  string(const string& existing);
321 
326  virtual ~string();
327 
334  string get(strsize_t offset, strsize_t size = 0) const;
335 
341  int scanf(const char *format, ...) __SCANF(2, 3);
342 
349  int vscanf(const char *format, va_list args) __SCANF(2, 0);
350 
356  strsize_t printf(const char *format, ...) __PRINTF(2, 3);
357 
364  strsize_t vprintf(const char *format, va_list args) __PRINTF(2, 0);
365 
370  char *c_mem(void) const;
371 
376  const char *c_str(void) const;
377 
383  virtual bool resize(strsize_t size);
384 
389  void set(const char *text);
390 
398  void set(strsize_t offset, const char *text, strsize_t size = 0);
399 
407  void set(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
408 
416  void rset(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
417 
422  void add(const char *text);
423 
428  void add(char character);
429 
434  void trim(const char *list);
435 
440  void chop(const char *list);
441 
446  void strip(const char *list);
447 
453  bool unquote(const char *quote);
454 
460  void cut(strsize_t offset, strsize_t size = 0);
461 
467  void clear(strsize_t offset, strsize_t size = 0);
468 
472  void clear(void);
473 
477  void upper(void);
478 
482  void lower(void);
483 
489  strsize_t ccount(const char *list) const;
490 
495  strsize_t count(void) const;
496 
501  strsize_t size(void) const;
502 
512  strsize_t offset(const char *pointer) const;
513 
519  char at(int position) const;
520 
526  const char *last(const char *list) const;
527 
533  const char *first(const char *list) const;
534 
539  const char *begin(void) const;
540 
545  const char *end(void) const;
546 
553  const char *skip(const char *list, strsize_t offset = 0) const;
554 
562  const char *rskip(const char *list, strsize_t offset = npos) const;
563 
570  const char *find(const char *list, strsize_t offset = 0) const;
571 
578  const char *rfind(const char *list, strsize_t offset = npos) const;
579 
585  void split(const char *pointer);
586 
592  void split(strsize_t offset);
593 
599  void rsplit(const char *pointer);
600 
606  void rsplit(strsize_t offset);
607 
613  const char *chr(char character) const;
614 
621  const char *rchr(char character) const;
622 
627  strsize_t len(void);
628 
633  char fill(void);
634 
639  inline operator const char *() const
640  {return c_str();};
641 
646  inline const char *operator*() const
647  {return c_str();};
648 
653  bool full(void) const;
654 
661  string operator()(int offset, strsize_t size) const;
662 
670  const char *operator()(int offset) const;
671 
677  const char operator[](int offset) const;
678 
683  bool operator!() const;
684 
689  operator bool() const;
690 
696  string& operator^=(const string& object);
697 
703  string& operator+=(const char *text);
704 
710  string& operator^=(const char *text);
711 
717  string& operator+(const char *text);
718 
725  string& operator&(const char *text);
726 
733  string& operator=(const string& object);
734 
739  string& operator=(const char *text);
740 
744  string& operator++(void);
745 
750  string& operator+=(strsize_t number);
751 
755  string& operator--(void);
756 
761  string& operator-=(strsize_t number);
762 
768  bool operator==(const char *text) const;
769 
775  bool operator!=(const char *text) const;
776 
782  bool operator<(const char *text) const;
783 
789  bool operator<=(const char *text) const;
790 
796  bool operator>(const char *text) const;
797 
803  bool operator>=(const char *text) const;
804 
810  string &operator%(short& value);
811 
817  string &operator%(unsigned short& value);
818 
824  string &operator%(long& value);
825 
831  string &operator%(unsigned long& value);
832 
838  string &operator%(double& value);
839 
845  string &operator%(const char *text);
846 
853  static int scanf(string& object, const char *format, ...) __SCANF(2, 3);
854 
861  static strsize_t printf(string& object, const char *format, ...) __PRINTF(2, 3);
862 
868  static void swap(string& object1, string& object2);
869 
874  static void fix(string& object);
875 
880  static void lower(char *text);
881 
886  static void upper(char *text);
887 
901  static char *token(char *text, char **last, const char *list, const char *quote = NULL, const char *end = NULL);
902 
909  static char *skip(char *text, const char *list);
910 
917  static char *rskip(char *text, const char *list);
918 
926  static char *unquote(char *text, const char *quote);
927 
935  static char *rset(char *buffer, size_t size, const char *text);
936 
945  static char *set(char *buffer, size_t size, const char *text);
946 
956  static char *set(char *buffer, size_t size, const char *text, size_t max);
957 
967  static char *add(char *buffer, size_t size, const char *text);
968 
979  static char *add(char *buffer, size_t size, const char *text, size_t max);
980 
988  static const char *ifind(const char *text, const char *key, const char *optional);
989 
997  static const char *find(const char *text, const char *key, const char *optional);
998 
1004  static size_t count(const char *text);
1005 
1012  static int compare(const char *text1, const char *text2);
1013 
1014  static inline int collate(const char *text1, const char *text2)
1015  {return compare(text1, text2);};
1016 
1023  static bool equal(const char *text1, const char *text2);
1024 
1032  static int compare(const char *text1, const char *text2, size_t size);
1033 
1041  static bool equal(const char *text1, const char *text2, size_t size);
1042 
1049  static int case_compare(const char *text1, const char *text2);
1050 
1057  static bool case_equal(const char *text1, const char *text2);
1058 
1066  static int case_compare(const char *text1, const char *text2, size_t size);
1067 
1075  static bool case_equal(const char *text1, const char *text2, size_t size);
1076 
1084  static char *trim(char *text, const char *list);
1085 
1093  static char *chop(char *text, const char *list);
1094 
1102  static char *strip(char *text, const char *list);
1103 
1112  static char *fill(char *text, size_t size, char character);
1113 
1120  static unsigned ccount(const char *text, const char *list);
1121 
1128  static char *find(char *text, const char *list);
1129 
1136  static char *rfind(char *text, const char *list);
1137 
1144  static char *first(char *text, const char *list);
1145 
1152  static char *last(char *text, const char *list);
1153 
1159  static char *dup(const char *text);
1160 
1174  inline static char *token(string& object, char **last, const char *list, const char *quote = NULL, const char *end = NULL)
1175  {return token(object.c_mem(), last, list, quote, end);};
1176 
1184  __SCANF(2,0) inline static int vscanf(string& object, const char *format, va_list args)
1185  {return object.vscanf(format, args);}
1186 
1194  __PRINTF(2,0) inline static strsize_t vprintf(string& object, const char *format, va_list args)
1195  {return object.vprintf(format, args);}
1196 
1202  inline static strsize_t len(string& object)
1203  {return object.len();};
1204 
1210  inline static char *mem(string& object)
1211  {return object.c_mem();};
1212 
1218  inline static strsize_t size(string& object)
1219  {return object.size();};
1220 
1225  inline static void clear(string& object)
1226  {object.clear();};
1227 
1234  inline static unsigned ccount(string& object, const char *list)
1235  {return object.ccount(list);};
1236 
1242  inline static size_t count(string& object)
1243  {return object.count();};
1244 
1249  inline static void upper(string& object)
1250  {object.upper();};
1251 
1256  inline static void lower(string& object)
1257  {object.lower();};
1258 
1265  inline static bool unquote(string& object, const char *quote)
1266  {return object.unquote(quote);};
1267 
1273  inline static void trim(string& object, const char *list)
1274  {object.trim(list);};
1275 
1281  inline static void chop(string& object, const char *list)
1282  {object.trim(list);};
1283 
1289  inline static void strip(string& object, const char *list)
1290  {object.trim(list);};
1291 
1298  inline static const char *find(string& object, const char *list)
1299  {return object.find(list);};
1300 
1307  inline static const char *rfind(string& object, const char *list)
1308  {return object.rfind(list);};
1309 
1316  inline static const char *first(string& object, const char *list)
1317  {return object.first(list);};
1318 
1325  inline static const char *last(string& object, const char *list)
1326  {return object.last(list);};
1327 
1334  inline static double tod(string& object, char **pointer = NULL)
1335  {return strtod(mem(object), pointer);};
1336 
1343  inline static long tol(string& object, char **pointer = NULL)
1344  {return strtol(mem(object), pointer, 0);};
1345 
1352  inline static double tod(const char *text, char **pointer = NULL)
1353  {return strtod(text, pointer);};
1354 
1361  inline static long tol(const char *text, char **pointer = NULL)
1362  {return strtol(text, pointer, 0);};
1363 
1372  static size_t b64encode(char *string, const uint8_t *binary, size_t size, size_t width = 0);
1373 
1381  static size_t b64decode(uint8_t *binary, const char *string, size_t size);
1382 
1389  static uint32_t crc24(uint8_t *binary, size_t size);
1390 
1397  static uint16_t crc16(uint8_t *binary, size_t size);
1398 
1406  static unsigned hexdump(const unsigned char *binary, char *string, const char *format);
1407 
1415  static unsigned hexpack(unsigned char *binary, const char *string, const char *format);
1416 
1417  static unsigned hexsize(const char *format);
1418 };
1419 
1427 class __EXPORT memstring : public string
1428 {
1429 public:
1430 #if _MSC_VER > 1400 // windows broken dll linkage issue...
1431  const static size_t header = sizeof(string::cstring);
1432 #else
1433  static const size_t header;
1434 #endif
1435 
1436 private:
1437  bool resize(strsize_t size);
1438  void cow(strsize_t adj = 0);
1439  void release(void);
1440 
1441 protected:
1442  cstring *c_copy(void) const;
1443 
1444 public:
1449  inline void operator=(string& object)
1450  {set(object.c_str());};
1451 
1456  inline void operator=(const char *text)
1457  {set(text);};
1458 
1465  memstring(void *memory, strsize_t size, char fill = 0);
1466 
1470  ~memstring();
1471 
1477  static memstring *create(strsize_t size, char fill = 0);
1478 
1485  static memstring *create(MemoryProtocol *pager, strsize_t size, char fill = 0);
1486 };
1487 
1495 template<size_t S>
1496 class charbuf
1497 {
1498 private:
1499  char buffer[S];
1500 
1501 public:
1505  inline charbuf()
1506  {buffer[0] = 0;};
1507 
1513  inline charbuf(const char *text)
1514  {string::set(buffer, S, text);};
1515 
1520  inline void operator=(const char *text)
1521  {string::set(buffer, S, text);};
1522 
1528  inline void operator+=(const char *text)
1529  {string::add(buffer, S, text);};
1530 
1535  inline operator bool() const
1536  {return buffer[0];};
1537 
1542  inline bool operator!() const
1543  {return buffer[0] == 0;};
1544 
1549  inline operator char *()
1550  {return buffer;};
1551 
1556  inline char *operator*()
1557  {return buffer;};
1558 
1564  inline char operator[](size_t offset) const
1565  {return buffer[offset];};
1566 
1572  inline char *operator()(size_t offset)
1573  {return buffer + offset;};
1574 
1579  inline size_t size(void) const
1580  {return S;};
1581 };
1582 
1586 typedef string string_t;
1587 
1592 typedef string String;
1593 
1604 template<strsize_t S>
1605 class stringbuf : public memstring
1606 {
1607 private:
1608  char buffer[sizeof(cstring) + S];
1609 
1610 public:
1614  inline stringbuf() : memstring(buffer, S) {};
1615 
1620  inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
1621 
1626  inline void operator=(const char *text)
1627  {set(text);};
1628 
1633  inline void operator=(string& object)
1634  {set(object.c_str());};
1635 };
1636 
1637 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
1638 
1645 extern "C" inline int stricmp(const char *string1, const char *string2)
1646  {return string::case_compare(string1, string2);}
1647 
1655 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
1656  {return string::case_compare(string1, string2, max);}
1657 
1658 #endif
1659 
1666 inline bool eq(char const *s1, char const *s2)
1667  {return String::equal(s1, s2);}
1668 
1676 inline bool eq(char const *s1, char const *s2, size_t size)
1677  {return String::equal(s1, s2, size);}
1678 
1685 inline bool eq(String &s1, String &s2)
1686  {return String::equal(s1.c_str(), s2.c_str());}
1687 
1695 inline bool case_eq(char const *s1, char const *s2)
1696  {return String::case_equal(s1, s2);}
1697 
1698 // to be depreciated...
1699 inline bool ieq(char const *s1, char const *s2)
1700  {return String::case_equal(s1, s2);}
1701 
1710 inline bool case_eq(char const *s1, char const *s2, size_t size)
1711  {return String::case_equal(s1, s2, size);}
1712 
1713 inline bool ieq(char const *s1, char const *s2, size_t size)
1714  {return String::case_equal(s1, s2, size);}
1715 
1723 inline bool ieq(String &s1, String &s2)
1724  {return String::case_equal(s1.c_str(), s2.c_str());}
1725 
1726 inline String str(const char *string)
1727  {return (String)string;}
1728 
1729 inline String str(String& string)
1730  {return (String)string;}
1731 
1732 inline String str(short value)
1733  {String temp(16, "%hd", value); return temp;}
1734 
1735 inline String str(unsigned short value)
1736  {String temp(16, "%hu", value); return temp;}
1737 
1738 inline String str(long value)
1739  {String temp(32, "%ld", value); return temp;}
1740 
1741 inline String str(unsigned long value)
1742  {String temp(32, "%lu", value); return temp;}
1743 
1744 inline String str(double value)
1745  {String temp(40, "%f", value); return temp;}
1746 
1747 String str(CharacterProtocol& cp, strsize_t size);
1748 
1749 template<>
1750 inline void swap<string_t>(string_t& s1, string_t& s2)
1751  {String::swap(s1, s2);}
1752 
1753 END_NAMESPACE
1754 
1755 #endif