xref: /aosp_15_r20/external/lzma/CPP/Common/IntToString.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/IntToString.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #define CONVERT_INT_TO_STR(charType, tempSize) \
10*f6dc9357SAndroid Build Coastguard Worker   if (val < 10) \
11*f6dc9357SAndroid Build Coastguard Worker     *s++ = (charType)('0' + (unsigned)val); \
12*f6dc9357SAndroid Build Coastguard Worker   else { \
13*f6dc9357SAndroid Build Coastguard Worker     Byte temp[tempSize]; \
14*f6dc9357SAndroid Build Coastguard Worker     size_t i = 0; \
15*f6dc9357SAndroid Build Coastguard Worker     do { \
16*f6dc9357SAndroid Build Coastguard Worker       temp[++i] = (Byte)('0' + (unsigned)(val % 10)); \
17*f6dc9357SAndroid Build Coastguard Worker       val /= 10; } \
18*f6dc9357SAndroid Build Coastguard Worker     while (val >= 10); \
19*f6dc9357SAndroid Build Coastguard Worker     *s++ = (charType)('0' + (unsigned)val); \
20*f6dc9357SAndroid Build Coastguard Worker     do { *s++ = (charType)temp[i]; } \
21*f6dc9357SAndroid Build Coastguard Worker     while (--i); \
22*f6dc9357SAndroid Build Coastguard Worker   } \
23*f6dc9357SAndroid Build Coastguard Worker   *s = 0; \
24*f6dc9357SAndroid Build Coastguard Worker   return s;
25*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt32ToString(UInt32 val,char * s)26*f6dc9357SAndroid Build Coastguard Worker char * ConvertUInt32ToString(UInt32 val, char *s) throw()
27*f6dc9357SAndroid Build Coastguard Worker {
28*f6dc9357SAndroid Build Coastguard Worker   CONVERT_INT_TO_STR(char, 16)
29*f6dc9357SAndroid Build Coastguard Worker }
30*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt64ToString(UInt64 val,char * s)31*f6dc9357SAndroid Build Coastguard Worker char * ConvertUInt64ToString(UInt64 val, char *s) throw()
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker   if (val <= (UInt32)0xFFFFFFFF)
34*f6dc9357SAndroid Build Coastguard Worker     return ConvertUInt32ToString((UInt32)val, s);
35*f6dc9357SAndroid Build Coastguard Worker   CONVERT_INT_TO_STR(char, 24)
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt32ToString(UInt32 val,wchar_t * s)38*f6dc9357SAndroid Build Coastguard Worker wchar_t * ConvertUInt32ToString(UInt32 val, wchar_t *s) throw()
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   CONVERT_INT_TO_STR(wchar_t, 16)
41*f6dc9357SAndroid Build Coastguard Worker }
42*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt64ToString(UInt64 val,wchar_t * s)43*f6dc9357SAndroid Build Coastguard Worker wchar_t * ConvertUInt64ToString(UInt64 val, wchar_t *s) throw()
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker   if (val <= (UInt32)0xFFFFFFFF)
46*f6dc9357SAndroid Build Coastguard Worker     return ConvertUInt32ToString((UInt32)val, s);
47*f6dc9357SAndroid Build Coastguard Worker   CONVERT_INT_TO_STR(wchar_t, 24)
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker 
ConvertInt64ToString(Int64 val,char * s)50*f6dc9357SAndroid Build Coastguard Worker void ConvertInt64ToString(Int64 val, char *s) throw()
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   if (val < 0)
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     *s++ = '-';
55*f6dc9357SAndroid Build Coastguard Worker     val = -val;
56*f6dc9357SAndroid Build Coastguard Worker   }
57*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString((UInt64)val, s);
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker 
ConvertInt64ToString(Int64 val,wchar_t * s)60*f6dc9357SAndroid Build Coastguard Worker void ConvertInt64ToString(Int64 val, wchar_t *s) throw()
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   if (val < 0)
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     *s++ = L'-';
65*f6dc9357SAndroid Build Coastguard Worker     val = -val;
66*f6dc9357SAndroid Build Coastguard Worker   }
67*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString((UInt64)val, s);
68*f6dc9357SAndroid Build Coastguard Worker }
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt64ToOct(UInt64 val,char * s)71*f6dc9357SAndroid Build Coastguard Worker void ConvertUInt64ToOct(UInt64 val, char *s) throw()
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   {
74*f6dc9357SAndroid Build Coastguard Worker     UInt64 v = val;
75*f6dc9357SAndroid Build Coastguard Worker     do
76*f6dc9357SAndroid Build Coastguard Worker       s++;
77*f6dc9357SAndroid Build Coastguard Worker     while (v >>= 3);
78*f6dc9357SAndroid Build Coastguard Worker   }
79*f6dc9357SAndroid Build Coastguard Worker   *s = 0;
80*f6dc9357SAndroid Build Coastguard Worker   do
81*f6dc9357SAndroid Build Coastguard Worker   {
82*f6dc9357SAndroid Build Coastguard Worker     const unsigned t = (unsigned)val & 7;
83*f6dc9357SAndroid Build Coastguard Worker     *--s = (char)('0' + t);
84*f6dc9357SAndroid Build Coastguard Worker   }
85*f6dc9357SAndroid Build Coastguard Worker   while (val >>= 3);
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(16) const char k_Hex_Upper[16] =
89*f6dc9357SAndroid Build Coastguard Worker  { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
90*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(16) const char k_Hex_Lower[16] =
91*f6dc9357SAndroid Build Coastguard Worker  { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
92*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt32ToHex(UInt32 val,char * s)93*f6dc9357SAndroid Build Coastguard Worker void ConvertUInt32ToHex(UInt32 val, char *s) throw()
94*f6dc9357SAndroid Build Coastguard Worker {
95*f6dc9357SAndroid Build Coastguard Worker   {
96*f6dc9357SAndroid Build Coastguard Worker     UInt32 v = val;
97*f6dc9357SAndroid Build Coastguard Worker     do
98*f6dc9357SAndroid Build Coastguard Worker       s++;
99*f6dc9357SAndroid Build Coastguard Worker     while (v >>= 4);
100*f6dc9357SAndroid Build Coastguard Worker   }
101*f6dc9357SAndroid Build Coastguard Worker   *s = 0;
102*f6dc9357SAndroid Build Coastguard Worker   do
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     const unsigned t = (unsigned)val & 0xF;
105*f6dc9357SAndroid Build Coastguard Worker     *--s = GET_HEX_CHAR_UPPER(t);
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   while (val >>= 4);
108*f6dc9357SAndroid Build Coastguard Worker }
109*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt64ToHex(UInt64 val,char * s)110*f6dc9357SAndroid Build Coastguard Worker void ConvertUInt64ToHex(UInt64 val, char *s) throw()
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker   {
113*f6dc9357SAndroid Build Coastguard Worker     UInt64 v = val;
114*f6dc9357SAndroid Build Coastguard Worker     do
115*f6dc9357SAndroid Build Coastguard Worker       s++;
116*f6dc9357SAndroid Build Coastguard Worker     while (v >>= 4);
117*f6dc9357SAndroid Build Coastguard Worker   }
118*f6dc9357SAndroid Build Coastguard Worker   *s = 0;
119*f6dc9357SAndroid Build Coastguard Worker   do
120*f6dc9357SAndroid Build Coastguard Worker   {
121*f6dc9357SAndroid Build Coastguard Worker     const unsigned t = (unsigned)val & 0xF;
122*f6dc9357SAndroid Build Coastguard Worker     *--s = GET_HEX_CHAR_UPPER(t);
123*f6dc9357SAndroid Build Coastguard Worker   }
124*f6dc9357SAndroid Build Coastguard Worker   while (val >>= 4);
125*f6dc9357SAndroid Build Coastguard Worker }
126*f6dc9357SAndroid Build Coastguard Worker 
ConvertUInt32ToHex8Digits(UInt32 val,char * s)127*f6dc9357SAndroid Build Coastguard Worker void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw()
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker   s[8] = 0;
130*f6dc9357SAndroid Build Coastguard Worker   int i = 7;
131*f6dc9357SAndroid Build Coastguard Worker   do
132*f6dc9357SAndroid Build Coastguard Worker   {
133*f6dc9357SAndroid Build Coastguard Worker     { const unsigned t = (unsigned)val & 0xF;       s[i--] = GET_HEX_CHAR_UPPER(t); }
134*f6dc9357SAndroid Build Coastguard Worker     { const unsigned t = (Byte)val >> 4; val >>= 8; s[i--] = GET_HEX_CHAR_UPPER(t); }
135*f6dc9357SAndroid Build Coastguard Worker   }
136*f6dc9357SAndroid Build Coastguard Worker   while (i >= 0);
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker /*
140*f6dc9357SAndroid Build Coastguard Worker void ConvertUInt32ToHex8Digits(UInt32 val, wchar_t *s)
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker   s[8] = 0;
143*f6dc9357SAndroid Build Coastguard Worker   for (int i = 7; i >= 0; i--)
144*f6dc9357SAndroid Build Coastguard Worker   {
145*f6dc9357SAndroid Build Coastguard Worker     const unsigned t = (unsigned)val & 0xF;
146*f6dc9357SAndroid Build Coastguard Worker     val >>= 4;
147*f6dc9357SAndroid Build Coastguard Worker     s[i] = GET_HEX_CHAR(t);
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker }
150*f6dc9357SAndroid Build Coastguard Worker */
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker 
153*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN(16) static const Byte k_Guid_Pos[] =
154*f6dc9357SAndroid Build Coastguard Worker   { 6,4,2,0, 11,9, 16,14, 19,21, 24,26,28,30,32,34 };
155*f6dc9357SAndroid Build Coastguard Worker 
RawLeGuidToString(const Byte * g,char * s)156*f6dc9357SAndroid Build Coastguard Worker char *RawLeGuidToString(const Byte *g, char *s) throw()
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker   s[ 8] = '-';
159*f6dc9357SAndroid Build Coastguard Worker   s[13] = '-';
160*f6dc9357SAndroid Build Coastguard Worker   s[18] = '-';
161*f6dc9357SAndroid Build Coastguard Worker   s[23] = '-';
162*f6dc9357SAndroid Build Coastguard Worker   s[36] = 0;
163*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 16; i++)
164*f6dc9357SAndroid Build Coastguard Worker   {
165*f6dc9357SAndroid Build Coastguard Worker     char *s2 = s + k_Guid_Pos[i];
166*f6dc9357SAndroid Build Coastguard Worker     const unsigned v = g[i];
167*f6dc9357SAndroid Build Coastguard Worker     s2[0] = GET_HEX_CHAR_UPPER(v >> 4);
168*f6dc9357SAndroid Build Coastguard Worker     s2[1] = GET_HEX_CHAR_UPPER(v & 0xF);
169*f6dc9357SAndroid Build Coastguard Worker   }
170*f6dc9357SAndroid Build Coastguard Worker   return s + 36;
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker 
RawLeGuidToString_Braced(const Byte * g,char * s)173*f6dc9357SAndroid Build Coastguard Worker char *RawLeGuidToString_Braced(const Byte *g, char *s) throw()
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker   *s++ = '{';
176*f6dc9357SAndroid Build Coastguard Worker   s = RawLeGuidToString(g, s);
177*f6dc9357SAndroid Build Coastguard Worker   *s++ = '}';
178*f6dc9357SAndroid Build Coastguard Worker   *s = 0;
179*f6dc9357SAndroid Build Coastguard Worker   return s;
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker 
ConvertDataToHex_Lower(char * dest,const Byte * src,size_t size)183*f6dc9357SAndroid Build Coastguard Worker void ConvertDataToHex_Lower(char *dest, const Byte *src, size_t size) throw()
184*f6dc9357SAndroid Build Coastguard Worker {
185*f6dc9357SAndroid Build Coastguard Worker   if (size)
186*f6dc9357SAndroid Build Coastguard Worker   {
187*f6dc9357SAndroid Build Coastguard Worker     const Byte *lim = src + size;
188*f6dc9357SAndroid Build Coastguard Worker     do
189*f6dc9357SAndroid Build Coastguard Worker     {
190*f6dc9357SAndroid Build Coastguard Worker       const unsigned b = *src++;
191*f6dc9357SAndroid Build Coastguard Worker       dest[0] = GET_HEX_CHAR_LOWER(b >> 4);
192*f6dc9357SAndroid Build Coastguard Worker       dest[1] = GET_HEX_CHAR_LOWER(b & 0xF);
193*f6dc9357SAndroid Build Coastguard Worker       dest += 2;
194*f6dc9357SAndroid Build Coastguard Worker     }
195*f6dc9357SAndroid Build Coastguard Worker     while (src != lim);
196*f6dc9357SAndroid Build Coastguard Worker   }
197*f6dc9357SAndroid Build Coastguard Worker   *dest = 0;
198*f6dc9357SAndroid Build Coastguard Worker }
199*f6dc9357SAndroid Build Coastguard Worker 
ConvertDataToHex_Upper(char * dest,const Byte * src,size_t size)200*f6dc9357SAndroid Build Coastguard Worker void ConvertDataToHex_Upper(char *dest, const Byte *src, size_t size) throw()
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker   if (size)
203*f6dc9357SAndroid Build Coastguard Worker   {
204*f6dc9357SAndroid Build Coastguard Worker     const Byte *lim = src + size;
205*f6dc9357SAndroid Build Coastguard Worker     do
206*f6dc9357SAndroid Build Coastguard Worker     {
207*f6dc9357SAndroid Build Coastguard Worker       const unsigned b = *src++;
208*f6dc9357SAndroid Build Coastguard Worker       dest[0] = GET_HEX_CHAR_UPPER(b >> 4);
209*f6dc9357SAndroid Build Coastguard Worker       dest[1] = GET_HEX_CHAR_UPPER(b & 0xF);
210*f6dc9357SAndroid Build Coastguard Worker       dest += 2;
211*f6dc9357SAndroid Build Coastguard Worker     }
212*f6dc9357SAndroid Build Coastguard Worker     while (src != lim);
213*f6dc9357SAndroid Build Coastguard Worker   }
214*f6dc9357SAndroid Build Coastguard Worker   *dest = 0;
215*f6dc9357SAndroid Build Coastguard Worker }
216