2 PROJECT: FlowerSoft C++ library
3 FILE : string-convert.cc
10 #include "string-convert.hh"
13 a safe length for stringconversion buffers
15 worst case would be %f printing HUGE (or 1/HUGE), which is approx
16 2e318, this number would have approx 318 zero's in its string.
18 Should enlarge buff dynamically.
22 static const int STRING_BUFFER_LEN=1024;
25 String_convert::bin2hex_str( String bin_str )
28 Byte const* byte_c_l = bin_str.byte_c_l();
29 for ( int i = 0; i < bin_str.length_i(); i++ ) {
30 str += (char)nibble2hex_byte( *byte_c_l >> 4 );
31 str += (char)nibble2hex_byte( *byte_c_l++ );
37 String_convert::bin2_i( String bin_str )
39 assert( bin_str.length_i() <= 4 );
42 for ( int i = 0; i < bin_str.length_i(); i++ ) {
44 result_i += (Byte)bin_str[ i ];
49 // breendet imp from String
51 String_convert::dec2_i( String dec_str )
53 if ( !dec_str.length_i() )
57 int conv = sscanf( dec_str.ch_c_l(), "%ld", &l );
64 String_convert::longlong_str(long long ll, char const* fmt)
66 char buffer[STRING_BUFFER_LEN];
67 snprintf(buffer, STRING_BUFFER_LEN,
68 (fmt ? fmt : "%Ld"), ll ); // assume radix 10
69 return String(buffer);
72 // breendet imp from String
74 String_convert::dec2_f( String dec_str )
76 if ( !dec_str.length_i() )
79 int conv = sscanf( dec_str.ch_c_l(), "%lf", &d );
85 String_convert::hex2bin_i( String hex_str, String& bin_str_r )
87 if ( hex_str.length_i() % 2 )
88 hex_str = "0" + hex_str;
91 Byte const* byte_c_l= hex_str.byte_c_l();
93 while ( i < hex_str.length_i() ) {
94 int high_i = hex2nibble_i( *byte_c_l++ );
95 int low_i = hex2nibble_i( *byte_c_l++ );
96 if ( high_i < 0 || low_i < 0 )
97 return 1; // illegal char
98 bin_str_r += String( (char)( high_i << 4 | low_i ), 1 );
105 String_convert::hex2bin_str( String hex_str )
108 // silly, asserts should alway be "on"!
109 // assert( !hex2bin_i( hex_str, str ) );
110 int error_i = hex2bin_i( hex_str, str );
116 String_convert::hex2nibble_i( Byte byte )
118 if ( byte >= '0' && byte <= '9' )
120 if ( byte >= 'A' && byte <= 'F' )
121 return byte - 'A' + 10;
122 if ( byte >= 'a' && byte <= 'f')
123 return byte - 'a' + 10;
127 // stupido. Should use int_str()
129 String_convert::i2dec_str( int i, int length_i, char ch )
139 return String( fill_ch, length_i - dec_str.length_i() ) + dec_str;
143 // stupido. Should use int_str()
145 String_convert::i2hex_str( int i, int length_i, char ch )
151 str = ( i % 16 )["0123456789abcdef"] + str;
154 if ( str.length_i() < length_i )
155 str = String( ch, length_i - str.length_i() ) + str;
160 String_convert::nibble2hex_byte( Byte byte )
162 if ( ( byte & 0x0f ) <= 9 )
163 return ( byte & 0x0f ) + '0';
165 return ( byte & 0x0f ) - 10 + 'a';
168 Convert an integer to a string
171 #fmt# is a printf style format, default assumes "%d" as format.
174 String_convert::int_str(int i, char const* fmt)
176 char buffer[STRING_BUFFER_LEN];
177 snprintf(buffer, STRING_BUFFER_LEN,
178 (fmt ? fmt : "%d"), i ); // assume radix 10
179 return String(buffer);
183 Convert a double to a string.
185 @param #fmt# is a printf style format, default assumes "%lf" as format
188 String_convert::double_str(double f, char const* fmt)
190 char buf[STRING_BUFFER_LEN];
192 snprintf(buf, STRING_BUFFER_LEN, fmt ? fmt : "%f", f);
197 Make a string from a single character.
200 #n# is a repetition count, default value is 1
203 String_convert::char_str(char c, int n)
206 char* ch_p = new char[ n ];
207 memset( ch_p, c, n );
208 String s((Byte*)ch_p, n);
214 String_convert::rational_str(Rational r)
216 char * n = Itoa(r.numerator()); // LEAK????
219 if (r.denominator() != 1) {
220 char * d = Itoa(r.denominator());
221 s += String( '/' ) + String(d);
230 String_convert::pointer_str(const void *l)
232 long long int ill = (long long int )l;
233 return String_convert::longlong_str(ill, "0x%0Lx");