00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSSTRING_H__
00020 #define __CS_CSSTRING_H__
00021
00022 #include <stdarg.h>
00023 #include "csutil/snprintf.h"
00024
00029 class csString
00030 {
00031 protected:
00033 char *Data;
00035 size_t Size;
00037 size_t MaxSize;
00038
00039 public:
00045 void SetCapacity (size_t NewSize);
00046
00048 void Free ();
00049
00051 csString &Truncate (size_t iLen);
00052
00054 csString &Reclaim ();
00055
00057 csString& Clear ()
00058 { return Truncate (0); }
00059
00064 char* GetData () const
00065 { return Data; }
00066
00068 size_t Length () const
00069 { return Size; }
00070
00072 bool IsEmpty () const
00073 { return (Size == 0); }
00074
00076 char& operator [] (size_t n)
00077 {
00078 CS_ASSERT (n < Size);
00079 return Data [n];
00080 }
00081
00083 char operator [] (size_t n) const
00084 {
00085 CS_ASSERT (n < Size);
00086 return Data[n];
00087 }
00088
00093 void SetAt (size_t n, const char c)
00094 {
00095 CS_ASSERT (n < Size);
00096 Data [n] = c;
00097 }
00098
00100 char GetAt (size_t n) const
00101 {
00102 CS_ASSERT (n < Size);
00103 return Data [n];
00104 }
00105
00107 csString& DeleteAt (size_t iPos, size_t iCount = 1);
00108
00110 csString& Insert (size_t iPos, const csString&);
00111
00113 csString& Insert (size_t iPos, const char);
00114
00116 csString& Overwrite (size_t iPos, const csString&);
00117
00123 csString& Append (const char*, size_t iCount = (size_t)-1);
00124
00129 csString& Append (const csString &iStr, size_t iCount = (size_t)-1);
00130
00132 csString& Append (char c)
00133 { char s[2]; s[0] = c; s[1] = '\0'; return Append(s); }
00135 csString &Append (unsigned char c)
00136 { return Append(char(c)); }
00137
00138 #define STR_APPEND(TYPE,FMT,SZ) csString& Append(TYPE n) \
00139 { char s[SZ]; cs_snprintf(s, SZ, #FMT, n); return Append(s); }
00140 STR_APPEND(short, %hd, 32)
00141 STR_APPEND(unsigned short, %hu, 32)
00142 STR_APPEND(int, %d, 32)
00143 STR_APPEND(unsigned int, %u, 32)
00144 STR_APPEND(long, %ld, 32)
00145 STR_APPEND(unsigned long, %lu, 32)
00146 STR_APPEND(float, %g, 64)
00147 STR_APPEND(double, %g, 64)
00148 #undef STR_APPEND
00149
00150 #if !defined(CS_USE_FAKE_BOOL_TYPE)
00151
00152 csString& Append (bool b) { return Append (b ? "1" : "0"); }
00153 #endif
00154
00160 csString& Replace (const csString& iStr, size_t iCount = (size_t)-1)
00161 {
00162 Size = 0;
00163 return Append (iStr, iCount);
00164 }
00165
00171 csString& Replace (const char* iStr, size_t iCount = (size_t)-1)
00172 {
00173 Size = 0;
00174 return Append (iStr, iCount);
00175 }
00176
00177 #define STR_REPLACE(TYPE) csString& Replace (TYPE s) { Size = 0; return Append(s); }
00178 STR_REPLACE(char)
00179 STR_REPLACE(unsigned char)
00180 STR_REPLACE(short)
00181 STR_REPLACE(unsigned short)
00182 STR_REPLACE(int)
00183 STR_REPLACE(unsigned int)
00184 STR_REPLACE(long)
00185 STR_REPLACE(unsigned long)
00186 STR_REPLACE(float)
00187 STR_REPLACE(double)
00188 #ifndef CS_USE_FAKE_BOOL_TYPE
00189 STR_REPLACE(bool)
00190 #endif
00191 #undef STR_REPLACE
00192
00194 bool Compare (const csString& iStr) const
00195 {
00196 if (&iStr == this)
00197 return true;
00198 size_t const n = iStr.Length();
00199 if (Size != n)
00200 return false;
00201 if (Size == 0 && n == 0)
00202 return true;
00203 return (memcmp (Data, iStr.GetData (), Size) == 0);
00204 }
00205
00207 bool Compare (const char* iStr) const
00208 { return (strcmp (Data ? Data : "", iStr) == 0); }
00209
00211 bool CompareNoCase (const csString& iStr) const
00212 {
00213 if (&iStr == this)
00214 return true;
00215 size_t const n = iStr.Length();
00216 if (Size != n)
00217 return false;
00218 if (Size == 0 && n == 0)
00219 return true;
00220 return (strncasecmp (Data, iStr.GetData (), Size) == 0);
00221 }
00222
00224 bool CompareNoCase (const char* iStr) const
00225 { return (strncasecmp (Data ? Data : "", iStr, Size) == 0); }
00226
00228 csString () : Data (NULL), Size (0), MaxSize (0) {}
00229
00231 csString (size_t iLength) : Data (NULL), Size (0), MaxSize (0)
00232 { SetCapacity (iLength); }
00233
00235 csString (const csString& copy) : Data (NULL), Size (0), MaxSize (0)
00236 { Append (copy); }
00237
00239 csString (const char* copy) : Data (NULL), Size (0), MaxSize (0)
00240 { Append (copy); }
00241
00243 csString (char c) : Data (NULL), Size (0), MaxSize (0)
00244 { Append (c); }
00245
00247 csString (unsigned char c) : Data(NULL), Size (0), MaxSize (0)
00248 { Append ((char) c); }
00249
00251 virtual ~csString ();
00252
00254 csString Clone () const
00255 { return csString (*this); }
00256
00258 csString& LTrim();
00259
00261 csString& RTrim();
00262
00264 csString& Trim();
00265
00270 csString& Collapse();
00271
00277 csString& Format(const char *format, ...) CS_GNUC_PRINTF (2, 3);
00278
00279 #define STR_FORMAT(TYPE,FMT,SZ) \
00280 static csString Format (TYPE v);
00281 STR_FORMAT(short, %hd, 32)
00282 STR_FORMAT(unsigned short, %hu, 32)
00283 STR_FORMAT(int, %d, 32)
00284 STR_FORMAT(unsigned int, %u, 32)
00285 STR_FORMAT(long, %ld, 32)
00286 STR_FORMAT(unsigned long, %lu, 32)
00287 STR_FORMAT(float, %g, 64)
00288 STR_FORMAT(double, %g, 64)
00289 #undef STR_FORMAT
00290
00291 #define STR_FORMAT_INT(TYPE,FMT) \
00292 static csString Format (TYPE v, int width, int prec=0);
00293 STR_FORMAT_INT(short, hd)
00294 STR_FORMAT_INT(unsigned short, hu)
00295 STR_FORMAT_INT(int, d)
00296 STR_FORMAT_INT(unsigned int, u)
00297 STR_FORMAT_INT(long, ld)
00298 STR_FORMAT_INT(unsigned long, lu)
00299 #undef STR_FORMAT_INT
00300
00301 #define STR_FORMAT_FLOAT(TYPE) \
00302 static csString Format (TYPE v, int width, int prec=6);
00303 STR_FORMAT_FLOAT(float)
00304 STR_FORMAT_FLOAT(double)
00305 #undef STR_FORMAT_FLOAT
00306
00308 csString& PadLeft (size_t iNewSize, char iChar=' ');
00309
00311 csString AsPadLeft (size_t iNewSize, char iChar=' ');
00312
00313
00314 #define STR_PADLEFT(TYPE) \
00315 static csString PadLeft (TYPE v, size_t iNewSize, char iChar=' ');
00316 STR_PADLEFT(const csString&)
00317 STR_PADLEFT(const char*)
00318 STR_PADLEFT(char)
00319 STR_PADLEFT(unsigned char)
00320 STR_PADLEFT(short)
00321 STR_PADLEFT(unsigned short)
00322 STR_PADLEFT(int)
00323 STR_PADLEFT(unsigned int)
00324 STR_PADLEFT(long)
00325 STR_PADLEFT(unsigned long)
00326 STR_PADLEFT(float)
00327 STR_PADLEFT(double)
00328 #if !defined(CS_USE_FAKE_BOOL_TYPE)
00329 STR_PADLEFT(bool)
00330 #endif
00331 #undef STR_PADLEFT
00332
00334 csString& PadRight (size_t iNewSize, char iChar=' ');
00335
00337 csString AsPadRight (size_t iNewSize, char iChar=' ');
00338
00339
00340 #define STR_PADRIGHT(TYPE) \
00341 static csString PadRight (TYPE v, size_t iNewSize, char iChar=' ');
00342 STR_PADRIGHT(const csString&)
00343 STR_PADRIGHT(const char*)
00344 STR_PADRIGHT(char)
00345 STR_PADRIGHT(unsigned char)
00346 STR_PADRIGHT(short)
00347 STR_PADRIGHT(unsigned short)
00348 STR_PADRIGHT(int)
00349 STR_PADRIGHT(unsigned int)
00350 STR_PADRIGHT(long)
00351 STR_PADRIGHT(unsigned long)
00352 STR_PADRIGHT(float)
00353 STR_PADRIGHT(double)
00354 #if !defined(CS_USE_FAKE_BOOL_TYPE)
00355 STR_PADRIGHT(bool)
00356 #endif
00357 #undef STR_PADRIGHT
00358
00360 csString& PadCenter (size_t iNewSize, char iChar=' ');
00361
00363 csString AsPadCenter (size_t iNewSize, char iChar=' ');
00364
00365
00366 #define STR_PADCENTER(TYPE) \
00367 static csString PadCenter (TYPE v, size_t iNewSize, char iChar=' ');
00368 STR_PADCENTER(const csString&)
00369 STR_PADCENTER(const char*)
00370 STR_PADCENTER(char)
00371 STR_PADCENTER(unsigned char)
00372 STR_PADCENTER(short)
00373 STR_PADCENTER(unsigned short)
00374 STR_PADCENTER(int)
00375 STR_PADCENTER(unsigned int)
00376 STR_PADCENTER(long)
00377 STR_PADCENTER(unsigned long)
00378 STR_PADCENTER(float)
00379 STR_PADCENTER(double)
00380 #if !defined(CS_USE_FAKE_BOOL_TYPE)
00381 STR_PADCENTER(bool)
00382 #endif
00383 #undef STR_PADCENTER
00384
00386 #define STR_ASSIGN(TYPE) const csString& operator = (TYPE s) { return Replace (s); }
00387 STR_ASSIGN(const csString&)
00388 STR_ASSIGN(const char*)
00389 STR_ASSIGN(char)
00390 STR_ASSIGN(unsigned char)
00391 STR_ASSIGN(short)
00392 STR_ASSIGN(unsigned short)
00393 STR_ASSIGN(int)
00394 STR_ASSIGN(unsigned int)
00395 STR_ASSIGN(long)
00396 STR_ASSIGN(unsigned long)
00397 STR_ASSIGN(float)
00398 STR_ASSIGN(double)
00399 #ifndef CS_USE_FAKE_BOOL_TYPE
00400 STR_ASSIGN(bool)
00401 #endif
00402 #undef STR_ASSIGN
00403
00404 #define STR_APPEND(TYPE) csString &operator += (TYPE s) { return Append (s); }
00405 STR_APPEND(const csString&)
00406 STR_APPEND(const char*)
00407 STR_APPEND(char)
00408 STR_APPEND(unsigned char)
00409 STR_APPEND(short)
00410 STR_APPEND(unsigned short)
00411 STR_APPEND(int)
00412 STR_APPEND(unsigned int)
00413 STR_APPEND(long);
00414 STR_APPEND(unsigned long)
00415 STR_APPEND(float)
00416 STR_APPEND(double)
00417 #ifndef CS_USE_FAKE_BOOL_TYPE
00418 STR_APPEND(bool)
00419 #endif
00420 #undef STR_APPEND
00421
00423 const csString& operator + (const csString &iStr) const
00424 { return Clone ().Append (iStr); }
00425
00427 operator const char* () const
00428 { return Data; }
00429
00431 bool operator == (const csString& iStr) const
00432 { return Compare (iStr); }
00433 bool operator == (const char* iStr) const
00434 { return Compare (iStr); }
00435 bool operator != (const csString& iStr) const
00436 { return !Compare (iStr); }
00437 bool operator != (const char* iStr) const
00438 { return !Compare (iStr); }
00439
00447 char* Detach ()
00448 { char *d = Data; Data = 0; Size = 0; MaxSize = 0; return d; }
00449 };
00450
00452 inline csString operator + (const char* iStr1, const csString &iStr2)
00453 {
00454 return csString (iStr1).Append (iStr2);
00455 }
00456
00458 inline csString operator + (const csString &iStr1, const char* iStr2)
00459 {
00460 return iStr1.Clone ().Append (iStr2);
00461 }
00462
00463
00464 #define STR_SHIFT(TYPE) \
00465 inline csString &operator << (csString &s, TYPE v) { return s.Append (v); }
00466 STR_SHIFT(const csString&)
00467 STR_SHIFT(const char*)
00468 STR_SHIFT(char)
00469 STR_SHIFT(unsigned char)
00470 STR_SHIFT(short)
00471 STR_SHIFT(unsigned short)
00472 STR_SHIFT(int)
00473 STR_SHIFT(unsigned int)
00474 STR_SHIFT(long);
00475 STR_SHIFT(unsigned long)
00476 STR_SHIFT(float)
00477 STR_SHIFT(double)
00478 #if !defined(CS_USE_FAKE_BOOL_TYPE)
00479 STR_SHIFT(bool)
00480 #endif
00481 #undef STR_SHIFT
00482
00483 #endif // __CS_CSSTRING_H__