(file) Return to String.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2