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
54 if (n == (ssize)-1 || n == (ssize)INT_MAX || n == NPOS)
56 return cut_string (pos, n);
58 if (n == (ssize)-1 || n == (ssize)INT_MAX || n == NPOS)
61 return left_string (n);
63 return right_string (length () - pos).left_string (n);
68 String::insert (ssize pos, String s)
70 *this = substr (0, pos) + s + substr (pos + 1);
75 String::copy (char *buf, ssize n, ssize pos) const
78 memcpy (buf, strh_.to_bytes (), strh_.length () + 1);
83 String::compare (String const &s) const
85 char const *p1 = c_str ();
86 char const *p2 = s.c_str ();
91 don't forget the terminating '\0'
93 int f = min (length (), s.length ());
94 int cmp_length = 1+ f;
95 int i = memcmp (p1, p2, cmp_length);
100 String::data () const
102 return (char const*) to_bytes ();
106 String::empty () const
112 String::find (char c, int pos) const
114 String f = right_string (length () - pos);
115 ssize n = f.index (c);
122 String::find (char const *c, int pos) const
124 return find (String (c), pos);
128 String::find (String s, int pos) const
132 String f = right_string (length () - pos);
133 ssize n = f.index (s);
140 String::rfind (char c) const
142 return index_last (c);
146 String::replace (int pos, int n, String str)
148 return this->substr (0, pos) + str + this->substr (pos + n);
152 String::append (String s)
154 strh_.append (s.to_bytes (), s.length ());
158 String::operator += (String s)
164 String::length () const
166 return strh_.length ();
175 String::compare (String const &s1, String const &s2)
177 return s1.compare (s2);
181 void *mymemmove (void *dest, void const *src, size_t n);
182 #define memmove mymemmove
185 // return array, alloced with new.
187 String::get_copy_byte () const
189 Byte const *src = strh_.to_bytes ();
190 Byte *dest = new Byte[strh_.length () + 1];
191 memcpy (dest, src, strh_.length () + 1);
196 String::get_copy_str0 () const
198 return (char *)get_copy_byte ();
205 String::prepend (String s)
215 String::to_bytes () const
217 return strh_.to_bytes ();
223 return strh_.get_bytes ();
228 String::index_last (char const c) const
233 char const *me = strh_.c_str ();
234 char const *p = (char const *)memrchr ((Byte *)me, length (), c);
240 /** find a character.
243 the index of the leftmost character #c# (0 <= return < length ()),
244 or NPOS if not found.
246 ? should return length ()?, as in string.left_string (index (delimiter))
249 String::index (char c) const
251 char const *me = strh_.c_str ();
252 char const *p = (char const *) memchr (me, c, length ());
262 index of leftmost occurrence of #searchfor#
265 String::index (String searchfor) const
267 char const *me = strh_.c_str ();
270 = (char const *) memmem (me, length (),
271 searchfor.c_str (), searchfor.length ());
279 /** find chars of a set.
283 the index of the leftmost occurance of an element of #set#. NPOS if
287 String::index_any (String set) const
293 void const *me = (void const *) strh_.c_str ();
294 for (int i = 0; i < set.length (); i++)
296 char *found = (char *) memchr (me, set[i], n);
298 return found - (char const *)me;
304 String::left_string (int n) const
314 retval.strh_.trunc (n);
319 String::right_string (int n) const
327 return String (strh_.c_str () + length () - n, n);
331 String::nomid_string (int index_i, int n) const
341 return left_string (index_i) + right_string (length () - index_i - n);
345 String::cut_string (int index_i, int n) const
353 if (!length () || (index_i < 0) || (index_i >= length ()) || (n < 1))
356 if ((n > length ()) || (index_i + n > length ()))
357 n = length () - index_i;
359 return String (c_str () + index_i, n);
364 String::to_int () const
366 return String_convert::dec2int (*this);
370 String::to_double () const
372 return String_convert::dec2double (*this);
375 #ifdef STREAM_SUPPORT
379 operator << (ostream &os, String d)
386 String::print_on (ostream &os) const
388 if (!strh_.is_binary_bo ())
391 for (int i = 0; i < length (); i++)
392 os << (Byte) (*this)[ i ];
397 String::substitute (String find, String replace)
399 int n = find.length ();
400 int m = replace.length ();
401 for (ssize i = index (find), j = 0; i != NPOS;
402 i = right_string (length () - j).index (find))
404 *this = left_string (i + j)
406 + right_string (length () - j - i - n);
413 String::substitute (char find, char replace)
415 for (ssize i = index (find); i != NPOS; i = index (find))
416 (*this)[i] = replace;
422 #endif /* !STD_STRING */