]> git.donarmstrong.com Git - lilypond.git/blob - flower/stringconversion.cc
partial: 0.0.37.jcn
[lilypond.git] / flower / stringconversion.cc
1 /*
2   PROJECT: FlowerSoft C++ library
3   FILE   : stringconversion.cc
4
5 --*/
6
7
8 #include <assert.h>
9 #include "string.hh"
10
11 String
12 StringConversion::bin2hex_str( String bin_str )
13 {
14     String str;
15     Byte const* byte_c_l = bin_str.byte_c_l();
16     for ( int i = 0; i < bin_str.length_i(); i++ ) {
17         str += (char)nibble2hex_by( *byte_c_l >> 4 );
18         str += (char)nibble2hex_by( *byte_c_l++ );
19     }
20     return str;
21 }
22
23 int
24 StringConversion::bin2int_i( String bin_str )
25 {
26     assert( bin_str.length_i() <= 4 );
27
28     int result_i = 0;
29     for ( int i = 0; i < bin_str.length_i(); i++ ) {
30         result_i <<= 8;
31         result_i |= bin_str[ i ];
32     }
33     return result_i;
34 }
35
36
37 int
38 StringConversion::hex2bin_i( String hex_str, String& bin_str_r )
39 {
40     if ( hex_str.length_i() % 2 )
41         hex_str = "0" + hex_str;
42
43     bin_str_r = "";
44     Byte const* byte_c_l= hex_str.byte_c_l();
45     int i = 0;
46     while ( i < hex_str.length_i() ) {   
47         int high_i = hex2nibble_i( *byte_c_l++ );
48         int low_i = hex2nibble_i( *byte_c_l++ );
49         if ( high_i < 0 || low_i < 0 )
50             return 1; // illegal char
51         bin_str_r += String( (char)( high_i << 4 | low_i ), 1 );
52         i += 2;
53     }
54     return 0;
55 }
56
57 String 
58 StringConversion::hex2bin_str( String hex_str )
59 {
60     String str;
61 //  silly, asserts should alway be "on"!
62 //    assert( !hex2bin_i( hex_str, str ) );
63     int error_i = hex2bin_i( hex_str, str );
64     assert( !error_i );
65     return str;
66 }
67
68 int 
69 StringConversion::hex2nibble_i( Byte by )
70 {
71     if ( by >= '0' && by <= '9' )
72         return by - '0';
73     if ( by >= 'A' && by <= 'F' )
74         return by - 'A' + 10;
75     if ( by >= 'a' && by <= 'f')
76         return by - 'a' + 10;
77     return -1;
78 }
79     
80 String 
81 StringConversion::int2hex_str( int i, int length_i, char ch )
82 {
83     String str;
84     if ( !i )
85         str = "0";
86     while ( i ) {
87         str = ( i % 16 )["0123456789abcdef"] + str;
88         i /= 16;
89     }
90     if ( str.length_i() < length_i )
91         str = String( ch, length_i - str.length_i() ) + str;
92     return str;
93 }
94
95 Byte
96 StringConversion::nibble2hex_by( Byte by )
97 {
98     if ( ( by & 0x0f ) <= 9 )
99         return ( by & 0x0f ) + '0';
100     else
101         return ( by & 0x0f ) - 10 + 'a';
102 }