Code

Mnemonics in "Export bitmap", and "Rows and Columns" dialogs (Bug 170765)
[inkscape.git] / cxxtest / cxxtest / ValueTraits.cpp
1 #ifndef __cxxtest__ValueTraits_cpp__
2 #define __cxxtest__ValueTraits_cpp__
4 #include <cxxtest/ValueTraits.h>
6 namespace CxxTest 
7 {
8     //
9     // Non-inline functions from ValueTraits.h
10     //
11     
12     char digitToChar( unsigned digit )
13     {
14         if ( digit < 10 )
15             return (char)('0' + digit);
16         if ( digit <= 10 + 'Z' - 'A' )
17             return (char)('A' + digit - 10);
18         return '?';
19     }
21     const char *byteToHex( unsigned char byte )
22     {
23         static char asHex[3];
24         asHex[0] = digitToChar( byte >> 4 );
25         asHex[1] = digitToChar( byte & 0x0F );
26         asHex[2] = '\0';
27         return asHex;
28     }
29     
30     char *copyString( char *dst, const char *src )
31     {
32         while ( (*dst = *src) != '\0' ) {
33             ++ dst;
34             ++ src;
35         }
36         return dst;
37     }
39     bool stringsEqual( const char *s1, const char *s2 )
40     {
41         char c;
42         while ( (c = *s1++) == *s2++ )
43             if ( c == '\0' )
44                 return true;
45         return false;
46     }
48     char *charToString( unsigned long c, char *s )
49     {
50         switch( c ) {
51         case '\\': return copyString( s, "\\\\" );
52         case '\"': return copyString( s, "\\\"" );
53         case '\'': return copyString( s, "\\\'" );
54         case '\0': return copyString( s, "\\0" );
55         case '\a': return copyString( s, "\\a" );
56         case '\b': return copyString( s, "\\b" );
57         case '\n': return copyString( s, "\\n" );
58         case '\r': return copyString( s, "\\r" );
59         case '\t': return copyString( s, "\\t" );
60         }
61         if ( c >= 32 && c <= 127 ) {
62             s[0] = (char)c;
63             s[1] = '\0';
64             return s + 1;
65         }
66         else {
67             s[0] = '\\';
68             s[1] = 'x';
69             if ( c < 0x10 ) {
70                 s[2] = '0';
71                 ++ s;
72             }
73             return numberToString( c, s + 2, 16UL );
74         }
75     }
77     char *charToString( char c, char *s )
78     {
79         return charToString( (unsigned long)(unsigned char)c, s );
80     }
81     
82     char *bytesToString( const unsigned char *bytes, unsigned numBytes, unsigned maxBytes, char *s )
83     {
84         bool truncate = (numBytes > maxBytes);
85         if ( truncate )
86             numBytes = maxBytes;
87         
88         s = copyString( s, "{ " );
89         for ( unsigned i = 0; i < numBytes; ++ i, ++ bytes )
90             s = copyString( copyString( s, byteToHex( *bytes ) ), " " );
91         if ( truncate )
92             s = copyString( s, "..." );
93         return copyString( s, " }" );
94     }
96 #ifndef CXXTEST_USER_VALUE_TRAITS
97     unsigned ValueTraits<const double>::requiredDigitsOnLeft( double t )
98     {
99         unsigned digits = 1;
100         for ( t = (t < 0.0) ? -t : t; t > 1.0; t /= BASE )
101             ++ digits;
102         return digits;
103     }
105     char *ValueTraits<const double>::doNegative( double &t )
106     {
107         if ( t >= 0 )
108             return _asString;
109         _asString[0] = '-';
110         t = -t;
111         return _asString + 1;
112     }
114     void ValueTraits<const double>::hugeNumber( double t )
115     {
116         char *s = doNegative( t );
117         s = doubleToString( t, s, 0, 1 );
118         s = copyString( s, "." );
119         s = doubleToString( t, s, 1, DIGITS_ON_RIGHT );
120         s = copyString( s, "E" );
121         s = numberToString( requiredDigitsOnLeft( t ) - 1, s );
122     }
123         
124     void ValueTraits<const double>::normalNumber( double t )
125     {
126         char *s = doNegative( t );
127         s = doubleToString( t, s );
128         s = copyString( s, "." );
129         for ( unsigned i = 0; i < DIGITS_ON_RIGHT; ++ i )
130             s = numberToString( (unsigned)(t *= BASE) % BASE, s );
131     }
133     char *ValueTraits<const double>::doubleToString( double t, char *s, unsigned skip, unsigned max )
134     {
135         return numberToString<double>( t, s, BASE, skip, max );
136     }
137 #endif // !CXXTEST_USER_VALUE_TRAITS
138 };
140 #endif // __cxxtest__ValueTraits_cpp__