1 mike 1.1 //BEGIN_LICENSE
2 //
3 // Copyright (c) 2000 The Open Group, BMC Software, Tivoli Systems, IBM
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a
6 // copy of this software and associated documentation files (the "Software"),
7 // to deal in the Software without restriction, including without limitation
8 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 // and/or sell copies of the Software, and to permit persons to whom the
10 // Software is furnished to do so, subject to the following conditions:
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18 // DEALINGS IN THE SOFTWARE.
19 //
20 //END_LICENSE
21 //BEGIN_HISTORY
22 mike 1.1 //
23 // Author:
24 //
|
25 mike 1.2 // $Log: String.cpp,v $
|
26 mike 1.8 // Revision 1.7 2001/04/10 22:42:55 karl
27 // Correct error in String find
28 //
|
29 karl 1.7 // Revision 1.6 2001/04/09 20:18:47 karl
30 // add find substring function
31 //
|
32 karl 1.6 // Revision 1.5 2001/03/09 19:49:32 karl
33 // long lines
34 //
|
35 karl 1.5 // Revision 1.4 2001/02/26 04:33:28 mike
36 // Fixed many places where cim names compared with operator==(String,String).
37 // Changed all of these to use CIMName::equal()
38 //
|
39 mike 1.4 // Revision 1.3 2001/02/11 17:19:30 mike
40 // added reverseFind() method
41 //
|
42 mike 1.3 // Revision 1.2 2001/02/11 05:42:33 mike
43 // new
44 //
|
45 mike 1.2 // Revision 1.1.1.1 2001/01/14 19:53:14 mike
46 // Pegasus import
47 //
|
48 mike 1.1 //
49 //END_HISTORY
50
|
51 karl 1.6
|
52 mike 1.2 #include <cctype>
|
53 mike 1.1 #include "String.h"
54 #include "Exception.h"
55 #include "String.h"
56
|
57 karl 1.6 // For debugging
|
58 karl 1.7 #include <iostream>
59 using namespace std;
|
60 karl 1.6
61
|
62 mike 1.1 PEGASUS_NAMESPACE_BEGIN
63
64 const String String::EMPTY;
65
|
66 mike 1.2 inline Uint32 StrLen(const char* str)
|
67 mike 1.1 {
|
68 mike 1.2 if (!str)
69 throw NullPointer();
70
71 return strlen(str);
|
72 mike 1.1 }
73
|
74 mike 1.2 inline Uint32 StrLen(const Char16* str)
|
75 mike 1.1 {
76 if (!str)
|
77 mike 1.2 throw NullPointer();
|
78 mike 1.1
79 Uint32 n = 0;
80
81 while (*str++)
82 n++;
83
84 return n;
85 }
86
|
87 karl 1.5 String::String()
|
88 mike 1.2 {
|
89 karl 1.5 _rep.append('\0');
|
90 mike 1.1 }
91
|
92 karl 1.5 String::String(const String& x) : _rep(x._rep)
|
93 mike 1.1 {
94
95 }
96
97 String::String(const String& x, Uint32 n)
98 {
99 _rep.append('\0');
100 append(x.getData(), n);
101 }
102
|
103 karl 1.5 String::String(const Char16* x) : _rep(x, StrLen(x) + 1)
104 {
|
105 mike 1.1
106 }
107
|
108 karl 1.5 String::String(const Char16* x, Uint32 n)
109 {
110 assign(x, n);
|
111 mike 1.1 }
112
113 String::String(const char* str)
114 {
115 Uint32 n = ::strlen(str) + 1;
116 reserve(n);
117
118 while (n--)
119 _rep.append(*str++);
120 }
121
|
122 karl 1.5 String::String(const char* str, Uint32 n_)
|
123 mike 1.1 {
124 Uint32 n = _min(strlen(str), n_);
125 reserve(n + 1);
126
127 while (n--)
128 _rep.append(*str++);
129
130 _rep.append('\0');
131 }
132
|
133 karl 1.5 String& String::assign(const Char16* x)
|
134 mike 1.1 {
135 _rep.clear();
136 _rep.append(x, StrLen(x) + 1);
|
137 karl 1.5 return *this;
|
138 mike 1.1 }
139
140 String& String::assign(const Char16* str, Uint32 n)
141 {
142 _rep.clear();
143 Uint32 m = _min(StrLen(str), n);
144 _rep.append(str, m);
145 _rep.append('\0');
146 return *this;
147 }
148
|
149 karl 1.5 String& String::assign(const char* x)
|
150 mike 1.1 {
151 _rep.clear();
152 Uint32 n = strlen(x);
153 _rep.reserve(n + 1);
154
155 while (n--)
156 _rep.append(*x++);
157
158 _rep.append('\0');
159
|
160 karl 1.5 return *this;
|
161 mike 1.1 }
162
163 String& String::assign(const char* x, Uint32 n_)
164 {
165 _rep.clear();
166
167 Uint32 n = _min(strlen(x), n_);
168 _rep.reserve(n + 1);
169
170 while (n--)
171 _rep.append(*x++);
172
173 _rep.append('\0');
174
|
175 karl 1.5 return *this;
|
176 mike 1.1 }
177
178 char* String::allocateCString(Uint32 extraBytes, Boolean noThrow) const
179 {
180 Uint32 n = getLength() + 1;
181 char* str = new char[n + extraBytes];
182 char* p = str;
183 const Char16* q = getData();
184
185 for (Uint32 i = 0; i < n; i++)
186 {
187 Uint16 c = *q++;
188 *p++ = char(c);
189
190 if ((c & 0xff00) && !noThrow)
191 throw TruncatedCharacter();
192 }
193
194 return str;
195 }
196
197 mike 1.1 void String::appendToCString(
|
198 karl 1.5 char* str,
199 Uint32 length,
|
200 mike 1.1 Boolean noThrow) const
201 {
202 if (!str)
203 throw NullPointer();
204
205 Uint32 n = _min(getLength(), length);
206
207 char* p = str + strlen(str);
208 const Char16* q = getData();
209
210 for (Uint32 i = 0; i < n; i++)
211 {
212 Uint16 c = *q++;
213 *p++ = char(c);
214
215 if ((c & 0xff00) && !noThrow)
216 throw TruncatedCharacter();
217 }
218
219 *p = '\0';
220 }
221 mike 1.1
|
222 karl 1.5 Char16& String::operator[](Uint32 i)
|
223 mike 1.1 {
224 if (i > getLength())
225 ThrowOutOfBounds();
226
|
227 karl 1.5 return _rep[i];
|
228 mike 1.1 }
229
230 const Char16 String::operator[](Uint32 i) const
231 {
232 if (i > getLength())
233 ThrowOutOfBounds();
234
|
235 karl 1.5 return _rep[i];
|
236 mike 1.1 }
237
238 String& String::append(const Char16* str, Uint32 n)
239 {
240 Uint32 m = _min(StrLen(str), n);
241 _rep.reserve(_rep.getSize() + m);
242 _rep.remove(_rep.getSize() - 1);
243 _rep.append(str, m);
244 _rep.append('\0');
245 return *this;
246 }
247
248 void String::remove(Uint32 pos, Uint32 size)
249 {
250 if (size == Uint32(-1))
251 size = getLength() - pos;
252
253 if (pos + size > getLength())
254 ThrowOutOfBounds();
255
256 if (size)
257 mike 1.1 _rep.remove(pos, size);
258 }
259
|
260 mike 1.4 int String::compare(const Char16* s1, const Char16* s2, Uint32 n)
261 {
262 while (n--)
263 {
264 int r = *s1++ - *s2++;
265
266 if (r)
267 return r;
268 }
269
270 return 0;
271 }
272
273 Boolean String::equal(const String& x, const String& y)
|
274 mike 1.1 {
275 if (x.getLength() != y.getLength())
276 return false;
277
278 return String::compare(x.getData(), y.getData(), x.getLength()) == 0;
279 }
280
|
281 mike 1.4 Boolean String::equal(const String& x, const Char16* y)
|
282 mike 1.1 {
283 if (x.getLength() != StrLen(y))
284 return false;
285
286 return String::compare(x.getData(), y, x.getLength()) == 0;
287 }
288
|
289 mike 1.4 Boolean String::equal(const Char16* x, const String& y)
|
290 mike 1.1 {
|
291 mike 1.4 return equal(y, x);
|
292 mike 1.1 }
293
|
294 mike 1.4 Boolean String::equal(const String& x, const char* y)
|
295 mike 1.1 {
|
296 mike 1.4 return equal(x, String(y));
297 }
|
298 mike 1.1
|
299 mike 1.4 Boolean String::equal(const char* x, const String& y)
300 {
301 return equal(String(x), y);
302 }
|
303 mike 1.1
304
305 String String::subString(Uint32 pos, Uint32 length) const
306 {
307 if (pos < getLength())
308 {
309 if (length == Uint32(-1))
310 length = getLength() - pos;
311
312 return String(getData() + pos, length);
313 }
314 else
315 return String();
316 }
317
318 Uint32 String::find(Char16 c) const
319 {
320 const Char16* first = getData();
321
322 for (const Char16* p = first; *p; p++)
323 {
324 mike 1.1 if (*p == c)
325 return p - first;
|
326 mike 1.3 }
327
328 return Uint32(-1);
|
329 karl 1.6 }
330
|
331 karl 1.7 Uint32 String::find(const String& s) const
|
332 karl 1.6 {
|
333 karl 1.7 const Char16* pSubStr = s.getData();
334 const Char16* pStr = getData();
335 Uint32 subStrLen = s.getLength();
336 Uint32 strLen = getLength();
337
338 // loop to find first char match
339 Uint32 loc = 0;
340 for( ; loc <= (strLen-subStrLen); loc++)
|
341 karl 1.6 {
|
342 karl 1.7 if (*pStr++ == *pSubStr) // match first char
343 {
344 // point to substr 2nd char
345 const Char16* p = pSubStr + 1;
346
347 // Test remaining chars for equal
348 Uint32 i = 1;
349 for (; i < subStrLen; i++)
350 if (*pStr++ != *p++ )
351 {pStr--; break;} // break from loop
352 if (i == subStrLen)
353 return loc;
354 }
355 }
356 return -1;
|
357 karl 1.6 }
|
358 mike 1.8
|
359 karl 1.6 // ATTN:KS 5 apr 2000 Need to add the Char16* version.
360 Uint32 String::find(const char* s) const
361 {
362 return find(String(s));
|
363 mike 1.3 }
364
365 Uint32 String::reverseFind(Char16 c) const
366 {
367 const Char16* first = getData();
368 const Char16* last = getData() + getLength();
369
370 while (last != first)
371 {
372 if (*--last == c)
373 return last - first;
|
374 mike 1.1 }
375
376 return Uint32(-1);
377 }
378
379 int String::compare(const Char16* s1, const Char16* s2)
380 {
381 while (*s1 && *s2)
382 {
383 int r = *s1++ - *s2++;
384
385 if (r)
386 return r;
387 }
388
389 if (*s2)
390 return -1;
391 else if (*s1)
392 return 1;
393
394 return 0;
395 mike 1.1 }
396
397 std::ostream& operator<<(std::ostream& os, const String& x)
398 {
399 for (Uint32 i = 0, n = x.getLength(); i < n; i++)
400 os << x[i];
401
402 return os;
|
403 mike 1.2 }
404
405 void String::toLower(char* str)
406 {
407 while (*str)
408 tolower(*str++);
409 }
410
411 String ToLower(const String& str)
412 {
413 String tmp(str);
414
415 for (Uint32 i = 0, n = tmp.getLength(); i < n; i++)
416 {
417 Char16 c = tmp[i];
418
419 if (c <= 127)
420 tmp[i] = tolower(c);
421 }
422
423 return tmp;
|
424 mike 1.1 }
425
426 PEGASUS_NAMESPACE_END
|