1 // Common/IntToString.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../C/CpuArch.h"
6
7 #include "IntToString.h"
8
9 #define CONVERT_INT_TO_STR(charType, tempSize) \
10 unsigned char temp[tempSize]; unsigned i = 0; \
11 while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \
12 *s++ = (charType)('0' + (unsigned)val); \
13 while (i != 0) { i--; *s++ = temp[i]; } \
14 *s = 0;
15
ConvertUInt32ToString(UInt32 val,char * s)16 void ConvertUInt32ToString(UInt32 val, char *s) throw()
17 {
18 CONVERT_INT_TO_STR(char, 16);
19 }
20
ConvertUInt64ToString(UInt64 val,char * s)21 void ConvertUInt64ToString(UInt64 val, char *s) throw()
22 {
23 if (val <= (UInt32)0xFFFFFFFF)
24 {
25 ConvertUInt32ToString((UInt32)val, s);
26 return;
27 }
28 CONVERT_INT_TO_STR(char, 24);
29 }
30
ConvertUInt64ToOct(UInt64 val,char * s)31 void ConvertUInt64ToOct(UInt64 val, char *s) throw()
32 {
33 UInt64 v = val;
34 unsigned i;
35 for (i = 1;; i++)
36 {
37 v >>= 3;
38 if (v == 0)
39 break;
40 }
41 s[i] = 0;
42 do
43 {
44 unsigned t = (unsigned)(val & 0x7);
45 val >>= 3;
46 s[--i] = (char)('0' + t);
47 }
48 while (i);
49 }
50
51
52 #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))))
53
GetHexChar(unsigned t)54 static inline char GetHexChar(unsigned t) { return GET_HEX_CHAR(t); }
55
56
ConvertUInt32ToHex(UInt32 val,char * s)57 void ConvertUInt32ToHex(UInt32 val, char *s) throw()
58 {
59 UInt32 v = val;
60 unsigned i;
61 for (i = 1;; i++)
62 {
63 v >>= 4;
64 if (v == 0)
65 break;
66 }
67 s[i] = 0;
68 do
69 {
70 unsigned t = (unsigned)(val & 0xF);
71 val >>= 4;
72 s[--i] = GET_HEX_CHAR(t);
73 }
74 while (i);
75 }
76
77
ConvertUInt64ToHex(UInt64 val,char * s)78 void ConvertUInt64ToHex(UInt64 val, char *s) throw()
79 {
80 UInt64 v = val;
81 unsigned i;
82 for (i = 1;; i++)
83 {
84 v >>= 4;
85 if (v == 0)
86 break;
87 }
88 s[i] = 0;
89 do
90 {
91 unsigned t = (unsigned)(val & 0xF);
92 val >>= 4;
93 s[--i] = GET_HEX_CHAR(t);
94 }
95 while (i);
96 }
97
ConvertUInt32ToHex8Digits(UInt32 val,char * s)98 void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw()
99 {
100 s[8] = 0;
101 for (int i = 7; i >= 0; i--)
102 {
103 unsigned t = val & 0xF;
104 val >>= 4;
105 s[i] = GET_HEX_CHAR(t);;
106 }
107 }
108
109 /*
110 void ConvertUInt32ToHex8Digits(UInt32 val, wchar_t *s)
111 {
112 s[8] = 0;
113 for (int i = 7; i >= 0; i--)
114 {
115 unsigned t = val & 0xF;
116 val >>= 4;
117 s[i] = (wchar_t)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
118 }
119 }
120 */
121
ConvertUInt32ToString(UInt32 val,wchar_t * s)122 void ConvertUInt32ToString(UInt32 val, wchar_t *s) throw()
123 {
124 CONVERT_INT_TO_STR(wchar_t, 16);
125 }
126
ConvertUInt64ToString(UInt64 val,wchar_t * s)127 void ConvertUInt64ToString(UInt64 val, wchar_t *s) throw()
128 {
129 if (val <= (UInt32)0xFFFFFFFF)
130 {
131 ConvertUInt32ToString((UInt32)val, s);
132 return;
133 }
134 CONVERT_INT_TO_STR(wchar_t, 24);
135 }
136
ConvertInt64ToString(Int64 val,char * s)137 void ConvertInt64ToString(Int64 val, char *s) throw()
138 {
139 if (val < 0)
140 {
141 *s++ = '-';
142 val = -val;
143 }
144 ConvertUInt64ToString(val, s);
145 }
146
ConvertInt64ToString(Int64 val,wchar_t * s)147 void ConvertInt64ToString(Int64 val, wchar_t *s) throw()
148 {
149 if (val < 0)
150 {
151 *s++ = L'-';
152 val = -val;
153 }
154 ConvertUInt64ToString(val, s);
155 }
156
157
ConvertByteToHex2Digits(unsigned v,char * s)158 static void ConvertByteToHex2Digits(unsigned v, char *s) throw()
159 {
160 s[0] = GetHexChar(v >> 4);
161 s[1] = GetHexChar(v & 0xF);
162 }
163
ConvertUInt16ToHex4Digits(UInt32 val,char * s)164 static void ConvertUInt16ToHex4Digits(UInt32 val, char *s) throw()
165 {
166 ConvertByteToHex2Digits(val >> 8, s);
167 ConvertByteToHex2Digits(val & 0xFF, s + 2);
168 }
169
RawLeGuidToString(const Byte * g,char * s)170 char *RawLeGuidToString(const Byte *g, char *s) throw()
171 {
172 ConvertUInt32ToHex8Digits(GetUi32(g ), s); s += 8; *s++ = '-';
173 ConvertUInt16ToHex4Digits(GetUi16(g + 4), s); s += 4; *s++ = '-';
174 ConvertUInt16ToHex4Digits(GetUi16(g + 6), s); s += 4; *s++ = '-';
175 for (unsigned i = 0; i < 8; i++)
176 {
177 if (i == 2)
178 *s++ = '-';
179 ConvertByteToHex2Digits(g[8 + i], s);
180 s += 2;
181 }
182 *s = 0;
183 return s;
184 }
185
RawLeGuidToString_Braced(const Byte * g,char * s)186 char *RawLeGuidToString_Braced(const Byte *g, char *s) throw()
187 {
188 *s++ = '{';
189 s = RawLeGuidToString(g, s);
190 *s++ = '}';
191 *s = 0;
192 return s;
193 }
194