ncbistr.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:84k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbistr.hpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 19:08:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.56
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBISTR__HPP
  10. #define CORELIB___NCBISTR__HPP
  11. /*  $Id: ncbistr.hpp,v 1000.6 2004/06/01 19:08:11 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Eugene Vasilchenko, Denis Vakatov
  37.  *
  38.  *
  39.  */
  40. /// @file ncbistr.hpp
  41. /// The NCBI C++ standard methods for dealing with std::string
  42. #include <corelib/ncbitype.h>
  43. #include <corelib/ncbiexpt.hpp>
  44. #include <corelib/ncbistl.hpp>
  45. #include <string.h>
  46. #include <ctype.h>
  47. #include <time.h>
  48. #include <stdarg.h>
  49. #include <string>
  50. #include <list>
  51. #include <vector>
  52. BEGIN_NCBI_SCOPE
  53. /** @addtogroup String
  54.  *
  55.  * @{
  56.  */
  57. /// Empty "C" string (points to a '').
  58. NCBI_XNCBI_EXPORT extern const char *const kEmptyCStr;
  59. #define NcbiEmptyCStr NCBI_NS_NCBI::kEmptyCStr
  60. /// Empty "C++" string.
  61. #ifndef NCBI_OS_MSWIN
  62. class NCBI_XNCBI_EXPORT CNcbiEmptyString
  63. {
  64. public:
  65.     /// Get string.
  66.     static const string& Get(void);
  67. private:
  68.     /// Helper method to initialize private data member and return
  69.     /// null string.
  70.     static const string& FirstGet(void);
  71.     static const string* m_Str;     ///< Null string pointer.
  72. };
  73. #else  // NCBI_OS_MSWIN 
  74. class CNcbiEmptyString
  75. {
  76. public:
  77.     /// Get string.
  78.     static const string& Get(void)
  79.     {
  80.         static string empty_str;
  81.         return empty_str;
  82.     }
  83. };
  84. #endif // NCBI_OS_MSWIN
  85. /// Empty string definition.
  86. #define NcbiEmptyString NCBI_NS_NCBI::CNcbiEmptyString::Get()
  87. /// Empty string definition.
  88. #define kEmptyStr       NcbiEmptyString
  89. // SIZE_TYPE and NPOS
  90. /// Define size type.
  91. typedef NCBI_NS_STD::string::size_type SIZE_TYPE;
  92. /// Define NPOS constant as the special value "std::string::npos" which is
  93. /// returned when a substring search fails, or to indicate an unspecified
  94. /// string position.
  95. static const SIZE_TYPE NPOS = NCBI_NS_STD::string::npos;
  96. /////////////////////////////////////////////////////////////////////////////
  97. ///
  98. /// NStr --
  99. ///
  100. /// Encapuslates class-wide string processing functions.
  101. class NCBI_XNCBI_EXPORT NStr
  102. {
  103. public:
  104.     /// Convert string to numeric value.
  105.     ///
  106.     /// @param str
  107.     ///   String containing digits.
  108.     /// @return
  109.     ///   - Convert "str" to a (non-negative) "int" value and return
  110.     ///     this value.
  111.     ///   - -1 if "str" contains any symbols other than [0-9], or
  112.     ///     if it represents a number that does not fit into "int".
  113.     static int StringToNumeric(const string& str);
  114.     /// Whether to prohibit trailing symbols (any symbol but '')
  115.     /// in the StringToXxx() conversion functions below.
  116.     enum ECheckEndPtr {
  117.         eCheck_Need,   ///< Check is necessary
  118.         eCheck_Skip    ///< Skip this check
  119.     };
  120.     /// Convert string to int.
  121.     ///
  122.     /// @param str
  123.     ///   String to be converted.
  124.     /// @param base
  125.     ///   Numeric base of the number symbols (default = 10).
  126.     /// @param check
  127.     ///   Whether trailing symbols (other than '') are permitted - default
  128.     ///   is eCheck_Needed which means that if there are trailing symbols
  129.     ///   after the number, an exception will be thrown. If the value is
  130.     ///   eCheck_Skip, the string can have trailing symbols after the number.
  131.     static int StringToInt(const string& str, int base = 10,
  132.                            ECheckEndPtr check = eCheck_Need);
  133.     /// Convert string to unsigned int.
  134.     ///
  135.     /// @param str
  136.     ///   String to be converted.
  137.     /// @param base
  138.     ///   Numeric base of the number symbols (default = 10).
  139.     /// @param check
  140.     ///   Whether trailing symbols (other than '') are permitted - default
  141.     ///   is eCheck_Needed which means that if there are trailing symbols
  142.     ///   after the number, an exception will be thrown. If the value is
  143.     ///   eCheck_Skip, the string can have trailing symbols after the number.
  144.     static unsigned int StringToUInt(const string& str, int base = 10,
  145.                                      ECheckEndPtr check = eCheck_Need);
  146.     /// Convert string to long.
  147.     ///
  148.     /// @param str
  149.     ///   String to be converted.
  150.     /// @param base
  151.     ///   Numeric base of the number symbols (default = 10).
  152.     /// @param check
  153.     ///   Whether trailing symbols (other than '') are permitted - default
  154.     ///   is eCheck_Needed which means that if there are trailing symbols
  155.     ///   after the number, an exception will be thrown. If the value is
  156.     ///   eCheck_Skip, the string can have trailing symbols after the number.
  157.     static long StringToLong(const string& str, int base = 10,
  158.                              ECheckEndPtr check = eCheck_Need);
  159.     /// Convert string to unsigned long.
  160.     ///
  161.     /// @param str
  162.     ///   String to be converted.
  163.     /// @param base
  164.     ///   Numeric base of the number symbols (default = 10).
  165.     /// @param check
  166.     ///   Whether trailing symbols (other than '') are permitted - default
  167.     ///   is eCheck_Needed which means that if there are trailing symbols
  168.     ///   after the number, an exception will be thrown. If the value is
  169.     ///   eCheck_Skip, the string can have trailing symbols after the number.
  170.     static unsigned long StringToULong(const string& str, int base = 10,
  171.                                        ECheckEndPtr check = eCheck_Need);
  172.     /// Convert string to double.
  173.     ///
  174.     /// @param str
  175.     ///   String to be converted.
  176.     /// @param check
  177.     ///   Whether trailing symbols (other than '') are permitted - default
  178.     ///   is eCheck_Needed which means that if there are trailing symbols
  179.     ///   after the number, an exception will be thrown. If the value is
  180.     ///   eCheck_Skip, the string can have trailing symbols after the number.
  181.     static double StringToDouble(const string& str,
  182.                                  ECheckEndPtr check = eCheck_Need);
  183.     /// Convert string to Int8.
  184.     ///
  185.     /// @param str
  186.     ///   String to be converted.
  187.     /// @return
  188.     ///   Converted Int8 value.
  189.     static Int8 StringToInt8(const string& str);
  190.     /// Convert string to Uint8.
  191.     ///
  192.     /// @param str
  193.     ///   String to be converted.
  194.     /// @param base
  195.     ///   Radix base. Default is 10. Other values can be 2, 8, and 16.
  196.     /// @return
  197.     ///   Converted UInt8 value.
  198.     static Uint8 StringToUInt8(const string& str, int base = 10);
  199.     /// Convert string to pointer.
  200.     ///
  201.     /// @param str
  202.     ///   String to be converted.
  203.     /// @return
  204.     ///   Pointer value corresponding to its string representation.
  205.     static const void* StringToPtr(const string& str);
  206.     /// Convert Int to String.
  207.     ///
  208.     /// @param value
  209.     ///   Integer value (long) to be converted.
  210.     /// @param sign
  211.     ///   Whether converted value should be preceded by the sign (+-) character.  
  212.     /// @return
  213.     ///   Converted string value.
  214.     static string IntToString(long value, bool sign = false);
  215.     /// Convert Int to String.
  216.     ///
  217.     /// @param out_str
  218.     ///   Output string variable
  219.     /// @param value
  220.     ///   Integer value (long) to be converted.
  221.     /// @param sign
  222.     ///   Whether converted value should be preceded by the sign (+-) character.  
  223.     static void IntToString(string& out_str, long value, bool sign = false);
  224.     /// Convert UInt to string.
  225.     ///
  226.     /// @param value
  227.     ///   Integer value (unsigned long) to be converted.
  228.     /// @return
  229.     ///   Converted string value.
  230.     static string UIntToString(unsigned long value);
  231.     /// Convert UInt to string.
  232.     ///
  233.     /// @param out_str
  234.     ///   Output string variable
  235.     /// @param value
  236.     ///   Integer value (unsigned long) to be converted.
  237.     static void UIntToString(string& out_str, unsigned long value);
  238.     /// Convert Int8 to string.
  239.     ///
  240.     /// @param value
  241.     ///   Integer value (Int8) to be converted.
  242.     /// @param sign
  243.     ///   Whether converted value should be preceded by the sign (+-) character.  
  244.     /// @return
  245.     ///   Converted string value.
  246.     static string Int8ToString(Int8 value, bool sign = false);
  247.     /// Convert Int8 to string.
  248.     ///
  249.     /// @param out_str
  250.     ///   Output string variable
  251.     /// @param value
  252.     ///   Integer value (Int8) to be converted.
  253.     /// @param sign
  254.     ///   Whether converted value should be preceded by the sign (+-) character.  
  255.     static void Int8ToString(string& out_str, Int8 value, bool sign = false);
  256.     /// Convert UInt8 to string.
  257.     ///
  258.     /// @param value
  259.     ///   Integer value (UInt8) to be converted.
  260.     /// @return
  261.     ///   Converted string value.
  262.     static string UInt8ToString(Uint8 value);
  263.     /// Convert UInt8 to string.
  264.     ///
  265.     /// @param out_str
  266.     ///   Output string variable
  267.     /// @param value
  268.     ///   Integer value (UInt8) to be converted.
  269.     static void UInt8ToString(string& out_str, Uint8 value);
  270.     /// Convert double to string.
  271.     ///
  272.     /// @param value
  273.     ///   Double value to be converted.
  274.     /// @return
  275.     ///   Converted string value.
  276.     static string DoubleToString(double value);
  277.     /// Convert double to string.
  278.     ///
  279.     /// @param out_str
  280.     ///   Output string variable
  281.     /// @param value
  282.     ///   Double value to be converted.
  283.     static void DoubleToString(string& out_str, double value);
  284.     /// Convert double to string with specified precision.
  285.     ///
  286.     /// @param value
  287.     ///   Double value to be converted.
  288.     /// @param precision
  289.     ///   Precision value for conversion. If precision is more that maximum
  290.     ///   for current platform, then it will be truncated to this maximum.
  291.     /// @return
  292.     ///   Converted string value.
  293.     static string DoubleToString(double value, unsigned int precision);
  294.     /// Convert double to string with specified precision and place the result
  295.     /// in the specified buffer.
  296.     ///
  297.     /// @param value
  298.     ///   Double value to be converted.
  299.     /// @param precision
  300.     ///   Precision value for conversion. If precision is more that maximum
  301.     ///   for current platform, then it will be truncated to this maximum.
  302.     /// @param buf
  303.     ///   Put result of the conversion into this buffer.
  304.     /// @param buf_size
  305.     ///   Size of buffer, "buf".
  306.     /// @return
  307.     ///   The number of bytes stored in "buf", not counting the
  308.     ///   terminating ''.
  309.     static SIZE_TYPE DoubleToString(double value, unsigned int precision,
  310.                                     char* buf, SIZE_TYPE buf_size);
  311.     /// Convert pointer to string.
  312.     ///
  313.     /// @param out_str
  314.     ///   Output string variable
  315.     /// @param str
  316.     ///   Pointer to be converted.
  317.     static void PtrToString(string& out_str, const void* ptr);
  318.     /// Convert pointer to string.
  319.     ///
  320.     /// @param str
  321.     ///   Pointer to be converted.
  322.     /// @return
  323.     ///   String value representing the pointer.
  324.     static string PtrToString(const void* ptr);
  325.     /// Convert bool to string.
  326.     ///
  327.     /// @param value
  328.     ///   Boolean value to be converted.
  329.     /// @return
  330.     ///   One of: 'true, 'false'
  331.     static const string& BoolToString(bool value);
  332.     /// Convert string to bool.
  333.     ///
  334.     /// @param str
  335.     ///   Boolean string value to be converted.  Can recognize
  336.     ///   case-insensitive version as one of:  'true, 't', 'yes', 'y'
  337.     ///   for TRUE; and  'false', 'f', 'no', 'n' for FALSE.
  338.     /// @return
  339.     ///   TRUE or FALSE.
  340.     static bool StringToBool(const string& str);
  341.     /// Handle an arbitrary printf-style format string.
  342.     ///
  343.     /// This method exists only to support third-party code that insists on
  344.     /// representing messages in this format; please stick to type-checked
  345.     /// means of formatting such as the above ToString methods and I/O
  346.     /// streams whenever possible.
  347.     static string FormatVarargs(const char* format, va_list args);
  348.     /// Which type of string comparison.
  349.     enum ECase {
  350.         eCase,      ///< Case sensitive compare
  351.         eNocase     ///< Case insensitive compare
  352.     };
  353.     // ATTENTION.  Be aware that:
  354.     //
  355.     // 1) "Compare***(..., SIZE_TYPE pos, SIZE_TYPE n, ...)" functions
  356.     //    follow the ANSI C++ comparison rules a la "basic_string::compare()":
  357.     //       str[pos:pos+n) == pattern   --> return 0
  358.     //       str[pos:pos+n) <  pattern   --> return negative value
  359.     //       str[pos:pos+n) >  pattern   --> return positive value
  360.     //
  361.     // 2) "strn[case]cmp()" functions follow the ANSI C comparison rules:
  362.     //       str[0:n) == pattern[0:n)   --> return 0
  363.     //       str[0:n) <  pattern[0:n)   --> return negative value
  364.     //       str[0:n) >  pattern[0:n)   --> return positive value
  365.     /// Case-sensitive compare of a substring with a pattern.
  366.     ///
  367.     /// @param str
  368.     ///   String containing the substring to be compared.
  369.     /// @param pos
  370.     ///   Start position of substring to be compared.
  371.     /// @param n
  372.     ///   Number of characters in substring to be compared.
  373.     /// @param pattern
  374.     ///   String pattern (char*) to be compared with substring.
  375.     /// @return
  376.     ///   - 0, if str[pos:pos+n) == pattern.   
  377.     ///   - Negative integer, if str[pos:pos+n) <  pattern.   
  378.     ///   - Positive integer, if str[pos:pos+n) >  pattern.   
  379.     /// @sa
  380.     ///   Other forms of overloaded CompareCase() with differences in argument
  381.     ///   types: char* vs. string&
  382.     static int CompareCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  383.                            const char* pattern);
  384.     /// Case-sensitive compare of a substring with a pattern.
  385.     ///
  386.     /// @param str
  387.     ///   String containing the substring to be compared.
  388.     /// @param pos
  389.     ///   Start position of substring to be compared.
  390.     /// @param n
  391.     ///   Number of characters in substring to be compared.
  392.     /// @param pattern
  393.     ///   String pattern (string&) to be compared with substring.
  394.     /// @return
  395.     ///   - 0, if str[pos:pos+n) == pattern.   
  396.     ///   - Negative integer, if str[pos:pos+n) <  pattern.   
  397.     ///   - Positive integer, if str[pos:pos+n) >  pattern.   
  398.     /// @sa
  399.     ///   Other forms of overloaded CompareCase() with differences in argument
  400.     ///   types: char* vs. string&
  401.     static int CompareCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  402.                            const string& pattern);
  403.     /// Case-sensitive compare of two strings -- char* version.
  404.     ///
  405.     /// @param s1
  406.     ///   String to be compared -- operand 1.
  407.     /// @param s2
  408.     ///   String to be compared -- operand 2.
  409.     /// @return
  410.     ///   - 0, if s1 == s2.   
  411.     ///   - Negative integer, if s1 < s2.   
  412.     ///   - Positive integer, if s1 > s2.   
  413.     /// @sa
  414.     ///   CompareNocase(), Compare() versions with same argument types.
  415.     static int CompareCase(const char* s1, const char* s2);
  416.     /// Case-sensitive compare of two strings -- string& version.
  417.     ///
  418.     /// @param s1
  419.     ///   String to be compared -- operand 1.
  420.     /// @param s2
  421.     ///   String to be compared -- operand 2.
  422.     /// @return
  423.     ///   - 0, if s1 == s2.   
  424.     ///   - Negative integer, if s1 < s2.   
  425.     ///   - Positive integer, if s1 > s2.   
  426.     /// @sa
  427.     ///   CompareNocase(), Compare() versions with same argument types.
  428.     static int CompareCase(const string& s1, const string& s2);
  429.     /// Case-insensitive compare of a substring with a pattern.
  430.     ///
  431.     /// @param str
  432.     ///   String containing the substring to be compared.
  433.     /// @param pos
  434.     ///   Start position of substring to be compared.
  435.     /// @param n
  436.     ///   Number of characters in substring to be compared.
  437.     /// @param pattern
  438.     ///   String pattern (char*) to be compared with substring.
  439.     /// @return
  440.     ///   - 0, if str[pos:pos+n) == pattern (case-insensitive compare).   
  441.     ///   - Negative integer, if str[pos:pos+n) <  pattern (case-insensitive
  442.     ///     compare).
  443.     ///   - Positive integer, if str[pos:pos+n) >  pattern (case-insensitive
  444.     ///     compare).
  445.     /// @sa
  446.     ///   Other forms of overloaded CompareNocase() with differences in
  447.     ///   argument types: char* vs. string&
  448.     static int CompareNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  449.                              const char* pattern);
  450.     /// Case-insensitive compare of a substring with a pattern.
  451.     ///
  452.     /// @param str
  453.     ///   String containing the substring to be compared.
  454.     /// @param pos
  455.     ///   Start position of substring to be compared.
  456.     /// @param n
  457.     ///   Number of characters in substring to be compared.
  458.     /// @param pattern
  459.     ///   String pattern (string&) to be compared with substring.
  460.     /// @return
  461.     ///   - 0, if str[pos:pos+n) == pattern (case-insensitive compare).   
  462.     ///   - Negative integer, if str[pos:pos+n) <  pattern (case-insensitive
  463.     ///     compare).
  464.     ///   - Positive integer, if str[pos:pos+n) >  pattern (case-insensitive
  465.     ///     compare).
  466.     /// @sa
  467.     ///   Other forms of overloaded CompareNocase() with differences in
  468.     ///   argument types: char* vs. string&
  469.     static int CompareNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  470.                              const string& pattern);
  471.     /// Case-insensitive compare of two strings -- char* version.
  472.     ///
  473.     /// @param s1
  474.     ///   String to be compared -- operand 1.
  475.     /// @param s2
  476.     ///   String to be compared -- operand 2.
  477.     /// @return
  478.     ///   - 0, if s1 == s2 (case-insensitive compare).      
  479.     ///   - Negative integer, if s1 < s2 (case-insensitive compare).      
  480.     ///   - Positive integer, if s1 > s2 (case-insensitive compare).    
  481.     /// @sa
  482.     ///   CompareCase(), Compare() versions with same argument types.
  483.     static int CompareNocase(const char* s1, const char* s2);
  484.     /// Case-insensitive compare of two strings -- string& version.
  485.     ///
  486.     /// @param s1
  487.     ///   String to be compared -- operand 1.
  488.     /// @param s2
  489.     ///   String to be compared -- operand 2.
  490.     /// @return
  491.     ///   - 0, if s1 == s2 (case-insensitive compare).      
  492.     ///   - Negative integer, if s1 < s2 (case-insensitive compare).      
  493.     ///   - Positive integer, if s1 > s2 (case-insensitive compare).    
  494.     /// @sa
  495.     ///   CompareCase(), Compare() versions with same argument types.
  496.     static int CompareNocase(const string& s1, const string& s2);
  497.     /// Compare of a substring with a pattern.
  498.     ///
  499.     /// @param str
  500.     ///   String containing the substring to be compared.
  501.     /// @param pos
  502.     ///   Start position of substring to be compared.
  503.     /// @param n
  504.     ///   Number of characters in substring to be compared.
  505.     /// @param pattern
  506.     ///   String pattern (char*) to be compared with substring.
  507.     /// @param use_case
  508.     ///   Whether to do a case sensitive compare(eCase -- default), or a
  509.     ///   case-insensitive compare (eNocase).
  510.     /// @return
  511.     ///   - 0, if str[pos:pos+n) == pattern.   
  512.     ///   - Negative integer, if str[pos:pos+n) <  pattern.   
  513.     ///   - Positive integer, if str[pos:pos+n) >  pattern.   
  514.     /// @sa
  515.     ///   Other forms of overloaded Compare() with differences in argument
  516.     ///   types: char* vs. string&
  517.     static int Compare(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  518.                        const char* pattern, ECase use_case = eCase);
  519.     /// Compare of a substring with a pattern.
  520.     ///
  521.     /// @param str
  522.     ///   String containing the substring to be compared.
  523.     /// @param pos
  524.     ///   Start position of substring to be compared.
  525.     /// @param n
  526.     ///   Number of characters in substring to be compared.
  527.     /// @param pattern
  528.     ///   String pattern (string&) to be compared with substring.
  529.     /// @param use_case
  530.     ///   Whether to do a case sensitive compare(default is eCase), or a
  531.     ///   case-insensitive compare (eNocase).
  532.     /// @return
  533.     ///   - 0, if str[pos:pos+n) == pattern.   
  534.     ///   - Negative integer, if str[pos:pos+n) <  pattern.   
  535.     ///   - Positive integer, if str[pos:pos+n) >  pattern.   
  536.     /// @sa
  537.     ///   Other forms of overloaded Compare() with differences in argument
  538.     ///   types: char* vs. string&
  539.     static int Compare(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  540.                        const string& pattern, ECase use_case = eCase);
  541.     /// Compare two strings -- char* version.
  542.     ///
  543.     /// @param s1
  544.     ///   String to be compared -- operand 1.
  545.     /// @param s2
  546.     ///   String to be compared -- operand 2.
  547.     /// @param use_case
  548.     ///   Whether to do a case sensitive compare(default is eCase), or a
  549.     ///   case-insensitive compare (eNocase).
  550.     /// @return
  551.     ///   - 0, if s1 == s2.   
  552.     ///   - Negative integer, if s1 < s2.   
  553.     ///   - Positive integer, if s1 > s2.   
  554.     /// @sa
  555.     ///   CompareNocase(), Compare() versions with similar argument types.
  556.     static int Compare(const char* s1, const char* s2,
  557.                        ECase use_case = eCase);
  558.     /// Compare two strings -- string&, char* version.
  559.     ///
  560.     /// @param s1
  561.     ///   String to be compared -- operand 1.
  562.     /// @param s2
  563.     ///   String to be compared -- operand 2.
  564.     /// @param use_case
  565.     ///   Whether to do a case sensitive compare(default is eCase), or a
  566.     ///   case-insensitive compare (eNocase).
  567.     /// @return
  568.     ///   - 0, if s1 == s2.   
  569.     ///   - Negative integer, if s1 < s2.   
  570.     ///   - Positive integer, if s1 > s2.   
  571.     /// @sa
  572.     ///   CompareNocase(), Compare() versions with similar argument types.
  573.     static int Compare(const string& s1, const char* s2,
  574.                        ECase use_case = eCase);
  575.     /// Compare two strings -- char*, string& version.
  576.     ///
  577.     /// @param s1
  578.     ///   String to be compared -- operand 1.
  579.     /// @param s2
  580.     ///   String to be compared -- operand 2.
  581.     /// @param use_case
  582.     ///   Whether to do a case sensitive compare(default is eCase), or a
  583.     ///   case-insensitive compare (eNocase).
  584.     /// @return
  585.     ///   - 0, if s1 == s2.   
  586.     ///   - Negative integer, if s1 < s2.   
  587.     ///   - Positive integer, if s1 > s2.   
  588.     /// @sa
  589.     ///   CompareNocase(), Compare() versions with similar argument types.
  590.     static int Compare(const char* s1, const string& s2,
  591.                        ECase use_case = eCase);
  592.     /// Compare two strings -- string& version.
  593.     ///
  594.     /// @param s1
  595.     ///   String to be compared -- operand 1.
  596.     /// @param s2
  597.     ///   String to be compared -- operand 2.
  598.     /// @param use_case
  599.     ///   Whether to do a case sensitive compare(default is eCase), or a
  600.     ///   case-insensitive compare (eNocase).
  601.     /// @return
  602.     ///   - 0, if s1 == s2.   
  603.     ///   - Negative integer, if s1 < s2.   
  604.     ///   - Positive integer, if s1 > s2.   
  605.     /// @sa
  606.     ///   CompareNocase(), Compare() versions with similar argument types.
  607.     static int Compare(const string& s1, const string& s2,
  608.                        ECase use_case = eCase);
  609.     /// Case-sensitive equality of a substring with a pattern.
  610.     ///
  611.     /// @param str
  612.     ///   String containing the substring to be compared.
  613.     /// @param pos
  614.     ///   Start position of substring to be compared.
  615.     /// @param n
  616.     ///   Number of characters in substring to be compared.
  617.     /// @param pattern
  618.     ///   String pattern (char*) to be compared with substring.
  619.     /// @return
  620.     ///   - true, if str[pos:pos+n) equals pattern.   
  621.     ///   - false, otherwise
  622.     /// @sa
  623.     ///   Other forms of overloaded EqualCase() with differences in argument
  624.     ///   types: char* vs. string&
  625.     static bool EqualCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  626.                            const char* pattern);
  627.     /// Case-sensitive equality of a substring with a pattern.
  628.     ///
  629.     /// @param str
  630.     ///   String containing the substring to be compared.
  631.     /// @param pos
  632.     ///   Start position of substring to be compared.
  633.     /// @param n
  634.     ///   Number of characters in substring to be compared.
  635.     /// @param pattern
  636.     ///   String pattern (string&) to be compared with substring.
  637.     /// @return
  638.     ///   - true, if str[pos:pos+n) equals pattern.   
  639.     ///   - false, otherwise
  640.     /// @sa
  641.     ///   Other forms of overloaded EqualCase() with differences in argument
  642.     ///   types: char* vs. string&
  643.     static bool EqualCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  644.                            const string& pattern);
  645.     /// Case-sensitive equality of two strings -- char* version.
  646.     ///
  647.     /// @param s1
  648.     ///   String to be compared -- operand 1.
  649.     /// @param s2
  650.     ///   String to be compared -- operand 2.
  651.     /// @return
  652.     ///   - true, if s1 equals s2
  653.     ///   - false, otherwise
  654.     /// @sa
  655.     ///   EqualCase(), Equal() versions with same argument types.
  656.     static bool EqualCase(const char* s1, const char* s2);
  657.     /// Case-sensitive equality of two strings -- string& version.
  658.     ///
  659.     /// @param s1
  660.     ///   String to be compared -- operand 1.
  661.     /// @param s2
  662.     ///   String to be compared -- operand 2.
  663.     /// @return
  664.     ///   - true, if s1 equals s2
  665.     ///   - false, otherwise
  666.     /// @sa
  667.     ///   EqualCase(), Equal() versions with same argument types.
  668.     static bool EqualCase(const string& s1, const string& s2);
  669.     /// Case-insensitive equality of a substring with a pattern.
  670.     ///
  671.     /// @param str
  672.     ///   String containing the substring to be compared.
  673.     /// @param pos
  674.     ///   Start position of substring to be compared.
  675.     /// @param n
  676.     ///   Number of characters in substring to be compared.
  677.     /// @param pattern
  678.     ///   String pattern (char*) to be compared with substring.
  679.     /// @return
  680.     ///   - true, if str[pos:pos+n) equals pattern (case-insensitive compare).   
  681.     ///   - false, otherwise.
  682.     /// @sa
  683.     ///   Other forms of overloaded EqualNocase() with differences in
  684.     ///   argument types: char* vs. string&
  685.     static bool EqualNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  686.                              const char* pattern);
  687.     /// Case-insensitive equality of a substring with a pattern.
  688.     ///
  689.     /// @param str
  690.     ///   String containing the substring to be compared.
  691.     /// @param pos
  692.     ///   Start position of substring to be compared.
  693.     /// @param n
  694.     ///   Number of characters in substring to be compared.
  695.     /// @param pattern
  696.     ///   String pattern (string&) to be compared with substring.
  697.     /// @return
  698.     ///   - true, if str[pos:pos+n) equals pattern (case-insensitive compare).   
  699.     ///   - false, otherwise.
  700.     /// @sa
  701.     ///   Other forms of overloaded EqualNocase() with differences in
  702.     ///   argument types: char* vs. string&
  703.     static bool EqualNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  704.                              const string& pattern);
  705.     /// Case-insensitive equality of two strings -- char* version.
  706.     ///
  707.     /// @param s1
  708.     ///   String to be compared -- operand 1.
  709.     /// @param s2
  710.     ///   String to be compared -- operand 2.
  711.     /// @return
  712.     ///   - true, if s1 equals s2 (case-insensitive compare).      
  713.     ///   - false, otherwise.
  714.     /// @sa
  715.     ///   EqualCase(), Equal() versions with same argument types.
  716.     static bool EqualNocase(const char* s1, const char* s2);
  717.     /// Case-insensitive equality of two strings -- string& version.
  718.     ///
  719.     /// @param s1
  720.     ///   String to be compared -- operand 1.
  721.     /// @param s2
  722.     ///   String to be compared -- operand 2.
  723.     /// @return
  724.     ///   - true, if s1 equals s2 (case-insensitive compare).      
  725.     ///   - false, otherwise.
  726.     /// @sa
  727.     ///   EqualCase(), Equal() versions with same argument types.
  728.     static bool EqualNocase(const string& s1, const string& s2);
  729.     /// Test for equality of a substring with a pattern.
  730.     ///
  731.     /// @param str
  732.     ///   String containing the substring to be compared.
  733.     /// @param pos
  734.     ///   Start position of substring to be compared.
  735.     /// @param n
  736.     ///   Number of characters in substring to be compared.
  737.     /// @param pattern
  738.     ///   String pattern (char*) to be compared with substring.
  739.     /// @param use_case
  740.     ///   Whether to do a case sensitive compare(eCase -- default), or a
  741.     ///   case-insensitive compare (eNocase).
  742.     /// @return
  743.     ///   - true, if str[pos:pos+n) equals pattern.   
  744.     ///   - false, otherwise.
  745.     /// @sa
  746.     ///   Other forms of overloaded Equal() with differences in argument
  747.     ///   types: char* vs. string&
  748.     static bool Equal(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  749.                        const char* pattern, ECase use_case = eCase);
  750.     /// Test for equality of a substring with a pattern.
  751.     ///
  752.     /// @param str
  753.     ///   String containing the substring to be compared.
  754.     /// @param pos
  755.     ///   Start position of substring to be compared.
  756.     /// @param n
  757.     ///   Number of characters in substring to be compared.
  758.     /// @param pattern
  759.     ///   String pattern (string&) to be compared with substring.
  760.     /// @param use_case
  761.     ///   Whether to do a case sensitive compare(default is eCase), or a
  762.     ///   case-insensitive compare (eNocase).
  763.     /// @return
  764.     ///   - 0, if str[pos:pos+n) == pattern.   
  765.     ///   - Negative integer, if str[pos:pos+n) <  pattern.   
  766.     ///   - Positive integer, if str[pos:pos+n) >  pattern.   
  767.     /// @sa
  768.     ///   Other forms of overloaded Equal() with differences in argument
  769.     ///   types: char* vs. string&
  770.     static bool Equal(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  771.                        const string& pattern, ECase use_case = eCase);
  772.     /// Test for equality of two strings -- char* version.
  773.     ///
  774.     /// @param s1
  775.     ///   String to be compared -- operand 1.
  776.     /// @param s2
  777.     ///   String to be compared -- operand 2.
  778.     /// @param use_case
  779.     ///   Whether to do a case sensitive compare(default is eCase), or a
  780.     ///   case-insensitive compare (eNocase).
  781.     /// @return
  782.     ///   - 0, if s1 == s2.   
  783.     ///   - Negative integer, if s1 < s2.   
  784.     ///   - Positive integer, if s1 > s2.   
  785.     /// @sa
  786.     ///   EqualNocase(), Equal() versions with similar argument types.
  787.     static bool Equal(const char* s1, const char* s2,
  788.                        ECase use_case = eCase);
  789.     /// Test for equality of two strings -- string&, char* version.
  790.     ///
  791.     /// @param s1
  792.     ///   String to be compared -- operand 1.
  793.     /// @param s2
  794.     ///   String to be compared -- operand 2.
  795.     /// @param use_case
  796.     ///   Whether to do a case sensitive compare(default is eCase), or a
  797.     ///   case-insensitive compare (eNocase).
  798.     /// @return
  799.     ///   - true, if s1 equals s2.   
  800.     ///   - false, otherwise.
  801.     /// @sa
  802.     ///   EqualNocase(), Equal() versions with similar argument types.
  803.     static bool Equal(const string& s1, const char* s2,
  804.                        ECase use_case = eCase);
  805.     /// Test for equality of two strings -- char*, string& version.
  806.     ///
  807.     /// @param s1
  808.     ///   String to be compared -- operand 1.
  809.     /// @param s2
  810.     ///   String to be compared -- operand 2.
  811.     /// @param use_case
  812.     ///   Whether to do a case sensitive compare(default is eCase), or a
  813.     ///   case-insensitive compare (eNocase).
  814.     /// @return
  815.     ///   - true, if s1 equals s2.   
  816.     ///   - false, otherwise.
  817.     /// @sa
  818.     ///   EqualNocase(), Equal() versions with similar argument types.
  819.     static bool Equal(const char* s1, const string& s2,
  820.                        ECase use_case = eCase);
  821.     /// Test for equality of two strings -- string& version.
  822.     ///
  823.     /// @param s1
  824.     ///   String to be compared -- operand 1.
  825.     /// @param s2
  826.     ///   String to be compared -- operand 2.
  827.     /// @param use_case
  828.     ///   Whether to do a case sensitive compare(default is eCase), or a
  829.     ///   case-insensitive compare (eNocase).
  830.     /// @return
  831.     ///   - true, if s1 equals s2.   
  832.     ///   - false, otherwise.
  833.     /// @sa
  834.     ///   EqualNocase(), Equal() versions with similar argument types.
  835.     static bool Equal(const string& s1, const string& s2,
  836.                        ECase use_case = eCase);
  837.     // NOTE.  On some platforms, "strn[case]cmp()" can work faster than their
  838.     //        "Compare***()" counterparts.
  839.     /// String compare.
  840.     ///
  841.     /// @param s1
  842.     ///   String to be compared -- operand 1.
  843.     /// @param s2
  844.     ///   String to be compared -- operand 2.
  845.     /// @return
  846.     ///   - 0, if s1 == s2.   
  847.     ///   - Negative integer, if s1 < s2.   
  848.     ///   - Positive integer, if s1 > s2.   
  849.     /// @sa
  850.     ///   strncmp(), strcasecmp(), strncasecmp()
  851.     static int strcmp(const char* s1, const char* s2);
  852.     /// String compare upto specified number of characters.
  853.     ///
  854.     /// @param s1
  855.     ///   String to be compared -- operand 1.
  856.     /// @param s2
  857.     ///   String to be compared -- operand 2.
  858.     /// @param n
  859.     ///   Number of characters in string 
  860.     /// @return
  861.     ///   - 0, if s1 == s2.   
  862.     ///   - Negative integer, if s1 < s2.   
  863.     ///   - Positive integer, if s1 > s2.   
  864.     /// @sa
  865.     ///   strcmp(), strcasecmp(), strncasecmp()
  866.     static int strncmp(const char* s1, const char* s2, size_t n);
  867.     /// Case-insensitive string compare.
  868.     ///
  869.     /// @param s1
  870.     ///   String to be compared -- operand 1.
  871.     /// @param s2
  872.     ///   String to be compared -- operand 2.
  873.     /// @return
  874.     ///   - 0, if s1 == s2.   
  875.     ///   - Negative integer, if s1 < s2.   
  876.     ///   - Positive integer, if s1 > s2.   
  877.     /// @sa
  878.     ///   strcmp(), strncmp(), strncasecmp()
  879.     static int strcasecmp(const char* s1, const char* s2);
  880.     /// Case-insensitive string compare upto specfied number of characters.
  881.     ///
  882.     /// @param s1
  883.     ///   String to be compared -- operand 1.
  884.     /// @param s2
  885.     ///   String to be compared -- operand 2.
  886.     /// @return
  887.     ///   - 0, if s1 == s2.   
  888.     ///   - Negative integer, if s1 < s2.   
  889.     ///   - Positive integer, if s1 > s2.   
  890.     /// @sa
  891.     ///   strcmp(), strcasecmp(), strcasecmp()
  892.     static int strncasecmp(const char* s1, const char* s2, size_t n);
  893.     /// Wrapper for the function strftime() that corrects handling %D and %T
  894.     /// time formats on MS Windows.
  895.     static size_t strftime (char* s, size_t maxsize, const char* format,
  896.                             const struct tm* timeptr);
  897.     /// Match "str" against the "mask".
  898.     ///
  899.     /// This function do not use regular expressions.
  900.     /// @param str
  901.     ///   String to match.
  902.     /// @param mask
  903.     ///   Mask used to match string "str". And can contains next
  904.     ///   wildcard characters:
  905.     ///     ? - matches to any one symbol in the string.
  906.     ///     * - matches to any number of symbols in the string. 
  907.     /// @return
  908.     ///   Return TRUE if "str" matches "mask", and FALSE otherwise.
  909.     /// @sa
  910.     ///    CRegexp, CRegexpUtil
  911.     static bool MatchesMask(const char *str, const char *mask);
  912.     // The following 4 methods change the passed string, then return it
  913.     /// Convert string to lower case -- string& version.
  914.     /// 
  915.     /// @param str
  916.     ///   String to be converted.
  917.     /// @return
  918.     ///   Lower cased string.
  919.     static string& ToLower(string& str);
  920.     /// Convert string to lower case -- char* version.
  921.     /// 
  922.     /// @param str
  923.     ///   String to be converted.
  924.     /// @return
  925.     ///   Lower cased string.
  926.     static char* ToLower(char*   str);
  927.     /// Convert string to upper case -- string& version.
  928.     /// 
  929.     /// @param str
  930.     ///   String to be converted.
  931.     /// @return
  932.     ///   Upper cased string.
  933.     static string& ToUpper(string& str);
  934.     /// Convert string to upper case -- char* version.
  935.     /// 
  936.     /// @param str
  937.     ///   String to be converted.
  938.     /// @return
  939.     ///   Upper cased string.
  940.     static char* ToUpper(char*   str);
  941. private:
  942.     /// Privatized ToLower() with const char* parameter to prevent passing of 
  943.     /// constant strings.
  944.     static void/*dummy*/ ToLower(const char* /*dummy*/);
  945.     /// Privatized ToUpper() with const char* parameter to prevent passing of 
  946.     /// constant strings.
  947.     static void/*dummy*/ ToUpper(const char* /*dummy*/);
  948. public:
  949.     /// Check if a string starts with a specified prefix value.
  950.     ///
  951.     /// @param str
  952.     ///   String to check.
  953.     /// @param start
  954.     ///   Prefix value to check for.
  955.     /// @param use_case
  956.     ///   Whether to do a case sensitive compare(default is eCase), or a
  957.     ///   case-insensitive compare (eNocase) while checking.
  958.     static bool StartsWith(const string& str, const string& start,
  959.                            ECase use_case = eCase);
  960.     /// Check if a string ends with a specified suffix value.
  961.     ///
  962.     /// @param str
  963.     ///   String to check.
  964.     /// @param end
  965.     ///   Suffix value to check for.
  966.     /// @param use_case
  967.     ///   Whether to do a case sensitive compare(default is eCase), or a
  968.     ///   case-insensitive compare (eNocase) while checking.
  969.     static bool EndsWith(const string& str, const string& end,
  970.                          ECase use_case = eCase);
  971.     /// Whether it is the first or last occurrence.
  972.     enum EOccurrence {
  973.         eFirst,             ///< First occurrence
  974.         eLast               ///< Last occurrence
  975.     };
  976.     /// Find the pattern in the specfied range of a string.
  977.     ///
  978.     /// @param str
  979.     ///   String to search.
  980.     /// @param pattern
  981.     ///   Pattern to search for in "str". 
  982.     /// @param start
  983.     ///   Position in "str" to start search from -- default of 0 means start
  984.     ///   the search from the beginning of the string.
  985.     /// @param end
  986.     ///   Position in "str" to start search up to -- default of NPOS means
  987.     ///   to search to the end of the string.
  988.     /// @param which
  989.     ///   When set to eFirst, this means to find the first occurrence of 
  990.     ///   "pattern" in "str". When set to eLast, this means to find the last
  991.     ///    occurrence of "pattern" in "str".
  992.     /// @param use_case
  993.     ///   Whether to do a case sensitive compare(default is eCase), or a
  994.     ///   case-insensitive compare (eNocase) while searching for the pattern.
  995.     /// @return
  996.     ///   - The start of the first or last (depending on "which" parameter)
  997.     ///   occurrence of "pattern" in "str", within the string interval
  998.     ///   ["start", "end"], or
  999.     ///   - NPOS if there is no occurrence of the pattern.
  1000.     static SIZE_TYPE Find(const string& str, const string& pattern,
  1001.                           SIZE_TYPE start = 0, SIZE_TYPE end = NPOS,
  1002.                           EOccurrence which = eFirst,
  1003.                           ECase use_case = eCase);
  1004.     /// Find the pattern in the specfied range of a string using a case
  1005.     /// sensitive search.
  1006.     ///
  1007.     /// @param str
  1008.     ///   String to search.
  1009.     /// @param pattern
  1010.     ///   Pattern to search for in "str". 
  1011.     /// @param start
  1012.     ///   Position in "str" to start search from -- default of 0 means start
  1013.     ///   the search from the beginning of the string.
  1014.     /// @param end
  1015.     ///   Position in "str" to start search up to -- default of NPOS means
  1016.     ///   to search to the end of the string.
  1017.     /// @param which
  1018.     ///   When set to eFirst, this means to find the first occurrence of 
  1019.     ///   "pattern" in "str". When set to eLast, this means to find the last
  1020.     ///    occurrence of "pattern" in "str".
  1021.     /// @return
  1022.     ///   - The start of the first or last (depending on "which" parameter)
  1023.     ///   occurrence of "pattern" in "str", within the string interval
  1024.     ///   ["start", "end"], or
  1025.     ///   - NPOS if there is no occurrence of the pattern.
  1026.     static SIZE_TYPE FindCase  (const string& str, const string& pattern,
  1027.                                 SIZE_TYPE start = 0, SIZE_TYPE end = NPOS,
  1028.                                 EOccurrence which = eFirst);
  1029.     /// Find the pattern in the specfied range of a string using a case
  1030.     /// insensitive search.
  1031.     ///
  1032.     /// @param str
  1033.     ///   String to search.
  1034.     /// @param pattern
  1035.     ///   Pattern to search for in "str". 
  1036.     /// @param start
  1037.     ///   Position in "str" to start search from -- default of 0 means start
  1038.     ///   the search from the beginning of the string.
  1039.     /// @param end
  1040.     ///   Position in "str" to start search up to -- default of NPOS means
  1041.     ///   to search to the end of the string.
  1042.     /// @param which
  1043.     ///   When set to eFirst, this means to find the first occurrence of 
  1044.     ///   "pattern" in "str". When set to eLast, this means to find the last
  1045.     ///    occurrence of "pattern" in "str".
  1046.     /// @return
  1047.     ///   - The start of the first or last (depending on "which" parameter)
  1048.     ///   occurrence of "pattern" in "str", within the string interval
  1049.     ///   ["start", "end"], or
  1050.     ///   - NPOS if there is no occurrence of the pattern.
  1051.     static SIZE_TYPE FindNoCase(const string& str, const string& pattern,
  1052.                                 SIZE_TYPE start = 0, SIZE_TYPE end = NPOS,
  1053.                                 EOccurrence which = eFirst);
  1054.     /// Which end to truncate a string.
  1055.     enum ETrunc {
  1056.         eTrunc_Begin,  ///< Truncate leading spaces only
  1057.         eTrunc_End,    ///< Truncate trailing spaces only
  1058.         eTrunc_Both    ///< Truncate spaces at both begin and end of string
  1059.     };
  1060.     /// Truncate spaces in a string.
  1061.     ///
  1062.     /// @param str
  1063.     ///   String to truncate spaces from.
  1064.     /// @param where
  1065.     ///   Which end of the string to truncate space from. Default is to
  1066.     ///   truncate space from both ends (eTrunc_Both).
  1067.     static string TruncateSpaces(const string& str, ETrunc where=eTrunc_Both);
  1068.     /// Replace occurrences of a substring within a string.
  1069.     ///
  1070.     /// @param src
  1071.     ///   Source string from which specified substring occurrences are
  1072.     ///   replaced.
  1073.     /// @param search
  1074.     ///   Substring value in "src" that is replaced.
  1075.     /// @param replace
  1076.     ///   Replace "search" substring with this value.
  1077.     /// @param dst
  1078.     ///   Result of replacing the "search" string with "replace" in "src".
  1079.     ///   This value is also returned by the function.
  1080.     /// @param start_pos
  1081.     ///   Position to start search from.
  1082.     /// @param max_replace
  1083.     ///   Replace no more than "max_replace" occurrences of substring "search"
  1084.     ///   If "max_replace" is zero(default), then replace all occurrences with
  1085.     ///   "replace".
  1086.     /// @return
  1087.     ///   Result of replacing the "search" string with "replace" in "src". This
  1088.     ///   value is placed in "dst" as well.
  1089.     /// @sa
  1090.     ///   Version of Replace() that returns a new string.
  1091.     static string& Replace(const string& src,
  1092.                            const string& search,
  1093.                            const string& replace,
  1094.                            string& dst,
  1095.                            SIZE_TYPE start_pos = 0, size_t max_replace = 0);
  1096.     /// Replace occurrences of a substring within a string and returns the
  1097.     /// result as a new string.
  1098.     ///
  1099.     /// @param src
  1100.     ///   Source string from which specified substring occurrences are
  1101.     ///   replaced.
  1102.     /// @param search
  1103.     ///   Substring value in "src" that is replaced.
  1104.     /// @param replace
  1105.     ///   Replace "search" substring with this value.
  1106.     /// @param start_pos
  1107.     ///   Position to start search from.
  1108.     /// @param max_replace
  1109.     ///   Replace no more than "max_replace" occurrences of substring "search"
  1110.     ///   If "max_replace" is zero(default), then replace all occurrences with
  1111.     ///   "replace".
  1112.     /// @return
  1113.     ///   A new string containing the result of replacing the "search" string
  1114.     ///   with "replace" in "src"
  1115.     /// @sa
  1116.     ///   Version of Replace() that has a destination parameter to accept
  1117.     ///   result.
  1118.     static string Replace(const string& src,
  1119.                           const string& search,
  1120.                           const string& replace,
  1121.                           SIZE_TYPE start_pos = 0, size_t max_replace = 0);
  1122.     /// Whether to merge adjacent delimiters in Split and Tokenize.
  1123.     enum EMergeDelims {
  1124.         eNoMergeDelims,     ///< No merging of delimiters -- default for
  1125.                             ///< Tokenize()
  1126.         eMergeDelims        ///< Merge the delimiters -- default for Split()
  1127.     };
  1128.     /// Split a string using specified delimiters.
  1129.     ///
  1130.     /// @param str
  1131.     ///   String to be split.
  1132.     /// @param delim
  1133.     ///   Delimiters used to split string "str".
  1134.     /// @param arr
  1135.     ///   The split tokens are added to the list "arr" and also returned
  1136.     ///   by the function. 
  1137.     /// @param merge
  1138.     ///   Whether to merge the delimiters or not. The default setting of
  1139.     ///   eMergeDelims means that delimiters that immediately follow each other
  1140.     ///   are treated as one delimiter.
  1141.     /// @return 
  1142.     ///   The list "arr" is also returned.
  1143.     /// @sa
  1144.     ///   Tokenize()
  1145.     static list<string>& Split(const string& str,
  1146.                                const string& delim,
  1147.                                list<string>& arr,
  1148.                                EMergeDelims  merge = eMergeDelims);
  1149.     /// Tokenize a string using the specified delimiters.
  1150.     ///
  1151.     ///
  1152.     /// @param str
  1153.     ///   String to be tokenized.
  1154.     /// @param delim
  1155.     ///   Delimiters used to tokenize string "str".
  1156.     ///   If delimiter is empty, then input string is appended to "arr" as is.
  1157.     /// @param arr
  1158.     ///   The tokens defined in "str" by using symbols from "delim" are added
  1159.     ///   to the list "arr" and also returned by the function. 
  1160.     /// @param merge
  1161.     ///   Whether to merge the delimiters or not. The default setting of
  1162.     ///   eNoMergeDelims means that delimiters that immediately follow each other
  1163.     ///   are treated as separate delimiters.
  1164.     /// @return 
  1165.     ///   The list "arr" is also returned.
  1166.     /// @sa
  1167.     ///   Split()
  1168.     static vector<string>& Tokenize(const string&   str,
  1169.                                     const string&   delim,
  1170.                                     vector<string>& arr,
  1171.                                     EMergeDelims    merge = eNoMergeDelims);
  1172.     /// Split a string into two pieces using the specified delimiters
  1173.     ///
  1174.     ///
  1175.     /// @param str 
  1176.     ///   String to be split.
  1177.     /// @param delim
  1178.     ///   Delimiters used to split string "str".
  1179.     /// @param str1
  1180.     ///   The sub-string of "str" before the first character of "delim".
  1181.     ///   It will not contain any characters in "delim".
  1182.     ///   Will be empty if "str" begin with a "delim" character.
  1183.     /// @param str2
  1184.     ///   The sub-string of "str" after the first character of "delim" found.
  1185.     ///   May contain "delim" characters.
  1186.     ///   Will be empty if "str" had no "delim" characters or ended
  1187.     ///   with the first "delim" charcter.
  1188.     /// @return
  1189.     ///   true if a symbol from "delim" was found in "str", false if not.
  1190.     ///   This lets you distinguish when there were no delimiters and when
  1191.     ///   the very last character was the first delimiter.
  1192.     /// @sa
  1193.     ///   Split()
  1194.     static bool SplitInTwo(const string& str, 
  1195.                            const string& delim,
  1196.                            string& str1,
  1197.                            string& str2);
  1198.                          
  1199.     /// Join strings using the specified delimiter.
  1200.     ///
  1201.     /// @param arr
  1202.     ///   Array of strings to be joined.
  1203.     /// @param delim
  1204.     ///   Delimiter used to join the string.
  1205.     /// @return 
  1206.     ///   The strings in "arr" are joined into a single string, separated
  1207.     ///   with "delim".
  1208.     static string Join(const list<string>& arr,   const string& delim);
  1209.     static string Join(const vector<string>& arr, const string& delim);
  1210.     /// How to display new line characters.
  1211.     ///
  1212.     /// Assists in making a printable version of "str".
  1213.     enum ENewLineMode {
  1214.         eNewLine_Quote,         ///< Display "n" instead of actual linebreak
  1215.         eNewLine_Passthru       ///< Break the line on every "n" occurrance
  1216.     };
  1217.     /// Get a printable version of the specified string. 
  1218.     ///
  1219.     /// The non-printable characters will be represented as "r", "n", "v",
  1220.     /// "t", """, "\", or "xDD" where DD is the character's code in
  1221.     /// hexadecimal.
  1222.     ///
  1223.     /// @param str
  1224.     ///   The string whose printable version is wanted.
  1225.     /// @param nl_mode
  1226.     ///   How to represent the new line character. The default setting of 
  1227.     ///   eNewLine_Quote displays the new line as "n". If set to
  1228.     ///   eNewLine_Passthru, a line break is used instead.
  1229.     /// @return
  1230.     ///   Return a printable version of "str".
  1231.     /// @sa
  1232.     ///   ParseEscapes
  1233.     static string PrintableString(const string& str,
  1234.                                   ENewLineMode  nl_mode = eNewLine_Quote);
  1235.     /// Parse C-style escape sequences in the specified string, including
  1236.     /// all those produced by PrintableString.
  1237.     static string ParseEscapes(const string& str);
  1238.     /// How to wrap the words in a string to a new line.
  1239.     enum EWrapFlags {
  1240.         fWrap_Hyphenate  = 0x1, ///< Add a hyphen when breaking words?
  1241.         fWrap_HTMLPre    = 0x2  ///< Wrap as preformatted HTML?
  1242.     };
  1243.     typedef int TWrapFlags;     ///< Binary OR of "EWrapFlags"
  1244.     /// Wrap the specified string into lines of a specified width -- prefix,
  1245.     /// prefix1 default version.
  1246.     ///
  1247.     /// Split string "str" into lines of width "width" and add the
  1248.     /// resulting lines to the list "arr". Normally, all
  1249.     /// lines will begin with "prefix" (counted against "width"),
  1250.     /// but the first line will instead begin with "prefix1" if
  1251.     /// you supply it.
  1252.     ///
  1253.     /// @param str
  1254.     ///   String to be split into wrapped lines.
  1255.     /// @param width
  1256.     ///   Width of each wrapped line.
  1257.     /// @param arr
  1258.     ///   List of strings containing wrapped lines.
  1259.     /// @param flags
  1260.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1261.     /// @param prefix
  1262.     ///   The prefix string added to each wrapped line, except the first line,
  1263.     ///   unless "prefix1" is set.
  1264.     ///   If "prefix" is set to 0(default), do not add a prefix string to the
  1265.     ///   wrapped lines.
  1266.     /// @param prefix1
  1267.     ///   The prefix string for the first line. Use this for the first line
  1268.     ///   instead of "prefix".
  1269.     ///   If "prefix1" is set to 0(default), do not add a prefix string to the
  1270.     ///   first line.
  1271.     /// @return
  1272.     ///   Return "arr", the list of wrapped lines.
  1273.     static list<string>& Wrap(const string& str, SIZE_TYPE width,
  1274.                               list<string>& arr, TWrapFlags flags = 0,
  1275.                               const string* prefix = 0,
  1276.                               const string* prefix1 = 0);
  1277.     /// Wrap the specified string into lines of a specified width -- prefix1
  1278.     /// default version.
  1279.     ///
  1280.     /// Split string "str" into lines of width "width" and add the
  1281.     /// resulting lines to the list "arr". Normally, all
  1282.     /// lines will begin with "prefix" (counted against "width"),
  1283.     /// but the first line will instead begin with "prefix1" if
  1284.     /// you supply it.
  1285.     ///
  1286.     /// @param str
  1287.     ///   String to be split into wrapped lines.
  1288.     /// @param width
  1289.     ///   Width of each wrapped line.
  1290.     /// @param arr
  1291.     ///   List of strings containing wrapped lines.
  1292.     /// @param flags
  1293.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1294.     /// @param prefix
  1295.     ///   The prefix string added to each wrapped line, except the first line,
  1296.     ///   unless "prefix1" is set.
  1297.     ///   If "prefix" is set to 0, do not add a prefix string to the wrapped
  1298.     ///   lines.
  1299.     /// @param prefix1
  1300.     ///   The prefix string for the first line. Use this for the first line
  1301.     ///   instead of "prefix".
  1302.     ///   If "prefix1" is set to 0(default), do not add a prefix string to the
  1303.     ///   first line.
  1304.     /// @return
  1305.     ///   Return "arr", the list of wrapped lines.
  1306.     static list<string>& Wrap(const string& str, SIZE_TYPE width,
  1307.                               list<string>& arr, TWrapFlags flags,
  1308.                               const string& prefix, const string* prefix1 = 0);
  1309.     /// Wrap the specified string into lines of a specified width.
  1310.     ///
  1311.     /// Split string "str" into lines of width "width" and add the
  1312.     /// resulting lines to the list "arr". Normally, all
  1313.     /// lines will begin with "prefix" (counted against "width"),
  1314.     /// but the first line will instead begin with "prefix1" if
  1315.     /// you supply it.
  1316.     ///
  1317.     /// @param str
  1318.     ///   String to be split into wrapped lines.
  1319.     /// @param width
  1320.     ///   Width of each wrapped line.
  1321.     /// @param arr
  1322.     ///   List of strings containing wrapped lines.
  1323.     /// @param flags
  1324.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1325.     /// @param prefix
  1326.     ///   The prefix string added to each wrapped line, except the first line,
  1327.     ///   unless "prefix1" is set.
  1328.     ///   If "prefix" is set to 0, do not add a prefix string to the wrapped
  1329.     ///   lines.
  1330.     /// @param prefix1
  1331.     ///   The prefix string for the first line. Use this for the first line
  1332.     ///   instead of "prefix".
  1333.     ///   If "prefix1" is set to 0, do not add a prefix string to the first
  1334.     ///   line.
  1335.     /// @return
  1336.     ///   Return "arr", the list of wrapped lines.
  1337.     static list<string>& Wrap(const string& str, SIZE_TYPE width,
  1338.                               list<string>& arr, TWrapFlags flags,
  1339.                               const string& prefix, const string& prefix1);
  1340.     /// Wrap the list using the specified criteria -- default prefix, 
  1341.     /// prefix1 version.
  1342.     ///
  1343.     /// WrapList() is similar to Wrap(), but tries to avoid splitting any
  1344.     /// elements of the list to be wrapped. Also, the "delim" only applies
  1345.     /// between elements on the same line; if you want everything to end with
  1346.     /// commas or such, you should add them first.
  1347.     ///
  1348.     /// @param l
  1349.     ///   The list to be wrapped.
  1350.     /// @param width
  1351.     ///   Width of each wrapped line.
  1352.     /// @param delim
  1353.     ///   Delimiters used to split elements on the same line.
  1354.     /// @param arr
  1355.     ///   List containing the wrapped list result.
  1356.     /// @param flags
  1357.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1358.     /// @param prefix
  1359.     ///   The prefix string added to each wrapped line, except the first line,
  1360.     ///   unless "prefix1" is set.
  1361.     ///   If "prefix" is set to 0(default), do not add a prefix string to the
  1362.     ///   wrapped lines.
  1363.     /// @param prefix1
  1364.     ///   The prefix string for the first line. Use this for the first line
  1365.     ///   instead of "prefix".
  1366.     ///   If "prefix1" is set to 0(default), do not add a prefix string to the
  1367.     ///   first line.
  1368.     /// @return
  1369.     ///   Return "arr", the wrapped list.
  1370.     static list<string>& WrapList(const list<string>& l, SIZE_TYPE width,
  1371.                                   const string& delim, list<string>& arr,
  1372.                                   TWrapFlags flags = 0,
  1373.                                   const string* prefix = 0,
  1374.                                   const string* prefix1 = 0);
  1375.     /// Wrap the list using the specified criteria -- default prefix1 version.
  1376.     ///
  1377.     /// WrapList() is similar to Wrap(), but tries to avoid splitting any
  1378.     /// elements of the list to be wrapped. Also, the "delim" only applies
  1379.     /// between elements on the same line; if you want everything to end with
  1380.     /// commas or such, you should add them first.
  1381.     ///
  1382.     /// @param l
  1383.     ///   The list to be wrapped.
  1384.     /// @param width
  1385.     ///   Width of each wrapped line.
  1386.     /// @param delim
  1387.     ///   Delimiters used to split elements on the same line.
  1388.     /// @param arr
  1389.     ///   List containing the wrapped list result.
  1390.     /// @param flags
  1391.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1392.     /// @param prefix
  1393.     ///   The prefix string added to each wrapped line, except the first line,
  1394.     ///   unless "prefix1" is set.
  1395.     ///   If "prefix" is set to 0, do not add a prefix string to the
  1396.     ///   wrapped lines.
  1397.     /// @param prefix1
  1398.     ///   The prefix string for the first line. Use this for the first line
  1399.     ///   instead of "prefix".
  1400.     ///   If "prefix1" is set to 0(default), do not add a prefix string to the
  1401.     ///   first line.
  1402.     /// @return
  1403.     ///   Return "arr", the wrappe list.
  1404.     static list<string>& WrapList(const list<string>& l, SIZE_TYPE width,
  1405.                                   const string& delim, list<string>& arr,
  1406.                                   TWrapFlags flags, const string& prefix,
  1407.                                   const string* prefix1 = 0);
  1408.         
  1409.     /// Wrap the list using the specified criteria.
  1410.     ///
  1411.     /// WrapList() is similar to Wrap(), but tries to avoid splitting any
  1412.     /// elements of the list to be wrapped. Also, the "delim" only applies
  1413.     /// between elements on the same line; if you want everything to end with
  1414.     /// commas or such, you should add them first.
  1415.     ///
  1416.     /// @param l
  1417.     ///   The list to be wrapped.
  1418.     /// @param width
  1419.     ///   Width of each wrapped line.
  1420.     /// @param delim
  1421.     ///   Delimiters used to split elements on the same line.
  1422.     /// @param arr
  1423.     ///   List containing the wrapped list result.
  1424.     /// @param flags
  1425.     ///   How to wrap the words to a new line. See EWrapFlags documentation.
  1426.     /// @param prefix
  1427.     ///   The prefix string added to each wrapped line, except the first line,
  1428.     ///   unless "prefix1" is set.
  1429.     ///   If "prefix" is set to 0, do not add a prefix string to the
  1430.     ///   wrapped lines.
  1431.     /// @param prefix1
  1432.     ///   The prefix string for the first line. Use this for the first line
  1433.     ///   instead of "prefix".
  1434.     ///   If "prefix1" is set to 0, do not add a prefix string to the
  1435.     ///   first line.
  1436.     /// @return
  1437.     ///   Return "arr", the wrapped list.
  1438.     static list<string>& WrapList(const list<string>& l, SIZE_TYPE width,
  1439.                                   const string& delim, list<string>& arr,
  1440.                                   TWrapFlags flags, const string& prefix,
  1441.                                   const string& prefix1);
  1442. }; // class NStr
  1443. /////////////////////////////////////////////////////////////////////////////
  1444. ///
  1445. /// CStringUTF8 --
  1446. ///
  1447. /// Define a UTF-8 String class.
  1448. ///
  1449. /// UTF-8 stands for Unicode Transformation Format-8, and is an 8-bit
  1450. /// lossless encoding of Unicode characters.
  1451. /// @sa
  1452. ///   RFC 2279
  1453. class NCBI_XNCBI_EXPORT CStringUTF8 : public string
  1454. {
  1455. public:
  1456.     /// Constructor.
  1457.     CStringUTF8(void)
  1458.     {
  1459.     }
  1460.     /// Destructor.
  1461.     ~CStringUTF8(void)
  1462.     {
  1463.     }
  1464.     /// Copy constructor.
  1465.     CStringUTF8(const CStringUTF8& src)
  1466.         : string(src)
  1467.     {
  1468.     }
  1469.     /// Constructor from a string argument.
  1470.     CStringUTF8(const string& src)
  1471.         : string()
  1472.     {
  1473.         x_Append(src.c_str());
  1474.     }
  1475.     /// Constructor from a char* argument.
  1476.     CStringUTF8(const char* src)
  1477.         : string()
  1478.     {
  1479.         x_Append(src);
  1480.     }
  1481. #if defined(HAVE_WSTRING)
  1482.     /// Constructor from a wstring argument.
  1483.     ///
  1484.     /// Defined only if HAVE_STRING is defined.
  1485.     CStringUTF8(const wstring& src)
  1486.         : string()
  1487.     {
  1488.         x_Append( src.c_str());
  1489.     }
  1490.     /// Constructor from a whcar_t* argument.
  1491.     ///
  1492.     /// Defined only if HAVE_STRING is defined.
  1493.     CStringUTF8(const wchar_t* src)
  1494.         : string()
  1495.     {
  1496.         x_Append(src);
  1497.     }
  1498. #endif // HAVE_WSTRING
  1499.     /// Assignment operator -- rhs is a CStringUTF8.
  1500.     CStringUTF8& operator= (const CStringUTF8& src)
  1501.     {
  1502.         string::operator= (src);
  1503.         return *this;
  1504.     }
  1505.     /// Assignment operator -- rhs is a string.
  1506.     CStringUTF8& operator= (const string& src)
  1507.     {
  1508.         erase();
  1509.         x_Append(src.c_str());
  1510.         return *this;
  1511.     }
  1512.     /// Assignment operator -- rhs is a char*.
  1513.     CStringUTF8& operator= (const char* src)
  1514.     {
  1515.         erase();
  1516.         x_Append(src);
  1517.         return *this;
  1518.     }
  1519. #if defined(HAVE_WSTRING)
  1520.     /// Assignment operator -- rhs is a wstring.
  1521.     ///
  1522.     /// Defined only if HAVE_STRING is defined.
  1523.     CStringUTF8& operator= (const wstring& src)
  1524.     {
  1525.         erase();
  1526.         x_Append(src.c_str());
  1527.         return *this;
  1528.     }
  1529.     /// Assignment operator -- rhs is a wchar_t*.
  1530.     ///
  1531.     /// Defined only if HAVE_STRING is defined.
  1532.     CStringUTF8& operator= (const wchar_t* src)
  1533.     {
  1534.         erase();
  1535.         x_Append(src);
  1536.         return *this;
  1537.     }
  1538. #endif // HAVE_WSTRING
  1539.     /// Append to string operator+= -- rhs is CStringUTF8.
  1540.     CStringUTF8& operator+= (const CStringUTF8& src)
  1541.     {
  1542.         string::operator+= (src);
  1543.         return *this;
  1544.     }
  1545.     /// Append to string operator+= -- rhs is string.
  1546.     CStringUTF8& operator+= (const string& src)
  1547.     {
  1548.         x_Append(src.c_str());
  1549.         return *this;
  1550.     }
  1551.     /// Append to string operator+= -- rhs is char*.
  1552.     CStringUTF8& operator+= (const char* src)
  1553.     {
  1554.         x_Append(src);
  1555.         return *this;
  1556.     }
  1557. #if defined(HAVE_WSTRING)
  1558.     /// Append to string operator+=  -- rhs is a wstring.
  1559.     ///
  1560.     /// Defined only if HAVE_STRING is defined.
  1561.     CStringUTF8& operator+= (const wstring& src)
  1562.     {
  1563.         x_Append(src.c_str());
  1564.         return *this;
  1565.     }
  1566.     /// Append to string operator+=  -- rhs is a wchar_t*.
  1567.     ///
  1568.     /// Defined only if HAVE_STRING is defined.
  1569.     CStringUTF8& operator+= (const wchar_t* src)
  1570.     {
  1571.         x_Append(src);
  1572.         return *this;
  1573.     }
  1574. #endif // HAVE_WSTRING
  1575.     /// Convert to ASCII.
  1576.     ///
  1577.     /// Can throw a StringException with error codes "eFormat" or "eConvert"
  1578.     /// if string has a wrong UTF-8 format or cannot be converted to ASCII.
  1579.     string AsAscii(void) const;
  1580. #if defined(HAVE_WSTRING)
  1581.     /// Convert to Unicode.
  1582.     ///
  1583.     /// Defined only if HAVE_STRING is defined.
  1584.     /// Can throw a StringException with error code "eFormat" if string has
  1585.     /// a wrong UTF-8 format.
  1586.     wstring AsUnicode(void) const;
  1587. #endif // HAVE_WSTRING
  1588. private:
  1589.     /// Helper method to append necessary characters for UTF-8 format.
  1590.     void x_Append(const char* src);
  1591. #if defined(HAVE_WSTRING)
  1592.     /// Helper method to append necessary characters for UTF-8 format.
  1593.     ///
  1594.     /// Defined only if HAVE_STRING is defined.
  1595.     void x_Append(const wchar_t* src);
  1596. #endif // HAVE_WSTRING
  1597. };
  1598. /////////////////////////////////////////////////////////////////////////////
  1599. ///
  1600. /// CParseTemplException --
  1601. ///
  1602. /// Define template class for parsing exception. This class is used to define
  1603. /// exceptions for complex parsing tasks and includes an additional m_Pos
  1604. /// data member. The constructor requires that an additional postional
  1605. /// parameter be supplied along with the description message.
  1606. template <class TBase>
  1607. class CParseTemplException : EXCEPTION_VIRTUAL_BASE public TBase
  1608. {
  1609. public:
  1610.     /// Error types that for exception class.
  1611.     enum EErrCode {
  1612.         eErr        ///< Generic error 
  1613.     };
  1614.     /// Translate from the error code value to its string representation.
  1615.     virtual const char* GetErrCodeString(void) const
  1616.     {
  1617.         switch (GetErrCode()) {
  1618.         case eErr: return "eErr";
  1619.         default:   return CException::GetErrCodeString();
  1620.         }
  1621.     }
  1622.     /// Constructor.
  1623.     ///
  1624.     /// Report "pos" along with "what".
  1625.     CParseTemplException(const char* file,int line,
  1626.         const CException* prev_exception,
  1627.         EErrCode err_code,const string& message,
  1628.         string::size_type pos) throw()
  1629.           : TBase(file, line,prev_exception,
  1630.             (typename TBase::EErrCode)(CException::eInvalid),
  1631.             message), m_Pos(pos)
  1632.     {
  1633.         this->x_Init(file, line,
  1634.                      string("{") + NStr::UIntToString(m_Pos) + "} " + message,
  1635.                      prev_exception);
  1636.         this->x_InitErrCode((CException::EErrCode) err_code);
  1637.     }
  1638.     /// Constructor.
  1639.     CParseTemplException(const CParseTemplException<TBase>& other) throw()
  1640.         : TBase(other)
  1641.     {
  1642.         m_Pos = other.m_Pos;
  1643.         x_Assign(other);
  1644.     }
  1645.     /// Destructor.
  1646.     virtual ~CParseTemplException(void) throw() {}
  1647.     /// Report error position.
  1648.     virtual void ReportExtra(ostream& out) const
  1649.     {
  1650.         out << "m_Pos = " << m_Pos;
  1651.     }
  1652.     // Attributes.
  1653.     /// Get exception class type.
  1654.     virtual const char* GetType(void) const { return "CParseTemplException"; }
  1655.     /// Get error code.
  1656.     EErrCode GetErrCode(void) const
  1657.     {
  1658.         return typeid(*this) == typeid(CParseTemplException<TBase>) ?
  1659.             (typename CParseTemplException<TBase>::EErrCode)
  1660.                 this->x_GetErrCode() :
  1661.             (typename CParseTemplException<TBase>::EErrCode)
  1662.                 CException::eInvalid;
  1663.     }
  1664.     /// Get error position.
  1665.     string::size_type GetPos(void) const throw() { return m_Pos; }
  1666. protected:
  1667.     /// Constructor.
  1668.     CParseTemplException(void) throw()
  1669.     {
  1670.         m_Pos = 0;
  1671.     }
  1672.     /// Helper clone method.
  1673.     virtual const CException* x_Clone(void) const
  1674.     {
  1675.         return new CParseTemplException<TBase>(*this);
  1676.     }
  1677. private:
  1678.     string::size_type m_Pos;    ///< Error position
  1679. };
  1680. /////////////////////////////////////////////////////////////////////////////
  1681. ///
  1682. /// CStringException --
  1683. ///
  1684. /// Define exceptions generated by string classes.
  1685. ///
  1686. /// CStringException inherits its basic functionality from
  1687. /// CParseTemplException<CCoreException> and defines additional error codes
  1688. /// for string parsing.
  1689. class NCBI_XNCBI_EXPORT CStringException :
  1690.                         public CParseTemplException<CCoreException>
  1691. {
  1692. public:
  1693.     /// Error types that string classes can generate.
  1694.     enum EErrCode {
  1695.         eConvert,       ///< Failure to convert string
  1696.         eBadArgs,       ///< Bad arguments to string methods 
  1697.         eFormat         ///< Wrong format for any input to string methods
  1698.     };
  1699.     /// Translate from the error code value to its string representation.
  1700.     virtual const char* GetErrCodeString(void) const
  1701.     {
  1702.         switch (GetErrCode()) {
  1703.         case eConvert:  return "eConvert";
  1704.         case eBadArgs:  return "eBadArgs";
  1705.         case eFormat:   return "eFormat";
  1706.         default:    return CException::GetErrCodeString();
  1707.         }
  1708.     }
  1709.     // Standard exception boilerplate code.
  1710.     NCBI_EXCEPTION_DEFAULT2(CStringException,
  1711.         CParseTemplException<CCoreException>, std::string::size_type);
  1712. };
  1713. /////////////////////////////////////////////////////////////////////////////
  1714. //  Predicates
  1715. //
  1716. /////////////////////////////////////////////////////////////////////////////
  1717. ///
  1718. /// Define Case-sensitive string comparison methods.
  1719. ///
  1720. /// Used as arguments to template functions for specifying the type of 
  1721. /// comparison.
  1722. struct PCase
  1723. {
  1724.     /// Return difference between "s1" and "s2".
  1725.     int Compare(const string& s1, const string& s2) const;
  1726.     /// Return TRUE if s1 < s2.
  1727.     bool Less(const string& s1, const string& s2) const;
  1728.     /// Return TRUE if s1 == s2.
  1729.     bool Equals(const string& s1, const string& s2) const;
  1730.     /// Return TRUE if s1 < s2.
  1731.     bool operator()(const string& s1, const string& s2) const;
  1732. };
  1733. /////////////////////////////////////////////////////////////////////////////
  1734. ///
  1735. /// Define Case-insensitive string comparison methods.
  1736. ///
  1737. /// Used as arguments to template functions for specifying the type of 
  1738. /// comparison.
  1739. struct PNocase
  1740. {
  1741.     /// Return difference between "s1" and "s2".
  1742.     int Compare(const string& s1, const string& s2) const;
  1743.     /// Return TRUE if s1 < s2.
  1744.     bool Less(const string& s1, const string& s2) const;
  1745.     /// Return TRUE if s1 == s2.
  1746.     bool Equals(const string& s1, const string& s2) const;
  1747.     /// Return TRUE if s1 < s2 ignoring case.
  1748.     bool operator()(const string& s1, const string& s2) const;
  1749. };
  1750. /////////////////////////////////////////////////////////////////////////////
  1751. //  Algorithms
  1752. //
  1753. /// Check equivalence of arguments using predicate.
  1754. template<class Arg1, class Arg2, class Pred>
  1755. inline
  1756. bool AStrEquiv(const Arg1& x, const Arg2& y, Pred pr)
  1757. {
  1758.     return pr.Equals(x, y);
  1759. }
  1760. /* @} */
  1761. /////////////////////////////////////////////////////////////////////////////
  1762. /////////////////////////////////////////////////////////////////////////////
  1763. //  IMPLEMENTATION of INLINE functions
  1764. /////////////////////////////////////////////////////////////////////////////
  1765. /////////////////////////////////////////////////////////////////////////////
  1766. //  CNcbiEmptyString::
  1767. //
  1768. #ifndef NCBI_OS_MSWIN
  1769. inline
  1770. const string& CNcbiEmptyString::Get(void)
  1771. {
  1772.     const string* str = m_Str;
  1773.     return str ? *str: FirstGet();
  1774. }
  1775. #endif // NCBI_OS_MSWIN
  1776. /////////////////////////////////////////////////////////////////////////////
  1777. //  NStr::
  1778. //
  1779. inline
  1780. int NStr::strcmp(const char* s1, const char* s2)
  1781. {
  1782.     return ::strcmp(s1, s2);
  1783. }
  1784. inline
  1785. int NStr::strncmp(const char* s1, const char* s2, size_t n)
  1786. {
  1787.     return ::strncmp(s1, s2, n);
  1788. }
  1789. inline
  1790. int NStr::strcasecmp(const char* s1, const char* s2)
  1791. {
  1792. #if defined(HAVE_STRICMP)
  1793.     return ::stricmp(s1, s2);
  1794. #elif defined(HAVE_STRCASECMP)
  1795.     return ::strcasecmp(s1, s2);
  1796. #else
  1797.     int diff = 0;
  1798.     for ( ;; ++s1, ++s2) {
  1799.         char c1 = *s1;
  1800.         // calculate difference
  1801.         diff = toupper(c1) - toupper(*s2);
  1802.         // if end of string or different
  1803.         if (!c1  ||  diff)
  1804.             break; // return difference
  1805.     }
  1806.     return diff;
  1807. #endif
  1808. }
  1809. inline
  1810. int NStr::strncasecmp(const char* s1, const char* s2, size_t n)
  1811. {
  1812. #if defined(HAVE_STRICMP)
  1813.     return ::strnicmp(s1, s2, n);
  1814. #elif defined(HAVE_STRCASECMP)
  1815.     return ::strncasecmp(s1, s2, n);
  1816. #else
  1817.     int diff = 0;
  1818.     for ( ; ; ++s1, ++s2, --n) {
  1819.         char c1 = *s1;
  1820.         // calculate difference
  1821.         diff = toupper(c1) - toupper(*s2);
  1822.         // if end of string or different
  1823.         if (!c1  ||  diff)
  1824.             break; // return difference
  1825.         if (n == 0)
  1826.             return 0;
  1827.     }
  1828.     return diff;
  1829. #endif
  1830. }
  1831. inline
  1832. size_t NStr::strftime(char* s, size_t maxsize, const char* format,
  1833.                       const struct tm* timeptr)
  1834. {
  1835. #if defined(NCBI_COMPILER_MSVC)
  1836.     string x_format;
  1837.     x_format = Replace(format,   "%T", "%H:%M:%S");
  1838.     x_format = Replace(x_format, "%D", "%m/%d/%y");
  1839.     return ::strftime(s, maxsize, x_format.c_str(), timeptr);
  1840. #else
  1841.     return ::strftime(s, maxsize, format, timeptr);
  1842. #endif
  1843. }
  1844. inline
  1845. int NStr::Compare(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1846.                   const char* pattern, ECase use_case)
  1847. {
  1848.     return use_case == eCase ?
  1849.         CompareCase(str, pos, n, pattern): CompareNocase(str, pos, n, pattern);
  1850. }
  1851. inline
  1852. int NStr::Compare(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1853.                   const string& pattern, ECase use_case)
  1854. {
  1855.     return use_case == eCase ?
  1856.         CompareCase(str, pos, n, pattern): CompareNocase(str, pos, n, pattern);
  1857. }
  1858. inline
  1859. int NStr::CompareCase(const char* s1, const char* s2)
  1860. {
  1861.     return NStr::strcmp(s1, s2);
  1862. }
  1863. inline
  1864. int NStr::CompareNocase(const char* s1, const char* s2)
  1865. {
  1866.     return NStr::strcasecmp(s1, s2);
  1867. }
  1868. inline
  1869. int NStr::Compare(const char* s1, const char* s2, ECase use_case)
  1870. {
  1871.     return use_case == eCase ? CompareCase(s1, s2): CompareNocase(s1, s2);
  1872. }
  1873. inline
  1874. int NStr::Compare(const string& s1, const char* s2, ECase use_case)
  1875. {
  1876.     return Compare(s1.c_str(), s2, use_case);
  1877. }
  1878. inline
  1879. int NStr::Compare(const char* s1, const string& s2, ECase use_case)
  1880. {
  1881.     return Compare(s1, s2.c_str(), use_case);
  1882. }
  1883. inline
  1884. int NStr::Compare(const string& s1, const string& s2, ECase use_case)
  1885. {
  1886.     return Compare(s1.c_str(), s2.c_str(), use_case);
  1887. }
  1888. inline
  1889. int NStr::CompareCase(const string& s1, const string& s2)
  1890. {
  1891.     return CompareCase(s1.c_str(), s2.c_str());
  1892. }
  1893. inline
  1894. int NStr::CompareNocase(const string& s1, const string& s2)
  1895. {
  1896.     return CompareNocase(s1.c_str(), s2.c_str());
  1897. }
  1898. inline
  1899. bool NStr::Equal(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1900.                   const char* pattern, ECase use_case)
  1901. {
  1902.     return (use_case == eCase ?
  1903.         EqualCase(str, pos, n, pattern) : EqualNocase(str, pos, n, pattern)) == 0;
  1904. }
  1905. inline
  1906. bool NStr::Equal(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1907.                   const string& pattern, ECase use_case)
  1908. {
  1909.     return use_case == eCase ?
  1910.         EqualCase(str, pos, n, pattern): EqualNocase(str, pos, n, pattern);
  1911. }
  1912. inline
  1913. bool NStr::EqualCase(const char* s1, const char* s2)
  1914. {
  1915.     return NStr::strcmp(s1, s2) == 0;
  1916. }
  1917. inline
  1918. bool NStr::EqualNocase(const char* s1, const char* s2)
  1919. {
  1920.     return NStr::strcasecmp(s1, s2) == 0;
  1921. }
  1922. inline
  1923. bool NStr::EqualCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1924.                      const char* pattern)
  1925. {
  1926.     return NStr::CompareCase(str, pos, n, pattern) == 0;
  1927. }
  1928. inline
  1929. bool NStr::EqualCase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1930.                      const string& pattern)
  1931. {
  1932.     return NStr::CompareCase(str, pos, n, pattern) == 0;
  1933. }
  1934. inline
  1935. bool NStr::Equal(const char* s1, const char* s2, ECase use_case)
  1936. {
  1937.     return (use_case == eCase ? EqualCase(s1, s2): EqualNocase(s1, s2)) == 0;
  1938. }
  1939. inline
  1940. bool NStr::Equal(const string& s1, const char* s2, ECase use_case)
  1941. {
  1942.     return Equal(s1.c_str(), s2, use_case) == 0;
  1943. }
  1944. inline
  1945. bool NStr::Equal(const char* s1, const string& s2, ECase use_case)
  1946. {
  1947.     return Equal(s1, s2.c_str(), use_case) == 0;
  1948. }
  1949. inline
  1950. bool NStr::Equal(const string& s1, const string& s2, ECase use_case)
  1951. {
  1952.     return Equal(s1.c_str(), s2.c_str(), use_case) == 0;
  1953. }
  1954. inline
  1955. bool NStr::EqualCase(const string& s1, const string& s2)
  1956. {
  1957.     // return EqualCase(s1.c_str(), s2.c_str());
  1958.     return s1 == s2;
  1959. }
  1960. inline
  1961. bool NStr::EqualNocase(const string& s1, const string& s2)
  1962. {
  1963.     return EqualNocase(s1.c_str(), s2.c_str());
  1964. }
  1965. inline
  1966. bool NStr::EqualNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1967.                              const char* pattern)
  1968. {
  1969.     return CompareNocase(str, pos, n, pattern) == 0;
  1970. }
  1971. inline
  1972. bool NStr::EqualNocase(const string& str, SIZE_TYPE pos, SIZE_TYPE n,
  1973.                              const string& pattern)
  1974. {
  1975.     return CompareNocase(str, pos, n, pattern) == 0;
  1976. }
  1977. inline
  1978. bool NStr::StartsWith(const string& str, const string& start, ECase use_case)
  1979. {
  1980.     return str.size() >= start.size()  &&
  1981.         Compare(str, 0, start.size(), start, use_case) == 0;
  1982. }
  1983. inline
  1984. bool NStr::EndsWith(const string& str, const string& end, ECase use_case)
  1985. {
  1986.     return str.size() >= end.size()  &&
  1987.         Compare(str, str.size() - end.size(), end.size(), end, use_case) == 0;
  1988. }
  1989. inline
  1990. SIZE_TYPE NStr::Find(const string& str, const string& pattern,
  1991.                      SIZE_TYPE start, SIZE_TYPE end, EOccurrence where,
  1992.                      ECase use_case)
  1993. {
  1994.     return use_case == eCase ? FindCase(str, pattern, start, end, where)
  1995.         : FindNoCase(str, pattern, start, end, where);
  1996. }
  1997. inline
  1998. SIZE_TYPE NStr::FindCase(const string& str, const string& pattern,
  1999.                          SIZE_TYPE start, SIZE_TYPE end, EOccurrence where)
  2000. {
  2001.     if (where == eFirst) {
  2002.         SIZE_TYPE result = str.find(pattern, start);
  2003.         return (result == NPOS  ||  result > end) ? NPOS : result;
  2004.     } else {
  2005.         SIZE_TYPE result = str.rfind(pattern, end);
  2006.         return (result == NPOS  ||  result < start) ? NPOS : result;
  2007.     }
  2008. }
  2009. inline
  2010. list<string>& NStr::Wrap(const string& str, SIZE_TYPE width, list<string>& arr,
  2011.                          NStr::TWrapFlags flags, const string& prefix,
  2012.                          const string* prefix1)
  2013. {
  2014.     return Wrap(str, width, arr, flags, &prefix, prefix1);
  2015. }
  2016. inline
  2017. list<string>& NStr::Wrap(const string& str, SIZE_TYPE width, list<string>& arr,
  2018.                          NStr::TWrapFlags flags, const string& prefix,
  2019.                          const string& prefix1)
  2020. {
  2021.     return Wrap(str, width, arr, flags, &prefix, &prefix1);
  2022. }
  2023. inline
  2024. list<string>& NStr::WrapList(const list<string>& l, SIZE_TYPE width,
  2025.                              const string& delim, list<string>& arr,
  2026.                              NStr::TWrapFlags flags, const string& prefix,
  2027.                              const string* prefix1)
  2028. {
  2029.     return WrapList(l, width, delim, arr, flags, &prefix, prefix1);
  2030. }
  2031. inline
  2032. list<string>& NStr::WrapList(const list<string>& l, SIZE_TYPE width,
  2033.                              const string& delim, list<string>& arr,
  2034.                              NStr::TWrapFlags flags, const string& prefix,
  2035.                              const string& prefix1)
  2036. {
  2037.     return WrapList(l, width, delim, arr, flags, &prefix, &prefix1);
  2038. }
  2039. /////////////////////////////////////////////////////////////////////////////
  2040. //  PCase::
  2041. //
  2042. inline
  2043. int PCase::Compare(const string& s1, const string& s2) const
  2044. {
  2045.     return NStr::Compare(s1, s2, NStr::eCase);
  2046. }
  2047. inline
  2048. bool PCase::Less(const string& s1, const string& s2) const
  2049. {
  2050.     return Compare(s1, s2) < 0;
  2051. }
  2052. inline
  2053. bool PCase::Equals(const string& s1, const string& s2) const
  2054. {
  2055.     return Compare(s1, s2) == 0;
  2056. }
  2057. inline
  2058. bool PCase::operator()(const string& s1, const string& s2) const
  2059. {
  2060.     return Less(s1, s2);
  2061. }
  2062. /////////////////////////////////////////////////////////////////////////////
  2063. //  PNocase::
  2064. //
  2065. inline
  2066. int PNocase::Compare(const string& s1, const string& s2) const
  2067. {
  2068.     return NStr::Compare(s1, s2, NStr::eNocase);
  2069. }
  2070. inline
  2071. bool PNocase::Less(const string& s1, const string& s2) const
  2072. {
  2073.     return Compare(s1, s2) < 0;
  2074. }
  2075. inline
  2076. bool PNocase::Equals(const string& s1, const string& s2) const
  2077. {
  2078.     return Compare(s1, s2) == 0;
  2079. }
  2080. inline
  2081. bool PNocase::operator()(const string& s1, const string& s2) const
  2082. {
  2083.     return Less(s1, s2);
  2084. }
  2085. END_NCBI_SCOPE
  2086. /*
  2087.  * ===========================================================================
  2088.  *
  2089.  * $Log: ncbistr.hpp,v $
  2090.  * Revision 1000.6  2004/06/01 19:08:11  gouriano
  2091.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.56
  2092.  *
  2093.  * Revision 1.56  2004/05/26 20:46:35  ucko
  2094.  * Fix backwards logic in Equal{Case,Nocase}.
  2095.  *
  2096.  * Revision 1.55  2004/04/26 14:44:30  ucko
  2097.  * Move CParseTemplException from ncbiexpt.hpp, as it needs NStr.
  2098.  *
  2099.  * Revision 1.54  2004/03/11 22:56:51  gorelenk
  2100.  * Removed tabs.
  2101.  *
  2102.  * Revision 1.53  2004/03/11 18:48:34  gorelenk
  2103.  * Added (condionaly) Windows-specific declaration of class CNcbiEmptyString.
  2104.  *
  2105.  * Revision 1.52  2004/03/05 14:21:54  shomrat
  2106.  * added missing definitions
  2107.  *
  2108.  * Revision 1.51  2004/03/05 12:28:00  ivanov
  2109.  * Moved CDirEntry::MatchesMask() to NStr class.
  2110.  *
  2111.  * Revision 1.50  2004/03/04 20:45:21  shomrat
  2112.  * Added equality checks
  2113.  *
  2114.  * Revision 1.49  2004/03/04 13:38:39  kuznets
  2115.  * + set of ToString conversion functions taking outout string as a parameter,
  2116.  * not a return value (should give a performance advantage in some cases)
  2117.  *
  2118.  * Revision 1.48  2003/12/12 17:26:45  ucko
  2119.  * +FormatVarargs
  2120.  *
  2121.  * Revision 1.47  2003/12/01 20:45:25  ucko
  2122.  * Extend Join to handle vectors as well as lists.
  2123.  * Add ParseEscapes (inverse of PrintableString).
  2124.  *
  2125.  * Revision 1.46  2003/11/18 11:57:37  siyan
  2126.  * Changed so @addtogroup does not cross namespace boundary
  2127.  *
  2128.  * Revision 1.45  2003/11/03 14:51:55  siyan
  2129.  * Fixed a typo in StringToInt header
  2130.  *
  2131.  * Revision 1.44  2003/08/19 15:17:20  rsmith
  2132.  * Add NStr::SplitInTwo() function.
  2133.  *
  2134.  * Revision 1.43  2003/08/15 18:14:54  siyan
  2135.  * Added documentation.
  2136.  *
  2137.  * Revision 1.42  2003/05/22 20:08:00  gouriano
  2138.  * added UTF8 strings
  2139.  *
  2140.  * Revision 1.41  2003/05/14 21:51:54  ucko
  2141.  * Move FindNoCase out of line and reimplement it to avoid making
  2142.  * lowercase copies of both strings.
  2143.  *
  2144.  * Revision 1.40  2003/03/31 13:31:06  siyan
  2145.  * Minor changes to doxygen support
  2146.  *
  2147.  * Revision 1.39  2003/03/31 13:22:02  siyan
  2148.  * Added doxygen support
  2149.  *
  2150.  * Revision 1.38  2003/02/26 16:42:27  siyan
  2151.  * Added base parameter to NStr::StringToUInt8 to support different radixes
  2152.  * such as base 10 (default), 16, 8, 2.
  2153.  *
  2154.  * Revision 1.37  2003/02/24 19:54:50  gouriano
  2155.  * use template-based exceptions instead of errno and parse exceptions
  2156.  *
  2157.  * Revision 1.36  2003/02/20 18:41:49  dicuccio
  2158.  * Added NStr::StringToPtr()
  2159.  *
  2160.  * Revision 1.35  2003/01/24 16:58:54  ucko
  2161.  * Add an optional parameter to Split and Tokenize indicating whether to
  2162.  * merge adjacent delimiters; drop suggestion about joining WrapList's
  2163.  * output with ",n" because long items may be split across lines.
  2164.  *
  2165.  * Revision 1.34  2003/01/21 23:22:06  vakatov
  2166.  * NStr::Tokenize() to return reference, and not a new "vector<>".
  2167.  *
  2168.  * Revision 1.33  2003/01/21 20:08:28  ivanov
  2169.  * Added function NStr::DoubleToString(value, precision, buf, buf_size)
  2170.  *
  2171.  * Revision 1.32  2003/01/14 21:16:12  kuznets
  2172.  * +NStr::Tokenize
  2173.  *
  2174.  * Revision 1.31  2003/01/10 22:15:56  kuznets
  2175.  * Working on String2Int8
  2176.  *
  2177.  * Revision 1.30  2003/01/10 21:59:06  kuznets
  2178.  * +NStr::String2Int8
  2179.  *
  2180.  * Revision 1.29  2003/01/10 00:08:05  vakatov
  2181.  * + Int8ToString(),  UInt8ToString()
  2182.  *
  2183.  * Revision 1.28  2003/01/06 16:43:05  ivanov
  2184.  * + DoubleToString() with 'precision'
  2185.  *
  2186.  * Revision 1.27  2002/12/20 19:40:45  ucko
  2187.  * Add NStr::Find and variants.
  2188.  *
  2189.  * Revision 1.26  2002/12/18 22:53:21  dicuccio
  2190.  * Added export specifier for building DLLs in windows.  Added global list of
  2191.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  2192.  *
  2193.  * Revision 1.25  2002/10/18 21:02:30  ucko
  2194.  * Drop obsolete (and misspelled!) reference to fWrap_UsePrefix1 from
  2195.  * usage description.
  2196.  *
  2197.  * Revision 1.24  2002/10/18 20:48:41  lavr
  2198.  * +ENewLine_Mode and 'n' translation in NStr::PrintableString()
  2199.  *
  2200.  * Revision 1.23  2002/10/16 19:29:17  ucko
  2201.  * +fWrap_HTMLPre
  2202.  *
  2203.  * Revision 1.22  2002/10/03 14:44:33  ucko
  2204.  * Tweak the interfaces to NStr::Wrap* to avoid publicly depending on
  2205.  * kEmptyStr, removing the need for fWrap_UsePrefix1 in the process; also
  2206.  * drop fWrap_FavorPunct, as WrapList should be a better choice for such
  2207.  * situations.
  2208.  *
  2209.  * Revision 1.21  2002/10/02 20:14:52  ucko
  2210.  * Add Join, Wrap, and WrapList functions to NStr::.
  2211.  *
  2212.  * Revision 1.20  2002/07/17 16:49:03  gouriano
  2213.  * added ncbiexpt.hpp include
  2214.  *
  2215.  * Revision 1.19  2002/07/15 18:17:52  gouriano
  2216.  * renamed CNcbiException and its descendents
  2217.  *
  2218.  * Revision 1.18  2002/07/11 14:17:55  gouriano
  2219.  * exceptions replaced by CNcbiException-type ones
  2220.  *
  2221.  * Revision 1.17  2002/06/18 16:03:49  ivanov
  2222.  * Fixed #ifdef clause in NStr::strftime()
  2223.  *
  2224.  * Revision 1.16  2002/06/18 15:19:36  ivanov
  2225.  * Added NStr::strftime() -- correct handling %D and %T time formats on MS Windows
  2226.  *
  2227.  * Revision 1.15  2002/05/02 15:38:02  ivanov
  2228.  * Fixed comments for String-to-X functions
  2229.  *
  2230.  * Revision 1.14  2002/05/02 15:25:51  ivanov
  2231.  * Added new parameter to String-to-X functions for skipping the check
  2232.  * the end of string on zero
  2233.  *
  2234.  * Revision 1.13  2002/04/11 20:39:19  ivanov
  2235.  * CVS log moved to end of the file
  2236.  *
  2237.  * Revision 1.12  2002/03/01 17:54:38  kans
  2238.  * include string.h and ctype.h
  2239.  *
  2240.  * Revision 1.11  2002/02/22 22:23:20  vakatov
  2241.  * Comments changed/added for string comparison functions
  2242.  * #elseif --> #elif
  2243.  *
  2244.  * Revision 1.10  2002/02/22 19:51:57  ivanov
  2245.  * Changed NCBI_OS_WIN to HAVE_STRICMP in the NStr::strncasecmp and
  2246.  * NStr::strcasecmp functions
  2247.  *
  2248.  * Revision 1.9  2002/02/22 17:50:22  ivanov
  2249.  * Added compatible compare functions strcmp, strncmp, strcasecmp, strncasecmp.
  2250.  * Was speed-up some Compare..() functions.
  2251.  *
  2252.  * Revision 1.8  2001/08/30 17:03:59  thiessen
  2253.  * remove class name from NStr member function declaration
  2254.  *
  2255.  * Revision 1.7  2001/08/30 00:39:29  vakatov
  2256.  * + NStr::StringToNumeric()
  2257.  * Moved all of "ncbistr.inl" code to here.
  2258.  * NStr::BoolToString() to return "const string&" rather than "string".
  2259.  * Also, well-groomed the code.
  2260.  *
  2261.  * Revision 1.6  2001/05/21 21:46:17  vakatov
  2262.  * SIZE_TYPE, NPOS -- moved from <ncbistl.hpp> to <ncbistr.hpp> and
  2263.  * made non-macros (to avoid possible name clashes)
  2264.  *
  2265.  * Revision 1.5  2001/05/17 14:54:18  lavr
  2266.  * Typos corrected
  2267.  *
  2268.  * Revision 1.4  2001/04/12 21:44:34  vakatov
  2269.  * Added dummy and private NStr::ToUpper/Lower(const char*) to prohibit
  2270.  * passing of constant C strings to the "regular" NStr::ToUpper/Lower()
  2271.  * variants.
  2272.  *
  2273.  * Revision 1.3  2001/03/16 19:38:55  grichenk
  2274.  * Added NStr::Split()
  2275.  *
  2276.  * Revision 1.2  2000/12/28 16:57:41  golikov
  2277.  * add string version of case an nocase cmp
  2278.  *
  2279.  * Revision 1.1  2000/12/15 15:36:30  vasilche
  2280.  * Added header corelib/ncbistr.hpp for all string utility functions.
  2281.  * Optimized string utility functions.
  2282.  * Added assignment operator to CRef<> and CConstRef<>.
  2283.  * Add Upcase() and Locase() methods for automatic conversion.
  2284.  *
  2285.  * ===========================================================================
  2286.  */
  2287. #endif  /* CORELIB___NCBISTR__HPP */