2 string.cc - implement String
4 (c) 1997--2006 Han-Wen Nienhuys & Jan Nieuwenhuizen
7 #ifndef _GNU_SOURCE // we want memmem
21 #include "libc-extension.hh"
22 #include "string-convert.hh"
24 /* std::string conversion helpers */
28 #include "std-string.hh"
30 String::String (Std_string const &s)
32 *this = String (s.c_str ());
35 String::operator Std_string () const
37 return Std_string (this->c_str ());
42 /* std::string interface */
44 String::String (String const &s, int pos, int n)
47 n = s.length () - pos;
49 *this = s.left_string (n);
51 *this = s.right_string (s.length () - pos).left_string (n);
54 String::String (int n, char c)
56 *this = String_convert::char_string (c, n);
60 String::c_str () const
66 String::empty () const
72 String::find (char c) const
78 String::find (String &s, int pos) const
82 String f = right_string (length () - pos);
90 String::rfind (char c) const
92 return index_last (c);
96 String::replace (int pos, int n, String str)
98 return String (*this, 0, pos) + str + String (*this, pos + n);
106 void *mymemmove (void *dest, void const *src, size_t n);
107 #define memmove mymemmove
110 // return array, alloced with new.
112 String::get_copy_byte () const
114 Byte const *src = strh_.to_bytes ();
115 Byte *dest = new Byte[strh_.length () + 1];
116 memcpy (dest, src, strh_.length () + 1);
121 String::get_copy_str0 () const
123 return (char *)get_copy_byte ();
128 copying, constructing.
131 String::operator = (String const &source)
133 strh_ = source.strh_;
137 String::String (Byte const *byte, int len_i)
139 strh_.set (byte, len_i);
147 to_string (char c, int n)
149 return String_convert::char_string (c, n);
153 to_string (double f, char const *format)
155 return String_convert::double_string (f, format);
159 to_string (int i, char const *format)
161 return String_convert::int_string (i, format);
167 return String_convert::bool_string (b);
172 return String_convert::long_string (b);
176 to_string (char const *format, ...)
179 va_start (args, format);
180 String str = String_convert::vform_string (format, args);
187 String::append (String s)
189 strh_.append (s.to_bytes (), s.length ());
192 String::operator += (String s)
198 String::prepend (String s)
205 String::length () const
207 return strh_.length ();
211 String::to_bytes () const
213 return strh_.to_bytes ();
219 return strh_.get_bytes ();
225 return strh_.get_str0 ();
229 String::is_empty () const
234 Do a signed comparison, analogous to memcmp;
237 String::compare (String const &s1, String const &s2)
239 Byte const *p1 = s1.to_bytes ();
240 Byte const *p2 = s2.to_bytes ();
245 don't forget the terminating '\0'
247 int f = min (s1.length (), s2.length ());
248 int cmp_length = 1+ f;
249 int i = memcmp (p1, p2, cmp_length);
255 String::index_last (char const c) const
260 char const *me = strh_.to_str0 ();
261 char const *p = (char const *)memrchr ((Byte *)me, length (), c);
268 String::index_last (char const *string) const // UGK!
270 assert (false); // broken
271 int len = strlen (string); // ugrh
272 if (!length () || !len)
275 int next_i = index (string);
283 next_i = right_string (length () - index_i - len).index (string);
288 /** find a character.
291 the index of the leftmost character #c# (0 <= return < length ()),
294 ? should return length ()?, as in string.left_string (index (delimiter))
297 String::index (char c) const
299 char const *me = strh_.to_str0 ();
300 char const *p = (char const *) memchr (me, c, length ());
310 index of leftmost occurrence of #searchfor#
313 String::index (String searchfor) const
315 char const *me = strh_.to_str0 ();
318 = (char const *) memmem (me, length (),
319 searchfor.to_str0 (), searchfor.length ());
327 /** find chars of a set.
331 the index of the leftmost occurance of an element of #set#. -1 if
335 String::index_any (String set) const
341 void const *me = (void const *) strh_.to_str0 ();
342 for (int i = 0; i < set.length (); i++)
344 char *found = (char *) memchr (me, set[i], n);
346 return found - (char const *)me;
352 String::left_string (int n) const
362 retval.strh_.trunc (n);
367 String::right_string (int n) const
375 return String (strh_.to_bytes () + length () - n, n);
379 String::nomid_string (int index_i, int n) const
389 return left_string (index_i) + right_string (length () - index_i - n);
393 String::cut_string (int index_i, int n) const
401 if (!length () || (index_i < 0) || (index_i >= length ()) || (n < 1))
404 if ((n > length ()) || (index_i + n > length ()))
405 n = length () - index_i;
407 return String (to_bytes () + index_i, n);
414 strnupr (get_str0 (), length ());
420 strnlwr (get_str0 (), length ());
426 memrev (get_bytes (), length ());
430 String::to_int () const
432 return String_convert::dec2int (*this);
436 String::to_double () const
438 return String_convert::dec2double (*this);
441 #ifdef STREAM_SUPPORT
443 operator << (ostream &os, String d)
450 String::print_on (ostream &os) const
452 if (!strh_.is_binary_bo ())
455 for (int i = 0; i < length (); i++)
456 os << (Byte) (*this)[ i ];
461 String::substitute (String find, String replace)
463 int n = find.length ();
464 int m = replace.length ();
465 for (int i = index (find), j = 0; i > -1;
466 i = right_string (length () - j).index (find))
468 *this = left_string (i + j)
470 + right_string (length () - j - i - n);
477 String::substitute (char find, char replace)
479 for (int i = index (find); i > - 1; i = index (find))
480 (*this)[i] = replace;