xref: /aoo4110/main/soltools/support/simstr.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_soltools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <simstr.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <string.h>  // strlen(), memcpy(), memset()
31*b1cdbd2cSJim Jagielski #include <ctype.h>   // tolower()
32*b1cdbd2cSJim Jagielski #include <limits.h>  // INT_MAX
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski const char NULCH = '\0';
35*b1cdbd2cSJim Jagielski const int  NO_POS = -1;
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski 
Simstr(const char * s_)38*b1cdbd2cSJim Jagielski Simstr::Simstr(const char * s_)
39*b1cdbd2cSJim Jagielski {
40*b1cdbd2cSJim Jagielski    if (s_ == 0)
41*b1cdbd2cSJim Jagielski       {
42*b1cdbd2cSJim Jagielski          len = 0;
43*b1cdbd2cSJim Jagielski          sz = new char[1];
44*b1cdbd2cSJim Jagielski          *sz = 0;
45*b1cdbd2cSJim Jagielski       }
46*b1cdbd2cSJim Jagielski    else
47*b1cdbd2cSJim Jagielski       {
48*b1cdbd2cSJim Jagielski          len = strlen(s_);
49*b1cdbd2cSJim Jagielski          sz = new char[len+1];
50*b1cdbd2cSJim Jagielski          memcpy(sz,s_,len+1);
51*b1cdbd2cSJim Jagielski       }
52*b1cdbd2cSJim Jagielski }
53*b1cdbd2cSJim Jagielski 
Simstr(const char * anybytes,int nrOfBytes)54*b1cdbd2cSJim Jagielski Simstr::Simstr(const char * anybytes, int  nrOfBytes)
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski     if (anybytes == 0)
57*b1cdbd2cSJim Jagielski     {
58*b1cdbd2cSJim Jagielski 	    len = 0;
59*b1cdbd2cSJim Jagielski 		sz = new char[1];
60*b1cdbd2cSJim Jagielski 		*sz = 0;
61*b1cdbd2cSJim Jagielski         return;
62*b1cdbd2cSJim Jagielski     }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     int slen = static_cast<int>( strlen(anybytes) );
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     len =  slen < nrOfBytes
67*b1cdbd2cSJim Jagielski                   ? slen
68*b1cdbd2cSJim Jagielski                   : nrOfBytes;
69*b1cdbd2cSJim Jagielski     sz = new char[len+1];
70*b1cdbd2cSJim Jagielski     memcpy( sz, anybytes, len );
71*b1cdbd2cSJim Jagielski     *( sz + len ) = 0;
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
Simstr(char c,int anzahl)74*b1cdbd2cSJim Jagielski Simstr::Simstr(char c, int anzahl)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski    if (anzahl < 1)
77*b1cdbd2cSJim Jagielski       {
78*b1cdbd2cSJim Jagielski          len = 0;
79*b1cdbd2cSJim Jagielski          sz = new char[1];
80*b1cdbd2cSJim Jagielski          *sz = 0;
81*b1cdbd2cSJim Jagielski       }
82*b1cdbd2cSJim Jagielski    else
83*b1cdbd2cSJim Jagielski       {
84*b1cdbd2cSJim Jagielski          len = anzahl;
85*b1cdbd2cSJim Jagielski          sz = new char[len+1];
86*b1cdbd2cSJim Jagielski          memset(sz,c,anzahl);
87*b1cdbd2cSJim Jagielski          sz[len] = 0;
88*b1cdbd2cSJim Jagielski       }
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
Simstr(const char * anybytes,int firstBytesPos,int nrOfBytes)91*b1cdbd2cSJim Jagielski Simstr::Simstr( const char *   anybytes,
92*b1cdbd2cSJim Jagielski 				int            firstBytesPos,
93*b1cdbd2cSJim Jagielski 				int            nrOfBytes)
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski    unsigned slen = strlen(anybytes);
96*b1cdbd2cSJim Jagielski    if (anybytes == 0 || slen <= unsigned(firstBytesPos))
97*b1cdbd2cSJim Jagielski 	  {
98*b1cdbd2cSJim Jagielski 		 len = 0;
99*b1cdbd2cSJim Jagielski 		 sz = new char[1];
100*b1cdbd2cSJim Jagielski 		 *sz = 0;
101*b1cdbd2cSJim Jagielski 	  }
102*b1cdbd2cSJim Jagielski    else
103*b1cdbd2cSJim Jagielski 	  {
104*b1cdbd2cSJim Jagielski          int maxLen = slen - unsigned(firstBytesPos);
105*b1cdbd2cSJim Jagielski          len =  maxLen < nrOfBytes
106*b1cdbd2cSJim Jagielski                   ? maxLen
107*b1cdbd2cSJim Jagielski                   : nrOfBytes;
108*b1cdbd2cSJim Jagielski          sz = new char[len+1];
109*b1cdbd2cSJim Jagielski          memcpy(sz,anybytes+firstBytesPos,len);
110*b1cdbd2cSJim Jagielski          *(sz+len) = 0;
111*b1cdbd2cSJim Jagielski       }
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 
Simstr(const Simstr & S)115*b1cdbd2cSJim Jagielski Simstr::Simstr(const Simstr & S)
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski    len = S.len;
118*b1cdbd2cSJim Jagielski    sz = new char[len+1];
119*b1cdbd2cSJim Jagielski    memcpy(sz,S.sz,len+1);
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski 
operator =(const Simstr & S)122*b1cdbd2cSJim Jagielski Simstr & Simstr::operator=(const Simstr & S)
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski    if (sz == S.sz)
125*b1cdbd2cSJim Jagielski       return *this;
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski    delete [] sz;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski    len = S.len;
130*b1cdbd2cSJim Jagielski    sz = new char[len+1];
131*b1cdbd2cSJim Jagielski    memcpy(sz,S.sz,len+1);
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski    return *this;
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
~Simstr()136*b1cdbd2cSJim Jagielski Simstr::~Simstr()
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski    delete [] sz;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski char &
ch(int n)142*b1cdbd2cSJim Jagielski Simstr::ch(int  n)
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski    static char nullCh = NULCH;
145*b1cdbd2cSJim Jagielski    nullCh = NULCH;
146*b1cdbd2cSJim Jagielski    if (n >= long(len) || n < 0)
147*b1cdbd2cSJim Jagielski       return nullCh;
148*b1cdbd2cSJim Jagielski    else
149*b1cdbd2cSJim Jagielski       return sz[unsigned(n)];
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski const Simstr &
null_()153*b1cdbd2cSJim Jagielski Simstr::null_()
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski     static Simstr aNull_;
156*b1cdbd2cSJim Jagielski     return aNull_;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski Simstr
operator +(const Simstr & S) const161*b1cdbd2cSJim Jagielski Simstr::operator+(const Simstr & S) const
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski    Simstr ret = sz;
164*b1cdbd2cSJim Jagielski    ret.push_back(S);
165*b1cdbd2cSJim Jagielski    return ret;
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski Simstr &
operator +=(const Simstr & S)169*b1cdbd2cSJim Jagielski Simstr::operator+=(const Simstr & S)
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski    push_back(S);
172*b1cdbd2cSJim Jagielski    return *this;
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski Simstr &
operator +=(const char * s_)176*b1cdbd2cSJim Jagielski Simstr::operator+=(const char * s_)
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski     Simstr a(s_);
179*b1cdbd2cSJim Jagielski     push_back(a);
180*b1cdbd2cSJim Jagielski     return *this;
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski // REL
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski bool
operator ==(const Simstr & S) const187*b1cdbd2cSJim Jagielski Simstr::operator==(const Simstr & S) const
188*b1cdbd2cSJim Jagielski { return !strcmp(sz,S.sz) ? true : false; }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski bool
operator !=(const Simstr & S) const191*b1cdbd2cSJim Jagielski Simstr::operator!=(const Simstr & S) const
192*b1cdbd2cSJim Jagielski { return strcmp(sz,S.sz) ? true : false; }
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski bool
operator <(const Simstr & S) const195*b1cdbd2cSJim Jagielski Simstr::operator<(const Simstr & S) const
196*b1cdbd2cSJim Jagielski { return (strcmp(sz,S.sz) < 0) ? true : false; }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski bool
operator >(const Simstr & S) const199*b1cdbd2cSJim Jagielski Simstr::operator>(const Simstr & S) const
200*b1cdbd2cSJim Jagielski { return (strcmp(sz,S.sz) > 0) ? true : false; }
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski bool
operator <=(const Simstr & S) const203*b1cdbd2cSJim Jagielski Simstr::operator<=(const Simstr & S) const
204*b1cdbd2cSJim Jagielski { return (strcmp(sz,S.sz) <= 0) ? true : false; }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski bool
operator >=(const Simstr & S) const207*b1cdbd2cSJim Jagielski Simstr::operator>=(const Simstr & S) const
208*b1cdbd2cSJim Jagielski { return (strcmp(sz,S.sz) >= 0) ? true : false; }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski // **************          LIST - Funktionen        *****************
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski // Einzelzugriff
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski char
get(int n) const219*b1cdbd2cSJim Jagielski Simstr::get(int  n) const     { return (n >= len || n < 0) ? 0 : sz[n]; }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski char
get_front() const222*b1cdbd2cSJim Jagielski Simstr::get_front() const        { return sz[0]; }
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski char
get_back() const225*b1cdbd2cSJim Jagielski Simstr::get_back() const        { return  len ? sz[len-1] : 0; }
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski Simstr
get(int startPos,int anzahl) const228*b1cdbd2cSJim Jagielski Simstr::get(int  startPos, int  anzahl) const
229*b1cdbd2cSJim Jagielski {
230*b1cdbd2cSJim Jagielski    if (startPos >= len || startPos < 0 || anzahl < 1)
231*b1cdbd2cSJim Jagielski       return "";
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski    int anz = len - startPos < anzahl ? len - startPos : anzahl;
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski    Simstr ret(' ',anz);
236*b1cdbd2cSJim Jagielski    memcpy(ret.sz, sz+startPos, anz);
237*b1cdbd2cSJim Jagielski    return ret;
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski Simstr
get_front(int anzahl) const241*b1cdbd2cSJim Jagielski Simstr::get_front(int  anzahl) const
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski    int anz = len < anzahl ? len : anzahl;
244*b1cdbd2cSJim Jagielski    if (anz < 1)
245*b1cdbd2cSJim Jagielski       return "";
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski    Simstr ret(' ',anz);
248*b1cdbd2cSJim Jagielski    memcpy(ret.sz, sz, anz);
249*b1cdbd2cSJim Jagielski    return ret;
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski Simstr
get_back(int anzahl) const253*b1cdbd2cSJim Jagielski Simstr::get_back(int  anzahl) const
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski    int anz = len < anzahl ? len : anzahl;
256*b1cdbd2cSJim Jagielski    if (anz < 1)
257*b1cdbd2cSJim Jagielski       return "";
258*b1cdbd2cSJim Jagielski    int start = len-anz;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski    Simstr ret(' ',anz);
261*b1cdbd2cSJim Jagielski    memcpy(ret.sz, sz+start, anz);
262*b1cdbd2cSJim Jagielski    return ret;
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski Simstr
get_first_token(char c) const266*b1cdbd2cSJim Jagielski Simstr::get_first_token(char c) const
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski    int posc = pos_first(c);
269*b1cdbd2cSJim Jagielski    if (posc != NO_POS)
270*b1cdbd2cSJim Jagielski       return get_front(posc);
271*b1cdbd2cSJim Jagielski    else
272*b1cdbd2cSJim Jagielski       return sz;
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski Simstr
get_last_token(char c) const276*b1cdbd2cSJim Jagielski Simstr::get_last_token(char c) const
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski    int posc = pos_last(c);
279*b1cdbd2cSJim Jagielski    if (posc != NO_POS)
280*b1cdbd2cSJim Jagielski       return get_back(len-posc-1);
281*b1cdbd2cSJim Jagielski    else
282*b1cdbd2cSJim Jagielski       return sz;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski // Insert
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski void
insert(int pos,char c)290*b1cdbd2cSJim Jagielski Simstr::insert(int  pos, char c)
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski    if (pos < 0 || pos > len)
293*b1cdbd2cSJim Jagielski       return;
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski    char * result = new char[len+2];
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski    memcpy(result,sz,pos);
298*b1cdbd2cSJim Jagielski    result[pos] = c;
299*b1cdbd2cSJim Jagielski    memcpy(result+pos+1,sz+pos,len-pos+1);
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski    delete [] sz;
302*b1cdbd2cSJim Jagielski    sz = result;
303*b1cdbd2cSJim Jagielski    len++;
304*b1cdbd2cSJim Jagielski }
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski void
push_front(char c)307*b1cdbd2cSJim Jagielski Simstr::push_front(char c)
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski    char * result = new char[len+2];
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski    result[0] = c;
312*b1cdbd2cSJim Jagielski    memcpy(result+1,sz,len+1);
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski    delete [] sz;
315*b1cdbd2cSJim Jagielski    sz = result;
316*b1cdbd2cSJim Jagielski    len++;
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski void
push_back(char c)320*b1cdbd2cSJim Jagielski Simstr::push_back(char c)
321*b1cdbd2cSJim Jagielski {
322*b1cdbd2cSJim Jagielski    char * result = new char[len+2];
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski    memcpy(result,sz,len);
325*b1cdbd2cSJim Jagielski    result[len] = c;
326*b1cdbd2cSJim Jagielski    result[len+1] = 0;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski    delete [] sz;
329*b1cdbd2cSJim Jagielski    sz = result;
330*b1cdbd2cSJim Jagielski    len++;
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski void
insert(int pos,const Simstr & S)334*b1cdbd2cSJim Jagielski Simstr::insert(int  pos, const Simstr & S)
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski    if (pos < 0 || pos > len)
337*b1cdbd2cSJim Jagielski       return;
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski    char * result = new char[len+1+S.len];
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski    memcpy(result,sz,pos);
342*b1cdbd2cSJim Jagielski    memcpy(result+pos,S.sz,S.len);
343*b1cdbd2cSJim Jagielski    memcpy(result+pos+S.len,sz+pos,len-pos+1);
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski    delete [] sz;
346*b1cdbd2cSJim Jagielski    sz = result;
347*b1cdbd2cSJim Jagielski    len += S.len;
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski void
push_front(const Simstr & S)351*b1cdbd2cSJim Jagielski Simstr::push_front(const Simstr & S)
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski    char * result = new char[len+1+S.len];
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski    memcpy(result,S.sz,S.len);
356*b1cdbd2cSJim Jagielski    memcpy(result+S.len,sz,len+1);
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski    delete [] sz;
359*b1cdbd2cSJim Jagielski    sz = result;
360*b1cdbd2cSJim Jagielski    len += S.len;
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski void
push_back(const Simstr & S)364*b1cdbd2cSJim Jagielski Simstr::push_back(const Simstr & S)
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski    char * result = new char[len+1+S.len];
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski    memcpy(result,sz,len);
369*b1cdbd2cSJim Jagielski    memcpy(result+len,S.sz,S.len+1);
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski    delete [] sz;
372*b1cdbd2cSJim Jagielski    sz = result;
373*b1cdbd2cSJim Jagielski    len += S.len;
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski // Remove
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski void
remove(int pos,int anzahl)380*b1cdbd2cSJim Jagielski Simstr::remove(int  pos, int  anzahl)
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski    if (pos >= len || pos < 0 || anzahl < 1)
383*b1cdbd2cSJim Jagielski       return;
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	int anz = len - pos < anzahl ? len - pos : anzahl;
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	char * result = new char[len-anz+1];
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 	memcpy(result,sz,pos);
390*b1cdbd2cSJim Jagielski    memcpy(result+pos,sz+pos+anz,len-pos-anz+1);
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski    delete [] sz;
393*b1cdbd2cSJim Jagielski    sz = result;
394*b1cdbd2cSJim Jagielski    len -= anz;
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski void
remove_trailing_blanks()398*b1cdbd2cSJim Jagielski Simstr::remove_trailing_blanks()
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski 	int newlen = len-1;
401*b1cdbd2cSJim Jagielski 	for ( ; newlen > 1 && sz[newlen] <= 32; --newlen ) {}
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	if (newlen < len-1)
404*b1cdbd2cSJim Jagielski     	remove ( newlen+1, len-newlen);
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski void
pop_front(int anzahl)408*b1cdbd2cSJim Jagielski Simstr::pop_front(int  anzahl)
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski    if (anzahl < 1)
411*b1cdbd2cSJim Jagielski       return;
412*b1cdbd2cSJim Jagielski    int anz = len < anzahl ? len : anzahl;
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski    char * result = new char[len-anz+1];
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski    memcpy(result,sz+anz,len-anz+1);
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski    delete [] sz;
419*b1cdbd2cSJim Jagielski    sz = result;
420*b1cdbd2cSJim Jagielski    len -= anz;
421*b1cdbd2cSJim Jagielski }
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski void
pop_back(int anzahl)424*b1cdbd2cSJim Jagielski Simstr::pop_back(int  anzahl)
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski    if (anzahl < 1)
427*b1cdbd2cSJim Jagielski       return;
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski    int anz = len < anzahl ? len : anzahl;
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski    char * result = new char[len-anz+1];
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski    memcpy(result,sz,len-anz);
434*b1cdbd2cSJim Jagielski    result[len-anz] = 0;
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski    delete [] sz;
437*b1cdbd2cSJim Jagielski    sz = result;
438*b1cdbd2cSJim Jagielski    len -= anz;
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski void
rem_back_from(int removeStartPos)442*b1cdbd2cSJim Jagielski Simstr::rem_back_from(int  removeStartPos)
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski    if (removeStartPos != NO_POS)
445*b1cdbd2cSJim Jagielski       pop_back(len-removeStartPos);
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski void
remove_all(char c)449*b1cdbd2cSJim Jagielski Simstr::remove_all(char c)
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski    if (!len)
452*b1cdbd2cSJim Jagielski       return;
453*b1cdbd2cSJim Jagielski    char * result = new char[len];
454*b1cdbd2cSJim Jagielski    int i,j=0;
455*b1cdbd2cSJim Jagielski    for (i = 0; i < len; i++)
456*b1cdbd2cSJim Jagielski        if (sz[i] != c)
457*b1cdbd2cSJim Jagielski           result[j++] = sz[i];
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski    delete [] sz;
460*b1cdbd2cSJim Jagielski    sz = new char[j+1];
461*b1cdbd2cSJim Jagielski    memcpy(sz,result,j);
462*b1cdbd2cSJim Jagielski    sz[j] = 0;
463*b1cdbd2cSJim Jagielski    len = j;
464*b1cdbd2cSJim Jagielski    delete [] result;
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski void
remove_all(const Simstr & S)468*b1cdbd2cSJim Jagielski Simstr::remove_all(const Simstr & S)
469*b1cdbd2cSJim Jagielski {
470*b1cdbd2cSJim Jagielski    int  pos;
471*b1cdbd2cSJim Jagielski    while ( (pos=pos_first(S)) != NO_POS )
472*b1cdbd2cSJim Jagielski       remove(pos,S.len);
473*b1cdbd2cSJim Jagielski }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski void
strip(char c)476*b1cdbd2cSJim Jagielski Simstr::strip(char c)
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski 	int start = 0;
479*b1cdbd2cSJim Jagielski    if (c == ' ')
480*b1cdbd2cSJim Jagielski    {  // Sonderbehandlung: SPC entfernt auch TABs:
481*b1cdbd2cSJim Jagielski    	while ( start < len
482*b1cdbd2cSJim Jagielski                  ?  sz[start] == ' '
483*b1cdbd2cSJim Jagielski                     || sz[start] == '\t'
484*b1cdbd2cSJim Jagielski                  :  false )
485*b1cdbd2cSJim Jagielski 	   	start++;
486*b1cdbd2cSJim Jagielski    }
487*b1cdbd2cSJim Jagielski    else
488*b1cdbd2cSJim Jagielski    {
489*b1cdbd2cSJim Jagielski    	while (start < len && sz[start] == c)
490*b1cdbd2cSJim Jagielski 	   	start++;
491*b1cdbd2cSJim Jagielski    }
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 	int ende = len-1;
494*b1cdbd2cSJim Jagielski    if (c == ' ')
495*b1cdbd2cSJim Jagielski    {  // Sonderbehandlung: SPC entfernt auch TABs:
496*b1cdbd2cSJim Jagielski    	while ( ende >= start
497*b1cdbd2cSJim Jagielski                  ?  sz[ende] == ' '
498*b1cdbd2cSJim Jagielski                     || sz[ende] == '\t'
499*b1cdbd2cSJim Jagielski                  :  false  )
500*b1cdbd2cSJim Jagielski 	   	ende--;
501*b1cdbd2cSJim Jagielski    }
502*b1cdbd2cSJim Jagielski    else
503*b1cdbd2cSJim Jagielski    {
504*b1cdbd2cSJim Jagielski    	while (ende >= start && sz[ende] == c)
505*b1cdbd2cSJim Jagielski 	   	ende--;
506*b1cdbd2cSJim Jagielski    }
507*b1cdbd2cSJim Jagielski 	*this = get(start,ende-start+1);
508*b1cdbd2cSJim Jagielski }
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski void
empty()511*b1cdbd2cSJim Jagielski Simstr::empty()
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski    if (len > 0)
514*b1cdbd2cSJim Jagielski    {
515*b1cdbd2cSJim Jagielski       delete [] sz;
516*b1cdbd2cSJim Jagielski       sz = new char[1];
517*b1cdbd2cSJim Jagielski       *sz = 0;
518*b1cdbd2cSJim Jagielski       len = 0;
519*b1cdbd2cSJim Jagielski    }
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski Simstr
take_first_token(char c)523*b1cdbd2cSJim Jagielski Simstr::take_first_token(char c)
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski    Simstr ret;
526*b1cdbd2cSJim Jagielski    int pos = pos_first(c);
527*b1cdbd2cSJim Jagielski    if (pos != NO_POS)
528*b1cdbd2cSJim Jagielski       {
529*b1cdbd2cSJim Jagielski          ret = get_front(pos);
530*b1cdbd2cSJim Jagielski          pop_front(pos+1);
531*b1cdbd2cSJim Jagielski       }
532*b1cdbd2cSJim Jagielski    else
533*b1cdbd2cSJim Jagielski       {
534*b1cdbd2cSJim Jagielski          ret = sz;
535*b1cdbd2cSJim Jagielski          delete [] sz;
536*b1cdbd2cSJim Jagielski          sz = new char[1];
537*b1cdbd2cSJim Jagielski          *sz = NULCH;
538*b1cdbd2cSJim Jagielski          len = 0;
539*b1cdbd2cSJim Jagielski       }
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski    return ret;
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski Simstr
take_last_token(char c)545*b1cdbd2cSJim Jagielski Simstr::take_last_token(char c)
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski    Simstr ret;
548*b1cdbd2cSJim Jagielski    int pos = pos_last(c);
549*b1cdbd2cSJim Jagielski    if (pos != NO_POS)
550*b1cdbd2cSJim Jagielski       {
551*b1cdbd2cSJim Jagielski          ret = get_back(len-pos-1);
552*b1cdbd2cSJim Jagielski          pop_back(len-pos);
553*b1cdbd2cSJim Jagielski       }
554*b1cdbd2cSJim Jagielski    else
555*b1cdbd2cSJim Jagielski       {
556*b1cdbd2cSJim Jagielski          ret = sz;
557*b1cdbd2cSJim Jagielski          delete [] sz;
558*b1cdbd2cSJim Jagielski          sz = new char[1];
559*b1cdbd2cSJim Jagielski          *sz = NULCH;
560*b1cdbd2cSJim Jagielski          len = 0;
561*b1cdbd2cSJim Jagielski       }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski    return ret;
564*b1cdbd2cSJim Jagielski }
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski // Find
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski int
pos_first(char c) const571*b1cdbd2cSJim Jagielski Simstr::pos_first(char c) const
572*b1cdbd2cSJim Jagielski {
573*b1cdbd2cSJim Jagielski    int i = 0;
574*b1cdbd2cSJim Jagielski    for (i = 0; i < len ? sz[i] != c : false; i++) ;
575*b1cdbd2cSJim Jagielski    if (i >= len)
576*b1cdbd2cSJim Jagielski       return NO_POS;
577*b1cdbd2cSJim Jagielski    else
578*b1cdbd2cSJim Jagielski       return i;
579*b1cdbd2cSJim Jagielski }
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski int
pos_first_after(char c,int startSearchPos) const582*b1cdbd2cSJim Jagielski Simstr::pos_first_after( char           c,
583*b1cdbd2cSJim Jagielski                          int            startSearchPos) const
584*b1cdbd2cSJim Jagielski {
585*b1cdbd2cSJim Jagielski    int i = 0;
586*b1cdbd2cSJim Jagielski    if (startSearchPos >= i)
587*b1cdbd2cSJim Jagielski       i = startSearchPos+1;
588*b1cdbd2cSJim Jagielski    for (; i < len ? sz[i] != c : false; i++) ;
589*b1cdbd2cSJim Jagielski    if (i >= len)
590*b1cdbd2cSJim Jagielski       return NO_POS;
591*b1cdbd2cSJim Jagielski    else
592*b1cdbd2cSJim Jagielski       return i;
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski int
pos_last(char c) const597*b1cdbd2cSJim Jagielski Simstr::pos_last(char c) const
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski    int i = 0;
600*b1cdbd2cSJim Jagielski    for (i = len-1; i >= 0 ? sz[i] != c : false; i--) ;
601*b1cdbd2cSJim Jagielski    if (i < 0)
602*b1cdbd2cSJim Jagielski       return NO_POS;
603*b1cdbd2cSJim Jagielski    else
604*b1cdbd2cSJim Jagielski       return i;
605*b1cdbd2cSJim Jagielski }
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski int
pos_first(const Simstr & S) const608*b1cdbd2cSJim Jagielski Simstr::pos_first(const Simstr & S) const
609*b1cdbd2cSJim Jagielski {
610*b1cdbd2cSJim Jagielski    char * ptr = strstr(sz,S.sz);
611*b1cdbd2cSJim Jagielski    if (ptr)
612*b1cdbd2cSJim Jagielski       return int(ptr-sz);
613*b1cdbd2cSJim Jagielski    else
614*b1cdbd2cSJim Jagielski       return NO_POS;
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski int
pos_last(const Simstr & S) const618*b1cdbd2cSJim Jagielski Simstr::pos_last(const Simstr & S) const
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski    Simstr vgl;
621*b1cdbd2cSJim Jagielski    int i;
622*b1cdbd2cSJim Jagielski    for (i = len-S.len; i >= 0 ; i--)
623*b1cdbd2cSJim Jagielski       {
624*b1cdbd2cSJim Jagielski          vgl = get(i,S.len);
625*b1cdbd2cSJim Jagielski          if (vgl == S)
626*b1cdbd2cSJim Jagielski             break;
627*b1cdbd2cSJim Jagielski       }
628*b1cdbd2cSJim Jagielski    if (i >= 0)
629*b1cdbd2cSJim Jagielski       return i;
630*b1cdbd2cSJim Jagielski    else
631*b1cdbd2cSJim Jagielski       return NO_POS;
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski int
count(char c) const635*b1cdbd2cSJim Jagielski Simstr::count(char c) const
636*b1cdbd2cSJim Jagielski {
637*b1cdbd2cSJim Jagielski    int ret = 0;
638*b1cdbd2cSJim Jagielski    for (int i =0; i < len; i++)
639*b1cdbd2cSJim Jagielski 	  if (sz[i] == c)
640*b1cdbd2cSJim Jagielski 		 ret++;
641*b1cdbd2cSJim Jagielski    return ret;
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski bool
is_no_text() const645*b1cdbd2cSJim Jagielski Simstr::is_no_text() const
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski    if (!len)
648*b1cdbd2cSJim Jagielski 	  return true;
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski    int i;
651*b1cdbd2cSJim Jagielski    for (i = 0; sz[i] <= 32 && i < len; i++) ;
652*b1cdbd2cSJim Jagielski    if (i < len)
653*b1cdbd2cSJim Jagielski 		return false;
654*b1cdbd2cSJim Jagielski 	return true;
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski // Change
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski void
replace(int pos,char c)660*b1cdbd2cSJim Jagielski Simstr::replace(int  pos, char c)
661*b1cdbd2cSJim Jagielski {
662*b1cdbd2cSJim Jagielski 	if (pos < 0 || pos >= len)
663*b1cdbd2cSJim Jagielski       return;
664*b1cdbd2cSJim Jagielski    else
665*b1cdbd2cSJim Jagielski       sz[unsigned(pos)] = c;
666*b1cdbd2cSJim Jagielski }
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski void
replace(int startPos,int anzahl,const Simstr & S)669*b1cdbd2cSJim Jagielski Simstr::replace(int  startPos, int  anzahl, const Simstr & S)
670*b1cdbd2cSJim Jagielski {
671*b1cdbd2cSJim Jagielski    if (startPos >= len || startPos < 0 || anzahl < 1)
672*b1cdbd2cSJim Jagielski       return;
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski    int anz = len - startPos < anzahl ? len - startPos : anzahl;
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski    char * result = new char[len-anz+S.len+1];
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski    memcpy(result,sz,startPos);
679*b1cdbd2cSJim Jagielski    memcpy(result+startPos, S.sz, S.len);
680*b1cdbd2cSJim Jagielski    memcpy(result+startPos+S.len, sz+startPos+anz, len-startPos-anz+1);
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski    delete [] sz;
683*b1cdbd2cSJim Jagielski    sz = result;
684*b1cdbd2cSJim Jagielski    len = len-anz+S.len;
685*b1cdbd2cSJim Jagielski }
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski void
replace_all(char oldCh,char newCh)688*b1cdbd2cSJim Jagielski Simstr::replace_all(char oldCh, char newCh)
689*b1cdbd2cSJim Jagielski {
690*b1cdbd2cSJim Jagielski    for (int i=0; i < len; i++)
691*b1cdbd2cSJim Jagielski       if (sz[i] == oldCh)
692*b1cdbd2cSJim Jagielski          sz[i] = newCh;
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski void
replace_all(const Simstr & oldS,const Simstr & newS)696*b1cdbd2cSJim Jagielski Simstr::replace_all(const Simstr & oldS, const Simstr & newS)
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski    Simstr vgl;
699*b1cdbd2cSJim Jagielski    int i = 0;
700*b1cdbd2cSJim Jagielski 	while (i <= len-oldS.len)
701*b1cdbd2cSJim Jagielski 		{
702*b1cdbd2cSJim Jagielski          vgl = get(i,oldS.len);
703*b1cdbd2cSJim Jagielski          if (strcmp(vgl.sz,oldS.sz) == 0)
704*b1cdbd2cSJim Jagielski             {
705*b1cdbd2cSJim Jagielski                replace(i,oldS.len,newS);
706*b1cdbd2cSJim Jagielski                i += newS.len;
707*b1cdbd2cSJim Jagielski             }
708*b1cdbd2cSJim Jagielski          else
709*b1cdbd2cSJim Jagielski             i++;
710*b1cdbd2cSJim Jagielski       }
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski void
to_lower()714*b1cdbd2cSJim Jagielski Simstr::to_lower()
715*b1cdbd2cSJim Jagielski {
716*b1cdbd2cSJim Jagielski 	for (int i = 0; i < len; i++)
717*b1cdbd2cSJim Jagielski    	sz[i] = (char) tolower(sz[i]);
718*b1cdbd2cSJim Jagielski }
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski //   Simstr addition
723*b1cdbd2cSJim Jagielski Simstr
operator +(const char * str,const Simstr & S)724*b1cdbd2cSJim Jagielski operator+(const char * str, const Simstr & S)
725*b1cdbd2cSJim Jagielski {
726*b1cdbd2cSJim Jagielski    Simstr ret = S;
727*b1cdbd2cSJim Jagielski    ret.push_front(str);
728*b1cdbd2cSJim Jagielski    return ret;
729*b1cdbd2cSJim Jagielski }
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski Simstr
operator +(const Simstr & S,const char * str)732*b1cdbd2cSJim Jagielski operator+(const Simstr & S, const char * str)
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski    Simstr ret = S;
735*b1cdbd2cSJim Jagielski    ret.push_back(str);
736*b1cdbd2cSJim Jagielski    return ret;
737*b1cdbd2cSJim Jagielski }
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski Simstr
operator +(char c,const Simstr & S)740*b1cdbd2cSJim Jagielski operator+(char c, const Simstr & S)
741*b1cdbd2cSJim Jagielski {
742*b1cdbd2cSJim Jagielski    Simstr ret = S;
743*b1cdbd2cSJim Jagielski    ret.push_front(c);
744*b1cdbd2cSJim Jagielski    return ret;
745*b1cdbd2cSJim Jagielski }
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski Simstr
operator +(const Simstr & S,char c)748*b1cdbd2cSJim Jagielski operator+(const Simstr & S, char c)
749*b1cdbd2cSJim Jagielski {
750*b1cdbd2cSJim Jagielski    Simstr ret = S;
751*b1cdbd2cSJim Jagielski    ret.push_back(c);
752*b1cdbd2cSJim Jagielski    return ret;
753*b1cdbd2cSJim Jagielski }
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski // Simstr-Vergleiche mit char *
757*b1cdbd2cSJim Jagielski bool
operator ==(const Simstr & S,const char * str)758*b1cdbd2cSJim Jagielski operator==(const Simstr & S, const char * str)
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski    return strcmp(S,str) == 0;
761*b1cdbd2cSJim Jagielski }
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski bool
operator !=(const Simstr & S,const char * str)764*b1cdbd2cSJim Jagielski operator!=(const Simstr & S, const char * str)
765*b1cdbd2cSJim Jagielski {
766*b1cdbd2cSJim Jagielski    return strcmp(S,str) != 0;
767*b1cdbd2cSJim Jagielski }
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski bool
operator <(const Simstr & S,const char * str)770*b1cdbd2cSJim Jagielski operator<(const Simstr & S, const char * str)
771*b1cdbd2cSJim Jagielski {
772*b1cdbd2cSJim Jagielski    return strcmp(S,str) < 0;
773*b1cdbd2cSJim Jagielski }
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski bool
operator >(const Simstr & S,const char * str)776*b1cdbd2cSJim Jagielski operator>(const Simstr & S, const char * str)
777*b1cdbd2cSJim Jagielski {
778*b1cdbd2cSJim Jagielski    return strcmp(S,str) > 0;
779*b1cdbd2cSJim Jagielski }
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski bool
operator <=(const Simstr & S,const char * str)782*b1cdbd2cSJim Jagielski operator<=(const Simstr & S, const char * str)
783*b1cdbd2cSJim Jagielski {
784*b1cdbd2cSJim Jagielski    return strcmp(S,str) <= 0;
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski bool
operator >=(const Simstr & S,const char * str)788*b1cdbd2cSJim Jagielski operator>=(const Simstr & S, const char * str)
789*b1cdbd2cSJim Jagielski {
790*b1cdbd2cSJim Jagielski    return strcmp(S,str) >= 0;
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski bool
operator ==(const char * str,const Simstr & S)794*b1cdbd2cSJim Jagielski operator==(const char * str, const Simstr & S)
795*b1cdbd2cSJim Jagielski {
796*b1cdbd2cSJim Jagielski    return strcmp(str,S) == 0;
797*b1cdbd2cSJim Jagielski }
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski bool
operator !=(const char * str,const Simstr & S)800*b1cdbd2cSJim Jagielski operator!=(const char * str, const Simstr & S)
801*b1cdbd2cSJim Jagielski {
802*b1cdbd2cSJim Jagielski    return strcmp(str,S) != 0;
803*b1cdbd2cSJim Jagielski }
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski bool
operator <(const char * str,const Simstr & S)806*b1cdbd2cSJim Jagielski operator<(const char * str, const Simstr & S)
807*b1cdbd2cSJim Jagielski {
808*b1cdbd2cSJim Jagielski    return strcmp(str,S) < 0;
809*b1cdbd2cSJim Jagielski }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski bool
operator >(const char * str,const Simstr & S)812*b1cdbd2cSJim Jagielski operator>(const char * str, const Simstr & S)
813*b1cdbd2cSJim Jagielski {
814*b1cdbd2cSJim Jagielski    return strcmp(str,S) > 0;
815*b1cdbd2cSJim Jagielski }
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski bool
operator <=(const char * str,const Simstr & S)818*b1cdbd2cSJim Jagielski operator<=(const char * str, const Simstr & S)
819*b1cdbd2cSJim Jagielski {
820*b1cdbd2cSJim Jagielski    return strcmp(str,S) <= 0;
821*b1cdbd2cSJim Jagielski }
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski bool
operator >=(const char * str,const Simstr & S)824*b1cdbd2cSJim Jagielski operator>=(const char * str, const Simstr & S)
825*b1cdbd2cSJim Jagielski {
826*b1cdbd2cSJim Jagielski    return strcmp(str,S) >= 0;
827*b1cdbd2cSJim Jagielski }
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 
830