hxstradv.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxstring.h"
  36. #include "hlxclib/string.h"
  37. #include "hlxclib/ctype.h"
  38. #include "hxassert.h"
  39. #include "hxstrutl.h"
  40. CHXString CHXString::SpanIncluding(const char* pCharSet) const
  41. {
  42.     if (m_pRep)
  43. return CHXString(m_pRep->GetBuffer(), 
  44.  strspn(m_pRep->GetBuffer(), pCharSet));
  45.     return CHXString();
  46. }
  47. CHXString CHXString::SpanExcluding(const char* pCharSet) const
  48. {
  49.     if (m_pRep)
  50. return CHXString(m_pRep->GetBuffer(), 
  51.  strcspn(m_pRep->GetBuffer(), pCharSet));
  52.     return CHXString();
  53. }
  54. void CHXString::MakeUpper()
  55. {
  56.     if (m_pRep)
  57.     {
  58. EnsureUnique();
  59. char* pCur = m_pRep->GetBuffer();
  60. for(; *pCur; ++pCur)
  61.     *pCur = toupper(*pCur);
  62.     }
  63. }
  64. void CHXString::MakeLower()
  65. {
  66.     if (m_pRep)
  67.     {
  68. EnsureUnique();
  69. char* pCur = m_pRep->GetBuffer();
  70. for(; *pCur; ++pCur)
  71.     *pCur = tolower(*pCur);
  72.     }
  73. }
  74. INT32 CHXString::Find(char ch) const
  75. {
  76.     INT32 ret = -1;
  77.     if (m_pRep)
  78.     {
  79. const char* pTmp = strchr(m_pRep->GetBuffer(), ch);
  80. if (pTmp)
  81.     ret = pTmp - m_pRep->GetBuffer();
  82.     }
  83.     return ret;
  84. }
  85. INT32 CHXString::ReverseFind(char ch) const
  86. {
  87.     INT32 ret = -1;
  88.     if (m_pRep)
  89.     {
  90. const char* pTmp = strrchr(m_pRep->GetBuffer(), ch);
  91. if (pTmp)
  92.     ret = pTmp - m_pRep->GetBuffer();
  93.     }
  94.     return ret;
  95. }
  96. INT32 CHXString::Find(const char* pStr) const
  97. {
  98.     INT32 ret = -1;
  99.     
  100.     if (m_pRep)
  101.     {
  102. const char* pTmp = strstr(m_pRep->GetBuffer(), pStr);
  103. if (pTmp)
  104.     ret = pTmp - m_pRep->GetBuffer();
  105.     }
  106.     return ret;
  107. }
  108. void CHXString::AppendULONG(ULONG32 value)
  109. {
  110.     static const int MaxULongString = 12;
  111.     char buf[MaxULongString]; /* Flawfinder: ignore */
  112.     int tmp = SafeSprintf(buf, MaxULongString, "%lu", value);
  113.     HX_ASSERT(tmp < MaxULongString);
  114.     *this += buf;
  115. }
  116. void CHXString::AppendEndOfLine()
  117. {
  118. #if defined(_WINDOWS) || defined(_SYMBIAN)
  119.     *this += "rn";
  120. #elif defined(_MACINTOSH)
  121.     *this += 'r';
  122. #else
  123.     *this += 'n';
  124. #endif /* defined(_WINDOWS) */
  125. }
  126. void CHXString::Center(short length)
  127. {
  128.     if (m_pRep)
  129.     {
  130. EnsureUnique();
  131. TrimLeft();
  132. TrimRight();
  133. int offset = 0;
  134. if (length > m_pRep->GetStringSize())
  135.     offset = length / 2 - m_pRep->GetStringSize() / 2;
  136. HX_ASSERT(offset >= 0);
  137. int newSize = offset + m_pRep->GetStringSize();
  138. if (m_pRep->GetBufferSize() < (newSize + 1))
  139.     m_pRep->ResizeAndCopy(newSize);
  140. char* pSrc = m_pRep->GetBuffer() + m_pRep->GetStringSize();
  141. char* pDest = m_pRep->GetBuffer() + newSize;
  142. // Copy the string so that it is located offset characters
  143. // from the start of the string
  144. while (pSrc >= m_pRep->GetBuffer())
  145.     *pDest-- = *pSrc--;
  146. // Put offset number of space characters at the start of the string
  147. while (pDest >= m_pRep->GetBuffer())
  148.     *pDest-- = ' ';
  149. m_pRep->SetStringSize(newSize);
  150.     }
  151.     else if (length > 0)
  152. m_pRep = new CHXStringRep(' ', length / 2);
  153. }
  154. CHXString CHXString::Mid(INT32 i, INT32 length) const
  155. {
  156.     HX_ASSERT(m_pRep && (i <= m_pRep->GetStringSize()));
  157.     
  158.     if (m_pRep)
  159.     {
  160. if ((i + length) > m_pRep->GetStringSize())
  161.     length = m_pRep->GetStringSize() - i;
  162. return CHXString(m_pRep->GetBuffer() + i, length);
  163.     }
  164.     return CHXString();
  165. }
  166. CHXString CHXString::Mid(INT32 i) const
  167. {
  168.     HX_ASSERT(m_pRep &&(i <= m_pRep->GetStringSize()));
  169.     if (m_pRep)
  170. return CHXString(m_pRep->GetBuffer() + i);
  171.     return CHXString();
  172. }
  173. CHXString CHXString::Left(INT32 length) const
  174. {
  175.     HX_ASSERT(length >= 0);
  176.     
  177.     if (m_pRep)
  178.     {
  179. if (length > m_pRep->GetStringSize())
  180.     length = m_pRep->GetStringSize();
  181. return CHXString(m_pRep->GetBuffer(), length);
  182.     }
  183.     return CHXString();
  184. }
  185. CHXString CHXString::Right(INT32 length) const
  186. {
  187.     HX_ASSERT(length >= 0);
  188.     
  189.     if (m_pRep)
  190.     {
  191. if (length > m_pRep->GetStringSize())
  192.     length = m_pRep->GetStringSize();
  193. int offset = m_pRep->GetStringSize() - length;
  194. return CHXString(m_pRep->GetBuffer() + offset, length);
  195.     }
  196.     return CHXString();
  197. }
  198. ULONG32 CHXString::CountFields(char delim) const
  199. {
  200.     ULONG32 ret = 0;
  201.     if (m_pRep && m_pRep->GetStringSize())
  202.     {
  203. ret++; // If the string is not empty we have at least 1 field.
  204. for (const char* pCur = m_pRep->GetBuffer(); *pCur; pCur++)
  205.     if (*pCur == delim)
  206. ret++;
  207.     }
  208.     return ret;
  209. }
  210. static UINT64 PackState(ULONG32 index, ULONG32 offset)
  211. {
  212.     return (((UINT64)index) << 32) | offset;
  213. }
  214. static void UnpackState(UINT64 state, ULONG32& index, ULONG32& offset)
  215. {
  216.     index = INT64_TO_ULONG32(state >> 32);
  217.     offset = INT64_TO_ULONG32((state & 0x0ffffffff));
  218. }
  219. CHXString CHXString::GetNthField(char delim, ULONG32 i, UINT64& state) const
  220. {
  221.     CHXString ret;
  222.     if (m_pRep)
  223.     {
  224. ULONG32 index = 0;
  225. ULONG32 offset = 0;
  226. // Get the state values
  227. UnpackState(state, index, offset);
  228. if (offset >= (ULONG32)(m_pRep->GetStringSize()))
  229.     offset = 0;
  230. // 'i' passed in as a 1 based, with the exception that 0 also means 1.
  231. // This converts the 1 based index into a 0 base index
  232. if (i > 0)
  233.     i = i - 1;
  234. if (i >= index)
  235. {
  236.     const char* pStart = m_pRep->GetBuffer();
  237.     
  238.     // Apply state information
  239.     pStart += offset;
  240.     
  241.     // Find the start of the field
  242.     for(;(*pStart) && (index < i); pStart++)
  243. if (*pStart == delim)
  244.     index++;
  245.     
  246.     const char* pEnd = pStart;
  247.     
  248.     // Find the end of the field
  249.     for (; (*pEnd) && (*pEnd != delim); pEnd++);
  250.     
  251.     if (pStart != pEnd)
  252. ret = CHXString(pStart, pEnd - pStart);
  253.     
  254.     // Update the state
  255.     PackState(index, pEnd - m_pRep->GetBuffer());
  256. }
  257.     }
  258.     return ret;
  259. }
  260. CHXString CHXString::NthField(char delim, ULONG32 i) const
  261. {
  262.     UINT64 state = PackState(0,0);
  263.     return GetNthField(delim, i, state);
  264. }
  265. void CHXString::TrimRight()
  266. {
  267.     if (m_pRep)
  268.     {
  269. EnsureUnique();
  270. INT32 strSize = m_pRep->GetStringSize();
  271. if (strSize)
  272. {
  273.     char* pCur = m_pRep->GetBuffer() + strSize - 1;
  274.     
  275.     for(;(pCur >= m_pRep->GetBuffer()) && (isspace(*pCur)); pCur--, strSize--);
  276.     
  277.     // Null terminate the string
  278.     m_pRep->GetBuffer()[strSize] = '';
  279.     
  280.     m_pRep->SetStringSize(strSize);
  281. }
  282.     }
  283. }
  284. void CHXString::TrimLeft()
  285. {
  286.     if (m_pRep)
  287.     {
  288. EnsureUnique();
  289. char* pStart = m_pRep->GetBuffer();
  290. for(; (*pStart) && (isspace(*pStart)); pStart++);
  291. INT32 newSize = m_pRep->GetStringSize() - (pStart - m_pRep->GetBuffer());
  292. memmove(m_pRep->GetBuffer(), pStart, newSize + 1);
  293. m_pRep->SetStringSize(newSize);
  294.     }
  295. }
  296. BOOL CHXString::FindAndReplace(const char* pSearch , const char* pReplace,
  297. BOOL bReplaceAll)
  298. {
  299.     BOOL ret = FALSE;
  300.     if (m_pRep)
  301.     {
  302. const char* pStart = m_pRep->GetBuffer();
  303. const char* pMatch = strstr(pStart, pSearch);
  304.     
  305. if (pMatch)
  306. {
  307.     INT32 searchLen = SafeStrlen(pSearch);
  308.     CHXString buf;
  309.     while(pMatch)
  310.     {
  311. // Append any data that was between pStart and pMatch
  312. buf.Append(pStart, pMatch - pStart);
  313. // Append the replacement string to our buffer
  314. buf += pReplace;
  315. // Update search start position
  316. pStart = pMatch + searchLen;
  317. // See if we need to do more replacements
  318. if (bReplaceAll)
  319.     pMatch = strstr(pStart, pSearch);
  320. else
  321.     pMatch = 0;
  322.     }
  323.     // Append trailing part of the string
  324.     buf += pStart;
  325.     // Update the this objects m_pRep with the one we 
  326.     // just constructed in buf
  327.     *this = buf;
  328.     ret = TRUE;
  329. }
  330.     }
  331.     return ret;
  332. }