PTLib  Version 2.14.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pstring.h
Go to the documentation of this file.
1 /*
2  * pstring.h
3  *
4  * Character string class.
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
25  * All Rights Reserved.
26  *
27  * Contributor(s): ______________________________________.
28  *
29  * $Revision: 32211 $
30  * $Author: rjongbloed $
31  * $Date: 2014-06-25 10:46:18 +1000 (Wed, 25 Jun 2014) $
32  */
33 
34 #ifndef PTLIB_STRING_H
35 #define PTLIB_STRING_H
36 
37 #ifdef P_USE_PRAGMA
38 #pragma interface
39 #endif
40 
41 
42 #include <string>
43 #include <vector>
44 #include <ptlib/array.h>
45 
46 
48 // PString class
49 
50 class PStringArray;
51 class PRegularExpression;
52 class PString;
53 
58  const char * fmt,
59  ...
60 );
61 
66  const char * fmt,
67  va_list arg
68 );
69 
70 
71 #ifdef P_HAS_WCHAR
72 
73 typedef PBaseArray<wchar_t> PWCharArray;
74 #endif
75 
76 
111 class PString : public PCharArray
112 {
113  PCLASSINFO(PString, PCharArray);
114  public:
115  typedef const char * Initialiser;
116 
122  PString();
123 
127  PString(
128  const PString & str
129  );
130 
134  PString(
135  const PCharArray & buf
136  );
137 
142  PString(
143  const PBYTEArray & buf
144  );
145 
148  PString(
149  const std::string & str
150  );
151 
160  PString(
161  const char * cstr
162  );
163 
168 #ifdef P_HAS_WCHAR
169  PString(
170  const wchar_t * ustr
171  );
172 #endif
173 
187  PString(
188  const char * cstr,
189  PINDEX len
190  );
191 
202 #ifdef P_HAS_WCHAR
203  PString(
204  const wchar_t * ustr,
205  PINDEX len
206  );
207 
218  PString(
219  const PWCharArray & ustr
220  );
221 #endif
222 
231  PString(
232  char ch
233  );
234 
239  PString(
240  short n
241  );
242 
247  PString(
248  unsigned short n
249  );
250 
255  PString(
256  int n
257  );
258 
263  PString(
264  unsigned int n
265  );
266 
271  PString(
272  long n
273  );
274 
279  PString(
280  unsigned long n
281  );
282 
283 #ifdef HAVE_LONG_LONG_INT
284 
288  PString(
289  long long n
290  );
291 #endif
292 
293 #ifdef HAVE_UNSIGNED_LONG_LONG_INT
294 
298  PString(
299  unsigned long long n
300  );
301 #endif
302 
303 
304  /* Type of conversion to make in the conversion constructors.
305  */
317  };
318 
319  /* Contruct a new string converting from the spcified data source into
320  a string array.
321  */
322  PString(
323  ConversionType type,
324  const char * str,
325  ...
326  );
327 
328 #ifdef HAVE_LONG_LONG_INT
329  PString(
330  ConversionType type,
331  long long value,
332  unsigned param = 10
336  );
337 #endif
338 #ifdef HAVE_UNSIGNED_LONG_LONG_INT
339  PString(ConversionType type, unsigned long long value, unsigned param = 10);
340 #endif
341 
342  PString(ConversionType type, unsigned long value, unsigned param = 10);
343  PString(ConversionType type, signed long value, unsigned param = 10);
344  PString(ConversionType type, unsigned int value, unsigned param = 10);
345  PString(ConversionType type, signed int value, unsigned param = 10);
346  PString(ConversionType type, unsigned short value, unsigned param = 10);
347  PString(ConversionType type, signed short value, unsigned param = 10);
348  PString(ConversionType type, unsigned char value, unsigned param = 10);
349  PString(ConversionType type, signed char value, unsigned param = 10);
350 
351  /* Contruct a new string converting from the spcified data source into
352  a string array.
353  */
354  PString(
355  ConversionType type,
356  double value,
357  unsigned places
358  );
359 
367  PString & operator=(
368  const PString & str
369  );
370 
379  const std::string & str
380  ) { return operator=(str.c_str()); }
381 
391  PString & operator=(
392  const char * cstr
393  );
394 
403  PString & operator=(
404  char ch
405  );
406 
411  PString & operator=(
412  short n
413  );
414 
419  PString & operator=(
420  unsigned short n
421  );
422 
427  PString & operator=(
428  int n
429  );
430 
435  PString & operator=(
436  unsigned int n
437  );
438 
443  PString & operator=(
444  long n
445  );
446 
451  PString & operator=(
452  unsigned long n
453  );
454 
455 #ifdef HAVE_LONG_LONG_INT
456 
460  PString & operator=(
461  long long n
462  );
463 #endif
464 
465 #ifdef HAVE_UNSIGNED_LONG_LONG_INT
466 
470  PString & operator=(
471  unsigned long long n
472  );
473 #endif
474 
477  virtual PString & MakeEmpty();
478 
481  static const PString & Empty();
483 
490  virtual PObject * Clone() const;
491 
501  virtual Comparison Compare(
502  const PObject & obj
503  ) const;
504 
507  virtual void PrintOn(
508  ostream & strm
509  ) const;
510 
516  virtual void ReadFrom(
517  istream & strm
518  );
519 
533  virtual PINDEX HashFunction() const;
535 
550  virtual PBoolean SetSize(
551  PINDEX newSize
552  );
553 
562  virtual PBoolean IsEmpty() const;
563 
572  virtual PBoolean MakeUnique();
574 
575 
591  bool MakeMinimumSize(
592  PINDEX newLength = 0
593  );
594 
603  virtual PINDEX GetLength() const { return m_length; }
604 
611  bool operator!() const;
613 
623  const PString & str
624  ) const;
625 
638  const char * cstr
639  ) const;
640 
653  char ch
654  ) const;
655 
667  friend PString operator+(
668  const char * cstr,
669  const PString & str
670  );
671 
683  friend PString operator+(
684  char ch,
685  const PString & str
686  );
687 
694  const PString & str
695  );
696 
707  const char * cstr
708  );
709 
720  char ch
721  );
722 
723 
731  const PString & str
732  ) const;
733 
751  const char * cstr
752  ) const;
753 
771  char ch
772  ) const;
773 
790  friend PString operator&(
791  const char * cstr,
792  const PString & str
793  );
794 
811  friend PString operator&(
812  char ch,
813  const PString & str
814  );
815 
822  const PString & str
823  );
824 
840  const char * cstr
841  );
842 
843 
859  char ch
860  );
862 
863 
871  bool operator*=(
872  const PString & str
873  ) const;
874 
882  bool operator==(
883  const PString & str
884  ) const;
885 
893  bool operator!=(
894  const PString & str
895  ) const;
896 
904  bool operator<(
905  const PString & str
906  ) const;
907 
915  bool operator>(
916  const PString & str
917  ) const;
918 
926  bool operator<=(
927  const PString & str
928  ) const;
929 
937  bool operator>=(
938  const PString & str
939  ) const;
940 
941 
952  bool operator*=(
953  const char * cstr
954  ) const;
955 
966  bool operator==(
967  const char * cstr
968  ) const;
969 
980  bool operator!=(
981  const char * cstr
982  ) const;
983 
994  bool operator<(
995  const char * cstr
996  ) const;
997 
1008  bool operator>(
1009  const char * cstr
1010  ) const;
1011 
1022  bool operator<=(
1023  const char * cstr
1024  ) const;
1025 
1036  bool operator>=(
1037  const char * cstr
1038  ) const;
1039 
1050  friend bool operator*=(
1051  const char * cstr,
1052  const PString & str
1053  );
1054 
1065  friend bool operator==(
1066  const char * cstr,
1067  const PString & str
1068  );
1069 
1080  friend bool operator!=(
1081  const char * cstr,
1082  const PString & str
1083  );
1084 
1095  friend bool operator<(
1096  const char * cstr,
1097  const PString & str
1098  );
1099 
1110  friend bool operator>(
1111  const char * cstr,
1112  const PString & str
1113  );
1114 
1125  friend bool operator<=(
1126  const char * cstr,
1127  const PString & str
1128  );
1129 
1140  friend bool operator>=(
1141  const char * cstr,
1142  const PString & str
1143  );
1144 
1157  const PString & str,
1158  PINDEX count = P_MAX_INDEX,
1159  PINDEX offset = 0
1160  ) const;
1161 
1174  const char * cstr,
1175  PINDEX count = P_MAX_INDEX,
1176  PINDEX offset = 0
1177  ) const;
1179 
1180 
1184  PINDEX Find(
1185  char ch,
1186  PINDEX offset = 0
1187  ) const;
1188 
1190  PINDEX Find(
1191  const PString & str,
1192  PINDEX offset = 0
1193  ) const;
1194 
1195  /* Locate the position within the string of the character or substring. The
1196  search will begin at the character offset provided.
1197 
1198  If <code>offset</code> is beyond the length of the string, then the
1199  function will always return P_MAX_INDEX.
1200 
1201  The matching will be for identical character or string. If a search
1202  ignoring case is required then the string should be converted to a
1203  PCaselessString before the search is made.
1204 
1205  @return
1206  position of character or substring in the string, or P_MAX_INDEX if the
1207  character or substring is not in the string.
1208  */
1209  PINDEX Find(
1210  const char * cstr,
1211  PINDEX offset = 0
1212  ) const;
1213 
1215  PINDEX FindLast(
1216  char ch,
1217  PINDEX offset = P_MAX_INDEX
1218  ) const;
1219 
1221  PINDEX FindLast(
1222  const PString & str,
1223  PINDEX offset = P_MAX_INDEX
1224  ) const;
1225 
1243  PINDEX FindLast(
1244  const char * cstr,
1245  PINDEX offset = P_MAX_INDEX
1246  ) const;
1247 
1249  PINDEX FindOneOf(
1250  const PString & set,
1251  PINDEX offset = 0
1252  ) const;
1253 
1268  PINDEX FindOneOf(
1269  const char * cset,
1270  PINDEX offset = 0
1271  ) const;
1272 
1274  PINDEX FindSpan(
1275  const PString & set,
1276  PINDEX offset = 0
1277  ) const;
1278 
1294  PINDEX FindSpan(
1295  const char * cset,
1296  PINDEX offset = 0
1297  ) const;
1298 
1309  PINDEX FindRegEx(
1310  const PRegularExpression & regex,
1311  PINDEX offset = 0
1312  ) const;
1313 
1325  const PRegularExpression & regex,
1326  PINDEX & pos,
1327  PINDEX & len,
1328  PINDEX offset = 0,
1329  PINDEX maxPos = P_MAX_INDEX
1330  ) const;
1331 
1332 
1336  const PRegularExpression & regex
1337  ) const;
1338 
1349  PString & Replace(
1350  const PString & target,
1351  const PString & subs,
1352  PBoolean all = false,
1353  PINDEX offset = 0
1354  );
1355 
1363  PString & Splice(
1364  const PString & str,
1365  PINDEX pos,
1366  PINDEX len = 0
1367  );
1368 
1376  PString & Splice(
1377  const char * cstr,
1378  PINDEX pos,
1379  PINDEX len = 0
1380  );
1381 
1388  PString & Delete(
1389  PINDEX start,
1390  PINDEX len
1391  );
1393 
1394 
1415  PINDEX start,
1416  PINDEX end
1417  ) const;
1418 
1433  PString Left(
1434  PINDEX len
1435  ) const;
1436 
1451  PString Right(
1452  PINDEX len
1453  ) const;
1454 
1471  PString Mid(
1472  PINDEX start,
1473  PINDEX len = P_MAX_INDEX
1474  ) const;
1475 
1476 
1484  PString LeftTrim() const;
1485 
1493  PString RightTrim() const;
1494 
1503  PString Trim() const;
1504 
1505 
1514  PString ToLower() const;
1515 
1524  PString ToUpper() const;
1525 
1526 
1530  bool Split(
1531  char delimiter,
1532  PString & before,
1533  PString & after,
1534  bool trim = true
1535  ) const;
1536 
1537 
1540  const PString & separators,
1542  PBoolean onePerSeparator = true
1544  ) const;
1570  const char * cseparators,
1572  PBoolean onePerSeparator = true
1574  ) const;
1575 
1589  PStringArray Lines() const;
1591 
1608  PString & sprintf(
1609  const char * cfmt,
1610  ...
1611  );
1612 
1627  friend PString psprintf(
1628  const char * cfmt,
1629  ...
1630  );
1631 
1633  PString & vsprintf(
1634  const PString & fmt,
1635  va_list args
1636  );
1651  PString & vsprintf(
1652  const char * cfmt,
1653  va_list args
1654  );
1655 
1657  friend PString pvsprintf(
1658  const char * cfmt,
1659  va_list args
1660  );
1675  friend PString pvsprintf(
1676  const PString & fmt,
1677  va_list args
1678  );
1679 
1680 
1684  template <typename T> __inline T As(T t = T()) const;
1685 
1698  long AsInteger(
1699  unsigned base = 10
1700  ) const;
1713  DWORD AsUnsigned(
1714  unsigned base = 10
1715  ) const;
1729  PInt64 AsInt64(
1730  unsigned base = 10
1731  ) const;
1745  PUInt64 AsUnsigned64(
1746  unsigned base = 10
1747  ) const;
1748 
1759  double AsReal() const;
1760 
1761 #ifdef P_HAS_WCHAR
1762 
1765  PWCharArray AsUCS2() const;
1766 #endif
1767 
1778  PBYTEArray ToPascal() const;
1779 
1788  PString ToLiteral() const;
1789 
1798  PINDEX & offset
1799  ) const;
1800 
1808  operator const unsigned char *() const;
1809 
1812  operator std::string () const
1813  { return std::string(theArray); }
1814 
1836  char * GetPointerAndSetLength(
1837  PINDEX len
1838  );
1839 
1844  virtual const char * GetPointer(PINDEX = 0) const { return (const char *)(*this); }
1845 
1847 
1848 
1849  protected:
1850 #ifdef P_HAS_WCHAR
1851  void InternalFromUCS2(
1852  const wchar_t * ptr,
1853  PINDEX len
1854  );
1855 #endif
1856  virtual Comparison InternalCompare(
1857  PINDEX offset, // Offset into string to compare.
1858  char c // Character to compare against.
1859  ) const;
1860  virtual Comparison InternalCompare(
1861  PINDEX offset, // Offset into string to compare.
1862  PINDEX length, // Number of characters to compare.
1863  const char * cstr // C string to compare against.
1864  ) const;
1865 
1866  /* Internal function to compare the current string value against the
1867  specified C string.
1868 
1869  @return
1870  relative rank of the two strings.
1871  */
1872  PString(int dummy, const PString * str);
1873 
1874  virtual void AssignContents(const PContainer &);
1875  PString(PContainerReference & reference_, PINDEX len)
1876  : PCharArray(reference_)
1877  , m_length(len)
1878  { }
1879 
1880  protected:
1881  mutable PINDEX m_length; // Length of the string, always at least one less than GetSize()
1882 };
1883 
1884 
1885 inline ostream & operator<<(ostream & stream, const PString & string)
1886 {
1887  string.PrintOn(stream);
1888  return stream;
1889 }
1890 
1891 #ifdef P_HAS_WOSTREAM
1892 inline wostream & operator<<(wostream & stream, const PString & string)
1893 {
1894  return stream << (const char *)string;
1895 }
1896 #endif
1897 
1898 
1899 #ifdef _WIN32
1900  class PWideString : public PWCharArray {
1901  PCLASSINFO(PWideString, PWCharArray);
1902 
1903  public:
1904  typedef const wchar_t * Initialiser;
1905 
1906  PWideString() { }
1907  PWideString(const PWCharArray & arr) : PWCharArray(arr) { }
1908  PWideString(const PString & str) : PWCharArray(str.AsUCS2()) { }
1909  PWideString(const char * str);
1910  PWideString & operator=(const PWideString & str) { PWCharArray::operator=(str); return *this; }
1911  PWideString & operator=(const PString & str) { PWCharArray::operator=(str.AsUCS2()); return *this; }
1912  PWideString & operator=(const std::string & str);
1913  PWideString & operator=(const char * str);
1914  friend inline ostream & operator<<(ostream & stream, const PWideString & string) { return stream << PString(string); }
1915 
1916  PINDEX GetLength() const { return GetSize() - 1; }
1917 
1918  protected:
1919  PWideString(PContainerReference & reference_) : PWCharArray(reference_) { }
1920  };
1921 
1922  #ifdef UNICODE
1923  typedef PWideString PVarString;
1924  #else
1925  typedef PString PVarString;
1926  #endif
1927 #endif
1928 
1929 
1931 
1941 class PCaselessString : public PString
1942 {
1943  PCLASSINFO(PCaselessString, PString);
1944 
1945  public:
1948  PCaselessString();
1949 
1954  const char * cstr
1955  );
1956 
1962  const PString & str
1963  );
1964 
1965 
1969  const std::string & str
1970  ) : PString(str)
1971  { }
1972 
1981  const PString & str
1982  );
1983 
1992  const std::string & str
1993  ) { return operator=(str.c_str()); }
1994 
2005  const char * cstr
2006  );
2007 
2017  char ch
2018  );
2019 
2020 
2021  // Overrides from class PObject
2026  virtual PObject * Clone() const;
2027 
2028  protected:
2029  // Overrides from class PString
2030  virtual Comparison InternalCompare(
2031  PINDEX offset, // Offset into string to compare.
2032  char c // Character to compare against.
2033  ) const;
2034  virtual Comparison InternalCompare(
2035  PINDEX offset, // Offset into string to compare.
2036  PINDEX length, // Number of characters to compare.
2037  const char * cstr // C string to compare against.
2038  ) const;
2039  /* Internal function to compare the current string value against the
2040  specified C string.
2041 
2042  @return
2043  relative rank of the two strings or characters.
2044  */
2045 
2046  PCaselessString(int dummy, const PCaselessString * str);
2047  PCaselessString(PContainerReference & reference_, PINDEX len) : PString(reference_, len) { }
2048 };
2049 
2050 
2052 
2066 template <class ParentString>
2067 class PConstantString : public ParentString
2068 {
2069  private:
2070  PContainerReference m_staticReference;
2071  public:
2072  PConstantString(typename ParentString::Initialiser init)
2073  : ParentString(m_staticReference, init != NULL ? strlen(init) : 0)
2074  , P_DISABLE_MSVC_WARNINGS(4267 4355, m_staticReference(this->m_length+1, true))
2075  {
2076  this->theArray = (char *)(init != NULL ? init : "");
2077  }
2078 
2080  : ParentString(m_staticReference, other.m_length)
2081  , m_staticReference(other.m_length + 1, true)
2082  {
2083  this->theArray = other.theArray;
2084  }
2085 
2087  {
2088  this->Destruct();
2089  }
2090 
2091  virtual PBoolean SetSize(PINDEX s) { return s <= this->m_length+1; }
2093  virtual void DestroyReference() { }
2094 
2095  private:
2096  void operator=(const PConstantString &) { }
2097 };
2098 
2099 
2102 
2105 
2106 
2107 #ifdef _WIN32
2108 // Now have PConstString can have these definitions
2109 __inline PWideString::PWideString(const char * str) : PWCharArray(PConstString(str).AsUCS2()) { }
2110 __inline PWideString & PWideString::operator=(const std::string & str) { PWCharArray::operator=(PConstString(str.c_str()).AsUCS2()); return *this; }
2111 __inline PWideString & PWideString::operator=(const char * str) { PWCharArray::operator=(PConstString(str).AsUCS2()); return *this; }
2112 #endif
2113 
2114 
2116 
2123 class PStringStream : public PString, public std::iostream
2124 {
2125  PCLASSINFO(PStringStream, PString);
2126 
2127  public:
2133  PStringStream();
2134 
2139  PStringStream(
2140  PINDEX fixedBufferSize
2141  );
2142 
2149  PStringStream(
2150  const PString & str
2151  );
2152 
2157  PStringStream(
2158  const char * cstr
2159  );
2160 
2162  virtual ~PStringStream();
2163 
2166  virtual PString & MakeEmpty();
2167 
2180  const PStringStream & strm
2181  );
2182 
2195  const PString & str
2196  );
2197 
2214  const char * cstr
2215  );
2216 
2226  char ch
2227  );
2228 
2229  virtual PINDEX GetLength() const;
2230 
2231  protected:
2232  virtual void AssignContents(const PContainer & cont);
2233 
2234  private:
2235  PStringStream(int, const PStringStream &)
2236  : std::iostream(cout.rdbuf())
2237  {
2238  }
2239 
2240  class Buffer : public streambuf {
2241  public:
2242  Buffer(PStringStream & str, PINDEX size);
2243  Buffer(const Buffer & sbuf);
2244  Buffer & operator=(const Buffer & sbuf);
2245  virtual int_type overflow(int_type = EOF);
2246  virtual int_type underflow();
2247  virtual int sync();
2248  virtual pos_type seekoff(std::streamoff, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out);
2249  virtual pos_type seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
2250  PCharArray & string;
2251  PBoolean fixedBufferSize;
2252  };
2253 };
2254 
2255 
2267 #define PSTRSTRM(arg) dynamic_cast<const PString &>(PStringStream() << std::flush << arg)
2268 
2269 
2270 // Definition for template PString memeber function, needs to be after PStringStream
2271 template <typename T> __inline T PString::As(T t) const
2272 {
2273  PStringStream strm(*this);
2274  strm >> t;
2275  return t;
2276 }
2277 
2278 
2279 class PStringList;
2280 class PSortedStringList;
2281 class PStringSet;
2282 
2295 class PStringArray : public PArray<PString>
2296 {
2297  typedef PArray<PString> BaseClass;
2298  PCLASSINFO(PStringArray, BaseClass);
2299 
2300  protected:
2301  inline PStringArray(int dummy, const PStringArray * c)
2302  : BaseClass(dummy, c)
2303  {
2304  }
2305 
2306  public:
2309 
2310  __inline PStringArray(PINDEX initialSize = 0)
2311  : BaseClass(initialSize) { }
2312 
2313  __inline PStringArray(const BaseClass & other)
2314  : BaseClass(other) { }
2315 
2320  PStringArray(
2321  PINDEX count,
2322  char const * const * strarr,
2323  PBoolean caseless = false
2324  );
2327  PStringArray(
2328  const PString & str
2329  );
2332  PStringArray(
2333  const char * cstr
2334  );
2337  PStringArray(
2338  const PStringList & list
2339  );
2342  PStringArray(
2343  const PSortedStringList & list
2344  );
2347  PStringArray(
2348  const PStringSet & set
2349  );
2350 
2355  const std::vector<PString> & vec
2356  )
2357  {
2358  for (std::vector<PString>::const_iterator r = vec.begin(); r != vec.end(); ++r)
2359  AppendString(*r);
2360  }
2361 
2366  const std::vector<std::string> & vec
2367  )
2368  {
2369  for (std::vector<std::string>::const_iterator r = vec.begin(); r != vec.end(); ++r)
2370  AppendString(PString(*r));
2371  }
2372 
2376  template <typename stlContainer>
2378  const stlContainer & vec
2379  )
2380  {
2381  PStringArray list;
2382  for (typename stlContainer::const_iterator r = vec.begin(); r != vec.end(); ++r)
2383  list.AppendString(PString(*r));
2384  return list;
2385  }
2386 
2388 
2397  virtual void ReadFrom(
2398  istream &strm // Stream to read the objects contents from.
2399  );
2400 
2401  virtual PObject * Clone() const
2402  {
2403  return new PStringArray(0, this);
2404  }
2406 
2415  PINDEX GetStringsIndex(
2416  const PString & str
2417  ) const;
2418 
2420  PINDEX index
2421  ) const;
2422 
2430  PString & operator[](
2431  PINDEX index
2432  );
2433 
2436  PINDEX AppendString(
2437  const PString & str
2438  );
2439  void push_back(const PString & str) { AppendString(str); }
2440 
2446  PStringArray & operator +=(const PStringArray & array);
2447  PStringArray & operator +=(const PString & str) { AppendString(str); return *this; }
2448  PStringArray & operator +=(const char * cstr) { AppendString(cstr); return *this; }
2449 
2450 
2457  PStringArray operator + (const PStringArray & array);
2458  PStringArray operator + (const PString & str);
2459 
2467  char ** ToCharArray(
2468  PCharArray * storage = NULL
2469  ) const;
2470 
2473  PString ToString(
2474  char separator = ' '
2475  ) const;
2477 };
2478 
2479 
2492 class PStringList : public PList<PString>
2493 {
2494  typedef PList<PString> BaseClass;
2495  PCLASSINFO(PStringList, BaseClass);
2496 
2497  protected:
2498  PStringList(int dummy, const PStringList * c)
2499  : BaseClass(dummy, c) { }
2500 
2501  public:
2506  __inline PStringList()
2507  : BaseClass() { }
2508 
2509  __inline PStringList(const BaseClass & other)
2510  : BaseClass(other) { }
2511 
2514  PStringList(
2515  PINDEX count,
2516  char const * const * strarr,
2517  PBoolean caseless = false
2518  );
2521  PStringList(
2522  const PString & str
2523  );
2526  PStringList(
2527  const char * cstr
2528  );
2531  PStringList(
2532  const PStringArray & array
2533  );
2536  PStringList(
2537  const PSortedStringList & list
2538  );
2541  PStringList(
2542  const PStringSet & set
2543  );
2545 
2554  virtual void ReadFrom(
2555  istream &strm // Stream to read the objects contents from.
2556  );
2557 
2558  virtual PObject * Clone() const
2559  {
2560  return new PStringList(0, this);
2561  }
2563 
2568  PINDEX AppendString(
2569  const PString & str
2570  );
2571 
2574  PINDEX InsertString(
2575  const PString & before,
2576  const PString & str
2577  );
2578 
2582  PINDEX GetStringsIndex(
2583  const PString & str
2584  ) const;
2585 
2591  PStringList & operator +=(const PStringList & list);
2592  PStringList & operator +=(const PString & str) { AppendString(str); return *this; }
2593  PStringList & operator +=(const char * cstr) { AppendString(cstr); return *this; }
2594 
2595 
2602  PStringList operator + (const PStringList & array);
2603  PStringList operator + (const PString & str);
2604 
2608  template <typename stlContainer>
2610  const stlContainer & vec
2611  )
2612  {
2613  PStringList list;
2614  for (typename stlContainer::const_iterator r = vec.begin(); r != vec.end(); ++r)
2615  list.AppendString(PString(*r));
2616  return list;
2617  }
2619 };
2620 
2621 
2633 class PSortedStringList : public PSortedList<PString>
2634 {
2636  PCLASSINFO(PSortedStringList, BaseClass);
2637 
2638  protected:
2639  PSortedStringList(int dummy, const PSortedStringList * c)
2640  : BaseClass(dummy, c) { }
2641 
2642  public:
2648  : BaseClass() { }
2649 
2650  __inline PSortedStringList(const BaseClass & other)
2651  : BaseClass(other) { }
2652 
2656  PINDEX count,
2657  char const * const * strarr,
2658  PBoolean caseless = false
2659  );
2663  const PString & str
2664  );
2668  const char * cstr
2669  );
2673  const PStringArray & array
2674  );
2678  const PStringList & list
2679  );
2683  const PStringSet & set
2684  );
2686 
2695  virtual void ReadFrom(
2696  istream &strm // Stream to read the objects contents from.
2697  );
2699 
2705  PINDEX AppendString(
2706  const PString & str
2707  );
2708 
2712  PINDEX GetStringsIndex(
2713  const PString & str
2714  ) const;
2715 
2720  PINDEX GetNextStringsIndex(
2721  const PString & str
2722  ) const;
2724 
2725  protected:
2726  PINDEX InternalStringSelect(
2727  const char * str,
2728  PINDEX len,
2729  PSortedListElement * thisElement,
2730  PSortedListElement * & lastElement
2731  ) const;
2732 };
2733 
2734 
2751 class PStringSet : public PSet<PString>
2752 {
2753  typedef PSet<PString> BaseClass;
2754  PCLASSINFO(PStringSet, BaseClass);
2755 
2756  protected:
2757  PStringSet(int dummy, const PStringSet * c)
2758  : BaseClass(dummy, c) { }
2759 
2760  public:
2765  PStringSet(PBoolean initialDeleteObjects = true)
2766  : BaseClass(initialDeleteObjects) { }
2767 
2768  PStringSet(const BaseClass & other)
2769  : BaseClass(other) { }
2770 
2773  PStringSet(
2774  PINDEX count,
2775  char const * const * strarr,
2776  PBoolean caseless = false
2777  );
2778 
2781  PStringSet(
2782  const PString & str
2783  );
2786  PStringSet(
2787  const char * cstr
2788  );
2791  PStringSet(
2792  const PStringArray & strArray
2793  );
2796  PStringSet(
2797  const PStringList & strList
2798  );
2800 
2809  virtual void ReadFrom(
2810  istream &strm
2811  );
2812 
2813  virtual PObject * Clone() const
2814  {
2815  return PNEW PStringSet(0, this);
2816  }
2818 
2822  void Include(
2823  const PString & key
2824  );
2827  const PString & key
2828  );
2830  void Exclude(
2831  const PString & key
2832  );
2835  const PString & key
2836  );
2838 };
2839 
2840 
2848 template <class K> class PStringDictionary : public PDictionary<K, PString>
2849 {
2851  PCLASSINFO(PStringDictionary, BaseClass);
2852 
2853  public:
2863  : BaseClass() { }
2865 
2872  virtual PObject * Clone() const
2873  { return PNEW PStringDictionary(0, this); }
2875 
2891  PString operator()(const K & key, const char * dflt = NULL) const
2892  {
2893  PString * str = this->GetAt(key);
2894  return str != NULL ? *str : PString(dflt);
2895  }
2896 
2908  virtual PBoolean SetAt(
2909  const K & key, // Key for position in dictionary to add object.
2910  const PString & str // New string value to put into the dictionary.
2911  ) { return this->AbstractSetAt(key, PNEW PString(str)) != NULL; }
2913 
2914  protected:
2915  PStringDictionary(int dummy, const PStringDictionary * c)
2916  : BaseClass(dummy, c) { }
2917 };
2918 
2919 
2934 #define PDECLARE_STRING_DICTIONARY(cls, K) \
2935  PDECLARE_CLASS(cls, PStringDictionary<K>) \
2936  protected: \
2937  cls(int dummy, const cls * c) \
2938  : PStringDictionary<K>(dummy, c) { } \
2939  public: \
2940  cls() \
2941  : PStringDictionary<K>() { } \
2942  virtual PObject * Clone() const \
2943  { return PNEW cls(0, this); } \
2944 
2945 
2958 #define PSTRING_DICTIONARY(cls, K) typedef PStringDictionary<K> cls
2959 
2960 
2975 #ifdef DOC_PLUS_PLUS
2977 #endif
2978 PDECLARE_STRING_DICTIONARY(POrdinalToString, POrdinalKey);
2979  public:
2982 
2983  struct Initialiser {
2985  PINDEX key;
2987  const char * value;
2988  };
2992  PINDEX count,
2993  const Initialiser * init
2994  );
2996 
3005  virtual void ReadFrom(
3006  istream &strm // Stream to read the objects contents from.
3007  );
3009 };
3010 
3022 #ifdef DOC_PLUS_PLUS
3024 #endif
3025 PDECLARE_ORDINAL_DICTIONARY(PStringToOrdinal, PString);
3026  public:
3029 
3030  struct Initialiser {
3032  const char * key;
3034  PINDEX value;
3035  };
3039  PINDEX count,
3040  const Initialiser * init,
3041  PBoolean caseless = false
3042  );
3046  PINDEX count,
3047  const POrdinalToString::Initialiser * init,
3048  PBoolean caseless = false
3049  );
3051 
3060  virtual void ReadFrom(
3061  istream &strm // Stream to read the objects contents from.
3062  );
3064 };
3065 
3066 
3080 #ifdef DOC_PLUS_PLUS
3082 #endif
3083 PDECLARE_STRING_DICTIONARY(PStringToString, PString);
3084  public:
3087 
3088  struct Initialiser {
3090  const char * key;
3092  const char * value;
3093  };
3097  PINDEX count,
3098  const Initialiser * init,
3099  PBoolean caselessKeys = false,
3100  PBoolean caselessValues = false
3101  );
3102 
3107  const PString & str
3108  ) { FromString(str); }
3110 
3119  virtual void ReadFrom(
3120  istream &strm // Stream to read the objects contents from.
3121  );
3123 
3136  char ** ToCharArray(
3137  bool withEqualSign,
3138  PCharArray * storage = NULL
3139  ) const;
3140 
3144  void FromString(
3145  const PString & str
3146  );
3147 };
3148 
3149 
3157 {
3158  public:
3160  PStringOptions(const PString & str) : PStringToString(str) { }
3161  PStringOptions(const PStringToString & other) : PStringToString(other) { }
3162  PStringOptions & operator=(const PStringToString & other) { PStringToString::operator=(other); return *this; }
3163 
3165  bool Contains(const char * key ) const { PConstCaselessString k(key); return PStringToString::Contains(k); }
3166  bool Contains(const PString & key ) const { return PStringToString::Contains(PCaselessString(key)); }
3167  bool Contains(const PCaselessString & key ) const { return PStringToString::Contains(key); }
3168  bool Contains(const PCaselessString & (*key)()) const { return PStringToString::Contains(key()); }
3169 
3170  // Overide default PStringToString::SetAt() to make sure the key is caseless
3171  PString * GetAt(const char * key ) const { PConstCaselessString k(key); return PStringToString::GetAt(k); }
3172  PString * GetAt(const PString & key ) const { return PStringToString::GetAt(PCaselessString(key)); }
3173  PString * GetAt(const PCaselessString & key ) const { return PStringToString::GetAt(key); }
3174  PString * GetAt(const PCaselessString & (*key)()) const { return PStringToString::GetAt(key()); }
3175 
3176  // Overide default PStringToString::SetAt() to make sure the key is caseless
3177  PBoolean SetAt(const char * key, const PString & data) { PConstCaselessString k(key); return SetAt(k, data); }
3178  PBoolean SetAt(const PString & key, const PString & data) { return SetAt(PCaselessString(key), data); }
3179  PBoolean SetAt(const PCaselessString & key, const PString & data) { MakeUnique(); return PStringToString::SetAt(key, data); }
3180  PBoolean SetAt(const PCaselessString & (*key)(), const PString & data) { return SetAt(key(), data); }
3181 
3182  // Overide default PStringToString::RemoveAt() to make sure the key is caseless
3183  PString * RemoveAt(const char * key) { PConstCaselessString k(key); return RemoveAt(k); }
3184  PString * RemoveAt(const PString & key) { return RemoveAt(PCaselessString(key)); }
3186  PString * RemoveAt(const PCaselessString & (*key)()) { return RemoveAt(key()); }
3187 
3189  PString GetString(const char * key, const char * dflt = NULL) const { PConstCaselessString k(key); return GetString(k, dflt); }
3190  PString GetString(const PString & key, const char * dflt = NULL) const { return GetString(PCaselessString(key), dflt); }
3191  PString GetString(const PCaselessString & key, const char * dflt = NULL) const;
3192  PString GetString(const PCaselessString & (*key)(), const char * dflt = NULL) const { return GetString(key(), dflt); }
3193 
3195  bool SetString(const char * key, const PString & value) { return SetAt(key, value); }
3196  bool SetString(const PString & key, const PString & value) { return SetAt(key, value); }
3197  bool SetString(const PCaselessString & key, const PString & value) { return SetAt(key, value); }
3198  bool SetString(const PCaselessString & (*key)(), const PString & value) { return SetAt(key, value); }
3199 
3201  bool GetBoolean(const char * key, bool dflt = false) const { PConstCaselessString k(key); return GetBoolean(k, dflt); }
3202  bool GetBoolean(const PString & key, bool dflt = false) const { return GetBoolean(PCaselessString(key), dflt); }
3203  bool GetBoolean(const PCaselessString & key, bool dflt = false) const;
3204  bool GetBoolean(const PCaselessString & (*key)(), bool dflt = false) const { return GetBoolean(key(), dflt); }
3205 
3207  void SetBoolean(const char * key, bool value) { PConstCaselessString k(key); SetBoolean(k, value); }
3208  void SetBoolean(const PString & key, bool value) { SetBoolean(PCaselessString(key), value); }
3209  void SetBoolean(const PCaselessString & key, bool value) { SetAt(key, value ? "true" : "false"); }
3210  void SetBoolean(const PCaselessString & (*key)(), bool value) { SetBoolean(key(), value); }
3211 
3213  long GetInteger(const char * key, long dflt = 0) const { PConstCaselessString k(key); return GetInteger(k, dflt); }
3214  long GetInteger(const PString & key, long dflt = 0) const { return GetInteger(PCaselessString(key), dflt); }
3215  long GetInteger(const PCaselessString & key, long dflt = 0) const;
3216  long GetInteger(const PCaselessString & (*key)(), long dflt = 0) const { return GetInteger(key(), dflt); }
3217 
3219  void SetInteger(const char * key, long value) { PConstCaselessString k(key); SetInteger(k, value); }
3220  void SetInteger(const PString & key, long value) { SetInteger(PCaselessString(key), value); }
3221  void SetInteger(const PCaselessString & key, long value);
3222  void SetInteger(const PCaselessString & (*key)(), long value) { SetInteger(key(), value); }
3223 
3225  template<typename E> E GetEnum(const char * key, E dflt) const { PConstCaselessString k(key); return GetEnum(k, dflt); }
3226  template<typename E> E GetEnum(const PString & key, E dflt) const { return GetEnum(PCaselessString(key), dflt); }
3227  template<typename E> E GetEnum(const PCaselessString & key, E dflt) const { return (E)GetInteger(key, dflt); }
3228  template<typename E> E GetEnum(const PCaselessString & (*key)(), E dflt) const { return GetEnum(key(), dflt); }
3229 
3231  template<typename E> void SetEnum(const char * key, E value) { PConstCaselessString k(key); SetInteger(k, value); }
3232  template<typename E> void SetEnum(const PString & key, E value) { SetInteger(PCaselessString(key), value); }
3233  template<typename E> void SetEnum(const PCaselessString & key, E value) { SetInteger(key, value); }
3234  template<typename E> void SetEnum(const PCaselessString & (*key)(), E value) { SetInteger(key(), value); }
3235 
3237  double GetReal(const char * key, double dflt = 0) const { PConstCaselessString k(key); return GetReal(k, dflt); }
3238  double GetReal(const PString & key, double dflt = 0) const { return GetReal(PCaselessString(key), dflt); }
3239  double GetReal(const PCaselessString & key, double dflt = 0) const;
3240  double GetReal(const PCaselessString & (*key)(), double dflt = 0) const { return GetReal(key(), dflt); }
3241 
3243  void SetReal(const char * key, double value, int decimals) { PConstCaselessString k(key); SetReal(k, value, decimals); }
3244  void SetReal(const PString & key, double value, int decimals) { SetReal(PCaselessString(key), value, decimals); }
3245  void SetReal(const PCaselessString & key, double value, int decimals);
3246  void SetReal(const PCaselessString & (*key)(), double value, int decimals) { SetReal(key(), value, decimals); }
3247 
3249  __inline bool Has(const char * key) const { return Contains(key); }
3250  __inline bool Has(const PString & key) const { return Contains(key); }
3251  __inline bool Has(const PCaselessString & key) const { return Contains(key); }
3252  __inline bool Has(const PCaselessString & (*key)()) const { return Contains(key); }
3253 
3255  __inline PString Get(const char * key, const char * dflt = NULL) const { return GetString(key, dflt); }
3256  __inline PString Get(const PString & key, const char * dflt = NULL) const { return GetString(key, dflt); }
3257  __inline PString Get(const PCaselessString & key, const char * dflt = NULL) const { return GetString(key, dflt); }
3258  __inline PString Get(const PCaselessString & (*key)(), const char * dflt = NULL) const { return GetString(key, dflt); }
3259  __inline PString Get(const char * key, const PString & dflt) const { return GetString(key, dflt); }
3260  __inline PString Get(const PString & key, const PString & dflt) const { return GetString(key, dflt); }
3261  __inline PString Get(const PCaselessString & key, const PString & dflt) const { return GetString(key, dflt); }
3262  __inline PString Get(const PCaselessString & (*key)(), const PString & dflt) const { return GetString(key, dflt); }
3263 
3265  __inline bool Set(const char * key, const PString & value) { return SetAt(key, value); }
3266  __inline bool Set(const PString & key, const PString & value) { return SetAt(key, value); }
3267  __inline bool Set(const PCaselessString & key, const PString & value) { return SetAt(key, value); }
3268  __inline bool Set(const PCaselessString & (*key)(), const PString & value) { return SetAt(key, value); }
3269 
3271  __inline void Remove(const char * key) { RemoveAt(key); }
3272  __inline void Remove(const PString & key) { RemoveAt(key); }
3273  __inline void Remove(const PCaselessString & key) { RemoveAt(key); }
3274  __inline void Remove(const PCaselessString & (*key)()) { RemoveAt(key); }
3275 };
3276 
3277 
3278 // Put include here as needs PString above to be defined.
3279 #include <ptlib/bitwise_enum.h>
3280 
3281 
3288 {
3289  PCLASSINFO(PRegularExpression, PObject);
3290  public:
3293 
3295  CompileOptions, 3,
3296  (
3297  Simple,
3298  Extended,
3299  IgnoreCase,
3300  AnchorNewLine
3303  )
3304  );
3305 
3308  ExecOptions, 2,
3309  (
3310  Normal,
3311  NotBeginningOfLine,
3316  NotEndofLine
3318  )
3319  );
3320 
3323 
3327  const PString & pattern,
3328  CompileOptions options = IgnoreCase
3329  );
3330 
3334  const char * cpattern,
3335  CompileOptions options = IgnoreCase
3336  );
3337 
3342  const PRegularExpression &
3343  );
3344 
3349  const PRegularExpression &
3350  );
3351 
3355 
3356 
3361  virtual void PrintOn(
3362  ostream & strm
3363  ) const;
3365 
3368 
3369  enum ErrorCodes {
3371  NoError = 0,
3374 
3375  // POSIX regcomp return error codes. (In the order listed in the standard.)
3400 
3401  /* Error codes we've added. */
3410  };
3411 
3418 
3425  PString GetErrorText() const;
3426 
3428  const PString & GetPattern() const { return m_pattern; }
3430 
3434  bool Compile(
3435  const PString & pattern,
3436  CompileOptions options = IgnoreCase
3437  );
3445  bool Compile(
3446  const char * cpattern,
3447  CompileOptions options = IgnoreCase
3448  );
3449 
3450 
3452  bool Execute(
3453  const PString & str,
3454  PINDEX & start,
3455  ExecOptions options = Normal
3456  ) const;
3458  bool Execute(
3459  const PString & str,
3460  PINDEX & start,
3461  PINDEX & len,
3462  ExecOptions options = Normal
3463  ) const;
3465  bool Execute(
3466  const char * cstr,
3467  PINDEX & start,
3468  ExecOptions options = Normal
3469  ) const;
3471  bool Execute(
3472  const char * cstr,
3473  PINDEX & start,
3474  PINDEX & len,
3475  ExecOptions options = Normal
3476  ) const;
3478  bool Execute(
3479  const PString & str,
3480  PIntArray & starts,
3481  ExecOptions options = Normal
3482  ) const;
3484  bool Execute(
3485  const PString & str,
3486  PIntArray & starts,
3487  PIntArray & ends,
3488  ExecOptions options = Normal
3489  ) const;
3491  bool Execute(
3492  const char * cstr,
3493  PIntArray & starts,
3494  ExecOptions options = Normal
3495  ) const;
3512  bool Execute(
3513  const char * cstr,
3514  PIntArray & starts,
3515  PIntArray & ends,
3516  ExecOptions options = Normal
3517  ) const;
3534  bool Execute(
3535  const char * cstr,
3536  PStringArray & substring,
3537  ExecOptions options = Normal
3538  ) const;
3540 
3549  static PString EscapeString(
3550  const PString & str
3551  );
3553 
3554  protected:
3555  bool InternalCompile();
3556  void InternalClean();
3557 
3559  CompileOptions m_compileOptions;
3562 };
3563 
3564 
3565 #endif // PTLIB_STRING_H
3566 
3567 
3568 // End Of File ///////////////////////////////////////////////////////////////