00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __WVSTRING_H
00016 #define __WVSTRING_H
00017
00018 #include <string.h>
00019 #include <stdio.h>
00020 #include <stdlib.h>
00021
00022
00023
00024
00025
00026
00027 #define WVSTRING_EXTRA 5
00028
00029
00030 #define __WVS_FORM(n) WvStringParm __wvs_##n = WvFastString::null
00031 #define WVSTRING_FORMAT_DECL WvStringParm __wvs_format, \
00032 WvStringParm __wvs_a0, \
00033 __WVS_FORM( a1), __WVS_FORM( a2), __WVS_FORM( a3), \
00034 __WVS_FORM( a4), __WVS_FORM( a5), __WVS_FORM( a6), \
00035 __WVS_FORM( a7), __WVS_FORM( a8), __WVS_FORM( a9), \
00036 __WVS_FORM(a10), __WVS_FORM(a11), __WVS_FORM(a12), \
00037 __WVS_FORM(a13), __WVS_FORM(a14), __WVS_FORM(a15), \
00038 __WVS_FORM(a16), __WVS_FORM(a17), __WVS_FORM(a18), \
00039 __WVS_FORM(a19)
00040 #define WVSTRING_FORMAT_CALL __wvs_format, __wvs_a0, \
00041 __wvs_a1, __wvs_a2, __wvs_a3, __wvs_a4, __wvs_a5, \
00042 __wvs_a6, __wvs_a7, __wvs_a8, __wvs_a9, __wvs_a10, \
00043 __wvs_a11, __wvs_a12, __wvs_a13, __wvs_a14, __wvs_a15, \
00044 __wvs_a16, __wvs_a17, __wvs_a18, __wvs_a19
00045
00046 struct WvStringBuf;
00047 class WvFastString;
00048 class WvString;
00049 class QString;
00050 class QCString;
00051
00052
00053
00054
00055 typedef const WvFastString & WvStringParm;
00056
00057
00058
00059 struct WvStringBuf
00060 {
00061 size_t size;
00062 unsigned links;
00063 char data[1];
00064 };
00065
00066
00067
00068
00069 #define WVSTRINGBUF_SIZE(s) (s->data - (char *)s)
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 class WvFastString
00086 {
00087 friend class WvString;
00088
00089 protected:
00090 WvStringBuf *buf;
00091 char *str;
00092
00093
00094 static WvStringBuf nullbuf;
00095
00096 public:
00097
00098 static const WvFastString null;
00099
00100
00101
00102
00103
00104
00105
00106 WvFastString();
00107 void setsize(size_t i);
00108
00109
00110
00111
00112
00113
00114
00115 WvFastString(const WvFastString &s);
00116 WvFastString(const WvString &s);
00117
00118
00119
00120
00121
00122
00123
00124 WvFastString(const char *_str);
00125
00126
00127
00128
00129
00130 WvFastString(const QString &s);
00131 WvFastString(const QCString &s);
00132
00133
00134
00135
00136
00137 WvFastString(short i);
00138 WvFastString(unsigned short i);
00139 WvFastString(int i);
00140 WvFastString(unsigned int i);
00141 WvFastString(long i);
00142 WvFastString(unsigned long i);
00143 WvFastString(long long i);
00144 WvFastString(unsigned long long i);
00145 WvFastString(double i);
00146
00147
00148 static void do_format(WvFastString &output, const char *format,
00149 const WvFastString * const *a);
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 WvFastString(WVSTRING_FORMAT_DECL)
00169 {
00170 const WvFastString *x[20];
00171
00172 if (&__wvs_a0 != &null) x[ 0] = &__wvs_a0;
00173 if (&__wvs_a1 != &null) x[ 1] = &__wvs_a1;
00174 if (&__wvs_a2 != &null) x[ 2] = &__wvs_a2;
00175 if (&__wvs_a3 != &null) x[ 3] = &__wvs_a3;
00176 if (&__wvs_a4 != &null) x[ 4] = &__wvs_a4;
00177 if (&__wvs_a5 != &null) x[ 5] = &__wvs_a5;
00178 if (&__wvs_a6 != &null) x[ 6] = &__wvs_a6;
00179 if (&__wvs_a7 != &null) x[ 7] = &__wvs_a7;
00180 if (&__wvs_a8 != &null) x[ 8] = &__wvs_a8;
00181 if (&__wvs_a9 != &null) x[ 9] = &__wvs_a9;
00182 if (&__wvs_a10 != &null) x[10] = &__wvs_a10;
00183 if (&__wvs_a11 != &null) x[11] = &__wvs_a11;
00184 if (&__wvs_a12 != &null) x[12] = &__wvs_a12;
00185 if (&__wvs_a13 != &null) x[13] = &__wvs_a13;
00186 if (&__wvs_a14 != &null) x[14] = &__wvs_a14;
00187 if (&__wvs_a15 != &null) x[15] = &__wvs_a15;
00188 if (&__wvs_a16 != &null) x[16] = &__wvs_a16;
00189 if (&__wvs_a17 != &null) x[17] = &__wvs_a17;
00190 if (&__wvs_a18 != &null) x[18] = &__wvs_a18;
00191 if (&__wvs_a19 != &null) x[19] = &__wvs_a19;
00192
00193 link(&nullbuf, NULL);
00194 do_format(*this, __wvs_format.str, x);
00195 }
00196
00197 ~WvFastString();
00198
00199
00200
00201
00202 size_t len() const;
00203
00204 protected:
00205
00206
00207 WvFastString &operator= (const WvFastString &s2);
00208
00209
00210 void link(WvStringBuf *_buf, const char *_str);
00211 void unlink();
00212
00213
00214
00215 WvStringBuf *alloc(size_t size);
00216 void newbuf(size_t size);
00217
00218 public:
00219
00220 bool operator== (WvStringParm s2) const;
00221 bool operator!= (WvStringParm s2) const;
00222 bool operator< (WvStringParm s2) const;
00223 bool operator== (const char *s2) const;
00224 bool operator!= (const char *s2) const;
00225 bool operator< (const char *s2) const;
00226
00227
00228 bool operator! () const;
00229
00230
00231 const char *operator+ (int i) const
00232 { return str + i; }
00233 const char *operator- (int i) const
00234 { return str - i; }
00235
00236
00237 operator const char*() const
00238 { return str; }
00239
00240
00241
00242
00243
00244
00245 const char *cstr() const
00246 { return str; }
00247
00248
00249
00250
00251
00252 operator QString() const;
00253
00254
00255
00256
00257
00258 int num() const
00259 { return str ? atoi(str) : 0; }
00260
00261
00262 bool isnull() const
00263 { return str == NULL; }
00264 };
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 class WvString : public WvFastString
00298 {
00299 public:
00300
00301 static const WvString empty;
00302
00303 WvString() {}
00304 WvString(short i) : WvFastString(i) { }
00305 WvString(unsigned short i) : WvFastString(i) { }
00306 WvString(int i) : WvFastString(i) { }
00307 WvString(unsigned int i) : WvFastString(i) { }
00308 WvString(long i) : WvFastString(i) { }
00309 WvString(unsigned long i) : WvFastString(i) { }
00310 WvString(long long i) : WvFastString(i) { }
00311 WvString(unsigned long long i) : WvFastString(i) { }
00312 WvString(double i) : WvFastString(i) { }
00313
00314
00315
00316
00317
00318
00319
00320 WvString(const WvString &s)
00321 { copy_constructor(s); }
00322 WvString(const WvFastString &s)
00323 { copy_constructor(s); }
00324
00325
00326
00327
00328
00329
00330
00331 WvString(const char *_str);
00332
00333
00334
00335
00336
00337 WvString(const QString &);
00338 WvString(const QCString &);
00339
00340 WvString(WVSTRING_FORMAT_DECL) : WvFastString(WVSTRING_FORMAT_CALL)
00341 { }
00342
00343 WvString &append(WvStringParm s);
00344 WvString &append(WVSTRING_FORMAT_DECL)
00345 { return append(WvString(WVSTRING_FORMAT_CALL)); }
00346
00347 WvString &operator= (int i);
00348 WvString &operator= (const WvFastString &s2);
00349 WvString &operator= (const char *s2)
00350 { return *this = WvFastString(s2); }
00351
00352
00353 WvString &unique();
00354
00355
00356 char *edit()
00357 { return unique().str; }
00358
00359 protected:
00360 void copy_constructor(const WvFastString &s);
00361
00362 };
00363
00364
00365 inline bool operator== (const char *s1, WvStringParm s2)
00366 {
00367 return s2 == s1;
00368 }
00369
00370
00371 inline bool operator!= (const char *s1, WvStringParm s2)
00372 {
00373 return s2 != s1;
00374 }
00375
00376 #endif // __WVSTRING_H