2 string.cc - implement String
4 (c) 1997--2006 Han-Wen Nienhuys & Jan Nieuwenhuizen
8 #ifndef _GNU_SOURCE // we want memmem
12 #include "std-string.hh"
21 #include "libc-extension.hh"
22 #include "string-convert.hh"
24 /* std::string interface */
28 String::String (char const *s, int n)
30 strh_.set ((Byte const *)s, n);
33 String::String (String const &s, int pos, ssize n)
35 *this = s.substr (pos, n);
38 String::String (int n, char c)
40 *this = String_convert::char_string (c, n);
44 String::operator = (String const &source)
51 String::substr (int pos, ssize n) const
53 if (n == (ssize)-1 || n == (ssize)INT_MAX || n == NPOS)
55 return cut_string (pos, n);
59 String::insert (ssize pos, String s)
61 *this = substr (0, pos) + s + substr (pos + 1);
66 String::copy (char *buf, ssize n, ssize pos) const
69 memcpy (buf, strh_.to_bytes (), strh_.length () + 1);
74 String::compare (String const &s) const
76 char const *p1 = c_str ();
77 char const *p2 = s.c_str ();
82 don't forget the terminating '\0'
84 int f = min (length (), s.length ());
85 int cmp_length = 1+ f;
86 int i = memcmp (p1, p2, cmp_length);
93 return (char const*) to_bytes ();
97 String::empty () const
103 String::find (char c, int pos) const
105 String f = right_string (length () - pos);
106 ssize n = f.index (c);
113 String::find (char const *c, int pos) const
115 return find (String (c), pos);
119 String::find (String s, int pos) const
123 String f = right_string (length () - pos);
124 ssize n = f.index (s);
131 String::rfind (char c) const
133 return index_last (c);
137 String::replace (int pos, int n, String str)
139 return this->substr (0, pos) + str + this->substr (pos + n);
143 String::append (String s)
145 strh_.append (s.to_bytes (), s.length ());
149 String::operator += (String s)
155 String::length () const
157 return strh_.length ();
166 String::compare (String const &s1, String const &s2)
168 return s1.compare (s2);
172 void *mymemmove (void *dest, void const *src, size_t n);
173 #define memmove mymemmove
176 // return array, alloced with new.
178 String::get_copy_byte () const
180 Byte const *src = strh_.to_bytes ();
181 Byte *dest = new Byte[strh_.length () + 1];
182 memcpy (dest, src, strh_.length () + 1);
187 String::get_copy_str0 () const
189 return (char *)get_copy_byte ();
196 String::prepend (String s)
206 String::to_bytes () const
208 return strh_.to_bytes ();
214 return strh_.get_bytes ();
219 String::index_last (char const c) const
224 char const *me = strh_.c_str ();
225 char const *p = (char const *)memrchr ((Byte *)me, length (), c);
231 /** find a character.
234 the index of the leftmost character #c# (0 <= return < length ()),
235 or NPOS if not found.
237 ? should return length ()?, as in string.left_string (index (delimiter))
240 String::index (char c) const
242 char const *me = strh_.c_str ();
243 char const *p = (char const *) memchr (me, c, length ());
253 index of leftmost occurrence of #searchfor#
256 String::index (String searchfor) const
258 char const *me = strh_.c_str ();
261 = (char const *) memmem (me, length (),
262 searchfor.c_str (), searchfor.length ());
270 /** find chars of a set.
274 the index of the leftmost occurance of an element of #set#. NPOS if
278 String::index_any (String set) const
284 void const *me = (void const *) strh_.c_str ();
285 for (int i = 0; i < set.length (); i++)
287 char *found = (char *) memchr (me, set[i], n);
289 return found - (char const *)me;
295 String::left_string (int n) const
305 retval.strh_.trunc (n);
310 String::right_string (int n) const
318 return String (strh_.c_str () + length () - n, n);
322 String::nomid_string (int index_i, int n) const
332 return left_string (index_i) + right_string (length () - index_i - n);
336 String::cut_string (int index_i, int n) const
344 if (!length () || (index_i < 0) || (index_i >= length ()) || (n < 1))
347 if ((n > length ()) || (index_i + n > length ()))
348 n = length () - index_i;
350 return String (c_str () + index_i, n);
355 String::to_int () const
357 return String_convert::dec2int (*this);
361 String::to_double () const
363 return String_convert::dec2double (*this);
366 #ifdef STREAM_SUPPORT
370 operator << (ostream &os, String d)
377 String::print_on (ostream &os) const
379 if (!strh_.is_binary_bo ())
382 for (int i = 0; i < length (); i++)
383 os << (Byte) (*this)[ i ];
388 String::substitute (String find, String replace)
390 int n = find.length ();
391 int m = replace.length ();
392 for (ssize i = index (find), j = 0; i != NPOS;
393 i = right_string (length () - j).index (find))
395 *this = left_string (i + j)
397 + right_string (length () - j - i - n);
404 String::substitute (char find, char replace)
406 for (ssize i = index (find); i != NPOS; i = index (find))
407 (*this)[i] = replace;
413 #endif /* !STD_STRING */