gstring.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:17k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: gstring.h,v 1.2.24.1 2004/07/09 01:54:36 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _GSTRING_H
  50. #define _GSTRING_H
  51. /*******************************************************************************
  52.  * Defines
  53.  */
  54. #define GSTRING_REFMODE     TRUE
  55. #define GSTRING_VALMODE     FALSE
  56. /*******************************************************************************
  57.  * Includes
  58.  */
  59. #include <string.h>
  60. #include "hxtypes.h"
  61. #include "hxassert.h"
  62. #include "hxstrutl.h"
  63. /*******************************************************************************
  64.  * Class definition
  65.  */
  66. class GString
  67. {
  68. protected:
  69.     enum {kDefaultCapacity = 32,
  70.   kMinimumCapacity = 32,
  71.   kMaximumCapacity = 65536};
  72.     
  73.     char    *m_pszBuffer;
  74.     ULONG32  m_ulCapacity;
  75.     ULONG32  m_ulLength;
  76.     LONG32   m_lError;
  77.     BOOL     m_bRefMode;
  78.     
  79.     ULONG32 NextPowerOfTwo(ULONG32 ulX)
  80.     {
  81.         if (ulX > 0)
  82.         {
  83.             ulX--;
  84.         }
  85.         else
  86.         {
  87.             return 1;
  88.         }
  89.         ULONG32 i = 0;
  90.         while (ulX > 0)
  91.         {
  92.             ulX >>= 1;
  93.             i++;
  94.         }
  95.         return (1 << i);
  96.     };
  97. public:
  98.     enum {ErrorMemoryFull = -1,
  99.   ErrorNone       = 0};
  100.     GString() : m_pszBuffer(0L), m_ulCapacity(0), m_ulLength(0), m_lError(ErrorNone), m_bRefMode(FALSE) {};
  101.     
  102.     GString(ULONG32 ulCapacity)
  103. : m_bRefMode(FALSE)
  104.     {
  105.         if (ulCapacity < kMinimumCapacity)
  106.         {
  107.             ulCapacity = kMinimumCapacity;
  108.         }
  109.         else if (ulCapacity > kMaximumCapacity)
  110.         {
  111.             ulCapacity = kMaximumCapacity;
  112.         }
  113.         m_ulCapacity = m_ulLength = 0;
  114.         m_lError     = ErrorNone;
  115.         m_pszBuffer  = 0L;
  116.         if (ulCapacity > 0)
  117.         {
  118.             m_pszBuffer  = new char [ulCapacity];
  119.             if (m_pszBuffer)
  120.             {
  121.                 m_ulCapacity = ulCapacity;
  122.             }
  123.             else
  124.             {
  125.                 m_lError = ErrorMemoryFull;
  126.             }
  127.         }
  128.     };
  129.     
  130.     GString(const GString & rString)
  131.     {
  132.         m_lError     = ErrorNone;
  133. m_bRefMode = rString.m_bRefMode;
  134. if (m_bRefMode)
  135. {
  136.     m_pszBuffer = rString.m_pszBuffer;
  137.     m_ulCapacity = 0;
  138.     m_ulLength = rString.length();
  139.     m_bRefMode = TRUE;
  140. }
  141. else
  142. {
  143.     m_pszBuffer  = new char [rString.capacity()];
  144.     if (m_pszBuffer)
  145.     {
  146. strcpy(m_pszBuffer, rString.m_pszBuffer); /* Flawfinder: ignore */
  147. m_ulCapacity = rString.capacity();
  148. m_ulLength = rString.length();
  149.     }
  150.     else
  151.     {
  152. m_ulCapacity = 0;
  153. m_ulLength = 0;
  154. m_lError = ErrorMemoryFull;
  155.     }
  156. }
  157.     }
  158.     
  159.     GString(const char *pszString)
  160. : m_bRefMode(FALSE)
  161.     {
  162.         m_ulCapacity = m_ulLength = 0;
  163.         m_lError     = ErrorNone;
  164.         m_pszBuffer  = 0L;
  165.         ULONG32 ulCapacity = NextPowerOfTwo(strlen(pszString) + 1);
  166.         if (ulCapacity < kMinimumCapacity)
  167.         {
  168.             ulCapacity = kMinimumCapacity;
  169.         }
  170.         else if (ulCapacity > kMaximumCapacity)
  171.         {
  172.             ulCapacity = kMaximumCapacity;
  173.         }
  174.         m_pszBuffer = new char [ulCapacity];
  175.         if (m_pszBuffer)
  176.         {
  177.             strcpy(m_pszBuffer, pszString); /* Flawfinder: ignore */
  178.             m_ulCapacity = ulCapacity;
  179.             m_ulLength   = strlen(pszString);
  180.         }
  181.         else
  182.         {
  183.             m_lError = ErrorMemoryFull;
  184.         }
  185.     };
  186.     
  187.     GString(const char *pszString, LONG32 lLen, BOOL bRefMode = FALSE)
  188. : m_bRefMode(bRefMode)
  189.     {
  190. LONG32 strLen;
  191. char* tracer;
  192. m_ulCapacity = 0;
  193. m_lError = ErrorNone;
  194. if (m_bRefMode)
  195. {
  196.     m_pszBuffer = (char *) pszString;
  197. }
  198. else
  199. {
  200.     ULONG32 ulCapacity = NextPowerOfTwo(lLen + 1);
  201.     m_pszBuffer = 0L;
  202.     m_ulLength = 0;
  203.     if (ulCapacity < kMinimumCapacity)
  204.     {
  205. ulCapacity = kMinimumCapacity;
  206.     }
  207.     else if (ulCapacity > kMaximumCapacity)
  208.     {
  209. ulCapacity = kMaximumCapacity;
  210.     }
  211.     m_pszBuffer = new char [ulCapacity];
  212.     if (m_pszBuffer)
  213.     {
  214. strncpy(m_pszBuffer, pszString, lLen); /* Flawfinder: ignore */
  215. m_pszBuffer[lLen] = '';
  216. m_ulCapacity = ulCapacity;
  217.     }
  218.     else
  219.     {
  220. m_lError = ErrorMemoryFull;
  221. return;
  222.     }
  223. }
  224. for (strLen = 0, tracer = m_pszBuffer; strLen < lLen; strLen++, tracer++)
  225. {
  226.     if (*tracer == '')
  227.     {
  228. lLen = strLen;
  229.     }
  230. }
  231. m_ulLength = lLen;
  232.     };
  233.     ~GString()
  234.     {
  235.         if ((!m_bRefMode) && m_pszBuffer)
  236.         {
  237.             delete [] m_pszBuffer;
  238.         }
  239.     };
  240.     ULONG32 length()       const { return m_ulLength;   };
  241.     ULONG32 size()         const { return m_ulLength;   };
  242.     ULONG32 capacity()     const { return m_ulCapacity; };
  243.     ULONG32 max_capacity() const { return kMaximumCapacity; }
  244.     BOOL    empty()        const { return (m_ulLength == 0 ? TRUE : FALSE); };
  245.     LONG32  error()        const { return m_lError; };
  246.     LONG32  isref()        const { return m_bRefMode; }; 
  247.     
  248.     // c_str() const method is supported for bakward compatibility 
  249.     // with the code that expects this method to be const.
  250.     // The const method does not support reference mode (m_bRefMode).
  251.     const char *c_str()    const
  252.     {
  253. HX_ASSERT(!m_bRefMode);
  254. if (m_bRefMode)
  255. {
  256.     return NULL;
  257. }
  258. return m_pszBuffer;
  259.     }
  260.     const char *c_str()
  261.     {
  262. if (m_bRefMode)
  263. {
  264.     m_lError = reserve(m_ulLength + 1);
  265.     if (m_lError != ErrorNone)
  266.     {
  267. m_pszBuffer = NULL;
  268. m_ulCapacity = 0;
  269. m_ulLength = 0;
  270. m_lError = ErrorMemoryFull;
  271.     }
  272. }
  273. return m_pszBuffer;
  274.     }
  275.     LONG32 reserve(ULONG32 ulN)
  276.     {
  277.         if (ulN > m_ulCapacity)
  278.         {
  279.             ULONG32 ulCapacity = NextPowerOfTwo(ulN);
  280.             if (ulCapacity < kMinimumCapacity)
  281.             {
  282.                 ulCapacity = kMinimumCapacity;
  283.             }
  284.             else if (ulCapacity > kMaximumCapacity)
  285.             {
  286.                 ulCapacity = kMaximumCapacity;
  287.             }
  288.             char *pszTmp = 0L;
  289.             pszTmp       = new char [ulCapacity];
  290.             if (!pszTmp)
  291.             {
  292.                 return ErrorMemoryFull;
  293.             }
  294.             if (m_ulLength > ulCapacity)
  295.             {
  296.                 m_ulLength = ulCapacity - 1;
  297.             }
  298.             if (m_ulLength > 0)
  299.             {
  300.                 strncpy(pszTmp, m_pszBuffer, m_ulLength); /* Flawfinder: ignore */
  301. pszTmp[m_ulLength] = '';
  302.             }
  303.     if (!m_bRefMode)
  304.     {
  305. delete [] m_pszBuffer;
  306.     }
  307.             m_pszBuffer  = pszTmp;
  308.             m_ulCapacity = ulCapacity;
  309.     m_bRefMode = FALSE;
  310.         }
  311.         return ErrorNone;
  312.     };
  313.     GString & operator = (const GString &rString)
  314.     {
  315. if (rString.m_bRefMode)
  316. {
  317.     if (!m_bRefMode)
  318.     {
  319. delete [] m_pszBuffer;
  320.     }
  321.     m_pszBuffer = rString.m_pszBuffer;
  322.     m_ulLength = rString.m_ulLength;
  323.     m_ulCapacity = rString.m_ulCapacity;
  324.     m_bRefMode = TRUE;
  325. }
  326. else
  327. {
  328.     m_lError = reserve(rString.m_ulLength + 1);
  329.     if (m_lError == ErrorNone)
  330.     {
  331. strcpy(m_pszBuffer, rString.m_pszBuffer); /* Flawfinder: ignore */
  332. m_ulLength = rString.m_ulLength;
  333.     }
  334. }
  335.         return *this;
  336.     };
  337.     GString & operator = (const char *pszString)
  338.     {
  339.         if (pszString == NULL)
  340.         {
  341.             return *this;
  342.         }
  343.         m_lError = reserve(strlen(pszString) + 1);
  344.         if (m_lError == ErrorNone)
  345.         {
  346.             strcpy(m_pszBuffer, pszString); /* Flawfinder: ignore */
  347.             m_ulLength = strlen(pszString);
  348.         }
  349.         return *this;
  350.     };
  351.     GString & operator += (const GString &rString)
  352.     {
  353.         m_lError = reserve(m_ulLength + rString.m_ulLength + 1);
  354.         if (m_lError == ErrorNone)
  355.         {
  356.             strncat(m_pszBuffer, rString.m_pszBuffer, rString.m_ulLength); /* Flawfinder: ignore */
  357.             m_ulLength += rString.m_ulLength;
  358.         }
  359.         return *this;
  360.     };
  361.     GString & operator += (const char *pszString)
  362.     {
  363.         m_lError = reserve(m_ulLength + strlen(pszString) + 1);
  364.         if (m_lError == ErrorNone)
  365.         {
  366.             strcat(m_pszBuffer, pszString); /* Flawfinder: ignore */
  367.             m_ulLength += strlen(pszString);
  368.         }
  369.         return *this;
  370.     };
  371.     GString operator + (const GString &rString)
  372.     {
  373.         GString cTmp(*this);
  374.         cTmp += rString;
  375.         return cTmp;
  376.     };
  377.     GString operator + (const char *pszString)
  378.     {
  379.         GString cTmp(*this);
  380.         cTmp += pszString;
  381.         return cTmp;
  382.     };
  383.     BOOL operator == (const GString &rString)
  384.     {
  385.         return (((rString.m_ulLength != m_ulLength) ||
  386.          strncmp(m_pszBuffer, rString.m_pszBuffer, m_ulLength)) ? FALSE : TRUE);
  387.     };
  388.     BOOL operator == (const char *pszString)
  389.     {
  390.         return (((m_ulLength != strlen(pszString)) ||
  391.          strncmp(m_pszBuffer, pszString, m_ulLength)) ? FALSE : TRUE);
  392.     };
  393.     BOOL operator != (const GString &rString)
  394.     {
  395.         return (((m_ulLength != rString.m_ulLength) ||
  396.          strncmp(m_pszBuffer, rString.m_pszBuffer, m_ulLength)) ? TRUE : FALSE);
  397.     };
  398.     BOOL operator != (const char *pszString)
  399.     {
  400.         return (((m_ulLength != strlen(pszString)) ||
  401.          strncmp(m_pszBuffer, pszString, m_ulLength)) ? TRUE : FALSE);
  402.     };
  403.     const char & operator [] (LONG32 lPos) const
  404.     {
  405.         if (lPos < 0)
  406.         {
  407.             lPos = 0;
  408.         }
  409.         else if ((ULONG32) lPos > m_ulLength)
  410.         {
  411.             lPos = m_ulLength;
  412.         }
  413.         return m_pszBuffer[lPos];
  414.     };
  415.     LONG32 find(const char *pszString, LONG32 lPos = 0) const
  416.     {
  417. char *pSubStr;
  418. if (m_bRefMode)
  419. {
  420.     pSubStr = StrNStr(&m_pszBuffer[lPos], pszString, m_ulLength - lPos, kMaximumCapacity);
  421. }
  422. else
  423. {
  424.     pSubStr = strstr(&m_pszBuffer[lPos], pszString);
  425. }
  426.         LONG32 lRetVal;
  427.         if (pSubStr)
  428.         {
  429.             lRetVal = pSubStr - m_pszBuffer;
  430.         }
  431.         else
  432.         {
  433.             lRetVal = -1;
  434.         }
  435.         return lRetVal;
  436.     };
  437.     LONG32 find(const GString &rString, LONG32 lPos = 0) const
  438.     {
  439. char *pSubStr;
  440. if (m_bRefMode || rString.m_bRefMode)
  441. {
  442.     pSubStr = StrNStr(&m_pszBuffer[lPos], rString.m_pszBuffer, m_ulLength - lPos, rString.m_ulLength);
  443. }
  444. else
  445. {
  446.     pSubStr = strstr(&m_pszBuffer[lPos], rString.m_pszBuffer);
  447. }
  448.         LONG32 lRetVal;
  449.         if (pSubStr)
  450.         {
  451.             lRetVal = pSubStr - m_pszBuffer;
  452.         }
  453.         else
  454.         {
  455.             lRetVal = -1;
  456.         }
  457.         return lRetVal;
  458.     };
  459.     LONG32 find(char c, LONG32 lPos = 0) const
  460.     {
  461.         char *pSubStr;
  462. if (m_bRefMode)
  463. {
  464.     pSubStr = StrNChr(&m_pszBuffer[lPos], c, m_ulLength - lPos);
  465. }
  466. else
  467. {
  468.     pSubStr = strchr(&m_pszBuffer[lPos], c);
  469. }
  470.         LONG32 lRetVal;
  471.         if (pSubStr)
  472.         {
  473.             lRetVal = pSubStr - m_pszBuffer;
  474.         }
  475.         else
  476.         {
  477.             lRetVal = -1;
  478.         }
  479.         return lRetVal;
  480.     };
  481.     LONG32 find_last_of(char c) const
  482.     {
  483. char* pSubStr;
  484. if (m_bRefMode)
  485. {
  486.     pSubStr = StrNRChr(m_pszBuffer, c, m_ulLength);
  487. }
  488. else
  489. {
  490.     pSubStr = strrchr(m_pszBuffer, c);
  491. }
  492. LONG32 lRet;
  493.         if (pSubStr)
  494. {
  495.     lRet = pSubStr - m_pszBuffer;
  496. }
  497. else
  498. {
  499.     lRet = -1;
  500. }
  501.         return lRet;
  502.     };
  503.     LONG32 find_first_of(const char *pszString, LONG32 lPos = 0) const
  504.     {
  505. LONG32 lRet;
  506. if (m_bRefMode)
  507. {
  508.     lRet = StrNCSpn(&m_pszBuffer[lPos], pszString, m_ulLength - lPos, kMaximumCapacity);
  509. }
  510. else
  511. {
  512.     lRet = strcspn(&m_pszBuffer[lPos], pszString);
  513. }
  514.         return lRet + lPos;
  515.     };
  516.     LONG32 find_first_of(const GString &rString, LONG32 lPos = 0) const
  517.     {
  518. LONG32 lRet;
  519. if (m_bRefMode || rString.m_bRefMode)
  520. {
  521.     lRet = StrNCSpn(&m_pszBuffer[lPos], rString.m_pszBuffer, m_ulLength - lPos, rString.m_ulLength);
  522. }
  523. else
  524. {
  525.     lRet = strcspn(&m_pszBuffer[lPos], rString.m_pszBuffer);
  526. }
  527.         return lRet + lPos;
  528.     };
  529.     LONG32 find_first_of(char c, LONG32 lPos = 0) const
  530.     {
  531.         return find(c, lPos);
  532.     };
  533.     LONG32 find_first_not_of(const char *pszString, LONG32 lPos = 0) const
  534.     {
  535.         LONG32 lRet;
  536. if (m_bRefMode)
  537. {
  538.     lRet = StrNSpn(&m_pszBuffer[lPos], pszString, m_ulLength - lPos, kMaximumCapacity);
  539. }
  540. else
  541. {
  542.     lRet = strspn(&m_pszBuffer[lPos], pszString);
  543. }
  544.         return lRet + lPos;
  545.     };
  546.     LONG32 find_first_not_of(const GString &rString, LONG32 lPos = 0) const
  547.     {
  548. LONG32 lRet;
  549. if (m_bRefMode || rString.m_bRefMode)
  550. {
  551.     lRet = StrNSpn(&m_pszBuffer[lPos], rString.m_pszBuffer, m_ulLength - lPos, rString.m_ulLength);
  552. }
  553. else
  554. {
  555.     lRet = strspn(&m_pszBuffer[lPos], rString.m_pszBuffer);
  556. }
  557.         return lRet + lPos;
  558.     };
  559.     GString substr(LONG32 lPos, LONG32 rPos) const
  560.     {
  561.         if (lPos < 0) lPos = 0;
  562.         if ((ULONG32) lPos >= m_ulLength) lPos = m_ulLength - 1;
  563.         if (rPos < 0) rPos = 0;
  564.         if ((ULONG32) rPos >= m_ulLength) rPos = m_ulLength - 1;
  565.         if (rPos < lPos) rPos = lPos;
  566.         GString retStr(&m_pszBuffer[lPos], rPos - lPos + 1, m_bRefMode);
  567.         return retStr;
  568.     };
  569.     void CopyN(unsigned char *pBuffer, ULONG32 ulN)
  570.     {
  571.         m_lError = reserve(ulN + 1);
  572.         if (m_lError == ErrorNone)
  573.         {
  574.             strncpy(m_pszBuffer, (const char *) pBuffer, ulN); /* Flawfinder: ignore */
  575.             m_pszBuffer[ulN] = '';
  576.             m_ulLength = strlen(m_pszBuffer);
  577.         }
  578.     };
  579.     void LowerCase()
  580.     {
  581.         for (UINT32 i = 0; i < m_ulLength; i++)
  582.         {
  583.             char c = m_pszBuffer[i];
  584.             // If character is uppercase ASCII, convert to lowercase
  585.             if (c >= 65 && c <= 90)
  586.             {
  587.                 c             += 32;
  588.                 m_pszBuffer[i] = c;
  589.             }
  590.         }
  591.     };
  592.     void UpperCase()
  593.     {
  594.         for (UINT32 i = 0; i < m_ulLength; i++)
  595.         {
  596.             char c = m_pszBuffer[i];
  597.             // If character is lowercase ASCII, convert to uppercase
  598.             if (c >= 97 && c <= 122)
  599.             {
  600.                 c             -= 32;
  601.                 m_pszBuffer[i] = c;
  602.             }
  603.         }
  604.     };
  605. };
  606. #endif  // _GSTRING_H