1 /****************************************************************************
2 PROJECT: FlowerSoft C++ library
5 Rehacked by HWN 3/nov/95
7 introduced Class String_handle
19 static char* strlwr( char* s )
25 *p = tolower( *p ); /* a macro on some compilers */
31 static char* strupr( char* s )
37 *p = toupper( *p ); /* a macro on some compilers */
43 // return array, alloced with new.
45 String::copy_array() const
47 const char *src = data;
48 char *dest = new char[data.len() + 1];
54 String::printOn(ostream& os) const
56 os << (const char*) data;
59 String::String (bool b)
61 *this = (const char *) (b ? "true" : "false");
63 String::String( const char* source )
70 String::operator +=(String s)
72 *this += (const char *) s;
81 String::String(char c, int n)
84 assert(n >= 0 && n <= 80); // what the fuck is 80?
85 //min(max( n, 0 ), 80);
94 char digits[ 81 ]; // who the FUCK is 80???
96 sprintf(digits, "%d", i ); // assume radix 10
100 String::String( const int i, const int n, const char c )
108 data = String( fillChar, n - v.len() ) + String( v );
109 // String convd to const char *
120 // signed comparison, analogous to strcmp;
122 String::compare( const char* test ) const
124 if (test == (const char *) data)
127 return strcmp(data, test);
132 String::lastPos( const char c ) const
134 const char *me = data;
138 const char* p = strrchr(me, c );
146 String::lastPos( const char* string ) const
149 int length = strlen( string );
150 if ( len() && length )
152 int nextpos = this->pos( string );
156 nextpos = right( len() - pos - length + 1 ).pos( string );
163 // return 0 if not found.
165 // ? should return len()?, as in string.left(pos(delimiter))
167 String::pos(char c ) const
169 const char *me = data;
173 const char* p = strchr( me, c );
180 // find searchfor. (what if this == "" && searchfor == "") ???
182 String::pos( const char* searchfor ) const
184 const char *me = data;
186 if ( len() && searchfor)
188 const char* p = strstr(me, searchfor);
195 // find chars of a set.
197 String::posAny( const char* string ) const
200 const char *s = (const char *)data;
201 if ( len() && string )
203 const char* p = strpbrk( s, string );
211 String::left( int n ) const
221 retval.data.trunc(n);
228 String::right( int n ) const
237 const char *src = (const char *)data + len() - n;
245 String::nomid( const int pos, const int n ) const
254 return String( String( left( pos - 1 ) ) + right( len() - pos - n + 1 ));
259 String::mid( int pos, int n ) const
264 // pos 1 == data->string[ 0 ];
265 // pos 0 allowed for convenience
266 if ( !len() || ( pos < 0 ) || ( pos > len() ) && ( n < 1 ) )
269 retval = ((const char *) data) + pos -1;
270 if (n > retval.len())
272 retval.data.trunc(n);
281 char *s = data.array_for_modify();
288 String String::lower()
290 char *s = data.array_for_modify();
295 String::String (double f, const char *fmt)
297 /* worst case would be printing HUGE (or 1/HUGE), which is approx
298 2e318, this number would have approx 318 zero's in its string.
300 1024 is a safe length for the buffer
305 sprintf(buf, "%f", f);
312 String::value() const
316 int conv = sscanf(data, "%ld", &l);
323 String::fvalue() const
327 int conv = sscanf(data, "%lf", &d);
334 String quoteString( String msg, String quote)
336 return msg + " `" + quote + "' ";
340 char *strrev(char *s)
344 char *q = s + strlen(s) - 1;
356 String::reversed() const
359 char *s = retval.data.array_for_modify();