pstring.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:87k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  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.  * $Log: pstring.h,v $
  30.  * Revision 1.40  1999/08/22 12:13:43  robertj
  31.  * Fixed warning when using inlines on older GNU compiler
  32.  *
  33.  * Revision 1.39  1999/05/28 14:01:22  robertj
  34.  * Added initialisers to string containers (list, sorted list and set).
  35.  *
  36.  * Revision 1.38  1999/03/09 09:34:05  robertj
  37.  * Fixed typo's.
  38.  *
  39.  * Revision 1.37  1999/03/09 02:59:50  robertj
  40.  * Changed comments to doc++ compatible documentation.
  41.  *
  42.  * Revision 1.36  1999/02/16 08:11:09  robertj
  43.  * MSVC 6.0 compatibility changes.
  44.  *
  45.  * Revision 1.35  1998/09/23 06:21:12  robertj
  46.  * Added open source copyright license.
  47.  *
  48.  * Revision 1.34  1998/01/26 00:33:46  robertj
  49.  * Added FindRegEx function to PString that returns position and length.
  50.  * Added Execute() functions to PRegularExpression that take PINDEX references instead of PIntArrays.
  51.  * Added static function to PRegularExpression to escape all special operator characters in a string.
  52.  *
  53.  * Revision 1.33  1998/01/05 10:39:35  robertj
  54.  * Fixed "typesafe" templates/macros for dictionaries, especially on GNU.
  55.  *
  56.  * Revision 1.32  1997/12/11 13:32:47  robertj
  57.  * Added AsUnsigned() function to convert string to DWORD.
  58.  *
  59.  * Revision 1.31  1997/12/11 10:29:49  robertj
  60.  * Added type correct Contains() function to dictionaries.
  61.  *
  62.  * Revision 1.30  1997/07/08 13:13:47  robertj
  63.  * DLL support.
  64.  *
  65.  * Revision 1.29  1997/06/10 11:36:32  craigs
  66.  * Added inline statements to allow compilation uder Unix
  67.  *
  68.  * Revision 1.28  1997/06/08 04:48:58  robertj
  69.  * Added regular expressions.
  70.  * Fixed non-template class descendent order.
  71.  *
  72.  * Revision 1.27  1997/05/16 12:10:12  robertj
  73.  * Fixed G++ compatibility bug.
  74.  *
  75.  * Revision 1.26  1996/10/08 13:13:38  robertj
  76.  * Added operator += and &= for char so no implicit PString construction.
  77.  *
  78.  * Revision 1.25  1996/09/14 12:52:39  robertj
  79.  * Added operator! for !IsEmpty().
  80.  *
  81.  * Revision 1.24  1996/08/17 10:00:25  robertj
  82.  * Changes for Windows DLL support.
  83.  *
  84.  * Revision 1.23  1996/05/26 03:27:02  robertj
  85.  * Compatibility to GNU 2.7.x
  86.  *
  87.  * Revision 1.22  1996/03/31 08:51:22  robertj
  88.  * Added RemoveAt() function to remove entries from dictionaries.
  89.  *
  90.  * Revision 1.21  1996/03/10 13:15:50  robertj
  91.  * Added operator() to template version.
  92.  *
  93.  * Revision 1.20  1996/02/19 13:17:33  robertj
  94.  * Removed PCaselessString hash function to fix dictionary match failure.
  95.  * Added operator() to do string dictionary lookup with default value.
  96.  *
  97.  * Revision 1.19  1996/02/08 12:19:16  robertj
  98.  * Added new operators to PString for case insensitive compare and spaced concatenate.
  99.  *
  100.  * Revision 1.18  1996/01/24 14:43:15  robertj
  101.  * Added initialisers to string dictionaries.
  102.  *
  103.  * Revision 1.17  1996/01/23 13:15:17  robertj
  104.  * Added Replace() function to strings.
  105.  * Mac Metrowerks compiler support.
  106.  * String searching algorithm rewrite.
  107.  *
  108.  * Revision 1.16  1996/01/02 12:04:31  robertj
  109.  * Mac OS compatibility changes.
  110.  * Removed requirement that PArray elements have parameterless constructor..
  111.  *
  112.  * Revision 1.15  1995/12/23 03:46:23  robertj
  113.  * Added operators for include and exclude from string set.
  114.  *
  115.  * Revision 1.14  1995/10/14 15:02:56  robertj
  116.  * Changed arrays to not break references, but strings still need to.
  117.  *
  118.  * Revision 1.13  1995/06/17 11:13:08  robertj
  119.  * Documentation update.
  120.  *
  121.  * Revision 1.12  1995/06/17 00:43:40  robertj
  122.  * Added flag for PStringArray constructor to create caseless strings.
  123.  *
  124.  * Revision 1.11  1995/06/04 12:34:57  robertj
  125.  * Better C++ compatibility (with BC++)
  126.  *
  127.  * Revision 1.10  1995/04/02 09:27:23  robertj
  128.  * Added "balloon" help.
  129.  *
  130.  * Revision 1.9  1995/03/14 12:42:16  robertj
  131.  * Updated documentation to use HTML codes.
  132.  *
  133.  * Revision 1.8  1995/03/12  04:44:39  robertj
  134.  * Fixed use of PCaselessString as dictionary key.
  135.  *
  136.  * Revision 1.7  1995/02/05  00:48:09  robertj
  137.  * Fixed template version.
  138.  *
  139.  * Revision 1.6  1995/01/15  04:50:20  robertj
  140.  * Added inlines on friend functions, required by GNU compiler.
  141.  *
  142.  * Revision 1.5  1995/01/10  11:43:41  robertj
  143.  * Removed PString parameter in stdarg function for GNU C++ compatibility.
  144.  *
  145.  * Revision 1.4  1995/01/09  12:33:44  robertj
  146.  * Removed unnecesary return value from I/O functions.
  147.  * Changed function names due to Mac port.
  148.  *
  149.  * Revision 1.3  1994/12/21  11:53:21  robertj
  150.  * Documentation and variable normalisation.
  151.  *
  152.  * Revision 1.2  1994/12/12  13:13:13  robertj
  153.  * Fixed bugs in PString mods just made.
  154.  *
  155.  * Revision 1.1  1994/12/12  09:59:37  robertj
  156.  * Initial revision
  157.  *
  158.  */
  159. #ifdef __GNUC__
  160. #pragma interface
  161. #endif
  162. ///////////////////////////////////////////////////////////////////////////////
  163. // PString class
  164. class PStringArray;
  165. class PRegularExpression;
  166. #ifdef PHAS_UNICODE
  167. #define PSTRING_ANCESTOR_CLASS PWordArray
  168. #else
  169. #define PSTRING_ANCESTOR_CLASS PCharArray
  170. #endif
  171. /**The character string class. It supports a wealth of additional functions
  172.    for string processing and conversion. Operators are provided so that
  173.    strings can virtually be treated as a basic type.
  174.    The #PSTRING_ANCESTOR_CLASS# is dependent on whether UNICODE
  175.    support is selected. The {bf entire library and application} must be
  176.    compiled with or without UNICODE or undefined results will occur.
  177.    #PSTRING_ANCESTOR_CLASS# macro is normally set to
  178.    #PCharArray#.
  179.    An important feature of the string class, which is not present in other
  180.    container classes, is that when the string contents is changed, that is
  181.    resized or elements set, the string is "dereferenced", and a duplicate
  182.    made of its contents. That is this instance of the array is disconnected
  183.    from all other references to the string data, if any, and a new string array
  184.    contents created. For example consider the following:
  185. begin{verbatim}
  186.           PString s1 = "String"; // New array allocated and set to "String"
  187.           PString s2 = s1;       // s2 has pointer to same array as s1
  188.                                  // and reference count is 2 for both
  189.           s1[0] = 's';           // Breaks references into different strings
  190. end{verbatim}
  191.    at the end s1 is "string" and s2 is "String" both with reference count of 1.
  192.    The functions that will "break" a reference are #SetSize()#,
  193.    #SetMinSize()#, #GetPointer()#, #SetAt()# and
  194.    #operator[]#.
  195.    Note that the array is a '' terminated string as in C strings. Thus the
  196.    memory allocated, and the length of the string may be different values.
  197.  */
  198. #ifdef DOC_PLUS_PLUS
  199. class PString : public PCharArray {
  200. #endif
  201. PDECLARE_CLASS(PString, PSTRING_ANCESTOR_CLASS);
  202.   public:
  203.   /**@name Construction */
  204.   //@{
  205.     /**Construct an empty string. This will have one character in it which is
  206.        the '' character.
  207.      */
  208.     PINLINE PString();
  209.     /**Create a new reference to the specified string. The string memory is not
  210.        copied, only the pointer to the data.
  211.      */
  212.     PINLINE PString(
  213.       const PString & str  /// String to create new reference to.
  214.     );
  215.     /**Create a string from the C string array. This is most commonly used with
  216.        a literal string, eg "hello". A new memory block is allocated of a size
  217.        sufficient to take the length of the string and its terminating
  218.        '' character.
  219.        If UNICODE is used then each char from the char pointer is mapped to a
  220.        single UNICODE character.
  221.      */
  222.     PString(
  223.       const char * cstr /// Standard '' terminated C string.
  224.     );
  225.     /**Create a string from the Unicode string array.
  226.        A new memory block is allocated of a size sufficient to take the length
  227.        of the string and its terminating '' character.
  228.      */
  229.     PString(
  230.       const WORD * ustr /// Unicode null terminated string.
  231.     );
  232.     /**Create a string from the array. A new memory block is allocated of
  233.        a size equal to #len# plus one which is sufficient to take
  234.        the string and a terminating '' character.
  235.        If UNICODE is used then each char from the char pointer is mapped to a
  236.        single UNICODE character.
  237.        Note that this function will allow a string with embedded ''
  238.        characters to be created, but most of the functions here will be unable
  239.        to access characters beyond the first ''. Furthermore, if the
  240.        #MakeMinimumSize()# function is called, all data beyond that first
  241.        #''# character will be lost.
  242.      */
  243.     PString(
  244.       const char * cstr,  /// Pointer to a string of characters.
  245.       PINDEX len          /// Length of the string in bytes.
  246.     );
  247.     /**Create a string from the array. A new memory block is allocated of
  248.        a size equal to #len# plus one which is sufficient to take
  249.        the string and a terminating '' character.
  250.        Note that this function will allow a string with embedded ''
  251.        characters to be created, but most of the functions here will be unable
  252.        to access characters beyond the first ''. Furthermore, if the
  253.        #MakeMinimumSize()# function is called, all data beyond that first
  254.        #''# character will be lost.
  255.      */
  256.     PString(
  257.       const WORD * cstr,  /// Pointer to a string of Unicode characters.
  258.       PINDEX len          /// Length of the string in bytes.
  259.     );
  260.     /**Create a string from the single character. This is most commonly used
  261.        as a type conversion constructor when a literal character, eg 'A' is
  262.        used in a string expression. A new memory block is allocated of two
  263.        characters to take the char and its terminating '' character.
  264.        If UNICODE is used then the char is mapped to a single UNICODE
  265.        character.
  266.      */
  267.     PString(
  268.       char ch    /// Single character to initialise string.
  269.     );
  270.     enum ConversionType {
  271.       Pascal,   // Data is a length byte followed by characters.
  272.       Basic,    // Data is two length bytes followed by characters.
  273.       Literal,  // Data is C language style string with  escape codes.
  274.       Signed,   // Convert a signed integer to a string.
  275.       Unsigned, // Convert an unsigned integer to a string.
  276.       Decimal,  // Convert a real number to a string in decimal format.
  277.       Exponent, // Convert a real number to a string in exponent format.
  278.       Printf,   // Formatted output, sprintf() style function.
  279.       NumConversionTypes
  280.     };
  281.     /* Type of conversion to make in the conversion constructors.
  282.      */
  283.     /* Contruct a new string converting from the spcified data source into
  284.        a string array.
  285.      */
  286.     PString(
  287.       ConversionType type,  // Type of data source for conversion.
  288.       const char * str,    // String to convert.
  289.       ...                 // Extra parameters for #sprintf()# call.
  290.     );
  291.     PString(
  292.       ConversionType type,  // Type of data source for conversion.
  293.       long value,           // Integer value to convert.
  294.       unsigned base = 10    // Number base to use for the integer conversion.
  295.     );
  296.     PString(
  297.       ConversionType type,  // Type of data source for conversion.
  298.       double value,         // Floating point value to convert.
  299.       unsigned places       // Number of decimals in real number output.
  300.     );
  301.     /**Assign the string to the current object. The current instance then
  302.        becomes another reference to the same string in the #str#
  303.        parameter.
  304.        
  305.        @return
  306.        reference to the current PString object.
  307.      */
  308.     PString & operator=(
  309.       const PString & str  /// New string to assign.
  310.     );
  311.     /**Assign the C string to the current object. The current instance then
  312.        becomes a unique reference to a copy of the #cstr# parameter.
  313.        The #cstr# parameter is typically a literal string, eg:
  314. begin{verbatim}
  315.           myStr = "fred";
  316. end{verbatim}
  317.        @return
  318.        reference to the current PString object.
  319.      */
  320.     PString & operator=(
  321.       const char * cstr  /// C string to assign.
  322.     );
  323.     /**Assign the character to the current object. The current instance then
  324.        becomes a unique reference to a copy of the character parameter. eg:
  325. begin{verbatim}
  326.           myStr = 'A';
  327. end{verbatim}
  328.        @return
  329.        reference to the current PString object.
  330.      */
  331.     PString & operator=(
  332.       char ch            /// Character to assign.
  333.     );
  334.   //@}
  335.   /**@name Overrides from class PObject */
  336.   //@{
  337.     /**Make a complete duplicate of the string. Note that the data in the
  338.        array of characters is duplicated as well and the new object is a
  339.        unique reference to that data.
  340.      */
  341.     virtual PObject * Clone() const;
  342.     /**Get the relative rank of the two strings. The system standard function,
  343.        eg strcmp(), is used.
  344.        @return
  345.        comparison of the two objects, #EqualTo# for same,
  346.        #LessThan# for #obj# logically less than the
  347.        object and #GreaterThan# for #obj# logically
  348.        greater than the object.
  349.      */
  350.     virtual Comparison Compare(
  351.       const PObject & obj   /// Other PString to compare against.
  352.     ) const;
  353.     /**Output the string to the specified stream.
  354.      */
  355.     virtual void PrintOn(
  356.       ostream & strm  /// I/O stream to output to.
  357.     ) const;
  358.     /**Input the string from the specified stream. This will read all
  359.        characters until a end of line is reached. The end of line itself is
  360.        {bf not} placed in the string, however it {bf is} removed from
  361.        the stream.
  362.      */
  363.     virtual void ReadFrom(
  364.       istream & strm  /// I/O stream to input from.
  365.     );
  366.     /**Calculate a hash value for use in sets and dictionaries.
  367.     
  368.        The hash function for strings will produce a value based on the sum of
  369.        the first three characters of the string. This is a fairly basic
  370.        function and make no assumptions about the string contents. A user may
  371.        descend from PString and override the hash function if they can take
  372.        advantage of the types of strings being used, eg if all strings start
  373.        with the letter 'A' followed by 'B or 'C' then the current hash function
  374.        will not perform very well.
  375.        @return
  376.        hash value for string.
  377.      */
  378.     virtual PINDEX HashFunction() const;
  379.   //@}
  380.   /**@name Overrides from class PContainer */
  381.   //@{
  382.     /**Set the size of the string. A new string may be allocated to accomodate
  383.        the new number of characters. If the string increases in size then the
  384.        new characters are initialised to zero. If the string is made smaller
  385.        then the data beyond the new size is lost.
  386.        Note that this function will break the current instance from multiple
  387.        references to an array. A new array is allocated and the data from the
  388.        old array copied to it.
  389.        @return
  390.        TRUE if the memory for the array was allocated successfully.
  391.      */
  392.     virtual BOOL SetSize(
  393.       PINDEX newSize  /// New size of the array in elements.
  394.     );
  395.     /**Determine if the string is empty. This is semantically slightly
  396.        different from the usual #PContainer::IsEmpty()# function. It does
  397.        not test for #PContainer::GetSize()# equal to zero, it tests for
  398.        #GetLength()# equal to zero.
  399.        @return
  400.        TRUE if no non-null characters in string.
  401.      */
  402.     virtual BOOL IsEmpty() const;
  403.     /**Make this instance to be the one and only reference to the container
  404.        contents. This implicitly does a clone of the contents of the container
  405.        to make a unique reference. If the instance was already unique then
  406.        the function does nothing.
  407.        @return
  408.        TRUE if the instance was already unique.
  409.      */
  410.     virtual BOOL MakeUnique();
  411.   //@}
  412.   /**@name Size/Length functions */
  413.   //@{
  414.     /**Set the actual memory block array size to the minimum required to hold
  415.        the current string contents.
  416.        
  417.        Note that this function will break the current instance from multiple
  418.        references to the string. A new string buffer is allocated and the data
  419.        from the old string buffer copied to it.
  420.        @return
  421.        TRUE if new memory block successfully allocated.
  422.      */
  423.     BOOL MakeMinimumSize();
  424.     /**Determine the length of the null terminated string. This is different
  425.        from #PContainer::GetSize()# which returns the amount of memory
  426.        allocated to the string. This is often, though no necessarily, one
  427.        larger than the length of the string.
  428.        
  429.        @return
  430.        length of the null terminated string.
  431.      */
  432.     PINLINE PINDEX GetLength() const;
  433.     /**Determine if the string is NOT empty. This is semantically identical
  434.        to executing !IsEmpty() on the string.
  435.        @return
  436.        TRUE if non-null characters in string.
  437.      */
  438.     BOOL operator!() const;
  439.   //@}
  440.   /**@name Concatenation operators **/
  441.   //@{
  442.     /**Concatenate two strings to produce a third. The original strings are
  443.        not modified, an entirely new unique reference to a string is created.
  444.        
  445.        @return
  446.        new string with concatenation of the object and parameter.
  447.      */
  448.     PString operator+(
  449.       const PString & str   /// String to concatenate.
  450.     ) const;
  451.     /**Concatenate a C string to a PString to produce a third. The original
  452.        string is not modified, an entirely new unique reference to a string
  453.        is created. The #cstr# parameter is typically a literal
  454.        string, eg:
  455. begin{verbatim}
  456.           myStr = aStr + "fred";
  457. end{verbatim}
  458.        @return
  459.        new string with concatenation of the object and parameter.
  460.      */
  461.     PString operator+(
  462.       const char * cstr  /// C string to concatenate.
  463.     ) const;
  464.     /**Concatenate a single character to a PString to produce a third. The
  465.        original string is not modified, an entirely new unique reference to a
  466.        string is created. The #ch# parameter is typically a
  467.        literal, eg:
  468. begin{verbatim}
  469.           myStr = aStr + '!';
  470. end{verbatim}
  471.        @return
  472.        new string with concatenation of the object and parameter.
  473.      */
  474.     PString operator+(
  475.       char ch   /// Character to concatenate.
  476.     ) const;
  477.     /**Concatenate a PString to a C string to produce a third. The original
  478.        string is not modified, an entirely new unique reference to a string
  479.        is created. The #cstr# parameter is typically a literal
  480.        string, eg:
  481. begin{verbatim}
  482.           myStr = "fred" + aStr;
  483. end{verbatim}
  484.        @return
  485.        new string with concatenation of the object and parameter.
  486.      */
  487.     friend PString operator+(
  488.       const char * cstr,    /// C string to be concatenated to.
  489.       const PString & str   /// String to concatenate.
  490.     );
  491.     /**Concatenate a PString to a single character to produce a third. The
  492.        original string is not modified, an entirely new unique reference to a
  493.        string is created. The #c# parameter is typically a literal,
  494.        eg:
  495. begin{verbatim}
  496.           myStr = '!' + aStr;
  497. end{verbatim}
  498.        @return
  499.        new string with concatenation of the object and parameter.
  500.      */
  501.     friend PString operator+(
  502.       char  c,              /// Character to be concatenated to.
  503.       const PString & str   /// String to concatenate.
  504.     );
  505.     /**Concatenate a string to another string, modifiying that string.
  506.        @return
  507.        reference to string that was concatenated to.
  508.      */
  509.     PString & operator+=(
  510.       const PString & str   /// String to concatenate.
  511.     );
  512.     /**Concatenate a C string to a PString, modifiying that string. The
  513.        #cstr# parameter is typically a literal string, eg:
  514. begin{verbatim}
  515.           myStr += "fred";
  516. end{verbatim}
  517.        @return
  518.        reference to string that was concatenated to.
  519.      */
  520.     PString & operator+=(
  521.       const char * cstr  /// C string to concatenate.
  522.     );
  523.     /**Concatenate a single character to a PString. The #ch#
  524.        parameter is typically a literal, eg:
  525. begin{verbatim}
  526.           myStr += '!';
  527. end{verbatim}
  528.        @return
  529.        new string with concatenation of the object and parameter.
  530.      */
  531.     PString & operator+=(
  532.       char ch   /// Character to concatenate.
  533.     );
  534.     /**Concatenate two strings to produce a third. The original strings are
  535.        not modified, an entirely new unique reference to a string is created.
  536.        
  537.        @return
  538.        new string with concatenation of the object and parameter.
  539.      */
  540.     PString operator&(
  541.       const PString & str   /// String to concatenate.
  542.     ) const;
  543.     /**Concatenate a C string to a PString to produce a third. The original
  544.        string is not modified, an entirely new unique reference to a string
  545.        is created. The #cstr# parameter is typically a literal
  546.        string, eg:
  547. begin{verbatim}
  548.           myStr = aStr & "fred";
  549. end{verbatim}
  550.        This function differes from operator+ in that it assures there is at
  551.        least one space between the strings. Exactly one space is added if
  552.        there is not a space at the end of the first or beggining of the last
  553.        string.
  554.        @return
  555.        new string with concatenation of the object and parameter.
  556.      */
  557.     PString operator&(
  558.       const char * cstr  /// C string to concatenate.
  559.     ) const;
  560.     /**Concatenate a single character to a PString to produce a third. The
  561.        original string is not modified, an entirely new unique reference to a
  562.        string is created. The #ch# parameter is typically a
  563.        literal, eg:
  564. begin{verbatim}
  565.           myStr = aStr & '!';
  566. end{verbatim}
  567.        This function differes from operator+ in that it assures there is at
  568.        least one space between the strings. Exactly one space is added if
  569.        there is not a space at the end of the first or beggining of the last
  570.        string.
  571.        @return
  572.        new string with concatenation of the object and parameter.
  573.      */
  574.     PString operator&(
  575.       char ch   /// Character to concatenate.
  576.     ) const;
  577.     /**Concatenate a PString to a C string to produce a third. The original
  578.        string is not modified, an entirely new unique reference to a string
  579.        is created. The #cstr# parameter is typically a literal
  580.        string, eg:
  581. begin{verbatim}
  582.           myStr = "fred" & aStr;
  583. end{verbatim}
  584.        This function differes from operator+ in that it assures there is at
  585.        least one space between the strings. Exactly one space is added if
  586.        there is not a space at the end of the first or beggining of the last
  587.        string.
  588.        @return
  589.        new string with concatenation of the object and parameter.
  590.      */
  591.     friend PString operator&(
  592.       const char * cstr,    /// C string to be concatenated to.
  593.       const PString & str   /// String to concatenate.
  594.     );
  595.     /**Concatenate a PString to a single character to produce a third. The
  596.        original string is not modified, an entirely new unique reference to a
  597.        string is created. The #c# parameter is typically a literal,
  598.        eg:
  599. begin{verbatim}
  600.           myStr = '!' & aStr;
  601. end{verbatim}
  602.        This function differes from #operator+# in that it assures there is at
  603.        least one space between the strings. Exactly one space is added if
  604.        there is not a space at the end of the first or beggining of the last
  605.        string.
  606.        @return
  607.        new string with concatenation of the object and parameter.
  608.      */
  609.     friend PString operator&(
  610.       char  ch,              /// Character to be concatenated to.
  611.       const PString & str   /// String to concatenate.
  612.     );
  613.     /**Concatenate a string to another string, modifiying that string.
  614.        @return
  615.        reference to string that was concatenated to.
  616.      */
  617.     PString & operator&=(
  618.       const PString & str   /// String to concatenate.
  619.     );
  620.     /**Concatenate a C string to a PString, modifiying that string. The
  621.        #cstr# parameter is typically a literal string, eg:
  622. begin{verbatim}
  623.           myStr &= "fred";
  624. end{verbatim}
  625.        This function differes from operator+ in that it assures there is at
  626.        least one space between the strings. Exactly one space is added if
  627.        there is not a space at the end of the first or beggining of the last
  628.        string.
  629.        @return
  630.        reference to string that was concatenated to.
  631.      */
  632.     PString & operator&=(
  633.       const char * cstr  /// C string to concatenate.
  634.     );
  635.     /**Concatenate a character to a PString, modifiying that string. The
  636.        #ch# parameter is typically a literal string, eg:
  637. begin{verbatim}
  638.           myStr &= '!';
  639. end{verbatim}
  640.        This function differes from operator+ in that it assures there is at
  641.        least one space between the strings. Exactly one space is added if
  642.        there is not a space at the end of the first or beggining of the last
  643.        string.
  644.        @return
  645.        reference to string that was concatenated to.
  646.      */
  647.     PString & operator&=(
  648.       char ch  /// Character to concatenate.
  649.     );
  650.   //@}
  651.   /**@name Comparison operators */
  652.   //@{
  653.     /**Compare two strings using case insensitive comparison.
  654.        @return
  655.        TRUE if equal.
  656.      */
  657.     BOOL operator*=(
  658.       const PString & str  /// PString object to compare against.
  659.     ) const;
  660.     /**Compare two strings using the #PObject::Compare()# function. This
  661.        is identical to the #PObject# class function but is necessary due
  662.        to other overloaded versions.
  663.        @return
  664.        TRUE if equal.
  665.      */
  666.     BOOL operator==(
  667.       const PObject & str  /// PString object to compare against.
  668.     ) const;
  669.     /**Compare two strings using the #PObject::Compare()# function. This
  670.        is identical to the #PObject# class function but is necessary due
  671.        to other overloaded versions.
  672.        @return
  673.        TRUE if not equal.
  674.      */
  675.     BOOL operator!=(
  676.       const PObject & str  /// PString object to compare against.
  677.     ) const;
  678.     /**Compare two strings using the #PObject::Compare()# function. This
  679.        is identical to the #PObject# class function but is necessary due
  680.        to other overloaded versions.
  681.        @return
  682.        TRUE if less than.
  683.      */
  684.     BOOL operator<(
  685.       const PObject & str  /// PString object to compare against.
  686.     ) const;
  687.     /**Compare two strings using the #PObject::Compare()# function. This
  688.        is identical to the #PObject# class function but is necessary due
  689.        to other overloaded versions.
  690.        @return
  691.        TRUE if greater than.
  692.      */
  693.     BOOL operator>(
  694.       const PObject & str  /// PString object to compare against.
  695.     ) const;
  696.     /**Compare two strings using the #PObject::Compare()# function. This
  697.        is identical to the #PObject# class function but is necessary due
  698.        to other overloaded versions.
  699.        @return
  700.        TRUE if less than or equal.
  701.      */
  702.     BOOL operator<=(
  703.       const PObject & str  /// PString object to compare against.
  704.     ) const;
  705.     /**Compare two strings using the #PObject::Compare()# function. This
  706.        is identical to the #PObject# class function but is necessary due
  707.        to other overloaded versions.
  708.        @return
  709.        TRUE if greater than or equal.
  710.      */
  711.     BOOL operator>=(
  712.       const PObject & str  /// PString object to compare against.
  713.     ) const;
  714.     /**Compare a PString to a C string using a case insensitive compare
  715.        function. The #cstr# parameter is typically a literal string,
  716.        eg:
  717. begin{verbatim}
  718.           if (myStr == "fred")
  719. end{verbatim}
  720.        @return
  721.        TRUE if equal.
  722.      */
  723.     BOOL operator*=(
  724.       const char * cstr  /// C string to compare against.
  725.     ) const;
  726.     /**Compare a PString to a C string using the ##Compare()##
  727.        function. The #cstr# parameter is typically a literal string,
  728.        eg:
  729. begin{verbatim}
  730.           if (myStr == "fred")
  731. end{verbatim}
  732.        @return
  733.        TRUE if equal.
  734.      */
  735.     BOOL operator==(
  736.       const char * cstr  /// C string to compare against.
  737.     ) const;
  738.     /**Compare a PString to a C string using the #PObject::Compare()#
  739.        function. The #cstr# parameter is typically a literal
  740.        string, eg:
  741. begin{verbatim}
  742.           if (myStr != "fred")
  743. end{verbatim}
  744.        @return
  745.        TRUE if not equal.
  746.      */
  747.     BOOL operator!=(
  748.       const char * cstr  /// C string to compare against.
  749.     ) const;
  750.     /**Compare a PString to a C string using the #PObject::Compare()#
  751.        function. The #cstr# parameter is typically a literal
  752.        string, eg:
  753. begin{verbatim}
  754.           if (myStr < "fred")
  755. end{verbatim}
  756.        @return
  757.        TRUE if less than.
  758.      */
  759.     BOOL operator<(
  760.       const char * cstr  /// C string to compare against.
  761.     ) const;
  762.     /**Compare a PString to a C string using the #PObject::Compare()#
  763.        function. The #cstr# parameter is typically a literal
  764.        string, eg:
  765. begin{verbatim}
  766.           if (myStr > "fred")
  767. end{verbatim}
  768.        @return
  769.        TRUE if greater than.
  770.      */
  771.     BOOL operator>(
  772.       const char * cstr  /// C string to compare against.
  773.     ) const;
  774.     /**Compare a PString to a C string using the #PObject::Compare()#
  775.        function. The #cstr# parameter is typically a literal
  776.        string, eg:
  777. begin{verbatim}
  778.           if (myStr <= "fred")
  779. end{verbatim}
  780.        @return
  781.        TRUE if less than or equal.
  782.      */
  783.     BOOL operator<=(
  784.       const char * cstr  /// C string to compare against.
  785.     ) const;
  786.     /**Compare a PString to a C string using the #PObject::Compare()#
  787.        function. The #cstr# parameter is typically a literal
  788.        string, eg:
  789. begin{verbatim}
  790.           if (myStr >= "fred")
  791. end{verbatim}
  792.        @return
  793.        TRUE if greater than or equal.
  794.      */
  795.     BOOL operator>=(
  796.       const char * cstr  /// C string to compare against.
  797.     ) const;
  798.   //@}
  799.   /**@name Search & replace functions */
  800.   //@{
  801.     /** Locate the position within the string of the character. */
  802.     PINDEX Find(
  803.       char ch,              /// Character to search for in string.
  804.       PINDEX offset = 0     /// Offset into string to begin search.
  805.     ) const;
  806.     /** Locate the position within the string of the substring. */
  807.     PINDEX Find(
  808.       const PString & str,  /// String to search for in string.
  809.       PINDEX offset = 0     /// Offset into string to begin search.
  810.     ) const;
  811.     /* Locate the position within the string of the character or substring. The
  812.        search will begin at the character offset provided.
  813.        
  814.        If #offset# is beyond the length of the string, then the
  815.        function will always return #P_MAX_INDEX#.
  816.        
  817.        The matching will be for identical character or string. If a search
  818.        ignoring case is required then the string should be converted to a
  819.        #PCaselessString# before the search is made.
  820.        @return
  821.        position of character or substring in the string, or P_MAX_INDEX if the
  822.        character or substring is not in the string.
  823.      */
  824.     PINDEX Find(
  825.       const char * cstr,    /// C string to search for in string.
  826.       PINDEX offset = 0     /// Offset into string to begin search.
  827.     ) const;
  828.     /** Locate the position of the last matching character. */
  829.     PINDEX FindLast(
  830.       char ch,                     /// Character to search for in string.
  831.       PINDEX offset = P_MAX_INDEX  /// Offset into string to begin search.
  832.     ) const;
  833.     /** Locate the position of the last matching substring. */
  834.     PINDEX FindLast(
  835.       const PString & str,         /// String to search for in string.
  836.       PINDEX offset = P_MAX_INDEX  /// Offset into string to begin search.
  837.     ) const;
  838.     /**Locate the position of the last matching substring.
  839.        Locate the position within the string of the last matching character or
  840.        substring. The search will begin at the character offset provided,
  841.        moving backward through the string.
  842.        If #offset# is beyond the length of the string, then the
  843.        search begins at the end of the string. If #offset# is zero
  844.        then the function always returns #P_MAX_INDEX#.
  845.        The matching will be for identical character or string. If a search
  846.        ignoring case is required then the string should be converted to a
  847.        #PCaselessString# before the search is made.
  848.        @return
  849.        position of character or substring in the string, or P_MAX_INDEX if the
  850.        character or substring is not in the string.
  851.      */
  852.     PINDEX FindLast(
  853.       const char * cstr,           /// C string to search for in string.
  854.       PINDEX offset = P_MAX_INDEX  /// Offset into string to begin search.
  855.     ) const;
  856.     /** Locate the position of one of the characters in the set. */
  857.     PINDEX FindOneOf(
  858.       const PString & set,  /// String of characters to search for in string.
  859.       PINDEX offset = 0     /// Offset into string to begin search.
  860.     ) const;
  861.     /**Locate the position of one of the characters in the set.
  862.        The search will begin at the character offset provided.
  863.        If #offset# is beyond the length of the string, then the
  864.        function will always return #P_MAX_INDEX#.
  865.        
  866.        The matching will be for identical character or string. If a search
  867.        ignoring case is required then the string should be converted to a
  868.        #PCaselessString# before the search is made.
  869.        @return
  870.        position of character in the string, or P_MAX_INDEX if no characters
  871.        from the set are in the string.
  872.      */
  873.     PINDEX FindOneOf(
  874.       const char * cset,    /// C string of characters to search for in string.
  875.       PINDEX offset = 0     /// Offset into string to begin search.
  876.     ) const;
  877.     /**Locate the position within the string of one of the regular expression.
  878.        The search will begin at the character offset provided.
  879.        If #offset# is beyond the length of the string, then the
  880.        function will always return #P_MAX_INDEX#.
  881.        
  882.        @return
  883.        position of regular expression in the string, or P_MAX_INDEX if no
  884.        characters from the set are in the string.
  885.      */
  886.     PINDEX FindRegEx(
  887.       const PRegularExpression & regex, /// regular expression to find
  888.       PINDEX offset = 0                 /// Offset into string to begin search.
  889.     ) const;
  890.     /**Locate the position within the string of one of the regular expression.
  891.        The search will begin at the character offset provided.
  892.        If #offset# is beyond the length of the string, then the
  893.        function will always return #P_MAX_INDEX#.
  894.        
  895.        @return
  896.        position of regular expression in the string, or P_MAX_INDEX if no
  897.        characters from the set are in the string.
  898.      */
  899.     BOOL FindRegEx(
  900.       const PRegularExpression & regex, /// regular expression to find
  901.       PINDEX & pos,                     /// Position of matched expression
  902.       PINDEX & len,                     /// Length of matched expression
  903.       PINDEX offset = 0,                /// Offset into string to begin search.
  904.       PINDEX maxPos = P_MAX_INDEX       /// Maximum offset into string
  905.     ) const;
  906.     /**Locate the substring within the string and replace it with the specifed
  907.        substring. The search will begin at the character offset provided.
  908.        If #offset# is beyond the length of the string, then the
  909.        function will do nothing.
  910.        The matching will be for identical character or string. If a search
  911.        ignoring case is required then the string should be converted to a
  912.        #PCaselessString# before the search is made.
  913.      */
  914.     void Replace(
  915.       const PString & target,   /// String to be replaced in string.
  916.       const PString & subs,     /// String to do replace in string.
  917.       BOOL all = FALSE,         /// Replace all occurrences of string.
  918.       PINDEX offset = 0         /// Offset into string to begin search.
  919.     );
  920.     /**Splice the string into the current string at the specified position. The
  921.        specified number of bytes are removed from the string.
  922.        Note that this function will break the current instance from multiple
  923.        references to the string. A new string buffer is allocated and the data
  924.        from the old string buffer copied to it.
  925.      */
  926.     void Splice(
  927.       const PString & str,  /// Substring to insert.
  928.       PINDEX pos,           /// Position in string to insert the substring.
  929.       PINDEX len = 0        /// Length of section to remove.
  930.     );
  931.     /**Splice the string into the current string at the specified position. The
  932.        specified number of bytes are removed from the string.
  933.        Note that this function will break the current instance from multiple
  934.        references to the string. A new string buffer is allocated and the data
  935.        from the old string buffer copied to it.
  936.      */
  937.     void Splice(
  938.       const char * cstr,    /// Substring to insert.
  939.       PINDEX pos,           /// Position in string to insert the substring.
  940.       PINDEX len = 0        /// Length of section to remove.
  941.     );
  942.     /**Remove the substring from the string.
  943.        Note that this function will break the current instance from multiple
  944.        references to the string. A new string buffer is allocated and the data
  945.        from the old string buffer copied to it.
  946.      */
  947.     void Delete(
  948.       PINDEX start,   /// Position in string to remove.
  949.       PINDEX len      /// Number of characters to delete.
  950.     );
  951.   //@}
  952.   /**@name Sub-string functions */
  953.   //@{
  954.     /**Extract a portion of the string into a new string. The original string
  955.        is not changed and a new unique reference to a string is returned.
  956.        
  957.        The substring is returned inclusive of the characters at the
  958.        #start# and #end# positions.
  959.        
  960.        If the #end# position is greater than the length of the
  961.        string then all characters from the #start# up to the end of
  962.        the string are returned.
  963.        If #start# is greater than the length of the string or
  964.        #end# is before #start# then an empty string is
  965.        returned.
  966.        @return
  967.        substring of the source string.
  968.      */
  969.     PString operator()(
  970.       PINDEX start,  /// Starting position of the substring.
  971.       PINDEX end     /// Ending position of the substring.
  972.     ) const;
  973.     /**Extract a portion of the string into a new string. The original string
  974.        is not changed and a new unique reference to a string is returned.
  975.        
  976.        A substring from the beginning of the string for the number of
  977.        characters specified is extracted.
  978.        
  979.        If #len# is greater than the length of the string then all
  980.        characters to the end of the string are returned.
  981.        If #len# is zero then an empty string is returned.
  982.        @return
  983.        substring of the source string.
  984.      */
  985.     PString Left(
  986.       PINDEX len   /// Number of characters to extract.
  987.     ) const;
  988.     /**Extract a portion of the string into a new string. The original string
  989.        is not changed and a new unique reference to a string is returned.
  990.        A substring from the end of the string for the number of characters
  991.        specified is extracted.
  992.        
  993.        If #len# is greater than the length of the string then all
  994.        characters to the beginning of the string are returned.
  995.        If #len# is zero then an empty string is returned.
  996.        @return
  997.        substring of the source string.
  998.      */
  999.     PString Right(
  1000.       PINDEX len   /// Number of characters to extract.
  1001.     ) const;
  1002.     /**Extract a portion of the string into a new string. The original string
  1003.        is not changed and a new unique reference to a string is returned.
  1004.        
  1005.        A substring from the #start# position for the number of
  1006.        characters specified is extracted.
  1007.        
  1008.        If #len# is greater than the length of the string from the
  1009.        #start# position then all characters to the end of the
  1010.        string are returned.
  1011.        If #start# is greater than the length of the string or
  1012.        #len# is zero then an empty string is returned.
  1013.        @return
  1014.        substring of the source string.
  1015.      */
  1016.     PString Mid(
  1017.       PINDEX start,             /// Starting position of the substring.
  1018.       PINDEX len = P_MAX_INDEX  /// Number of characters to extract.
  1019.     ) const;
  1020.     /**Create a string consisting of all characters from the source string
  1021.        except all spaces at the beginning of the string. The original string
  1022.        is not changed and a new unique reference to a string is returned.
  1023.        
  1024.        @return
  1025.        string with leading spaces removed.
  1026.      */
  1027.     PString LeftTrim() const;
  1028.     /**Create a string consisting of all characters from the source string
  1029.        except all spaces at the end of the string. The original string is not
  1030.        changed and a new unique reference to a string is returned.
  1031.        
  1032.        @return
  1033.        string with trailing spaces removed.
  1034.      */
  1035.     PString RightTrim() const;
  1036.     /**Create a string consisting of all characters from the source string
  1037.        except all spaces at the beginning and end of the string. The original
  1038.        string is not changed and a new unique reference to a string is
  1039.        returned.
  1040.        
  1041.        @return
  1042.        string with leading and trailing spaces removed.
  1043.      */
  1044.     PString Trim() const;
  1045.     /**Create a string consisting of all characters from the source string
  1046.        with all upper case letters converted to lower case. The original
  1047.        string is not changed and a new unique reference to a string is
  1048.        returned.
  1049.        
  1050.        @return
  1051.        string with upper case converted to lower case.
  1052.      */
  1053.     PString ToLower() const;
  1054.     /**Create a string consisting of all characters from the source string
  1055.        with all lower case letters converted to upper case. The original
  1056.        string is not changed and a new unique reference to a string is
  1057.        returned.
  1058.        
  1059.        @return
  1060.        string with lower case converted to upper case.
  1061.      */
  1062.     PString ToUpper() const;
  1063.     /** Split the string into an array of substrings. */
  1064.     PStringArray Tokenise(
  1065.       const PString & separators,
  1066.         /// A string for the set of separator characters that delimit tokens.
  1067.       BOOL onePerSeparator = TRUE
  1068.         /// Flag for if there are empty tokens between consecutive separators.
  1069.     ) const;
  1070.     /**Split the string into an array of substrings.
  1071.        Divide the string into an array of substrings delimited by characters
  1072.        from the specified set.
  1073.        
  1074.        There are two options for the tokenisation, the first is where the
  1075.        #onePerSeparator# is TRUE. This form will produce a token
  1076.        for each delimiter found in the set. Thus the string ",two,three,,five"
  1077.        would be split into 5 substrings; "", "two", "three", "" and "five".
  1078.        
  1079.        The second form where #onePerSeparator# is FALSE is used
  1080.        where consecutive delimiters do not constitute a empty token. In this
  1081.        case the string "  a list  of words  " would be split into 4 substrings;
  1082.        "a", "list", "of" and "words".
  1083.        There is an important distinction when there are delimiters at the
  1084.        beginning or end of the source string. In the first case there will be
  1085.        empty strings at the end of the array and in the second the delimiters
  1086.        are ignored.
  1087.        @return
  1088.        an array of substring for each token in the string.
  1089.      */
  1090.     PStringArray Tokenise(
  1091.       const char * cseparators,
  1092.         /// A C string for the set of separator characters that delimit tokens.
  1093.       BOOL onePerSeparator = TRUE
  1094.         /// Flag for if there are empty tokens between consecutive separators.
  1095.     ) const;
  1096.     /**Split the string into individual lines. The line delimiters may be a
  1097.        carriage return ('r'), a line feed ('n') or a carriage return and
  1098.        line feed pair ("rn"). A line feed and carriage return pair ("nr")
  1099.        would yield a blank line. between the characters.
  1100.        The #Tokenise()# function should not be used to split a string
  1101.        into lines as a #"rn"# pair consitutes a single line
  1102.        ending. The #Tokenise()# function would produce a blank line in
  1103.        between them.
  1104.        @return
  1105.        string array with a substring for each line in the string.
  1106.      */
  1107.     PStringArray Lines() const;
  1108.   //@}
  1109.   /**@name Conversion functions */
  1110.   //@{
  1111.     /**Concatenate a formatted output to the string. This is identical to the
  1112.        standard C library #sprintf()# function, but appends its
  1113.        output to the string.
  1114.        
  1115.        This function makes the assumption that there is less the 1000
  1116.        characters of formatted output. The function will assert if this occurs.
  1117.        Note that this function will break the current instance from multiple
  1118.        references to the string. A new string buffer is allocated and the data
  1119.        from the old string buffer copied to it.
  1120.        
  1121.        @return
  1122.        reference to the current string object.
  1123.      */
  1124.     PString & sprintf(
  1125.       const char * cfmt,   /// C string for output format.
  1126.       ...                  /// Extra parameters for #sprintf()# call.
  1127.     );
  1128.     /**Produce formatted output as a string. This is identical to the standard
  1129.        C library #sprintf()# function, but sends its output to a
  1130.        #PString#.
  1131.        This function makes the assumption that there is less the 1000
  1132.        characters of formatted output. The function will assert if this occurs.
  1133.        Note that this function will break the current instance from multiple
  1134.        references to the string. A new string buffer is allocated and the data
  1135.        from the old string buffer copied to it.
  1136.        
  1137.        @return
  1138.        reference to the current string object.
  1139.      */
  1140.     friend PString psprintf(
  1141.       const char * cfmt,   /// C string for output format.
  1142.       ...                  /// Extra parameters for #sprintf()# call.
  1143.     );
  1144.     /** Concatenate a formatted output to the string. */
  1145.     PString & vsprintf(
  1146.       const PString & fmt, /// String for output format.
  1147.       va_list args         /// Extra parameters for #sprintf()# call.
  1148.     );
  1149.     /**Concatenate a formatted output to the string. This is identical to the
  1150.        standard C library #vsprintf()# function, but appends its
  1151.        output to the string.
  1152.        This function makes the assumption that there is less the 1000
  1153.        characters of formatted output. The function will assert if this occurs.
  1154.        Note that this function will break the current instance from multiple
  1155.        references to the string. A new string buffer is allocated and the data
  1156.        from the old string buffer copied to it.
  1157.        
  1158.        @return
  1159.        reference to the current string object.
  1160.      */
  1161.     PString & vsprintf(
  1162.       const char * cfmt,   /// C string for output format.
  1163.       va_list args         /// Extra parameters for #sprintf()# call.
  1164.     );
  1165.     /** Produce formatted output as a string. */
  1166.     friend PString pvsprintf(
  1167.       const char * cfmt,   /// C string for output format.
  1168.       va_list args         /// Extra parameters for #sprintf()# call.
  1169.     );
  1170.     /**Produce formatted output as a string. This is identical to the standard
  1171.        C library #vsprintf()# function, but sends its output to a
  1172.        #PString#.
  1173.        This function makes the assumption that there is less the 1000
  1174.        characters of formatted output. The function will assert if this occurs.
  1175.        Note that this function will break the current instance from multiple
  1176.        references to the string. A new string buffer is allocated and the data
  1177.        from the old string buffer copied to it.
  1178.        
  1179.        @return
  1180.        reference to the current string object.
  1181.      */
  1182.     friend PString pvsprintf(
  1183.       const PString & fmt, /// String for output format.
  1184.       va_list args         /// Extra parameters for #sprintf()# call.
  1185.     );
  1186.     /**Convert the string to an integer value using the specified number base.
  1187.        All characters up to the first illegal character for the number base are
  1188.        converted. Case is not significant for bases greater than 10.
  1189.        The number base may only be from 2 to 36 and the function will assert
  1190.        if it is not in this range.
  1191.        This function uses the standard C library #strtol()# function.
  1192.        @return
  1193.        integer value for the string.
  1194.      */
  1195.     long AsInteger(
  1196.       unsigned base = 10    /// Number base to convert the string in.
  1197.     ) const;
  1198.     /**Convert the string to an integer value using the specified number base.
  1199.        All characters up to the first illegal character for the number base are
  1200.        converted. Case is not significant for bases greater than 10.
  1201.        The number base may only be from 2 to 36 and the function will assert
  1202.        if it is not in this range.
  1203.        This function uses the standard C library #strtoul()# function.
  1204.        @return
  1205.        integer value for the string.
  1206.      */
  1207.     DWORD AsUnsigned(
  1208.       unsigned base = 10    /// Number base to convert the string in.
  1209.     ) const;
  1210.     /**Convert the string to an integer value using the specified number base.
  1211.        All characters up to the first illegal character for the number base are
  1212.        converted. Case is not significant for bases greater than 10.
  1213.        The number base may only be from 2 to 36 and the function will assert
  1214.        if it is not in this range.
  1215.        This function uses the standard C library #strtoq()#
  1216.        or #strtoul()# function.
  1217.        @return
  1218.        integer value for the string.
  1219.      */
  1220.     PInt64 AsInt64(
  1221.       unsigned base = 10    /// Number base to convert the string in.
  1222.     ) const;
  1223.     /**Convert the string to an integer value using the specified number base.
  1224.        All characters up to the first illegal character for the number base are
  1225.        converted. Case is not significant for bases greater than 10.
  1226.        The number base may only be from 2 to 36 and the function will assert
  1227.        if it is not in this range.
  1228.        This function uses the standard C library #strtouq()#
  1229.        or #strtoul()# function.
  1230.        @return
  1231.        integer value for the string.
  1232.      */
  1233.     PUInt64 AsUnsigned64(
  1234.       unsigned base = 10    /// Number base to convert the string in.
  1235.     ) const;
  1236.     /**Convert the string to a floating point number. This number may be in
  1237.        decimal or exponential form. All characters up to the first illegal
  1238.        character for a floting point number are converted.
  1239.        This function uses the standard C library #strtod()#
  1240.        function.
  1241.        @return
  1242.        floating point value for the string.
  1243.      */
  1244.     double AsReal() const;
  1245.      
  1246.     /**Convert a standard null terminated string to a "pascal" style string.
  1247.        This consists of a songle byte for the length of the string and then
  1248.        the string characters following it.
  1249.        
  1250.        This function will assert if the string is greater than 255 characters
  1251.        in length.
  1252.        @return
  1253.        byte array containing the "pascal" style string.
  1254.      */
  1255.     PBYTEArray ToPascal() const;
  1256.     /**Convert the string to C literal string format. This will convert non
  1257.        printable characters to the nnn form or for standard control characters
  1258.        such as line feed, to n form. Any '"' characters are also escaped with
  1259.        a  character and the entire string is enclosed in '"' characters.
  1260.        
  1261.        @return
  1262.        string converted to a C language literal form.
  1263.      */
  1264.     PString ToLiteral() const;
  1265. #ifndef PHAS_UNICODE
  1266.     /**Get the internal buffer as a pointer to unsigned characters. The
  1267.        standard "operator const char *" function is provided by the
  1268.        #PCharArray# ancestor class.
  1269.        @return
  1270.        pointer to character buffer.
  1271.      */
  1272.     operator const unsigned char *() const;
  1273. #endif
  1274.   //@}
  1275.   protected:
  1276.     virtual Comparison InternalCompare(
  1277.       PINDEX offset,      // Offset into string to compare.
  1278.       char c              // Character to compare against.
  1279.     ) const;
  1280.     virtual Comparison InternalCompare(
  1281.       PINDEX offset,      // Offset into string to compare.
  1282.       PINDEX length,      // Number of characters to compare.
  1283.       const char * cstr   // C string to compare against.
  1284.     ) const;
  1285.     /* Internal function to compare the current string value against the
  1286.        specified C string.
  1287.        @return
  1288.        relative rank of the two strings.
  1289.      */
  1290.     PString(int dummy, const PString * str);
  1291. };
  1292. //////////////////////////////////////////////////////////////////////////////
  1293. /**This class is a variation of a string that ignores case. Thus in all
  1294.    standard comparison (#==#, #<# etc) and search
  1295.    (#Find()# etc) functions the case of the characters and strings is
  1296.    ignored.
  1297.    
  1298.    The characters in the string still maintain their case. Only the comparison
  1299.    operations are affected. So printing etc will still display the string as
  1300.    entered.
  1301.  */
  1302. class PCaselessString : public PString
  1303. {
  1304.   PCLASSINFO(PCaselessString, PString);
  1305.   public:
  1306.     /**Create a new, empty, caseless string.
  1307.      */
  1308.     PCaselessString();
  1309.     /**Create a new caseless string, initialising it to the characters in the
  1310.        C string provided.
  1311.      */
  1312.     PCaselessString(
  1313.       const char * cstr   /// C string to initialise the caseless string from.
  1314.     );
  1315.     /**Create a caseless string, with a reference to the characters in the
  1316.        normal #PString# provided. A PCaselessString may also be provided
  1317.        to this constructor.
  1318.      */
  1319.     PCaselessString(
  1320.       const PString & str  /// String to initialise the caseless string from.
  1321.     );
  1322.     /**Set the current instance to reference the same string as the
  1323.        #str# parameter. */
  1324.     PCaselessString & operator=(
  1325.       const PString & str  /// String to initialise the caseless string from.
  1326.     );
  1327.     /**Set the current instance to reference the same string as the
  1328.        #str# parameter. The previous reference is decremented and
  1329.        if no more references to the string are present, the string buffer is
  1330.        released. A PCaselessString may also be provided to this operator.
  1331.      */
  1332.     PCaselessString & operator=(
  1333.       const char * cstr   /// C string to initialise the caseless string from.
  1334.     );
  1335.   // Overrides from class PObject
  1336.     /**Make a complete duplicate of the string. Note that the data in the
  1337.        array of characters is duplicated as well and the new object is a
  1338.        unique reference to that data.
  1339.      */
  1340.     virtual PObject * Clone() const;
  1341.   protected:
  1342.   // Overrides from class PString
  1343.     virtual Comparison InternalCompare(
  1344.       PINDEX offset,      // Offset into string to compare.
  1345.       char c              // Character to compare against.
  1346.     ) const;
  1347.     virtual Comparison InternalCompare(
  1348.       PINDEX offset,      // Offset into string to compare.
  1349.       PINDEX length,      // Number of characters to compare.
  1350.       const char * cstr   // C string to compare against.
  1351.     ) const;
  1352.     /* Internal function to compare the current string value against the
  1353.        specified C string.
  1354.        @return
  1355.        relative rank of the two strings or characters.
  1356.      */
  1357.     PCaselessString(int dummy, const PCaselessString * str);
  1358. };
  1359. //////////////////////////////////////////////////////////////////////////////
  1360. class PStringStream;
  1361. /**This class is a standard C++ stream class descendent for reading or writing
  1362.    streamed data to or from a #PString# class.
  1363.    
  1364.    All of the standard stream I/O operators, manipulators etc will operate on
  1365.    the PStringStream class.
  1366.  */
  1367. class PStringStream : public PString, public iostream
  1368. {
  1369.   PCLASSINFO(PStringStream, PString);
  1370.   public:
  1371.     /**Create a new, empty, string stream. Data may be output to this stream,
  1372.        but attempts to input from it will return end of file.
  1373.      */
  1374.     PStringStream();
  1375.     /**Create a new string stream and initialise it to the provided value. The
  1376.        string stream references the same string buffer as the #str#
  1377.        parameter until any output to the string stream is attempted. The
  1378.        reference is then broken and the instance of the string stream becomes
  1379.        a unique reference to a string buffer.
  1380.      */
  1381.     PStringStream(
  1382.       const PString & str   /// Initial value for string stream.
  1383.     );
  1384.     /**Create a new string stream and initialise it with the provided value.
  1385.        The stream may be read or written from. Writes will append to the end of
  1386.        the string.
  1387.      */
  1388.     PStringStream(
  1389.       const char * cstr   /// Initial value for the string stream.
  1390.     );
  1391.     /**Assign the string to the current object. The current instance then
  1392.        becomes another reference to the same string in the #str#
  1393.        parameter.
  1394.        
  1395.        This will reset the read pointer for input to the beginning of the
  1396.        string. Also, any data output to the string up until the asasignement
  1397.        will be lost.
  1398.        @return
  1399.        reference to the current PStringStream object.
  1400.      */
  1401.     PStringStream & operator=(
  1402.       const PString & str  /// New string to assign.
  1403.     );
  1404.     /**Assign the C string to the string stream. The current instance then
  1405.        becomes a unique reference to a copy of the #cstr#
  1406.        parameter. The #cstr# parameter is typically a literal
  1407.        string, eg:
  1408. begin{verbatim}
  1409.           myStr = "fred";
  1410. end{verbatim}
  1411.        This will reset the read pointer for input to the beginning of the
  1412.        string. Also, any data output to the string up until the asasignement
  1413.        will be lost.
  1414.        @return
  1415.        reference to the current PStringStream object.
  1416.      */
  1417.     PStringStream & operator=(
  1418.       const char * cstr  /// C string to assign.
  1419.     );
  1420.     /// Destroy the string stream, deleting the stream buffer
  1421.     virtual ~PStringStream();
  1422.   private:
  1423.     PStringStream(int, const PStringStream &) { }
  1424.     PStringStream & operator=(const PStringStream &) { return *this; }
  1425.     class Buffer : public streambuf {
  1426.       public:
  1427.         Buffer(PStringStream * str);
  1428.         Buffer(const Buffer & sbuf);
  1429.         Buffer & operator=(const Buffer & sbuf);
  1430.         virtual int overflow(int=EOF);
  1431.         virtual int underflow();
  1432.         virtual int sync();
  1433. #ifdef __MWERKS__
  1434.         virtual streampos seekoff(streamoff, ios::seekdir, ios::openmode);
  1435. #else
  1436.         virtual streampos seekoff(streamoff, ios::seek_dir, int);
  1437. #endif
  1438.         PStringStream * string;
  1439.     };
  1440. };
  1441. /**This is an array collection class of #PString# objects. It has all the
  1442.    usual functions for a collection, with the object types set to
  1443.    #PString# pointers.
  1444.    
  1445.    In addition some addition functions are added that take a const
  1446.    #PString# reference instead of a pointer as most standard collection
  1447.    functions do. This is more convenient for when string expressions are used
  1448.    as parameters to function in the collection.
  1449.    See the #PAbstractArray# and #PArray# classes and
  1450.    #PDECLARE_ARRAY# macro for more information.
  1451. */
  1452. #ifdef DOC_PLUS_PLUS
  1453. class PStringArray : public PArray {
  1454. #endif
  1455. PDECLARE_ARRAY(PStringArray, PString);
  1456.   public:
  1457.   /**@name Construction */
  1458.   //@{
  1459.     /**Create a PStringArray from the array of C strings.
  1460.      */
  1461.     PStringArray(
  1462.       PINDEX count,                 /// Count of strings in array
  1463.       char const * const * strarr,  /// Array of C strings
  1464.       BOOL caseless = FALSE         /// New strings are to be PCaselessStrings
  1465.     );
  1466.   //@}
  1467.   /**@name New functions for class */
  1468.   //@{
  1469.     /**As for #GetValuesIndex()# but takes a PString argument so that
  1470.        literals will be automatically converted.
  1471.        @return
  1472.        Index of string in array or P_MAX_INDEX if not found.
  1473.      */
  1474.     PINDEX GetStringsIndex(
  1475.       const PString & str /// String to search for index of
  1476.     ) const;
  1477.     inline PString & operator[](
  1478.       PINDEX index  // Index position in the collection of the object.
  1479.     ) const { return PStringArray_PTemplate::operator[](index); }
  1480.     /**Retrieve a reference  to the object in the array. If there was not an
  1481.        object at that ordinal position or the index was beyond the size of the
  1482.        array then the function will create a new one.
  1483.        @return
  1484.        reference to the object at #index# position.
  1485.      */
  1486.     PString & operator[](
  1487.       PINDEX index  /// Index position in the collection of the object.
  1488.     );
  1489.   //@}
  1490. };
  1491. /**This is a list collection class of #PString# objects. It has all the
  1492.    usual functions for a collection, with the object types set to
  1493.    #PString# pointers.
  1494.    
  1495.    In addition some addition functions are added that take a const
  1496.    #PString# reference instead of a pointer as most standard collection
  1497.    functions do. This is more convenient for when string expressions are used
  1498.    as parameters to function in the collection.
  1499.    See the #PAbstractList# and #PList# classes and
  1500.    #PDECLARE_LIST# macro for more information.
  1501.  */
  1502. #ifdef DOC_PLUS_PLUS
  1503. class PStringList : public PList {
  1504. #endif
  1505. PDECLARE_LIST(PStringList, PString);
  1506.   public:
  1507.   /**@name Construction */
  1508.   //@{
  1509.     /**Create a PStringArray from the array of C strings.
  1510.      */
  1511.     PStringList(
  1512.       PINDEX count,                 /// Count of strings in array
  1513.       char const * const * strarr,  /// Array of C strings
  1514.       BOOL caseless = FALSE         /// New strings are to be PCaselessStrings
  1515.     );
  1516.   //@}
  1517.   /**@name Operations */
  1518.   //@{
  1519.     /** Append a string to the list.
  1520.      */
  1521.     PINDEX AppendString(
  1522.       const PString & str /// String to append.
  1523.     );
  1524.     /** Insert a string into the list.
  1525.      */
  1526.     PINDEX InsertString(
  1527.       const PString & before,   /// String to insert before.
  1528.       const PString & str       /// String to insert.
  1529.     );
  1530.     /** Get the index of the string with the specified value.
  1531.       A linear search of list is performed to find the string value.
  1532.      */
  1533.     PINDEX GetStringsIndex(
  1534.       const PString & str   /// String value to search for.
  1535.     ) const;
  1536.   //@}
  1537. };
  1538. /**This is a sorted list collection class of #PString# objects. It has all
  1539.    the usual functions for a collection, with the object types set to
  1540.    #PString# pointers.
  1541.    
  1542.    In addition some addition functions are added that take a const
  1543.    #PString# reference instead of a pointer as most standard collection
  1544.    functions do. This is more convenient for when string expressions are used
  1545.    as parameters to function in the collection.
  1546.    See the #PAbstractSortedList# and #PSortedList# classes and
  1547.    #PDECLARE_SORTEDLIST# macro for more information.
  1548.  */
  1549. #ifdef DOC_PLUS_PLUS
  1550. class PSortedStringList : public PSortedList {
  1551. #endif
  1552. PDECLARE_SORTED_LIST(PSortedStringList, PString);
  1553.   public:
  1554.   /**@name Construction */
  1555.   //@{
  1556.     /**Create a PStringArray from the array of C strings.
  1557.      */
  1558.     PSortedStringList(
  1559.       PINDEX count,                 /// Count of strings in array
  1560.       char const * const * strarr,  /// Array of C strings
  1561.       BOOL caseless = FALSE         /// New strings are to be PCaselessStrings
  1562.     );
  1563.   //@}
  1564.   /**@name Operations */
  1565.   //@{
  1566.     /** Add a string to the list.
  1567.         This will place the string in the correct position in the sorted list.
  1568.      */
  1569.     PINDEX AppendString(
  1570.       const PString & str /// String to append.
  1571.     );
  1572.     /** Get the index of the string with the specified value.
  1573.       A binary search of tree is performed to find the string value.
  1574.      */
  1575.     PINDEX GetStringsIndex(
  1576.       const PString & str   /// String value to search for.
  1577.     ) const;
  1578.   //@}
  1579. };
  1580. /**This is a set collection class of #PString# objects. It has all the
  1581.    usual functions for a collection, with the object types set to
  1582.    #PString# pointers.
  1583.    In addition some addition functions are added that take a const
  1584.    #PString# reference instead of a pointer as most standard collection
  1585.    functions do. This is more convenient for when string expressions are used
  1586.    as parameters to function in the collection.
  1587.    Unlike the normal sets, this will delete the PStrings removed from it. This
  1588.    complements the automatic creation of new PString objects when literals or
  1589.    expressions are used.
  1590.    See the #PAbstractSet# and #PSet# classes and #PDECLARE_SET#
  1591.    macro for more information.
  1592.  */
  1593. #ifdef DOC_PLUS_PLUS
  1594. class PStringSet : public PSet {
  1595. #endif
  1596. PDECLARE_SET(PStringSet, PString, TRUE);
  1597.   public:
  1598.   /**@name Construction */
  1599.   //@{
  1600.     /**Create a PStringArray from the array of C strings.
  1601.      */
  1602.     PStringSet(
  1603.       PINDEX count,                 /// Count of strings in array
  1604.       char const * const * strarr,  /// Array of C strings
  1605.       BOOL caseless = FALSE         /// New strings are to be PCaselessStrings
  1606.     );
  1607.   //@}
  1608.   /**@name Operations */
  1609.   //@{
  1610.     /** Include the spcified string value into the set. */
  1611.     void Include(
  1612.       const PString & key /// String value to add to set.
  1613.     );
  1614.     /** Include the spcified string value into the set. */
  1615.     PStringSet & operator+=(
  1616.       const PString & key /// String value to add to set.
  1617.     );
  1618.     /** Exclude the spcified string value from the set. */
  1619.     void Exclude(
  1620.       const PString & key /// String value to remove from set.
  1621.     );
  1622.     /** Exclude the spcified string value from the set. */
  1623.     PStringSet & operator-=(
  1624.       const PString & key /// String value to remove from set.
  1625.     );
  1626.   //@}
  1627. };
  1628. #ifdef PHAS_TEMPLATES
  1629. /**This template class maps the PAbstractDictionary to a specific key type and
  1630.    a #PString# data type. The functions in this class primarily do all the
  1631.    appropriate casting of types.
  1632.    Note that if templates are not used the #PDECLARE_STRING_DICTIONARY#
  1633.    macro will simulate the template instantiation.
  1634.  */
  1635. template <class K> class PStringDictionary : public PAbstractDictionary
  1636. {
  1637.   PCLASSINFO(PStringDictionary, PAbstractDictionary);
  1638.   public:
  1639.   /**@name Construction */
  1640.   //@{
  1641.     /**Create a new, empty, dictionary.
  1642.        Note that by default, objects placed into the dictionary will be
  1643.        deleted when removed or when all references to the dictionary are
  1644.        destroyed.
  1645.      */
  1646.     PStringDictionary()
  1647.       : PAbstractDictionary() { }
  1648.   //@}
  1649.   /**@name Overrides from class PObject */
  1650.   //@{
  1651.     /**Make a complete duplicate of the dictionary. Note that all objects in
  1652.        the array are also cloned, so this will make a complete copy of the
  1653.        dictionary.
  1654.      */
  1655.     virtual PObject * Clone() const
  1656.       { return PNEW PStringDictionary(0, this); }
  1657.   //@}
  1658.   /**@name New functions for class */
  1659.   //@{
  1660.     /**Get the string contained in the dictionary at the #key#
  1661.        position. The hash table is used to locate the data quickly via the
  1662.        hash function provided by the key.
  1663.        The last key/data pair is remembered by the class so that subseqent
  1664.        access is very fast.
  1665.        This function asserts if there is no data at the key position.
  1666.        @return
  1667.        reference to the object indexed by the key.
  1668.      */
  1669.     const PString & operator[](const K & key) const
  1670.       { return (const PString &)GetRefAt(key); }
  1671.     /**Get the string contained in the dictionary at the #key#
  1672.        position. The hash table is used to locate the data quickly via the
  1673.        hash function provided by the key.
  1674.        The last key/data pair is remembered by the class so that subseqent
  1675.        access is very fast.
  1676.        This function returns the #dflt# value if there is no data
  1677.        at the key position.
  1678.        @return
  1679.        reference to the object indexed by the key.
  1680.      */
  1681.     PString operator()(const K & key, const char * dflt = "") const
  1682.       { if (AbstractContains(key)) return (*this)[key]; return dflt; }
  1683.     /**Determine if the value of the object is contained in the hash table. The
  1684.        object values are compared, not the pointers.  So the objects in the
  1685.        collection must correctly implement the #PObject::Compare()#
  1686.        function. The hash table is used to locate the entry.
  1687.        @return
  1688.        TRUE if the object value is in the dictionary.
  1689.      */
  1690.     BOOL Contains(
  1691.       const K & key   // Key to look for in the dictionary.
  1692.       ) const { return AbstractContains(key); }
  1693.     /**Remove an object at the specified key. The returned pointer is then
  1694.        removed using the #SetAt()# function to set that key value to
  1695.        NULL. If the #AllowDeleteObjects# option is set then the
  1696.        object is also deleted.
  1697.        @return
  1698.        pointer to the object being removed, or NULL if it was deleted.
  1699.      */
  1700.     virtual PString * RemoveAt(
  1701.       const K & key   // Key for position in dictionary to get object.
  1702.     ) { PString * s = GetAt(key); AbstractSetAt(key, NULL); return s; }
  1703.     /**Get the object at the specified key position. If the key was not in the
  1704.        collection then NULL is returned.
  1705.        @return
  1706.        pointer to object at the specified key.
  1707.      */
  1708.     virtual PString * GetAt(
  1709.       const K & key   // Key for position in dictionary to get object.
  1710.     ) const { return (PString *)AbstractGetAt(key); }
  1711.     /**Set the data at the specified ordinal index position in the dictionary.
  1712.        The ordinal position in the dictionary is determined by the hash values
  1713.        of the keys and the order of insertion.
  1714.        @return
  1715.        TRUE if the new object could be placed into the dictionary.
  1716.      */
  1717.     virtual BOOL SetDataAt(
  1718.       PINDEX index,        // Ordinal index in the dictionary.
  1719.       const PString & str  // New string value to put into the dictionary.
  1720.     ) { return PAbstractDictionary::SetDataAt(index, PNEW PString(str)); }
  1721.     /**Add a new object to the collection. If the objects value is already in
  1722.        the dictionary then the object is overrides the previous value. If the
  1723.        AllowDeleteObjects option is set then the old object is also deleted.
  1724.        The object is placed in the an ordinal position dependent on the keys
  1725.        hash function. Subsequent searches use the has function to speed access
  1726.        to the data item.
  1727.        @return
  1728.        TRUE if the object was successfully added.
  1729.      */
  1730.     virtual BOOL SetAt(
  1731.       const K & key,       // Key for position in dictionary to add object.
  1732.       const PString & str  // New string value to put into the dictionary.
  1733.     ) { return AbstractSetAt(key, PNEW PString(str)); }
  1734.     /**Get the key in the dictionary at the ordinal index position.
  1735.     
  1736.        The ordinal position in the dictionary is determined by the hash values
  1737.        of the keys and the order of insertion.
  1738.        The last key/data pair is remembered by the class so that subseqent
  1739.        access is very fast.
  1740.        @return
  1741.        reference to key at the index position.
  1742.      */
  1743.     const K & GetKeyAt(PINDEX index) const
  1744.       { return (const K &)AbstractGetKeyAt(index); }
  1745.     /**Get the data in the dictionary at the ordinal index position.
  1746.     
  1747.        The ordinal position in the dictionary is determined by the hash values
  1748.        of the keys and the order of insertion.
  1749.        The last key/data pair is remembered by the class so that subseqent
  1750.        access is very fast.
  1751.        @return
  1752.        reference to data at the index position.
  1753.      */
  1754.     PString & GetDataAt(PINDEX index) const
  1755.       { return (PString &)AbstractGetDataAt(index); }
  1756.   //@}
  1757.   protected:
  1758.     PStringDictionary(int dummy, const PStringDictionary * c)
  1759.       : PAbstractDictionary(dummy, c) { }
  1760. };
  1761. /**Begin declaration of a dictionary of strings class.
  1762.    This macro is used to declare a descendent of PAbstractList class,
  1763.    customised for a particular key type {bf K} and data object type
  1764.    #PString#.
  1765.    If the compilation is using templates then this macro produces a descendent
  1766.    of the #PStringDictionary# template class. If templates are not being
  1767.    used then the macro defines a set of inline functions to do all casting of
  1768.    types. The resultant classes have an identical set of functions in either
  1769.    case.
  1770.    See the #PStringDictionary# and #PAbstractDictionary# classes for
  1771.    more information.
  1772.  */
  1773. #define PDECLARE_STRING_DICTIONARY(cls, K) 
  1774.   PDECLARE_CLASS(cls, PStringDictionary<K>) 
  1775.   protected: 
  1776.     cls(int dummy, const cls * c) 
  1777.       : PStringDictionary<K>(dummy, c) { } 
  1778.   public: 
  1779.     cls() 
  1780.       : PStringDictionary<K>() { } 
  1781.     virtual PObject * Clone() const 
  1782.       { return PNEW cls(0, this); } 
  1783. /**Declare a dictionary of strings class.
  1784.    This macro is used to declare a descendent of PAbstractDictionary class,
  1785.    customised for a particular key type {bf K} and data object type
  1786.    #PString#. This macro closes the class declaration off so no additional
  1787.    members can be added.
  1788.    If the compilation is using templates then this macro produces a typedef
  1789.    of the #PStringDictionary# template class.
  1790.    See the #PStringDictionary# class and #PDECLARE_STRING_DICTIONARY#
  1791.    macro for more information.
  1792.  */
  1793. #define PSTRING_DICTIONARY(cls, K) typedef PStringDictionary<K> cls
  1794. #else // PHAS_TEMPLATES
  1795. #define PSTRING_DICTIONARY(cls, K) 
  1796.   class cls : public PAbstractDictionary { 
  1797.   PCLASSINFO(cls, PAbstractDictionary) 
  1798.   protected: 
  1799.     inline cls(int dummy, const cls * c) 
  1800.       : PAbstractDictionary(dummy, c) { } 
  1801.   public: 
  1802.     inline cls() 
  1803.       : PAbstractDictionary() { } 
  1804.     inline virtual PObject * Clone() const 
  1805.       { return PNEW cls(0, this); } 
  1806.     inline PString & operator[](const K & key) const 
  1807.       { return (PString &)GetRefAt(key); } 
  1808.     inline PString operator()(const K & key, const char * dflt = "") const 
  1809.       { if (Contains(key)) return (PString &)GetRefAt(key); return dflt; } 
  1810.     virtual BOOL Contains(const K & key) const 
  1811.       { return AbstractContains(key); } 
  1812.     virtual PString * RemoveAt(const K & key) 
  1813.       { PString * s = GetAt(key); AbstractSetAt(key, NULL); return s; } 
  1814.     inline virtual PString * GetAt(const K & key) const 
  1815.       { return (PString *)AbstractGetAt(key); } 
  1816.     inline virtual BOOL SetDataAt(PINDEX index, const PString & str) 
  1817.       { return PAbstractDictionary::SetDataAt(index,PNEW PString(str));} 
  1818.     inline virtual BOOL SetAt(const K & key, const PString & str) 
  1819.       { return AbstractSetAt(key, PNEW PString(str)); } 
  1820.     inline const K & GetKeyAt(PINDEX index) const 
  1821.       { return (const K &)AbstractGetKeyAt(index); } 
  1822.     inline PString & GetDataAt(PINDEX index) const 
  1823.       { return (PString &)AbstractGetDataAt(index); } 
  1824.   }
  1825. #define PDECLARE_STRING_DICTIONARY(cls, K) 
  1826.   PSTRING_DICTIONARY(cls##_PTemplate, K); 
  1827.   PDECLARE_CLASS(cls, cls##_PTemplate) 
  1828.   protected: 
  1829.     cls(int dummy, const cls * c) 
  1830.       : cls##_PTemplate(dummy, c) { } 
  1831.   public: 
  1832.     cls() 
  1833.       : cls##_PTemplate() { } 
  1834.     virtual PObject * Clone() const 
  1835.       { return PNEW cls(0, this); } 
  1836. #endif // PHAS_TEMPLATES
  1837. /**This is a dictionary collection class of #PString# objects, keyed by an
  1838.    ordinal value. It has all the usual functions for a collection, with the
  1839.    object types set to #PString# pointers. The class could be considered
  1840.    like a sparse array of strings.
  1841.    In addition some addition functions are added that take a const
  1842.    #PString# reference instead of a pointer as most standard collection
  1843.    functions do. This is more convenient for when string expressions are used
  1844.    as parameters to function in the collection.
  1845.    See the #PAbstractDictionary# and #PStringDictionary# classes and
  1846.    #PDECLARE_DICTIONARY# and #PDECLARE_STRING_DICTIONARY# macros for
  1847.    more information.
  1848.  */
  1849. #ifdef DOC_PLUS_PLUS
  1850. class POrdinalToString : public PStringDictionary {
  1851. #endif
  1852. PDECLARE_STRING_DICTIONARY(POrdinalToString, POrdinalKey);
  1853.   public:
  1854.     /// Structure for static array initialiser for class.
  1855.     struct Initialiser {
  1856.       /// Ordinal key for string.
  1857.       PINDEX key;
  1858.       /// String value for ordinal.
  1859.       const char * value;
  1860.     };
  1861.     /** Initialise the ordinal dictionary of strings from the static array.
  1862.      */
  1863.     POrdinalToString(
  1864.       PINDEX count,                /// Count of strings in initialiser array
  1865.       const Initialiser * init     /// Array of Initialiser structures
  1866.     );
  1867. };
  1868. /**This is a dictionary collection class of ordinals keyed by
  1869.    #PString# objects. It has all the usual functions for a collection,
  1870.    with the object types set to #POrdinalKey# pointers.
  1871.    In addition some addition functions are added that take a const
  1872.    #POrdinalKey# reference or a simple #PINDEX# instead of a pointer
  1873.    as most standard collection functions do. This is more convenient for when
  1874.    integer expressions are used as parameters to function in the collection.
  1875.    See the #PAbstractDicionary# and #POrdinalDictionary# classes and
  1876.    #PDECLARE_ORDINAL_DICTIONARY# macro for more information.
  1877.  */
  1878. #ifdef DOC_PLUS_PLUS
  1879. class PStringToOrdinal : public POrdinalDictionary {
  1880. #endif
  1881. PDECLARE_ORDINAL_DICTIONARY(PStringToOrdinal, PString);
  1882.   public:
  1883.     /// Structure for static array initialiser for class.
  1884.     struct Initialiser {
  1885.       /// String key for ordinal.
  1886.       const char * key;
  1887.       /// Ordinal value for string.
  1888.       PINDEX value;
  1889.     };
  1890.     /** Initialise the string dictionary of ordinals from the static array.
  1891.      */
  1892.     PStringToOrdinal(
  1893.       PINDEX count,                /// Count of strings in initialiser array
  1894.       const Initialiser * init,    /// Array of Initialiser structures
  1895.       BOOL caseless = FALSE        /// New keys are to be PCaselessStrings
  1896.     );
  1897. };
  1898. /**This is a dictionary collection class of #PString# objects, keyed by
  1899.    another string. It has all the usual functions for a collection, with the
  1900.    object types set to #PString# pointers.
  1901.    In addition some addition functions are added that take a const
  1902.    #PString# reference instead of a pointer as most standard collection
  1903.    functions do. This is more convenient for when string expressions are used
  1904.    as parameters to function in the collection.
  1905.    See the #PAbstractDictionary# and #PStringDictionary# classes and
  1906.    #PDECLARE_DICTIONARY# and #PDECLARE_STRING_DICTIONARY# macros for
  1907.    more information.
  1908.  */
  1909. #ifdef DOC_PLUS_PLUS
  1910. class PStringToString : public PStringDictionary {
  1911. #endif
  1912. PDECLARE_STRING_DICTIONARY(PStringToString, PString);
  1913.   public:
  1914.     /// Structure for static array initialiser for class.
  1915.     struct Initialiser {
  1916.       /// String key for string.
  1917.       const char * key;
  1918.       /// String value for string.
  1919.       const char * value;
  1920.     };
  1921.     /** Initialise the string dictionary of strings from the static array.
  1922.      */
  1923.     PStringToString(
  1924.       PINDEX count,                /// Count of strings in initialiser array
  1925.       const Initialiser * init,    /// Array of Initialiser structures
  1926.       BOOL caselessKeys = FALSE,   /// New keys are to be PCaselessStrings
  1927.       BOOL caselessValues = FALSE  /// New values are to be PCaselessStrings
  1928.     );
  1929. };
  1930. extern "C" {
  1931. typedef struct re_pattern_buffer regex_t;
  1932. };
  1933. /**A class representing a regular expression that may be used for locating
  1934.    patterns in strings. The regular expression string is "compiled" into a
  1935.    form that is more efficient during the matching. This compiled form
  1936.    exists for the lifetime of the PRegularExpression instance.
  1937.  */
  1938. class PRegularExpression : public PObject
  1939. {
  1940.   PCLASSINFO(PRegularExpression, PObject);
  1941.   public:
  1942.   /**@name Constructors & destructors */
  1943.   //@{
  1944.     /// Flags for compiler options.
  1945.     enum {
  1946.       /// Use extended regular expressions
  1947.       Extended = 1,
  1948.       /// Ignore case in search.
  1949.       IgnoreCase = 2,
  1950.       /**If this bit is set, then anchors do not match at newline
  1951.          characters in the string. If not set, then anchors do match
  1952.          at newlines.
  1953.         */
  1954.       AnchorNewLine = 4
  1955.     };
  1956.     /// Flags for execution options.
  1957.     enum {
  1958.       /**If this bit is set, then the beginning-of-line operator doesn't match
  1959.          the beginning of the string (presumably because it's not the
  1960.          beginning of a line).
  1961.          If not set, then the beginning-of-line operator does match the
  1962.          beginning of the string.
  1963.       */
  1964.       NotBeginningOfLine = 1,
  1965.       /**Like #NotBeginningOfLine#, except for the end-of-line.  */
  1966.       NotEndofLine = 2
  1967.     };
  1968.     /// Create a new, empty, regular expression
  1969.     PRegularExpression();
  1970.     /** Create and compile a new regular expression pattern.
  1971.      */
  1972.     PRegularExpression(
  1973.       const PString & pattern,    /// Pattern to compile
  1974.       int flags = IgnoreCase      /// Pattern match options
  1975.     );
  1976.     /** Create and compile a new regular expression pattern.
  1977.      */
  1978.     PRegularExpression(
  1979.       const char * cpattern,      /// Pattern to compile
  1980.       int flags = IgnoreCase      /// Pattern match options
  1981.     );
  1982.     /// Release storage for the compiled regular expression.
  1983.     ~PRegularExpression();
  1984.   //@}
  1985.   /**@name Status functions */
  1986.   //@{
  1987.     /// Error codes.
  1988.     enum ErrorCodes {
  1989.       /// Success.
  1990.       NoError = 0,     
  1991.       /// Didn't find a match (for regexec).
  1992.       NoMatch,       
  1993.       // POSIX regcomp return error codes.  (In the order listed in the standard.)
  1994.       /// Invalid pattern.
  1995.       BadPattern,   
  1996.       /// Not implemented.
  1997.       CollateError,   
  1998.       /// Invalid character class name.
  1999.       BadClassType,   
  2000.       /// Trailing backslash.
  2001.       BadEscape,     
  2002.       /// Invalid back reference.
  2003.       BadSubReg,
  2004.       /// Unmatched left bracket.
  2005.       UnmatchedBracket, 
  2006.       /// Parenthesis imbalance.
  2007.       UnmatchedParen,
  2008.       /// Unmatched #{}#.
  2009.       UnmatchedBrace,
  2010.       /// Invalid contents of #{}#.
  2011.       BadBR,         
  2012.       /// Invalid range end.
  2013.       RangeError,   
  2014.       /// Ran out of memory.
  2015.       OutOfMemory,
  2016.       /// No preceding re for repetition op.
  2017.       BadRepitition,
  2018.       /* Error codes we've added.  */
  2019.       /// Premature end.
  2020.       PrematureEnd,
  2021.       /// Compiled pattern bigger than 2^16 bytes.
  2022.       TooBig,
  2023.       /// Unmatched ) or ); not returned from regcomp.
  2024.       UnmatchedRParen,
  2025.       /// Miscellaneous error
  2026.       NotCompiled
  2027.     };
  2028.     /**Get the error code for the last Compile() or Execute() operation.
  2029.        @return
  2030.        Error code.
  2031.      */
  2032.     ErrorCodes GetErrorCode() const;
  2033.     /**Get the text description for the error of the last Compile() or
  2034.        Execute() operation.
  2035.        @return
  2036.        Error text string.
  2037.      */
  2038.     PString GetErrorText() const;
  2039.   //@}
  2040.   /**@name Compile & Execute functions */
  2041.   //@{
  2042.     /** Compiler pattern. */
  2043.     BOOL Compile(
  2044.       const PString & pattern,    /// Pattern to compile
  2045.       int flags = IgnoreCase      /// Pattern match options
  2046.     );
  2047.     /**Compiler pattern.
  2048.        The pattern is compiled into an internal format to speed subsequent
  2049.        execution of the pattern match algorithm.
  2050.        @return
  2051.        TRUE if successfully compiled.
  2052.      */
  2053.     BOOL Compile(
  2054.       const char * cpattern,      /// Pattern to compile
  2055.       int flags = IgnoreCase      /// Pattern match options
  2056.     );
  2057.     /** Execute regular expression */
  2058.     BOOL Execute(
  2059.       const PString & str,    /// Source string to search
  2060.       PINDEX & start,         /// First match locations
  2061.       int flags = 0           /// Pattern match options
  2062.     ) const;
  2063.     /** Execute regular expression */
  2064.     BOOL Execute(
  2065.       const PString & str,    /// Source string to search
  2066.       PINDEX & start,         /// First match locations
  2067.       PINDEX & len,           /// Length of match
  2068.       int flags = 0           /// Pattern match options
  2069.     ) const;
  2070.     /** Execute regular expression */
  2071.     BOOL Execute(
  2072.       const char * cstr,      /// Source string to search
  2073.       PINDEX & start,         /// First match locations
  2074.       int flags = 0           /// Pattern match options
  2075.     ) const;
  2076.     /** Execute regular expression */
  2077.     BOOL Execute(
  2078.       const char * cstr,      /// Source string to search
  2079.       PINDEX & start,         /// First match locations
  2080.       PINDEX & len,           /// Length of match
  2081.       int flags = 0           /// Pattern match options
  2082.     ) const;
  2083.     /** Execute regular expression */
  2084.     BOOL Execute(
  2085.       const PString & str,    /// Source string to search
  2086.       PIntArray & starts,     /// List of match locations
  2087.       int flags = 0           /// Pattern match options
  2088.     ) const;
  2089.     /** Execute regular expression */
  2090.     BOOL Execute(
  2091.       const PString & str,    /// Source string to search
  2092.       PIntArray & starts,     /// List of match locations
  2093.       PIntArray & ends,       /// List of match ends
  2094.       int flags = 0           /// Pattern match options
  2095.     ) const;
  2096.     /** Execute regular expression */
  2097.     BOOL Execute(
  2098.       const char * cstr,      /// Source string to search
  2099.       PIntArray & starts,     /// List of match locations
  2100.       int flags = 0           /// Pattern match options
  2101.     ) const;
  2102.     /**Execute regular expression.
  2103.        Execute the pattern match algorithm using the previously compiled
  2104.        pattern.
  2105.        The #starts# array is filled with as many matches as will fit
  2106.        into the array. If the the array size is zero then it is set to at least
  2107.        one for the first match found.
  2108.        
  2109.        The #ends# array is set to teh ending position of each
  2110.        substring whose start is returned in the #starts# array. This
  2111.        will always be set to the same size as that array.
  2112.        @return
  2113.        TRUE if successfully compiled.
  2114.      */
  2115.     BOOL Execute(
  2116.       const char * cstr,      /// Source string to search
  2117.       PIntArray & starts,     /// List of match locations
  2118.       PIntArray & ends,       /// List of match ends
  2119.       int flags = 0           /// Pattern match options
  2120.     ) const;
  2121.   //@}
  2122.   /**@name Miscellaneous functions */
  2123.   //@{
  2124.     /**Escape all characters in the #str# parameter that have a
  2125.        special meaning within a regular expression.
  2126.        @return
  2127.        String with additional escape ('') characters.
  2128.      */
  2129.     static PString EscapeString(
  2130.       const PString & str     /// String to add esacpes to.
  2131.     );
  2132.   //@}
  2133.   protected:
  2134.     regex_t * expression;
  2135.     int lastError;
  2136. };
  2137. // End Of File ///////////////////////////////////////////////////////////////