SBjsiStringNoSTL.hpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:4k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *****************************************************************************
  3.  *
  4.  * SBjsiString, string class that is a subset of STL wstring
  5.  *
  6.  * The SBjsiString class stores a string in a grow-only buffer, a
  7.  * functional subset of the STL wstring class. This header merely
  8.  * exists to make it easy to eliminate the use of STL wstring which
  9.  * does not exist on some Linux versions.
  10.  *
  11.  *****************************************************************************
  12.  ****************************************************************************/
  13. /****************License************************************************
  14.  * Vocalocity OpenVXI
  15.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  16.  * This program is free software; you can redistribute it and/or
  17.  * modify it under the terms of the GNU General Public License
  18.  * as published by the Free Software Foundation; either version 2
  19.  * of the License, or (at your option) any later version.
  20.  *  
  21.  * This program is distributed in the hope that it will be useful,
  22.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  * GNU General Public License for more details.
  25.  *
  26.  * You should have received a copy of the GNU General Public License
  27.  * along with this program; if not, write to the Free Software
  28.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  29.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  30.  * registered trademarks of Vocalocity, Inc. 
  31.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  32.  * by Vocalocity.
  33.  ***********************************************************************/
  34. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  35. #ifndef _SBJSISTRINGNOSTL_HPP__
  36. #define _SBJSISTRINGNOSTL_HPP__
  37. // Non-STL implementation
  38. #include <stdlib.h>
  39. #include <wchar.h>
  40. class SBjsiString
  41. {
  42.  public:
  43.   // Constructors and destructor
  44.   SBjsiString():
  45.     data(NULL),
  46.     allocated(0),
  47.     dataLen(0)
  48.   {}
  49.   SBjsiString(const VXIchar *str):
  50.     data(NULL),
  51.     allocated(0),
  52.     dataLen(0)
  53.   {
  54.     operator+=(str);
  55.   }
  56.   SBjsiString (const SBjsiString &str):
  57.     data(NULL),
  58.     allocated(0),
  59.     dataLen(0)
  60.   {
  61.     operator+=(str.data);
  62.   }
  63.   virtual ~SBjsiString()
  64.   {
  65.     if ( data ) free (data);
  66.   }
  67.   // Assignment operators
  68.   SBjsiString& operator=(const SBjsiString &str)
  69.   {
  70.     if (&str != this)
  71.     {
  72.       dataLen = 0;
  73.       operator+=(str.data);
  74.     }
  75.     return *this;
  76.   }
  77.   SBjsiString& operator=(const VXIchar *str)
  78.   {
  79.     dataLen = 0;
  80.     return operator+=(str);
  81.     return *this;
  82.   }
  83.   // Clear operator
  84.   void clear()
  85.   {
  86.     dataLen = 0;
  87.   }
  88.   // Operators for appending data to the string
  89.   SBjsiString& operator+=(const SBjsiString& str)
  90.   {
  91.     return concat(str.data, str.datalen);
  92.   }
  93.   SBjsiString& operator+=(const VXIchar *str)
  94.   {
  95.     return concat(str, wcslen(str));
  96.   }
  97.   SBjsiString& operator+=(VXIchar c)
  98.   {
  99.     return concat(&c, 1);
  100.   }
  101. bool operator==(const VXIchar *str)
  102. {
  103. return wcscmp( str, this->c_str() ) == 0;
  104. }
  105. bool operator==(const SBjsiString& str)
  106. {
  107. return wcscmp( str.c_str(), this->c_str() ) == 0;
  108. }
  109.   // Operators to access the string data
  110.   unsigned int length( ) const { return dataLen; }
  111.   const VXIchar *c_str( ) const { return data; }
  112.   void replace(int p, int n, VXIchar *s)
  113.   {
  114.     if((s == NULL) return;
  115.     if(p + n > dataLen) n = dataLen - p;
  116.     ::wcsncpy(&data[p], s, n);
  117.   }
  118.  private:
  119.   SBjsiString& concat(const VXIchar *str, int len)
  120.   {
  121.     if (datalen + len + 1 <= allocated || Grow(len + 1))
  122.     {
  123.       wcsncpy(data + datalen, str, len);
  124.       datalen += len;
  125.       data[datalen] = L'';
  126.     }
  127.     return *this;
  128.   }
  129.   // Grow the buffer
  130.   bool Grow (unsigned int size)
  131.   {
  132.     if ( size < 128 ) size = 128;
  133.     VXIchar *newData =
  134.       (VXIchar *) realloc (data, (dataLen + size) * sizeof (VXIchar));
  135.     if (!newData) return false;
  136.     data = newData;
  137.     allocated = dataLen + size;
  138.     return true;
  139.   }
  140.  private:
  141.   unsigned int  allocated;
  142.   unsigned int  dataLen;
  143.   VXIchar      *data;
  144. };
  145. #endif /* include guard */