2 PROJECT: FlowerSoft C++ library
5 Rehacked by HWN 3/nov/95
7 introduced class String_handle
19 void* mymemmove( void* dest, void const* src, size_t n );
20 #define memmove mymemmove
29 *p = tolower( *p ); /* a macro on some compilers */
41 *p = toupper( *p ); /* a macro on some compilers */
47 String::String(Rational r)
49 char * n = Itoa(r.numerator()); // LEAK????
52 if (r.denominator() != 1) {
53 char * d = Itoa(r.denominator());
54 *this += String( '/' ) + String(d);
61 // return array, alloced with new.
63 String::copy_byte_p() const
65 Byte const* src = strh_.byte_c_l();
66 Byte* dest = new Byte[strh_.length_i() + 1];
67 memmove( dest, src, strh_.length_i() + 1 );
72 String::print_on(ostream& os) const
74 if ( length_i() == strlen( ch_c_l() ) )
77 for ( int i = 0; i < length_i(); i++ )
78 os << (Byte)(*this)[ i ];
81 String::String (bool b)
83 *this = (char const* ) (b ? "true" : "false");
85 String::String( char const* source )
91 String::String( Byte const* byte_l, int length_i )
93 // assert( !length_i || byte_l );// ugh. Storing null pointers?
94 strh_.set( byte_l, length_i );
98 String::operator +=(String s)
100 strh_.append( s.byte_c_l(), s.length_i() );
104 String::length_i() const
106 return strh_.length_i();
109 // will go away, fixed anyway
110 String::String( char c, int n )
113 char* ch_p = new char[ n ];
114 memset( ch_p, c, n );
115 strh_.set( (Byte*)ch_p, n );
119 String::String(int i)
121 char digits[ 81 ]; // who the fuck is 80???
123 sprintf(digits, "%d", i ); // assume radix 10
127 String::String( const int i, const int n, char const c )
135 String str = String( fill_ch, n - v.length_i() ) + String( v );
136 strh_.set( str.byte_c_l(), str.length_i() );
140 String::byte_c_l() const
142 return strh_.byte_c_l();
146 String::ch_c_l() const
148 return strh_.ch_c_l();
154 return strh_.byte_l();
163 // signed comparison, analogous to memcmp;
165 String::compare_i(String const& s1, String const& s2 )
167 Byte const* p1 = s1.byte_c_l();
168 Byte const* p2 = s2.byte_c_l();
172 int i1 = s1.length_i();
173 int i2 = s2.length_i();
176 int result= memcmp( p1, p2, i );
177 return result ? result : i1-i2;
182 String::index_last_i( char const c ) const
185 assert( length_i() == strlen( ch_c_l() ) );
189 char const* me = strh_.ch_c_l();
190 char const* p = strrchr(me, c );
197 String::index_last_i( char const* string ) const
200 assert( length_i() == strlen( ch_c_l() ) );
202 int length = strlen( string );
203 if ( !length_i() || !length )
206 int next_i = index_i( string );
211 while( next_i >= 0 ) {
213 next_i = right_str( length_i() - index_i - length ).index_i( string );
219 // return -1 if not found.
221 // ? should return length_i()?, as in string.left_str(index_i(delimiter))
223 String::index_i(char c ) const
226 assert( length_i() == strlen( ch_c_l() ) );
230 char const* me = strh_.ch_c_l();
231 char const* p = strchr( me, c );
237 // find searchfor. (what if this == "" && searchfor == "") ???
239 String::index_i( char const* searchfor ) const
242 assert( length_i() == strlen( ch_c_l() ) );
243 if ( !length_i() || !searchfor )
246 char const* me = strh_.ch_c_l();
247 char const* p = strstr(me, searchfor);
253 // find chars of a set.
255 String::index_any_i( char const* string ) const
258 assert( length_i() == strlen( ch_c_l() ) );
260 if ( !length_i() || !string )
263 char const* s = (char const* )strh_.ch_c_l();
264 char const* p = strpbrk( s, string );
271 String::left_str( int n ) const
281 retval.strh_.trunc(n);
288 String::right_str( int n ) const
296 return String( strh_.byte_c_l() + length_i() - n, n );
301 String::nomid_str( int index_i, int n ) const
305 if ( index_i >= length_i() )
308 return String( String( left_str( index_i ) ) + right_str( length_i() - index_i - n ));
313 String::mid_str( int index_i, int n ) const
315 if ( !length_i() || ( index_i < 0 ) || ( index_i >= length_i() ) || ( n < 1 ) )
318 if ( ( n > length_i() ) || ( index_i + n > length_i() ) )
319 n = length_i() - index_i;
321 return String( byte_c_l() + index_i, n );
327 String::upper_str() const
330 assert( length_i() == strlen( ch_c_l() ) );
332 char *s = str.strh_.byte_l();
340 String::lower_str() const
343 assert( length_i() == strlen( ch_c_l() ) );
345 char* s = str.strh_.ch_l();
350 String::String (double f, char const* fmt)
352 /* worst case would be printing HUGE (or 1/HUGE), which is approx
353 2e318, this number would have approx 318 zero's in its string.
355 1024 is a safe length for the buffer
360 sprintf(buf, "%f", f);
367 String::value_i() const
369 return String_convert::dec2_i( *this );
373 String::value_f() const
375 return String_convert::dec2_f( *this );
381 quoteString( String msg, String quote)
383 return msg + " `" + quote + "' ";
388 strrev( Byte* byte_l, int length_i )
391 Byte* left_byte_l = byte_l;
392 Byte* right_byte_l = byte_l + length_i;
394 while ( right_byte_l > left_byte_l ) {
396 *left_byte_l++ = *right_byte_l;
397 *right_byte_l-- = byte;
404 String::reversed_str() const
407 strrev( str.byte_l(), str.length_i() );