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