2 PROJECT: FlowerSoft C++ library
5 Rehacked by HWN 3/nov/95
7 introduced Class String_handle
26 *p = tolower( *p ); /* a macro on some compilers */
39 *p = toupper( *p ); /* a macro on some compilers */
45 String::String(Rational r)
47 char * n = Itoa(r.numerator()); // LEAK????
50 if (r.denominator() != 1) {
51 char * d = Itoa(r.denominator());
52 *this += String( '/' ) + String(d);
59 // return array, alloced with new.
61 String::copy_by_p() const
63 Byte const* src = strh_.by_c_l();
64 Byte* dest = new Byte[strh_.length_i() + 1];
65 memmove( dest, src, strh_.length_i() + 1 );
70 String::printOn(ostream& os) const
72 if ( length_i() == strlen( ch_c_l() ) )
75 for ( int i = 0; i < length_i(); i++ )
76 os << (Byte)(*this)[ i ];
79 String::String (bool b)
81 *this = (char const* ) (b ? "true" : "false");
83 String::String( char const* source )
89 String::String( Byte const* by_l, int length_i )
91 assert( !length_i || by_l );
92 strh_.set( by_l, length_i );
96 String::operator +=(String s)
98 strh_.append( s.by_c_l(), s.length_i() );
102 String::length_i() const
104 return strh_.length_i();
107 String::String(char c, int n)
110 assert(n >= 0 && n <= 80); // what the fuck is 80?
111 //min(max( n, 0 ), 80);
116 strh_.set( (Byte*)s, 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( fillChar, n - v.length_i() ) + String( v );
136 strh_.set( str.by_c_l(), str.length_i() );
140 String::by_c_l() const
142 return strh_.by_c_l();
146 String::ch_c_l() const
148 return strh_.ch_c_l();
163 // signed comparison, analogous to memcmp;
165 String::compare(String const& s1, String const& s2 )
167 Byte const* p1 = s1.by_c_l();
168 Byte const* p2 = s2.by_c_l();
172 int i1 = s1.length_i();
173 int i2 = s2.length_i();
179 int result = memcmp( p1, p2, i );
181 return (result)? result : i1 - i2;
186 String::lastPos( char const c ) const
189 assert( length_i() == strlen( ch_c_l() ) );
190 char const* me = strh_.ch_c_l();
194 char const* p = strrchr(me, c );
202 String::lastPos( char const* string ) const
205 assert( length_i() == strlen( ch_c_l() ) );
207 int length = strlen( string );
208 if ( length_i() && length )
210 int nextpos = this->pos( string );
214 nextpos = right( length_i() - pos - length + 1 ).pos( string );
221 // return 0 if not found.
223 // ? should return length_i()?, as in string.left(pos(delimiter))
225 String::pos(char c ) const
228 assert( length_i() == strlen( ch_c_l() ) );
229 char const* me = strh_.ch_c_l();
233 char const* p = strchr( me, c );
240 // find searchfor. (what if this == "" && searchfor == "") ???
242 String::pos( char const* searchfor ) const
245 assert( length_i() == strlen( ch_c_l() ) );
246 char const* me = strh_.ch_c_l();
248 if ( length_i() && searchfor)
250 char const* p = strstr(me, searchfor);
257 // find chars of a set.
259 String::posAny( char const* string ) const
262 assert( length_i() == strlen( ch_c_l() ) );
264 char const* s = (char const* )strh_.ch_c_l();
265 if ( length_i() && string )
267 char const* p = strpbrk( s, string );
275 String::left( int n ) const
285 retval.strh_.trunc(n);
292 String::right( int n ) const
300 return String( strh_.by_c_l() + length_i() - n, n );
305 String::nomid( const int pos, const int n ) const
311 if ( pos > length_i())
314 return String( String( left( pos - 1 ) ) + right( length_i() - pos - n + 1 ));
319 String::mid( int pos, int n ) const
321 // HWN. This SUX: JCN: yep, please change me + all my invocations
322 // pos 1 == strh_->string[ 0 ];
323 // pos 0 allowed for convenience
324 if ( !length_i() || ( pos < 0 ) || ( pos > length_i() ) && ( n < 1 ) )
328 if ( ( n > length_i() ) || ( pos + n - 1 > length_i() ) )
329 n = length_i() - pos + 1;
331 return String( by_c_l() + pos -1, n );
340 assert( length_i() == strlen( ch_c_l() ) );
341 char *s = strh_.by_l();
352 assert( length_i() == strlen( ch_c_l() ) );
353 char* s = strh_.by_l();
358 String::String (double f, char const* fmt)
360 /* worst case would be printing HUGE (or 1/HUGE), which is approx
361 2e318, this number would have approx 318 zero's in its string.
363 1024 is a safe length for the buffer
368 sprintf(buf, "%f", f);
375 String::value() const
379 int conv = sscanf(strh_.ch_c_l(), "%ld", &l);
386 String::fvalue() const
390 int conv = sscanf(strh_.ch_c_l(), "%lf", &d);
397 String quoteString( String msg, String quote)
399 return msg + " `" + quote + "' ";
404 strrev( Byte* by_l, int length_i )
407 Byte* left_by_l = by_l;
408 Byte* right_by_l = by_l + length_i;
410 while ( right_by_l > left_by_l ) {
412 *left_by_l++ = *right_by_l;
420 String::reversed() const
423 strrev( str.by_l(), str.length_i() );