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 ();
138 return strh_.get_bytes ();
144 return strh_.get_str0 ();
148 String::is_empty () const
153 Do a signed comparison, analogous to memcmp;
156 String::compare (String const &s1, String const &s2)
158 Byte const *p1 = s1.to_bytes ();
159 Byte const *p2 = s2.to_bytes ();
164 don't forget the terminating '\0'
166 int f = min (s1.length (), s2.length ());
167 int cmp_length = 1+ f;
168 int i = memcmp (p1, p2, cmp_length);
174 String::index_last (char const c) const
179 char const *me = strh_.to_str0 ();
180 char const *p = (char const *)memrchr ((Byte *)me, length (), c);
187 String::index_last (char const *string) const // UGK!
189 assert (false); // broken
190 int len = strlen (string); // ugrh
191 if (!length () || !len)
194 int next_i = index (string);
202 next_i = right_string (length () - index_i - len).index (string);
207 /** find a character.
210 the index of the leftmost character #c# (0 <= return < length ()),
213 ? should return length ()?, as in string.left_string (index (delimiter))
216 String::index (char c) const
218 char const *me = strh_.to_str0 ();
219 char const *p = (char const *) memchr (me, c, length ());
229 index of leftmost occurrence of #searchfor#
232 String::index (String searchfor) const
234 char const *me = strh_.to_str0 ();
236 char const *p = (char const *)
237 memmem (me, length (), searchfor.to_str0 (), searchfor.length ());
245 /** find chars of a set.
249 the index of the leftmost occurance of an element of #set#. -1 if
253 String::index_any (String set) const
259 void const *me = (void const *) strh_.to_str0 ();
260 for (int i = 0; i < set.length (); i++)
262 char *found = (char *) memchr (me, set[i], n);
264 return found - (char const *)me;
270 String::left_string (int n) const
280 retval.strh_.trunc (n);
285 String::right_string (int n) const
293 return String (strh_.to_bytes () + length () - n, n);
297 String::nomid_string (int index_i, int n) const
307 return left_string (index_i) + right_string (length () - index_i - n);
311 String::cut_string (int index_i, int n) const
319 if (!length () || (index_i < 0) || (index_i >= length ()) || (n < 1))
322 if ((n > length ()) || (index_i + n > length ()))
323 n = length () - index_i;
325 return String (to_bytes () + index_i, n);
332 strnupr (get_str0 (), length ());
338 strnlwr (get_str0 (), length ());
344 memrev (get_bytes (), length ());
348 String::to_int () const
350 return String_convert::dec2int (*this);
354 String::to_double () const
356 return String_convert::dec2double (*this);
359 #ifdef STREAM_SUPPORT
361 operator << (ostream &os, String d)
368 String::print_on (ostream &os) const
370 if (!strh_.is_binary_bo ())
373 for (int i = 0; i < length (); i++)
374 os << (Byte) (*this)[ i ];
379 String::substitute (String find, String replace)
381 int n = find.length ();
382 int m = replace.length ();
383 for (int i = index (find), j = 0; i > -1;
384 i = right_string (length () - j).index (find))
386 *this = left_string (i + j)
388 + right_string (length () - j - i - n);
395 String::substitute (char find, char replace)
397 for (int i = index (find); i > - 1; i = index (find))
398 (*this)[i] = replace;