3 string.cc - implement String
5 (c) 1997 Han-Wen Nienhuys & Jan Nieuwenhuizen
9 #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::copy_byte_p() const
32 Byte const* src = strh_.byte_C();
33 Byte* dest = new Byte[strh_.length_i() + 1];
34 memcpy (dest, src, strh_.length_i() + 1);
38 String::print_on (ostream& os) const
40 if (!strh_.is_binary_bo())
43 for (int i = 0; i < length_i(); i++)
44 os << (Byte)(*this)[ i ];
48 copying, constructing.
51 String::operator = (String const&source)
58 String::String (Rational r)
60 *this = String_convert::rational_str (r);
63 String::String (double f, char const* fmt)
65 *this= String_convert::double_str (f,fmt);
68 String::String (char c, int n)
70 *this = String_convert::char_str (c,n);
75 String_convert::int_str
77 String::String (int i, char const * format)
79 *this = String_convert::int_str (i,format);
82 String::String (bool b)
84 *this = (char const*) (b ? "true" : "false");
87 String::String (char const* source)
93 String::String (Byte const* byte_l, int length_i)
95 strh_.set (byte_l, length_i);
99 String::append (String s)
101 strh_.append (s.byte_C(), s.length_i());
104 String::operator +=(String s)
110 String::prepend (String s)
117 String::length_i() const
119 return strh_.length_i();
123 String::byte_C() const
125 return strh_.byte_C();
137 return strh_.byte_l();
147 String::empty_b () const
152 Do a signed comparison, analogous to memcmp;
155 String::compare_i (String const& s1, String const& s2)
157 Byte const* p1 = s1.byte_C();
158 Byte const* p2 = s2.byte_C();
163 don't forget the terminating '\0'
165 int f = (s1.length_i() <? s2.length_i());
166 int cmp_length = 1+ f;
167 return memcmp (p1, p2, cmp_length);
172 String::index_last_i (char const c) const
177 char const* me = strh_.ch_C();
178 char const* p = memrchr ((Byte*)me, length_i(), c);
185 String::index_last_i (char const* string) const // UGK!
187 assert (false); // broken
188 int length = strlen (string); // ugrh
189 if (!length_i() || !length)
192 int next_i = index_i (string);
200 next_i = right_str (length_i() - index_i - length).index_i (string );
205 /** find a character.
208 the index of the leftmost character #c# (0 <= return < length_i()),
211 ? should return length_i()?, as in string.left_str (index_i (delimiter))
214 String::index_i (char c) const
216 char const* me = strh_.ch_C();
217 char const* p = (char const *) memchr (me,c, length_i());
227 1 index of leftmost occurrence of #searchfor#
230 String::index_i (String searchfor) const
232 char const* me = strh_.ch_C();
234 char const* p = (char const *)
235 memmem (me, length_i(), searchfor.ch_C(), searchfor.length_i ());
243 /** find chars of a set.
246 the index of the leftmost occurance of an element of #set#
249 String::index_any_i (String set) const
255 void const * me_l = (void const *) strh_.ch_C();
256 for (int i=0; i < set.length_i(); i++)
258 char * found=(char*) memchr (me_l, set[i], n );
268 String::left_str (int n) const
278 retval.strh_.trunc (n);
283 String::right_str (int n) const
291 return String (strh_.byte_C() + length_i() - n, n);
296 String::nomid_str (int index_i, int n) const
308 right_str (length_i() - index_i - n) ;
312 String::cut (int index_i, int n) const
320 if (!length_i() || (index_i < 0) || (index_i >= length_i () ) || (n < 1 ) )
323 if ((n > length_i()) || (index_i + n > length_i () ) )
324 n = length_i() - index_i;
326 return String (byte_C() + index_i, n);
330 String::upper_str() const
339 char *s = (char*)strh_.byte_l();
340 strnupr (s ,length_i());
346 char* s = strh_.ch_l();
347 strnlwr (s,length_i());
352 String::lower_str() const
359 String::reversed_str() const
362 strrev (str.byte_l(), str.length_i ());
367 String::value_i() const
369 return String_convert::dec2_i (*this);
373 String::value_f() const
375 return String_convert::dec2_f (*this);