2 PROJECT: FlowerSoft C++ library
3 FILE : string-convert.cc
9 #include "libc-extension.hh"
11 #include "string-convert.hh"
14 a safe length for stringconversion buffers
16 worst case would be %f printing HUGE (or 1/HUGE), which is approx
17 2e318, this number would have approx 318 zero's in its string.
19 Should enlarge buff dynamically.
23 static const int STRING_BUFFER_LEN=1024;
26 String_convert::bin2hex_str( String bin_str )
29 Byte const* byte_c_l = bin_str.byte_c_l();
30 for ( int i = 0; i < bin_str.length_i(); i++ ) {
31 str += (char)nibble2hex_byte( *byte_c_l >> 4 );
32 str += (char)nibble2hex_byte( *byte_c_l++ );
38 String_convert::bin2_i( String bin_str )
40 assert( bin_str.length_i() <= 4 );
43 for ( int i = 0; i < bin_str.length_i(); i++ ) {
45 result_i += (Byte)bin_str[ i ];
50 // breendet imp from String
52 String_convert::dec2_i( String dec_str )
54 if ( !dec_str.length_i() )
58 int conv = sscanf( dec_str.ch_c_l(), "%ld", &l );
65 String_convert::longlong_str(long long ll, char const* fmt)
67 char buffer[STRING_BUFFER_LEN];
68 snprintf(buffer, STRING_BUFFER_LEN,
69 (fmt ? fmt : "%Ld"), ll ); // assume radix 10
70 return String(buffer);
73 // breendet imp from String
75 String_convert::dec2_f( String dec_str )
77 if ( !dec_str.length_i() )
80 int conv = sscanf( dec_str.ch_c_l(), "%lf", &d );
86 String_convert::hex2bin_i( String hex_str, String& bin_str_r )
88 if ( hex_str.length_i() % 2 )
89 hex_str = "0" + hex_str;
92 Byte const* byte_c_l= hex_str.byte_c_l();
94 while ( i < hex_str.length_i() ) {
95 int high_i = hex2nibble_i( *byte_c_l++ );
96 int low_i = hex2nibble_i( *byte_c_l++ );
97 if ( high_i < 0 || low_i < 0 )
98 return 1; // illegal char
99 bin_str_r += String( (char)( high_i << 4 | low_i ), 1 );
106 String_convert::hex2bin_str( String hex_str )
109 // silly, asserts should alway be "on"!
110 // assert( !hex2bin_i( hex_str, str ) );
111 int error_i = hex2bin_i( hex_str, str );
117 String_convert::hex2nibble_i( Byte byte )
119 if ( byte >= '0' && byte <= '9' )
121 if ( byte >= 'A' && byte <= 'F' )
122 return byte - 'A' + 10;
123 if ( byte >= 'a' && byte <= 'f')
124 return byte - 'a' + 10;
128 // stupido. Should use int_str()
130 String_convert::i2dec_str( int i, int length_i, char ch )
140 return String( fill_ch, length_i - dec_str.length_i() ) + dec_str;
144 // stupido. Should use int_str()
146 String_convert::i2hex_str( int i, int length_i, char ch )
152 str = String( ( i % 16 )["0123456789abcdef"] ) + str;
155 if ( str.length_i() < length_i )
156 str = String( ch, length_i - str.length_i() ) + str;
161 String_convert::nibble2hex_byte( Byte byte )
163 if ( ( byte & 0x0f ) <= 9 )
164 return ( byte & 0x0f ) + '0';
166 return ( byte & 0x0f ) - 10 + 'a';
169 Convert an integer to a string
172 #fmt# is a printf style format, default assumes "%d" as format.
175 String_convert::int_str(int i, char const* fmt)
177 char buffer[STRING_BUFFER_LEN];
178 snprintf(buffer, STRING_BUFFER_LEN,
179 (fmt ? fmt : "%d"), i ); // assume radix 10
180 return String(buffer);
184 Convert a double to a string.
186 @param #fmt# is a printf style format, default assumes "%lf" as format
189 String_convert::double_str(double f, char const* fmt)
191 char buf[STRING_BUFFER_LEN];
193 snprintf(buf, STRING_BUFFER_LEN, fmt ? fmt : "%f", f);
198 Make a string from a single character.
201 #n# is a repetition count, default value is 1
204 String_convert::char_str(char c, int n)
207 char* ch_p = new char[ n ];
208 memset( ch_p, c, n );
209 String s((Byte*)ch_p, n);
215 String_convert::rational_str(Rational r)
217 char * n = Itoa(r.numerator()); // LEAK????
220 if (r.denominator() != 1) {
221 char * d = Itoa(r.denominator());
222 s += String( '/' ) + String(d);
231 String_convert::pointer_str(const void *l)
233 long long int ill = (long long int )l;
234 return String_convert::longlong_str(ill, "0x%0Lx");