3 string.cc - implement String
5 (c) 1997--2000 Han-Wen Nienhuys & Jan Nieuwenhuizen
9 #ifndef _GNU_SOURCE // we want memmem
22 #include "libc-extension.hh"
23 #include "string-convert.hh"
26 void* mymemmove (void* dest, void const* src, size_t n);
27 #define memmove mymemmove
30 // return array, alloced with new.
32 String::copy_byte_p () const
34 Byte const* src = strh_.byte_C ();
35 Byte* dest = new Byte[strh_.length_i () + 1];
36 memcpy (dest, src, strh_.length_i () + 1);
41 String::copy_ch_p () const
43 return (char*)copy_byte_p ();
48 copying, constructing.
51 String::operator = (String const&source)
58 String::String (Byte const* byte_l, int len_i)
60 strh_.set (byte_l, len_i);
68 to_str (char c, int n)
70 return String_convert::char_str (c, n);
74 to_str (double f, char const* format)
76 return String_convert::double_str (f, format);
80 to_str (int i, char const * format)
82 return String_convert::int_str (i, format);
88 return String_convert::bool_str (b);
93 return String_convert::long_str (b);
97 to_str (char const* format, ... )
100 va_start (args, format);
101 String str = String_convert::vform_str (format, args);
108 String::append (String s)
110 strh_.append (s.byte_C (), s.length_i ());
113 String::operator += (String s)
119 String::prepend (String s)
126 String::length_i () const
128 return strh_.length_i ();
132 String::byte_C () const
134 return strh_.byte_C ();
138 String::ch_C () const
140 return strh_.ch_C ();
146 return strh_.byte_l ();
152 return strh_.ch_l ();
156 String::empty_b () const
161 Do a signed comparison, analogous to memcmp;
164 String::compare_i (String const& s1, String const& s2)
166 Byte const* p1 = s1.byte_C ();
167 Byte const* p2 = s2.byte_C ();
172 don't forget the terminating '\0'
174 int f = (s1.length_i () <? s2.length_i ());
175 int cmp_length = 1+ f;
176 int i = memcmp (p1, p2, cmp_length);
182 String::index_last_i (char const c) const
187 char const* me = strh_.ch_C ();
188 char const* p = (char const*)memrchr ((Byte*)me, length_i (), c);
195 String::index_last_i (char const* string) const // UGK!
197 assert (false); // broken
198 int len = strlen (string); // ugrh
199 if (!length_i () || !len)
202 int next_i = index_i (string);
210 next_i = right_str (length_i () - index_i - len).index_i (string );
215 /** find a character.
218 the index of the leftmost character #c# (0 <= return < length_i ()),
221 ? should return length_i ()?, as in string.left_str (index_i (delimiter))
224 String::index_i (char c) const
226 char const* me = strh_.ch_C ();
227 char const* p = (char const *) memchr (me,c, length_i ());
237 1 index of leftmost occurrence of #searchfor#
240 String::index_i (String searchfor) const
242 char const* me = strh_.ch_C ();
244 char const* p = (char const *)
245 memmem (me, length_i (), searchfor.ch_C (), searchfor.length_i ());
253 /** find chars of a set.
257 the index of the leftmost occurance of an element of #set#. -1 if
263 String::index_any_i (String set) const
269 void const * me_l = (void const *) strh_.ch_C ();
270 for (int i=0; i < set.length_i (); i++)
272 char * found= (char*) memchr (me_l, set[i], n );
275 return found - (char const*)me_l;
282 String::left_str (int n) const
284 if (n >= length_i ())
292 retval.strh_.trunc (n);
297 String::right_str (int n) const
305 return String (strh_.byte_C () + length_i () - n, n);
310 String::nomid_str (int index_i, int n) const
322 right_str (length_i () - index_i - n) ;
326 String::cut_str (int index_i, int n) const
334 if (!length_i () || (index_i < 0) || (index_i >= length_i () ) || (n < 1 ) )
337 if ((n > length_i ()) || (index_i + n > length_i () ) )
338 n = length_i () - index_i;
340 return String (byte_C () + index_i, n);
344 String::upper_str () const
353 char *s = (char*)strh_.byte_l ();
354 strnupr (s ,length_i ());
360 char* s = strh_.ch_l ();
361 strnlwr (s,length_i ());
366 String::lower_str () const
373 String::reversed_str () const
376 strrev (str.byte_l (), str.length_i ());
381 String::value_i () const
383 return String_convert::dec2_i (*this);
387 String::value_f () const
389 return String_convert::dec2_f (*this);
392 #ifdef STREAM_SUPPORT
394 operator << (ostream& os, String d)
402 String::print_on (ostream& os) const
404 if (!strh_.is_binary_bo ())
407 for (int i = 0; i < length_i (); i++)
408 os << (Byte) (*this)[ i ];