00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_StringBuffer.hpp"
00038 #include "OW_CIMDateTime.hpp"
00039 #include "OW_Char16.hpp"
00040 #include "OW_CIMObjectPath.hpp"
00041 #include "OW_CIMDateTime.hpp"
00042
00043 #include <cstring>
00044 #include <cstdio>
00045 #include <cctype>
00046 #if defined(OW_HAVE_ISTREAM) && defined(OW_HAVE_OSTREAM)
00047 #include <istream>
00048 #include <ostream>
00049 #else
00050 #include <iostream>
00051 #endif
00052 #include <algorithm>
00053 #include <cfloat>
00054
00055 namespace OW_NAMESPACE
00056 {
00057
00058 #if defined(OW_AIX)
00059 const size_t StringBuffer::OW_DEFAULT_ALLOCATION_UNIT = 128;
00060 #endif // OW_AIX
00061
00062 StringBuffer::StringBuffer(size_t allocSize) :
00063 m_len(0),
00064 m_allocated(allocSize > 0 ? allocSize : OW_DEFAULT_ALLOCATION_UNIT),
00065 m_bfr(new char[m_allocated])
00066 {
00067 m_bfr[0] = 0;
00068 }
00070 StringBuffer::StringBuffer(const char* arg) :
00071 m_len(strlen(arg)),
00072 m_allocated(m_len + OW_DEFAULT_ALLOCATION_UNIT),
00073 m_bfr(new char[m_allocated])
00074 {
00075 ::strcpy(m_bfr, arg);
00076 }
00078 StringBuffer::StringBuffer(const String& arg) :
00079 m_len(arg.length()),
00080 m_allocated(m_len + OW_DEFAULT_ALLOCATION_UNIT),
00081 m_bfr(new char[m_allocated])
00082 {
00083 ::strcpy(m_bfr, arg.c_str());
00084 }
00086 StringBuffer::StringBuffer(const StringBuffer& arg) :
00087 m_len(arg.m_len), m_allocated(arg.m_allocated),
00088 m_bfr(new char[arg.m_allocated])
00089 {
00090 ::memmove(m_bfr, arg.m_bfr, arg.m_len + 1);
00091 }
00093 StringBuffer&
00094 StringBuffer::operator= (const String& arg)
00095 {
00096 StringBuffer(arg).swap(*this);
00097 return *this;
00098 }
00100 StringBuffer&
00101 StringBuffer::operator= (const char* str)
00102 {
00103 StringBuffer(str).swap(*this);
00104 return *this;
00105 }
00107 StringBuffer&
00108 StringBuffer::operator =(const StringBuffer& arg)
00109 {
00110 StringBuffer(arg).swap(*this);
00111 return *this;
00112 }
00114 void
00115 StringBuffer::swap(StringBuffer& x)
00116 {
00117 std::swap(m_len, x.m_len);
00118 std::swap(m_allocated, x.m_allocated);
00119 std::swap(m_bfr, x.m_bfr);
00120 }
00122 void
00123 StringBuffer::reset()
00124 {
00125 m_len = 0;
00126 m_bfr[0] = '\0';
00127 }
00128
00130 void
00131 StringBuffer::truncate(size_t index)
00132 {
00133 if (index < m_len)
00134 {
00135 m_bfr[index] = '\0';
00136 m_len = index;
00137 }
00138 }
00139
00141 char
00142 StringBuffer::operator[] (size_t ndx) const
00143 {
00144 return (ndx > m_len) ? 0 : m_bfr[ndx];
00145 }
00147
00148 StringBuffer&
00149 StringBuffer::operator += (Bool v)
00150 {
00151 return append(v.toString());
00152 }
00154 StringBuffer&
00155 StringBuffer::operator += (const CIMDateTime& arg)
00156 {
00157 return append(arg.toString());
00158 }
00160 StringBuffer&
00161 StringBuffer::operator += (const CIMObjectPath& arg)
00162 {
00163 return append(arg.toString());
00164 }
00165 #if defined(OW_WIN32)
00166 #define snprintf _snprintf // stupid windoze...
00167 #endif
00168
00169 StringBuffer&
00170 StringBuffer::operator += (UInt8 v)
00171 {
00172 char bfr[6];
00173 ::snprintf(bfr, sizeof(bfr), "%u", UInt32(v));
00174 return append(bfr);
00175 }
00177 StringBuffer&
00178 StringBuffer::operator += (Int8 v)
00179 {
00180 char bfr[6];
00181 ::snprintf(bfr, sizeof(bfr), "%d", Int32(v));
00182 return append(bfr);
00183 }
00185 StringBuffer&
00186 StringBuffer::operator += (UInt16 v)
00187 {
00188 char bfr[16];
00189 ::snprintf(bfr, sizeof(bfr), "%u", UInt32(v));
00190 return append(bfr);
00191 }
00193 StringBuffer&
00194 StringBuffer::operator += (Int16 v)
00195 {
00196 char bfr[16];
00197 ::snprintf(bfr, sizeof(bfr), "%d", Int32(v));
00198 return append(bfr);
00199 }
00201 StringBuffer&
00202 StringBuffer::operator += (UInt32 v)
00203 {
00204 char bfr[16];
00205 ::snprintf(bfr, sizeof(bfr), "%u", v);
00206 return append(bfr);
00207 }
00209 StringBuffer&
00210 StringBuffer::operator += (Int32 v)
00211 {
00212 char bfr[16];
00213 ::snprintf(bfr, sizeof(bfr), "%d", v);
00214 return append(bfr);
00215 }
00217 StringBuffer&
00218 StringBuffer::operator += (UInt64 v)
00219 {
00220 char bfr[28];
00221 #if OW_SIZEOF_LONG_INT == 8
00222 ::snprintf(bfr, sizeof(bfr), "%lu", v);
00223 #else
00224 ::snprintf(bfr, sizeof(bfr), "%llu", v);
00225 #endif
00226 return append(bfr);
00227 }
00229 StringBuffer&
00230 StringBuffer::operator += (Int64 v)
00231 {
00232 char bfr[28];
00233 #if OW_SIZEOF_LONG_INT == 8
00234 ::snprintf(bfr, sizeof(bfr), "%ld", v);
00235 #else
00236 ::snprintf(bfr, sizeof(bfr), "%lld", v);
00237 #endif
00238 return append(bfr);
00239 }
00241
00242 StringBuffer&
00243 StringBuffer::operator += (Real32 v)
00244 {
00245 char bfr[128];
00246 #if FLT_RADIX == 2
00247 #if defined(OW_REAL32_IS_FLOAT)
00248 ::snprintf(bfr, sizeof(bfr), "%.*g", FLT_MANT_DIG * 3 / 10 + 1, static_cast<double>(v));
00249 #elif defined(OW_REAL32_IS_DOUBLE)
00250 ::snprintf(bfr, sizeof(bfr), "%.*g", DBL_MANT_DIG * 3 / 10 + 1, v);
00251 #endif
00252 #else
00253 #error "The formula for computing the number of digits of precision for a floating point needs to be implmented. It's ceiling(bits * log(FLT_RADIX) / log(10))"
00254 #endif
00255 return append(bfr);
00256 }
00258 StringBuffer&
00259 StringBuffer::operator += (Real64 v)
00260 {
00261 char bfr[32];
00262 #if FLT_RADIX == 2
00263 #if defined(OW_REAL64_IS_DOUBLE)
00264 ::snprintf(bfr, sizeof(bfr), "%.*g", DBL_MANT_DIG * 3 / 10 + 1, v);
00265 #elif defined(OW_REAL64_IS_LONG_DOUBLE)
00266 ::snprintf(bfr, sizeof(bfr), "%.*Lg", LDBL_MANT_DIG * 3 / 10 + 1, v);
00267 #endif
00268 #else
00269 #error "The formula for computing the number of digits of precision for a floating point needs to be implmented. It's ceiling(bits * log(FLT_RADIX) / log(10))"
00270 #endif
00271 return append(bfr);
00272 }
00273 #if defined(OW_WIN32)
00274 #undef snprintf
00275 #endif
00276
00277 StringBuffer&
00278 StringBuffer::append(const char* str, const size_t len)
00279 {
00280 checkAvail(len+1);
00281 ::strncpy(m_bfr+m_len, str, len);
00282 m_len += len;
00283 m_bfr[m_len] = '\0';
00284 return *this;
00285 }
00287 bool
00288 StringBuffer::equals(const char* arg) const
00289 {
00290 return ::strcmp(arg, m_bfr) == 0;
00291 }
00292
00294 bool
00295 StringBuffer::equals(const StringBuffer& arg) const
00296 {
00297 return ::strcmp(arg.m_bfr, m_bfr) == 0;
00298 }
00299
00301 bool
00302 StringBuffer::endsWith(char ch) const
00303 {
00304 return (m_len && m_bfr[m_len-1] == ch);
00305 }
00306
00308 bool
00309 StringBuffer::startsWith(char ch) const
00310 {
00311 return (m_len && m_bfr[0] == ch);
00312 }
00313
00315 void
00316 StringBuffer::chop()
00317 {
00318 if (m_len)
00319 {
00320 truncate(m_len-1);
00321 }
00322 }
00323
00325 void
00326 StringBuffer::trim()
00327 {
00328 if (m_len)
00329 {
00330 while (m_len && isspace(m_bfr[m_len-1]))
00331 {
00332 m_bfr[--m_len] = 0;
00333 }
00334
00335 if (m_len)
00336 {
00337 char *p = m_bfr;
00338 while (*p && isspace(*p))
00339 {
00340 ++p;
00341 }
00342
00343 if (*p && p > m_bfr)
00344 {
00345 m_len -= (p - m_bfr);
00346 memmove(m_bfr, p, m_len+1);
00347 }
00348 }
00349 }
00350 }
00351
00353
00354
00355 const char*
00356 StringBuffer::getLine(std::istream& is, bool resetBuffer)
00357 {
00358 if (resetBuffer)
00359 {
00360 reset();
00361 }
00362
00363 if (is)
00364 {
00365 size_t count = 0;
00366 std::streambuf *sb = is.rdbuf();
00367
00368 while (1)
00369 {
00370 int ch = sb->sbumpc();
00371 if (ch == EOF)
00372 {
00373 is.setstate(count == 0
00374 ? (std::ios::failbit | std::ios::eofbit) : std::ios::eofbit);
00375 break;
00376 }
00377
00378 ++count;
00379
00380 if (ch == '\n')
00381 {
00382 break;
00383 }
00384
00385 append(static_cast<char>(ch));
00386 }
00387 }
00388
00389 const char* p = ::strchr(m_bfr, '\r');
00390 if (p)
00391 {
00392 truncate(size_t(p-m_bfr));
00393 }
00394
00395 return m_bfr;
00396 }
00397
00399 std::ostream& operator<<(std::ostream& ostr, const StringBuffer& b)
00400 {
00401 ostr.write(b.c_str(), b.length());
00402 return ostr;
00403 }
00404
00406 bool operator==(const StringBuffer& x, const StringBuffer& y)
00407 {
00408 return x.equals(y);
00409 }
00410
00412 bool operator!=(const StringBuffer& x, const StringBuffer& y)
00413 {
00414 return !(x == y);
00415 }
00416
00418 bool operator==(const StringBuffer& x, const String& y)
00419 {
00420 return x.equals(y.c_str());
00421 }
00422
00424 bool operator!=(const StringBuffer& x, const String& y)
00425 {
00426 return !(x == y);
00427 }
00428
00430 bool operator==(const String& x, const StringBuffer& y)
00431 {
00432 return x.equals(y.c_str());
00433 }
00434
00436 bool operator!=(const String& x, const StringBuffer& y)
00437 {
00438 return !(x == y);
00439 }
00440
00441 }
00442