2 string.cc - implement String
4 (c) 1997--2005 Han-Wen Nienhuys & Jan Nieuwenhuizen
7 #ifndef _GNU_SOURCE // we want memmem
20 #include "libc-extension.hh"
21 #include "string-convert.hh"
24 void *mymemmove (void *dest, void const *src, size_t n);
25 #define memmove mymemmove
28 // return array, alloced with new.
30 String::get_copy_byte () const
32 Byte const *src = strh_.to_bytes ();
33 Byte *dest = new Byte[strh_.length () + 1];
34 memcpy (dest, src, strh_.length () + 1);
39 String::get_copy_str0 () const
41 return (char *)get_copy_byte ();
46 copying, constructing.
49 String::operator = (String const &source)
55 String::String (Byte const *byte, int len_i)
57 strh_.set (byte, len_i);
65 to_string (char c, int n)
67 return String_convert::char_string (c, n);
71 to_string (double f, char const *format)
73 return String_convert::double_string (f, format);
77 to_string (int i, char const *format)
79 return String_convert::int_string (i, format);
85 return String_convert::bool_string (b);
90 return String_convert::long_string (b);
94 to_string (char const *format, ...)
97 va_start (args, format);
98 String str = String_convert::vform_string (format, args);
105 String::append (String s)
107 strh_.append (s.to_bytes (), s.length ());
110 String::operator += (String s)
116 String::prepend (String s)
123 String::length () const
125 return strh_.length ();
129 String::to_bytes () const
131 return strh_.to_bytes ();
137 return strh_.get_bytes ();
143 return strh_.get_str0 ();
147 String::is_empty () const
152 Do a signed comparison, analogous to memcmp;
155 String::compare (String const &s1, String const &s2)
157 Byte const *p1 = s1.to_bytes ();
158 Byte const *p2 = s2.to_bytes ();
163 don't forget the terminating '\0'
165 int f = min (s1.length (), s2.length ());
166 int cmp_length = 1+ f;
167 int i = memcmp (p1, p2, cmp_length);
173 String::index_last (char const c) const
178 char const *me = strh_.to_str0 ();
179 char const *p = (char const *)memrchr ((Byte *)me, length (), c);
186 String::index_last (char const *string) const // UGK!
188 assert (false); // broken
189 int len = strlen (string); // ugrh
190 if (!length () || !len)
193 int next_i = index (string);
201 next_i = right_string (length () - index_i - len).index (string);
206 /** find a character.
209 the index of the leftmost character #c# (0 <= return < length ()),
212 ? should return length ()?, as in string.left_string (index (delimiter))
215 String::index (char c) const
217 char const *me = strh_.to_str0 ();
218 char const *p = (char const *) memchr (me, c, length ());
228 index of leftmost occurrence of #searchfor#
231 String::index (String searchfor) const
233 char const *me = strh_.to_str0 ();
235 char const *p = (char const *)
236 memmem (me, length (), searchfor.to_str0 (), searchfor.length ());
244 /** find chars of a set.
248 the index of the leftmost occurance of an element of #set#. -1 if
252 String::index_any (String set) const
258 void const *me = (void const *) strh_.to_str0 ();
259 for (int i = 0; i < set.length (); i++)
261 char *found = (char *) memchr (me, set[i], n);
263 return found - (char const *)me;
269 String::left_string (int n) const
279 retval.strh_.trunc (n);
284 String::right_string (int n) const
292 return String (strh_.to_bytes () + length () - n, n);
296 String::nomid_string (int index_i, int n) const
306 return left_string (index_i) + right_string (length () - index_i - n);
310 String::cut_string (int index_i, int n) const
318 if (!length () || (index_i < 0) || (index_i >= length ()) || (n < 1))
321 if ((n > length ()) || (index_i + n > length ()))
322 n = length () - index_i;
324 return String (to_bytes () + index_i, n);
331 strnupr (get_str0 (), length ());
337 strnlwr (get_str0 (), length ());
343 memrev (get_bytes (), length ());
347 String::to_int () const
349 return String_convert::dec2int (*this);
353 String::to_double () const
355 return String_convert::dec2double (*this);
358 #ifdef STREAM_SUPPORT
360 operator << (ostream &os, String d)
367 String::print_on (ostream &os) const
369 if (!strh_.is_binary_bo ())
372 for (int i = 0; i < length (); i++)
373 os << (Byte) (*this)[ i ];
378 String::substitute (String find, String replace)
380 int n = find.length ();
381 int m = replace.length ();
382 for (int i = index (find), j = 0; i > -1;
383 i = right_string (length () - j).index (find))
385 *this = left_string (i + j)
387 + right_string (length () - j - i - n);
394 String::substitute (char find, char replace)
396 for (int i = index (find); i > - 1; i = index (find))
397 (*this)[i] = replace;