00001 #ifndef __STRING_HPP__
00002 #define __STRING_HPP__
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 #include "arch.h"
00031
00032
00033
00034
00035 #ifdef __CC_GNUC__NOT_DEFINED
00036
00037 #include <string>
00038 #else // #include "gstring.hpp"
00039
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #ifndef __GSTRING_HPP__
00066 #ifdef __GNUG__
00067
00068 #endif
00069 #define __GSTRING_HPP__ 1
00070
00071 #include <iostream.h>
00072
00073 struct StrRep
00074 {
00075 unsigned short len;
00076 unsigned short sz;
00077 char s[1];
00078
00079
00080 };
00081
00082
00083
00084 StrRep* Salloc(StrRep*, const char*, int, int);
00085 StrRep* Scopy(StrRep*, const StrRep*);
00086 StrRep* Scat(StrRep*, const char*, int, const char*, int);
00087 StrRep* Scat(StrRep*, const char*, int,const char*,int, const char*,int);
00088 StrRep* Sprepend(StrRep*, const char*, int);
00089 StrRep* Sreverse(const StrRep*, StrRep*);
00090 StrRep* Supcase(const StrRep*, StrRep*);
00091 StrRep* Sdowncase(const StrRep*, StrRep*);
00092 StrRep* Scapitalize(const StrRep*, StrRep*);
00093
00094
00095
00096 class String;
00097 class SubString;
00098
00099 class SubString
00100 {
00101 friend class String;
00102 protected:
00103
00104 String& S;
00105 unsigned short pos;
00106 unsigned short len;
00107
00108 void assign(const StrRep*, const char*, int = -1);
00109 SubString(String& x, int p, int l);
00110 SubString(const SubString& x);
00111
00112 public:
00113
00114
00115
00116
00117 ~SubString();
00118
00119 SubString& operator = (const String& y);
00120 SubString& operator = (const SubString& y);
00121 SubString& operator = (const char* t);
00122 SubString& operator = (char c);
00123
00124
00125
00126 int contains(char c) const;
00127 int contains(const String& y) const;
00128 int contains(const SubString& y) const;
00129 int contains(const char* t) const;
00130
00131
00132
00133
00134
00135 friend ostream& operator<<(ostream& s, const SubString& x);
00136
00137
00138
00139 unsigned int length() const;
00140 int empty() const;
00141 const char* chars() const;
00142
00143 int OK() const;
00144
00145 };
00146
00147
00148 class String
00149 {
00150 friend class SubString;
00151
00152 protected:
00153 StrRep* rep;
00154
00155
00156
00157 int search(int, int, const char*, int = -1) const;
00158 int search(int, int, char) const;
00159 int match(int, int, int, const char*, int = -1) const;
00160 int _gsub(const char*, int, const char* ,int);
00161 SubString _substr(int, int);
00162
00163 public:
00164
00165
00166
00167 String();
00168 String(const String& x);
00169 String(const SubString& x);
00170 String(const char* t);
00171 String(const char* t, int len);
00172 String(char c);
00173
00174 ~String();
00175
00176 String& operator = (const String& y);
00177 String& operator = (const char* y);
00178 String& operator = (char c);
00179 String& operator = (const SubString& y);
00180
00181
00182
00183 String& operator += (const String& y);
00184 String& operator += (const SubString& y);
00185 String& operator += (const char* t);
00186 String& operator += (char c);
00187
00188 void prepend(const String& y);
00189 void prepend(const SubString& y);
00190 void prepend(const char* t);
00191 void prepend(char c);
00192
00193
00194
00195
00196
00197 friend void cat(const String&, const String&, String&);
00198 friend void cat(const String&, const SubString&, String&);
00199 friend void cat(const String&, const char*, String&);
00200 friend void cat(const String&, char, String&);
00201
00202 friend void cat(const SubString&, const String&, String&);
00203 friend void cat(const SubString&, const SubString&, String&);
00204 friend void cat(const SubString&, const char*, String&);
00205 friend void cat(const SubString&, char, String&);
00206
00207 friend void cat(const char*, const String&, String&);
00208 friend void cat(const char*, const SubString&, String&);
00209 friend void cat(const char*, const char*, String&);
00210 friend void cat(const char*, char, String&);
00211
00212
00213
00214
00215
00216 friend void cat(const String&,const String&, const String&,String&);
00217 friend void cat(const String&,const String&,const SubString&,String&);
00218 friend void cat(const String&,const String&, const char*, String&);
00219 friend void cat(const String&,const String&, char, String&);
00220 friend void cat(const String&,const SubString&,const String&,String&);
00221 friend void cat(const String&,const SubString&,const SubString&,String&);
00222 friend void cat(const String&,const SubString&, const char*, String&);
00223 friend void cat(const String&,const SubString&, char, String&);
00224 friend void cat(const String&,const char*, const String&, String&);
00225 friend void cat(const String&,const char*, const SubString&, String&);
00226 friend void cat(const String&,const char*, const char*, String&);
00227 friend void cat(const String&,const char*, char, String&);
00228
00229 friend void cat(const char*, const String&, const String&,String&);
00230 friend void cat(const char*,const String&,const SubString&,String&);
00231 friend void cat(const char*,const String&, const char*, String&);
00232 friend void cat(const char*,const String&, char, String&);
00233 friend void cat(const char*,const SubString&,const String&,String&);
00234 friend void cat(const char*,const SubString&,const SubString&,String&);
00235 friend void cat(const char*,const SubString&, const char*, String&);
00236 friend void cat(const char*,const SubString&, char, String&);
00237 friend void cat(const char*,const char*, const String&, String&);
00238 friend void cat(const char*,const char*, const SubString&, String&);
00239 friend void cat(const char*,const char*, const char*, String&);
00240 friend void cat(const char*,const char*, char, String&);
00241
00242
00243
00244
00245
00246
00247 int index(char c, int startpos = 0) const;
00248 int index(const String& y, int startpos = 0) const;
00249 int index(const SubString& y, int startpos = 0) const;
00250 int index(const char* t, int startpos = 0) const;
00251
00252
00253
00254 int contains(char c) const;
00255 int contains(const String& y) const;
00256 int contains(const SubString& y) const;
00257 int contains(const char* t) const;
00258
00259
00260
00261
00262 int contains(char c, int pos) const;
00263 int contains(const String& y, int pos) const;
00264 int contains(const SubString& y, int pos) const;
00265 int contains(const char* t, int pos) const;
00266
00267
00268
00269 int matches(char c, int pos = 0) const;
00270 int matches(const String& y, int pos = 0) const;
00271 int matches(const SubString& y, int pos = 0) const;
00272 int matches(const char* t, int pos = 0) const;
00273
00274
00275
00276 int freq(char c) const;
00277 int freq(const String& y) const;
00278 int freq(const SubString& y) const;
00279 int freq(const char* t) const;
00280
00281
00282
00283
00284
00285
00286
00287 SubString at(int pos, int len);
00288 SubString operator () (int pos, int len);
00289
00290 SubString at(const String& x, int startpos = 0);
00291 SubString at(const SubString& x, int startpos = 0);
00292 SubString at(const char* t, int startpos = 0);
00293 SubString at(char c, int startpos = 0);
00294
00295 SubString before(int pos);
00296 SubString before(const String& x, int startpos = 0);
00297 SubString before(const SubString& x, int startpos = 0);
00298 SubString before(const char* t, int startpos = 0);
00299 SubString before(char c, int startpos = 0);
00300
00301 SubString through(int pos);
00302 SubString through(const String& x, int startpos = 0);
00303 SubString through(const SubString& x, int startpos = 0);
00304 SubString through(const char* t, int startpos = 0);
00305 SubString through(char c, int startpos = 0);
00306
00307 SubString from(int pos);
00308 SubString from(const String& x, int startpos = 0);
00309 SubString from(const SubString& x, int startpos = 0);
00310 SubString from(const char* t, int startpos = 0);
00311 SubString from(char c, int startpos = 0);
00312
00313 SubString after(int pos);
00314 SubString after(const String& x, int startpos = 0);
00315 SubString after(const SubString& x, int startpos = 0);
00316 SubString after(const char* t, int startpos = 0);
00317 SubString after(char c, int startpos = 0);
00318
00319
00320
00321
00322
00323 void del(int pos, int len);
00324
00325
00326
00327 void del(const String& y, int startpos = 0);
00328 void del(const SubString& y, int startpos = 0);
00329 void del(const char* t, int startpos = 0);
00330 void del(char c, int startpos = 0);
00331
00332
00333
00334 int gsub(const String& pat, const String& repl);
00335 int gsub(const SubString& pat, const String& repl);
00336 int gsub(const char* pat, const String& repl);
00337 int gsub(const char* pat, const char* repl);
00338
00339
00340
00341
00342
00343 friend int split(const String& x, String res[], int maxn,
00344 const String& sep);
00345
00346 friend String common_prefix(const String& x, const String& y,
00347 int startpos = 0);
00348 friend String common_suffix(const String& x, const String& y,
00349 int startpos = -1);
00350 friend String replicate(char c, int n);
00351 friend String replicate(const String& y, int n);
00352 friend String join(String src[], int n, const String& sep);
00353
00354
00355
00356 friend String reverse(const String& x);
00357 friend String upcase(const String& x);
00358 friend String downcase(const String& x);
00359 friend String capitalize(const String& x);
00360
00361
00362
00363 void reverse();
00364 void upcase();
00365 void downcase();
00366 void capitalize();
00367
00368
00369
00370 char& operator [] (int i);
00371 const char& operator [] (int i) const;
00372 char elem(int i) const;
00373 char firstchar() const;
00374 char lastchar() const;
00375
00376
00377
00378 operator const char*() const;
00379 const char* chars() const;
00380
00381
00382
00383
00384 friend ostream& operator<<(ostream& s, const String& x);
00385 friend ostream& operator<<(ostream& s, const SubString& x);
00386 friend istream& operator>>(istream& s, String& x);
00387
00388 friend int readline(istream& s, String& x,
00389 char terminator = '\n',
00390 int discard_terminator = 1);
00391
00392
00393
00394 unsigned int length() const;
00395 int empty() const;
00396
00397
00398 void alloc(int newsize);
00399
00400
00401
00402 int allocation() const;
00403
00404
00405 void error(const char* msg) const;
00406
00407 int OK() const;
00408 };
00409
00410 typedef String StrTmp;
00411
00412
00413
00414 int compare(const String& x, const String& y);
00415 int compare(const String& x, const SubString& y);
00416 int compare(const String& x, const char* y);
00417 int compare(const SubString& x, const String& y);
00418 int compare(const SubString& x, const SubString& y);
00419 int compare(const SubString& x, const char* y);
00420 int fcompare(const String& x, const String& y);
00421
00422 extern StrRep _nilStrRep;
00423 extern String _nilString;
00424
00425
00426
00427 inline unsigned int String::length() const { return rep->len; }
00428 inline int String::empty() const { return rep->len == 0; }
00429 inline const char* String::chars() const { return &(rep->s[0]); }
00430 inline int String::allocation() const { return rep->sz; }
00431
00432 inline unsigned int SubString::length() const { return len; }
00433 inline int SubString::empty() const { return len == 0; }
00434 inline const char* SubString::chars() const { return &(S.rep->s[pos]); }
00435
00436
00437
00438
00439 inline String::String()
00440 : rep(&_nilStrRep) {}
00441 inline String::String(const String& x)
00442 : rep(Scopy(0, x.rep)) {}
00443 inline String::String(const char* t)
00444 : rep(Salloc(0, t, -1, -1)) {}
00445 inline String::String(const char* t, int tlen)
00446 : rep(Salloc(0, t, tlen, tlen)) {}
00447 inline String::String(const SubString& y)
00448 : rep(Salloc(0, y.chars(), y.length(), y.length())) {}
00449 inline String::String(char c)
00450 : rep(Salloc(0, &c, 1, 1)) {}
00451
00452 inline String::~String() { if (rep != &_nilStrRep) delete rep; }
00453
00454 inline SubString::SubString(const SubString& x)
00455 :S(x.S), pos(x.pos), len(x.len) {}
00456 inline SubString::SubString(String& x, int first, int l)
00457 :S(x), pos(first), len(l) {}
00458
00459 inline SubString::~SubString() {}
00460
00461
00462
00463 inline String& String::operator = (const String& y)
00464 {
00465 rep = Scopy(rep, y.rep);
00466 return *this;
00467 }
00468
00469 inline String& String::operator=(const char* t)
00470 {
00471 rep = Salloc(rep, t, -1, -1);
00472 return *this;
00473 }
00474
00475 inline String& String::operator=(const SubString& y)
00476 {
00477 rep = Salloc(rep, y.chars(), y.length(), y.length());
00478 return *this;
00479 }
00480
00481 inline String& String::operator=(char c)
00482 {
00483 rep = Salloc(rep, &c, 1, 1);
00484 return *this;
00485 }
00486
00487
00488 inline SubString& SubString::operator = (const char* ys)
00489 {
00490 assign(0, ys);
00491 return *this;
00492 }
00493
00494 inline SubString& SubString::operator = (char ch)
00495 {
00496 assign(0, &ch, 1);
00497 return *this;
00498 }
00499
00500 inline SubString& SubString::operator = (const String& y)
00501 {
00502 assign(y.rep, y.chars(), y.length());
00503 return *this;
00504 }
00505
00506 inline SubString& SubString::operator = (const SubString& y)
00507 {
00508 assign(y.S.rep, y.chars(), y.length());
00509 return *this;
00510 }
00511
00512
00513
00514 inline void cat(const String& x, const String& y, String& r)
00515 {
00516 r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length());
00517 }
00518
00519 inline void cat(const String& x, const SubString& y, String& r)
00520 {
00521 r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length());
00522 }
00523
00524 inline void cat(const String& x, const char* y, String& r)
00525 {
00526 r.rep = Scat(r.rep, x.chars(), x.length(), y, -1);
00527 }
00528
00529 inline void cat(const String& x, char y, String& r)
00530 {
00531 r.rep = Scat(r.rep, x.chars(), x.length(), &y, 1);
00532 }
00533
00534 inline void cat(const SubString& x, const String& y, String& r)
00535 {
00536 r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length());
00537 }
00538
00539 inline void cat(const SubString& x, const SubString& y, String& r)
00540 {
00541 r.rep = Scat(r.rep, x.chars(), x.length(), y.chars(), y.length());
00542 }
00543
00544 inline void cat(const SubString& x, const char* y, String& r)
00545 {
00546 r.rep = Scat(r.rep, x.chars(), x.length(), y, -1);
00547 }
00548
00549 inline void cat(const SubString& x, char y, String& r)
00550 {
00551 r.rep = Scat(r.rep, x.chars(), x.length(), &y, 1);
00552 }
00553
00554 inline void cat(const char* x, const String& y, String& r)
00555 {
00556 r.rep = Scat(r.rep, x, -1, y.chars(), y.length());
00557 }
00558
00559 inline void cat(const char* x, const SubString& y, String& r)
00560 {
00561 r.rep = Scat(r.rep, x, -1, y.chars(), y.length());
00562 }
00563
00564 inline void cat(const char* x, const char* y, String& r)
00565 {
00566 r.rep = Scat(r.rep, x, -1, y, -1);
00567 }
00568
00569 inline void cat(const char* x, char y, String& r)
00570 {
00571 r.rep = Scat(r.rep, x, -1, &y, 1);
00572 }
00573
00574 inline void cat(const String& a, const String& x, const String& y, String& r)
00575 {
00576 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length());
00577 }
00578
00579 inline void cat(const String& a, const String& x, const SubString& y, String& r)
00580 {
00581 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length());
00582 }
00583
00584 inline void cat(const String& a, const String& x, const char* y, String& r)
00585 {
00586 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y, -1);
00587 }
00588
00589 inline void cat(const String& a, const String& x, char y, String& r)
00590 {
00591 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), &y, 1);
00592 }
00593
00594 inline void cat(const String& a, const SubString& x, const String& y, String& r)
00595 {
00596 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length());
00597 }
00598
00599 inline void cat(const String& a, const SubString& x, const SubString& y, String& r)
00600 {
00601 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y.chars(), y.length());
00602 }
00603
00604 inline void cat(const String& a, const SubString& x, const char* y, String& r)
00605 {
00606 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), y, -1);
00607 }
00608
00609 inline void cat(const String& a, const SubString& x, char y, String& r)
00610 {
00611 r.rep = Scat(r.rep, a.chars(), a.length(), x.chars(), x.length(), &y, 1);
00612 }
00613
00614 inline void cat(const String& a, const char* x, const String& y, String& r)
00615 {
00616 r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y.chars(), y.length());
00617 }
00618
00619 inline void cat(const String& a, const char* x, const SubString& y, String& r)
00620 {
00621 r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y.chars(), y.length());
00622 }
00623
00624 inline void cat(const String& a, const char* x, const char* y, String& r)
00625 {
00626 r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, y, -1);
00627 }
00628
00629 inline void cat(const String& a, const char* x, char y, String& r)
00630 {
00631 r.rep = Scat(r.rep, a.chars(), a.length(), x, -1, &y, 1);
00632 }
00633
00634
00635 inline void cat(const char* a, const String& x, const String& y, String& r)
00636 {
00637 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length());
00638 }
00639
00640 inline void cat(const char* a, const String& x, const SubString& y, String& r)
00641 {
00642 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length());
00643 }
00644
00645 inline void cat(const char* a, const String& x, const char* y, String& r)
00646 {
00647 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y, -1);
00648 }
00649
00650 inline void cat(const char* a, const String& x, char y, String& r)
00651 {
00652 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), &y, 1);
00653 }
00654
00655 inline void cat(const char* a, const SubString& x, const String& y, String& r)
00656 {
00657 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length());
00658 }
00659
00660 inline void cat(const char* a, const SubString& x, const SubString& y, String& r)
00661 {
00662 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y.chars(), y.length());
00663 }
00664
00665 inline void cat(const char* a, const SubString& x, const char* y, String& r)
00666 {
00667 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), y, -1);
00668 }
00669
00670 inline void cat(const char* a, const SubString& x, char y, String& r)
00671 {
00672 r.rep = Scat(r.rep, a, -1, x.chars(), x.length(), &y, 1);
00673 }
00674
00675 inline void cat(const char* a, const char* x, const String& y, String& r)
00676 {
00677 r.rep = Scat(r.rep, a, -1, x, -1, y.chars(), y.length());
00678 }
00679
00680 inline void cat(const char* a, const char* x, const SubString& y, String& r)
00681 {
00682 r.rep = Scat(r.rep, a, -1, x, -1, y.chars(), y.length());
00683 }
00684
00685 inline void cat(const char* a, const char* x, const char* y, String& r)
00686 {
00687 r.rep = Scat(r.rep, a, -1, x, -1, y, -1);
00688 }
00689
00690 inline void cat(const char* a, const char* x, char y, String& r)
00691 {
00692 r.rep = Scat(r.rep, a, -1, x, -1, &y, 1);
00693 }
00694
00695
00696
00697
00698 inline String& String::operator +=(const String& y)
00699 {
00700 cat(*this, y, *this);
00701 return *this;
00702 }
00703
00704 inline String& String::operator +=(const SubString& y)
00705 {
00706 cat(*this, y, *this);
00707 return *this;
00708 }
00709
00710 inline String& String::operator += (const char* y)
00711 {
00712 cat(*this, y, *this);
00713 return *this;
00714 }
00715
00716 inline String& String:: operator +=(char y)
00717 {
00718 cat(*this, y, *this);
00719 return *this;
00720 }
00721
00722
00723
00724 #if defined(__GNUG__) && !defined(_G_NO_NRV)
00725
00726 inline String operator + (const String& x, const String& y) return r;
00727 {
00728 cat(x, y, r);
00729 }
00730
00731 inline String operator + (const String& x, const SubString& y) return r;
00732 {
00733 cat(x, y, r);
00734 }
00735
00736 inline String operator + (const String& x, const char* y) return r;
00737 {
00738 cat(x, y, r);
00739 }
00740
00741 inline String operator + (const String& x, char y) return r;
00742 {
00743 cat(x, y, r);
00744 }
00745
00746 inline String operator + (const SubString& x, const String& y) return r;
00747 {
00748 cat(x, y, r);
00749 }
00750
00751 inline String operator + (const SubString& x, const SubString& y) return r;
00752 {
00753 cat(x, y, r);
00754 }
00755
00756 inline String operator + (const SubString& x, const char* y) return r;
00757 {
00758 cat(x, y, r);
00759 }
00760
00761 inline String operator + (const SubString& x, char y) return r;
00762 {
00763 cat(x, y, r);
00764 }
00765
00766 inline String operator + (const char* x, const String& y) return r;
00767 {
00768 cat(x, y, r);
00769 }
00770
00771 inline String operator + (const char* x, const SubString& y) return r;
00772 {
00773 cat(x, y, r);
00774 }
00775
00776 inline String reverse(const String& x) return r;
00777 {
00778 r.rep = Sreverse(x.rep, r.rep);
00779 }
00780
00781 inline String upcase(const String& x) return r;
00782 {
00783 r.rep = Supcase(x.rep, r.rep);
00784 }
00785
00786 inline String downcase(const String& x) return r;
00787 {
00788 r.rep = Sdowncase(x.rep, r.rep);
00789 }
00790
00791 inline String capitalize(const String& x) return r;
00792 {
00793 r.rep = Scapitalize(x.rep, r.rep);
00794 }
00795
00796 #else
00797
00798 inline String operator + (const String& x, const String& y)
00799 {
00800 String r; cat(x, y, r); return r;
00801 }
00802
00803 inline String operator + (const String& x, const SubString& y)
00804 {
00805 String r; cat(x, y, r); return r;
00806 }
00807
00808 inline String operator + (const String& x, const char* y)
00809 {
00810 String r; cat(x, y, r); return r;
00811 }
00812
00813 inline String operator + (const String& x, char y)
00814 {
00815 String r; cat(x, y, r); return r;
00816 }
00817
00818 inline String operator + (const SubString& x, const String& y)
00819 {
00820 String r; cat(x, y, r); return r;
00821 }
00822
00823 inline String operator + (const SubString& x, const SubString& y)
00824 {
00825 String r; cat(x, y, r); return r;
00826 }
00827
00828 inline String operator + (const SubString& x, const char* y)
00829 {
00830 String r; cat(x, y, r); return r;
00831 }
00832
00833 inline String operator + (const SubString& x, char y)
00834 {
00835 String r; cat(x, y, r); return r;
00836 }
00837
00838 inline String operator + (const char* x, const String& y)
00839 {
00840 String r; cat(x, y, r); return r;
00841 }
00842
00843 inline String operator + (const char* x, const SubString& y)
00844 {
00845 String r; cat(x, y, r); return r;
00846 }
00847
00848 inline String reverse(const String& x)
00849 {
00850 String r; r.rep = Sreverse(x.rep, r.rep); return r;
00851 }
00852
00853 inline String upcase(const String& x)
00854 {
00855 String r; r.rep = Supcase(x.rep, r.rep); return r;
00856 }
00857
00858 inline String downcase(const String& x)
00859 {
00860 String r; r.rep = Sdowncase(x.rep, r.rep); return r;
00861 }
00862
00863 inline String capitalize(const String& x)
00864 {
00865 String r; r.rep = Scapitalize(x.rep, r.rep); return r;
00866 }
00867
00868 #endif
00869
00870
00871
00872 inline void String::prepend(const String& y)
00873 {
00874 rep = Sprepend(rep, y.chars(), y.length());
00875 }
00876
00877 inline void String::prepend(const char* y)
00878 {
00879 rep = Sprepend(rep, y, -1);
00880 }
00881
00882 inline void String::prepend(char y)
00883 {
00884 rep = Sprepend(rep, &y, 1);
00885 }
00886
00887 inline void String::prepend(const SubString& y)
00888 {
00889 rep = Sprepend(rep, y.chars(), y.length());
00890 }
00891
00892
00893
00894
00895 inline void String::reverse()
00896 {
00897 rep = Sreverse(rep, rep);
00898 }
00899
00900
00901 inline void String::upcase()
00902 {
00903 rep = Supcase(rep, rep);
00904 }
00905
00906
00907 inline void String::downcase()
00908 {
00909 rep = Sdowncase(rep, rep);
00910 }
00911
00912
00913 inline void String::capitalize()
00914 {
00915 rep = Scapitalize(rep, rep);
00916 }
00917
00918
00919
00920 inline char& String::operator [] (int i)
00921 {
00922 if (((unsigned)i) >= length()) error("invalid index");
00923 return rep->s[i];
00924 }
00925
00926 inline const char& String::operator [] (int i) const
00927 {
00928 if (((unsigned)i) >= length()) error("invalid index");
00929 return rep->s[i];
00930 }
00931
00932 inline char String::elem (int i) const
00933 {
00934 if (((unsigned)i) >= length()) error("invalid index");
00935 return rep->s[i];
00936 }
00937
00938 inline char String::firstchar() const
00939 {
00940 return elem(0);
00941 }
00942
00943 inline char String::lastchar() const
00944 {
00945 return elem(length() - 1);
00946 }
00947
00948
00949
00950 inline int String::index(char c, int startpos) const
00951 {
00952 return search(startpos, length(), c);
00953 }
00954
00955 inline int String::index(const char* t, int startpos) const
00956 {
00957 return search(startpos, length(), t);
00958 }
00959
00960 inline int String::index(const String& y, int startpos) const
00961 {
00962 return search(startpos, length(), y.chars(), y.length());
00963 }
00964
00965 inline int String::index(const SubString& y, int startpos) const
00966 {
00967 return search(startpos, length(), y.chars(), y.length());
00968 }
00969
00970 inline int String::contains(char c) const
00971 {
00972 return search(0, length(), c) >= 0;
00973 }
00974
00975 inline int String::contains(const char* t) const
00976 {
00977 return search(0, length(), t) >= 0;
00978 }
00979
00980 inline int String::contains(const String& y) const
00981 {
00982 return search(0, length(), y.chars(), y.length()) >= 0;
00983 }
00984
00985 inline int String::contains(const SubString& y) const
00986 {
00987 return search(0, length(), y.chars(), y.length()) >= 0;
00988 }
00989
00990 inline int String::contains(char c, int p) const
00991 {
00992 return match(p, length(), 0, &c, 1) >= 0;
00993 }
00994
00995 inline int String::contains(const char* t, int p) const
00996 {
00997 return match(p, length(), 0, t) >= 0;
00998 }
00999
01000 inline int String::contains(const String& y, int p) const
01001 {
01002 return match(p, length(), 0, y.chars(), y.length()) >= 0;
01003 }
01004
01005 inline int String::contains(const SubString& y, int p) const
01006 {
01007 return match(p, length(), 0, y.chars(), y.length()) >= 0;
01008 }
01009
01010 inline int String::matches(const SubString& y, int p) const
01011 {
01012 return match(p, length(), 1, y.chars(), y.length()) >= 0;
01013 }
01014
01015 inline int String::matches(const String& y, int p) const
01016 {
01017 return match(p, length(), 1, y.chars(), y.length()) >= 0;
01018 }
01019
01020 inline int String::matches(const char* t, int p) const
01021 {
01022 return match(p, length(), 1, t) >= 0;
01023 }
01024
01025 inline int String::matches(char c, int p) const
01026 {
01027 return match(p, length(), 1, &c, 1) >= 0;
01028 }
01029
01030 inline int SubString::contains(const char* t) const
01031 {
01032 return S.search(pos, pos+len, t) >= 0;
01033 }
01034
01035 inline int SubString::contains(const String& y) const
01036 {
01037 return S.search(pos, pos+len, y.chars(), y.length()) >= 0;
01038 }
01039
01040 inline int SubString::contains(const SubString& y) const
01041 {
01042 return S.search(pos, pos+len, y.chars(), y.length()) >= 0;
01043 }
01044
01045 inline int SubString::contains(char c) const
01046 {
01047 return S.search(pos, pos+len, c) >= 0;
01048 }
01049
01050 inline int String::gsub(const String& pat, const String& r)
01051 {
01052 return _gsub(pat.chars(), pat.length(), r.chars(), r.length());
01053 }
01054
01055 inline int String::gsub(const SubString& pat, const String& r)
01056 {
01057 return _gsub(pat.chars(), pat.length(), r.chars(), r.length());
01058 }
01059
01060 inline int String::gsub(const char* pat, const String& r)
01061 {
01062 return _gsub(pat, -1, r.chars(), r.length());
01063 }
01064
01065 inline int String::gsub(const char* pat, const char* r)
01066 {
01067 return _gsub(pat, -1, r, -1);
01068 }
01069
01070
01071
01072 inline ostream& operator<<(ostream& s, const String& x)
01073 {
01074 s << x.chars(); return s;
01075 }
01076
01077
01078
01079 inline int operator==(const String& x, const String& y)
01080 {
01081 return compare(x, y) == 0;
01082 }
01083
01084 inline int operator!=(const String& x, const String& y)
01085 {
01086 return compare(x, y) != 0;
01087 }
01088
01089 inline int operator>(const String& x, const String& y)
01090 {
01091 return compare(x, y) > 0;
01092 }
01093
01094 inline int operator>=(const String& x, const String& y)
01095 {
01096 return compare(x, y) >= 0;
01097 }
01098
01099 inline int operator<(const String& x, const String& y)
01100 {
01101 return compare(x, y) < 0;
01102 }
01103
01104 inline int operator<=(const String& x, const String& y)
01105 {
01106 return compare(x, y) <= 0;
01107 }
01108
01109 inline int operator==(const String& x, const SubString& y)
01110 {
01111 return compare(x, y) == 0;
01112 }
01113
01114 inline int operator!=(const String& x, const SubString& y)
01115 {
01116 return compare(x, y) != 0;
01117 }
01118
01119 inline int operator>(const String& x, const SubString& y)
01120 {
01121 return compare(x, y) > 0;
01122 }
01123
01124 inline int operator>=(const String& x, const SubString& y)
01125 {
01126 return compare(x, y) >= 0;
01127 }
01128
01129 inline int operator<(const String& x, const SubString& y)
01130 {
01131 return compare(x, y) < 0;
01132 }
01133
01134 inline int operator<=(const String& x, const SubString& y)
01135 {
01136 return compare(x, y) <= 0;
01137 }
01138
01139 inline int operator==(const String& x, const char* t)
01140 {
01141 return compare(x, t) == 0;
01142 }
01143
01144 inline int operator!=(const String& x, const char* t)
01145 {
01146 return compare(x, t) != 0;
01147 }
01148
01149 inline int operator>(const String& x, const char* t)
01150 {
01151 return compare(x, t) > 0;
01152 }
01153
01154 inline int operator>=(const String& x, const char* t)
01155 {
01156 return compare(x, t) >= 0;
01157 }
01158
01159 inline int operator<(const String& x, const char* t)
01160 {
01161 return compare(x, t) < 0;
01162 }
01163
01164 inline int operator<=(const String& x, const char* t)
01165 {
01166 return compare(x, t) <= 0;
01167 }
01168
01169 inline int operator==(const SubString& x, const String& y)
01170 {
01171 return compare(y, x) == 0;
01172 }
01173
01174 inline int operator!=(const SubString& x, const String& y)
01175 {
01176 return compare(y, x) != 0;
01177 }
01178
01179 inline int operator>(const SubString& x, const String& y)
01180 {
01181 return compare(y, x) < 0;
01182 }
01183
01184 inline int operator>=(const SubString& x, const String& y)
01185 {
01186 return compare(y, x) <= 0;
01187 }
01188
01189 inline int operator<(const SubString& x, const String& y)
01190 {
01191 return compare(y, x) > 0;
01192 }
01193
01194 inline int operator<=(const SubString& x, const String& y)
01195 {
01196 return compare(y, x) >= 0;
01197 }
01198
01199 inline int operator==(const SubString& x, const SubString& y)
01200 {
01201 return compare(x, y) == 0;
01202 }
01203
01204 inline int operator!=(const SubString& x, const SubString& y)
01205 {
01206 return compare(x, y) != 0;
01207 }
01208
01209 inline int operator>(const SubString& x, const SubString& y)
01210 {
01211 return compare(x, y) > 0;
01212 }
01213
01214 inline int operator>=(const SubString& x, const SubString& y)
01215 {
01216 return compare(x, y) >= 0;
01217 }
01218
01219 inline int operator<(const SubString& x, const SubString& y)
01220 {
01221 return compare(x, y) < 0;
01222 }
01223
01224 inline int operator<=(const SubString& x, const SubString& y)
01225 {
01226 return compare(x, y) <= 0;
01227 }
01228
01229 inline int operator==(const SubString& x, const char* t)
01230 {
01231 return compare(x, t) == 0;
01232 }
01233
01234 inline int operator!=(const SubString& x, const char* t)
01235 {
01236 return compare(x, t) != 0;
01237 }
01238
01239 inline int operator>(const SubString& x, const char* t)
01240 {
01241 return compare(x, t) > 0;
01242 }
01243
01244 inline int operator>=(const SubString& x, const char* t)
01245 {
01246 return compare(x, t) >= 0;
01247 }
01248
01249 inline int operator<(const SubString& x, const char* t)
01250 {
01251 return compare(x, t) < 0;
01252 }
01253
01254 inline int operator<=(const SubString& x, const char* t)
01255 {
01256 return compare(x, t) <= 0;
01257 }
01258
01259
01260
01261
01262 inline SubString String::_substr(int first, int l)
01263 {
01264 if (first < 0 || (unsigned)(first + l) > length() )
01265 return SubString(_nilString, 0, 0) ;
01266 else
01267 return SubString(*this, first, l);
01268 }
01269
01270 #endif
01272
01273 #endif // #include "gstring.hpp"
01274
01275
01276
01277 #endif