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

xml/soap/webservice

开发平台:

Visual C++

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