Rev 6424 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6424 | Rev 6425 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | Siemargl update formats as http://www.cplusplus.com/reference/cstdio/printf/, no wchar though |
4 | Siemargl update formats as http://www.cplusplus.com/reference/cstdio/printf/, no wchar though |
5 | http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap05.html is used too |
5 | http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap05.html is used too |
6 | %g explain https://support.microsoft.com/en-us/kb/43392 |
6 | %g explain https://support.microsoft.com/en-us/kb/43392 |
Line 7... | Line 7... | ||
7 | 7 | ||
8 | todo: |
- | |
9 | -%e |
- | |
10 | -simplify justifying |
- | |
11 | -fix %o, %x |
8 | todo: |
- | 9 | -fix precision in %g |
|
- | 10 | -%u printed as signed, %x, %o also is promoted to long long |
|
12 | -fix precision in %g |
11 | // FAIL 0x0FFFF7A7E as %x - signed long promotes sign, need %llx or %Lx and type conversion |
13 | -%a |
- | |
14 | -NAN, INF |
12 | -%a |
15 | -%n nothing printed |
13 | -%n nothing printed |
16 | -%17.18f digits maximum format |
14 | -%17.18f digits maximum format |
- | 15 | -use %C as w_char L'x' (non standard extension) |
|
17 | %C as w_char L'x' |
16 | -radix point always '.', no LOCALEs |
Line 18... | Line -... | ||
18 | */ |
- | |
19 | 17 | */ |
|
20 | 18 | ||
21 | //#include |
19 | |
22 | #include |
20 | #include |
23 | #include |
21 | #include |
Line 34... | Line 32... | ||
34 | flag_lead_zeros = 0x20, |
32 | flag_lead_zeros = 0x20, |
35 | flag_space_plus = 0x40, |
33 | flag_space_plus = 0x40, |
36 | flag_hash_sign = 0x80, |
34 | flag_hash_sign = 0x80, |
37 | flag_point = 0x100 |
35 | flag_point = 0x100 |
38 | }; |
36 | }; |
- | 37 | int formatted_double_to_string(long double number, int format1, int format2, char *s, int flags); |
|
- | 38 | int formatted_double_to_string_scientific(long double number, int format1, int format2, char *s, int flags); |
|
- | 39 | int formatted_long_to_string(long long number, int format1, int prec, char *s, int flags); |
|
- | 40 | int formatted_hex_to_string(unsigned long long number, int fmt1, int prec, char *s, int flags); |
|
- | 41 | int formatted_octa_to_string(unsigned long long number, int fmt1, int prec, char *s, int flags); |
|
- | 42 | ||
- | 43 | ||
- | 44 | int formatted_double_special(long double number, char *s) |
|
- | 45 | // return 0 if no special values: NAN, INF. -0.0 ignored |
|
- | 46 | // http://steve.hollasch.net/cgindex/coding/ieeefloat.html |
|
- | 47 | { |
|
- | 48 | struct IEEExp { |
|
- | 49 | unsigned manl:32; |
|
- | 50 | unsigned manh:32; |
|
- | 51 | unsigned exp:15; |
|
- | 52 | unsigned sign:1; |
|
- | 53 | } *ip = (struct IEEExp *)&number; |
|
- | 54 | ||
- | 55 | if (ip->exp != 0x7fff) return 0; |
|
- | 56 | ||
- | 57 | if (ip->manh == 0x80000000 && ip->manl == 0) // Inf |
|
- | 58 | { |
|
- | 59 | if(ip->sign) |
|
- | 60 | strcpy(s, "-INF"); |
|
- | 61 | else |
|
- | 62 | strcpy(s, "+INF"); |
|
- | 63 | } else |
|
- | 64 | if (ip->manh & ~0x7fffffff) |
|
- | 65 | strcpy(s, "QNaN"); |
|
- | 66 | else |
|
- | 67 | strcpy(s, "SNaN"); |
|
- | 68 | ||
- | 69 | return 4; |
|
- | 70 | } |
|
- | 71 | ||
- | 72 | int copy_and_align(char *dest, int width, char *src, int src_len, char sign, int flags) |
|
- | 73 | // alingn number in buffer, put sign and fills additional places |
|
- | 74 | // flags used only flag_left_just and flag_lead_zeros |
|
- | 75 | // sign can be zero, 0, x, X, space, +, - |
|
- | 76 | { |
|
- | 77 | int rc = 0, sign_len; |
|
- | 78 | char fill; |
|
- | 79 | ||
- | 80 | fill = (flags & flag_lead_zeros) ? '0' : ' '; |
|
- | 81 | if(sign == 'x' || sign == 'X') |
|
- | 82 | { |
|
- | 83 | sign_len = 2; |
|
- | 84 | } else |
|
- | 85 | if (sign) |
|
- | 86 | sign_len = 1; |
|
- | 87 | else |
|
- | 88 | sign_len = 0; |
|
- | 89 | ||
- | 90 | if ((flags & flag_left_just) || (src_len + sign_len >= width)) // left justify or no room |
|
- | 91 | { |
|
- | 92 | if (sign) |
|
- | 93 | { |
|
- | 94 | if(sign == 'x' || sign == 'X') |
|
- | 95 | { |
|
- | 96 | dest[0] = '0'; |
|
- | 97 | dest[1] = sign; |
|
- | 98 | memcpy(dest + 2, src, src_len); |
|
- | 99 | rc = src_len + 2; |
|
- | 100 | } else |
|
- | 101 | { // single sign |
|
- | 102 | dest[0] = sign; |
|
- | 103 | memcpy(dest + 1, src, src_len); |
|
- | 104 | rc = src_len + 1; |
|
- | 105 | } |
|
- | 106 | } else |
|
- | 107 | { |
|
- | 108 | memcpy(dest, src, src_len); |
|
- | 109 | rc = src_len; |
|
- | 110 | } |
|
- | 111 | if (rc < width) |
|
- | 112 | { |
|
- | 113 | memset(dest + rc, fill, width - rc); |
|
- | 114 | rc = width; |
|
- | 115 | } |
|
- | 116 | } else // right justify and fill |
|
- | 117 | { |
|
- | 118 | rc = width; |
|
- | 119 | memcpy(dest + width - src_len, src, src_len); |
|
- | 120 | memset(dest, fill, width - src_len); |
|
- | 121 | if (flags & flag_lead_zeros) |
|
- | 122 | { |
|
- | 123 | if(sign == 'x' || sign == 'X') |
|
- | 124 | { |
|
- | 125 | dest[0] = '0'; |
|
- | 126 | dest[1] = sign; |
|
- | 127 | } else |
|
- | 128 | if (sign) dest[0] = sign; |
|
- | 129 | } else |
|
- | 130 | { |
|
- | 131 | if(sign == 'x' || sign == 'X') |
|
- | 132 | { |
|
- | 133 | dest[width - src_len - 2] = '0'; |
|
- | 134 | dest[width - src_len - 1] = sign; |
|
- | 135 | } else |
|
- | 136 | if (sign) dest[width - src_len - 1] = sign; |
|
- | 137 | } |
|
- | 138 | } |
|
- | 139 | return rc; |
|
- | 140 | } |
|
Line 39... | Line 141... | ||
39 | 141 | ||
40 | int formatted_double_to_string_scientific(long double number, int format1, int format2, char *s, int flags) |
142 | int formatted_double_to_string_scientific(long double number, int format1, int format2, char *s, int flags) |
- | 143 | { |
|
- | 144 | long double norm_digit; |
|
- | 145 | long mul = 0; |
|
- | 146 | char sign = 0; |
|
- | 147 | char buf[50]; |
|
- | 148 | int len; |
|
- | 149 | ||
- | 150 | if((flags & flag_point) == 0) format2 = 6; // default prec if no point spec |
|
- | 151 | ||
- | 152 | len = formatted_double_special(number, buf); |
|
- | 153 | if (len == 0) |
|
- | 154 | { |
|
- | 155 | if (number < 0) { sign = '-'; norm_digit = -number; } |
|
- | 156 | else |
|
- | 157 | { |
|
- | 158 | norm_digit = number; |
|
- | 159 | if (flags & flag_plus) sign = '+'; else |
|
- | 160 | if (flags & flag_space_plus) sign = ' '; |
|
- | 161 | } |
|
- | 162 | // normalize |
|
- | 163 | while (norm_digit < 1.0) { norm_digit *= 10; mul--; } |
|
- | 164 | while (norm_digit >= 10.0) { norm_digit /= 10; mul++; } |
|
- | 165 | ||
- | 166 | len = formatted_double_to_string(norm_digit, 0, format2, buf, flags & ~(flag_plus | flag_space_plus)); |
|
- | 167 | ||
- | 168 | if (flags & flag_register) |
|
- | 169 | buf[len++] = 'E'; |
|
- | 170 | else |
|
- | 171 | buf[len++] = 'e'; |
|
- | 172 | ||
- | 173 | len += formatted_long_to_string(mul, 0, 3, buf + len, flag_plus | flag_lead_zeros); |
|
- | 174 | } |
|
- | 175 | else |
|
- | 176 | flags &= ~flag_lead_zeros; // no need for INF, NAN |
|
41 | { |
177 | |
- | 178 | len = copy_and_align(s, format1, buf, len, sign, flags); |
|
42 | strcpy(s, "%e not implemented yet, sorry"); |
179 | |
43 | return strlen(s); |
180 | return len; |
Line 44... | Line 181... | ||
44 | } |
181 | } |
45 | 182 | ||
46 | int formatted_double_to_string(long double number, int format1, int format2, char *s, int flags) |
183 | int formatted_double_to_string(long double number, int format1, int format2, char *s, int flags) |
47 | { |
184 | { |
48 | long double nafter, beforpointdigit; |
185 | long double nafter, beforpointdigit; |
49 | long long intdigit, mul; |
186 | long long intdigit, mul; |
50 | int div; |
187 | int div; |
51 | int i; |
188 | int i; |
52 | char* size; |
189 | char sign = 0; |
53 | int fmt1; |
190 | int fmt1; |
54 | int fmt2; |
191 | int fmt2; |
Line 55... | Line 192... | ||
55 | char buf[100], *pbuf = buf; |
192 | char buf[100], *pbuf = buf; |
Line -... | Line 193... | ||
- | 193 | char buf_low[50], *pbuf_lo = buf_low; |
|
56 | char buf_low[50], *pbuf_lo = buf_low; |
194 | |
- | 195 | if((flags & flag_point) == 0) format2 = 6; // default prec if no point spec |
|
57 | 196 | ||
58 | if((flags & flag_point) == 0) format2 = 6; // default prec if no point spec |
197 | i = formatted_double_special(number, buf); |
59 | 198 | if (i == 0) |
|
60 | size = s; |
199 | { |
61 | if (number < 0) {*s++ = '-'; number = -number; } |
200 | if (number < 0) {sign = '-'; number = -number; } |
62 | else |
201 | else |
Line 63... | Line 202... | ||
63 | { |
202 | { |
64 | if (flags & flag_plus) *s++ = '+'; else |
203 | if (flags & flag_plus) sign = '+'; else |
65 | if (flags & flag_space_plus) *s++ = ' '; |
204 | if (flags & flag_space_plus) sign = ' '; |
Line 114... | Line 253... | ||
114 | mul /= 10; |
253 | mul /= 10; |
115 | if (mul == 1) break; |
254 | if (mul == 1) break; |
116 | } |
255 | } |
117 | *pbuf_lo++ = (char)intdigit + '0'; |
256 | *pbuf_lo++ = (char)intdigit + '0'; |
Line 118... | Line -... | ||
118 | - | ||
119 | 257 | ||
120 | memcpy(s, buf, pbuf - buf); s += pbuf - buf; |
258 | // form full number |
121 | if (roundl(nafter) != 0 || fmt2 != 0) |
259 | if (roundl(nafter) != 0 || fmt2 != 0) |
122 | { |
260 | { |
123 | *s++ = '.'; |
261 | *pbuf++ = '.'; |
124 | memcpy(s, buf_low, pbuf_lo - buf_low); s += pbuf_lo - buf_low; |
262 | memcpy(pbuf, buf_low, pbuf_lo - buf_low); pbuf += pbuf_lo - buf_low; |
125 | } else if (flags & flag_hash_sign) |
263 | } else if (flags & flag_hash_sign) |
126 | *s++ = '.'; |
- | |
127 | - | ||
128 | // right justifiyng and forward zeros |
- | |
129 | div = (s - size); |
- | |
130 | if ((flags & flag_left_just) == 0 && div < format1) |
264 | *pbuf++ = '.'; |
131 | { |
- | |
132 | pbuf = size; |
- | |
133 | if ((flags & flag_lead_zeros) != 0) |
- | |
134 | if (*pbuf == '+' || *pbuf == '-' || *pbuf == ' ') { pbuf++; div--; } // sign already at place |
- | |
135 | for (i = 0; i < div; i++) |
- | |
136 | size[format1 - i - 1] = pbuf[div - 1 - i]; |
- | |
137 | for (i = 0; i < format1 - div - (pbuf - size); i++) |
- | |
138 | if (flags & flag_lead_zeros) |
- | |
139 | pbuf[i] = '0'; |
265 | } |
- | 266 | else |
|
140 | else |
267 | { |
141 | pbuf[i] = ' '; |
- | |
142 | 268 | flags &= ~flag_lead_zeros; // no need for INF, NAN |
|
143 | return format1; |
269 | pbuf += i; |
Line 144... | Line 270... | ||
144 | } |
270 | } |
145 | 271 | ||
Line 146... | Line 272... | ||
146 | return s - size; |
272 | return copy_and_align(s, format1, buf, pbuf - buf, sign, flags); |
147 | } |
273 | } |
148 | 274 | ||
149 | int formatted_long_to_string(long long number, int format1, int prec, char *s, int flags) |
275 | int formatted_long_to_string(long long number, int format1, int prec, char *s, int flags) |
150 | { |
276 | { |
151 | int i; |
277 | int i; |
152 | int fmt; |
278 | int fmt; |
153 | char* size = s; |
279 | char sign = 0; |
154 | long long digit; |
280 | long long digit; |
Line 155... | Line 281... | ||
155 | long long mul; |
281 | long long mul; |
156 | int div; |
282 | int div; |
157 | char buf[100], *pbuf = buf; |
283 | char buf[100], *pbuf = buf; |
158 | - | ||
159 | if (number == -9223372036854775807LL - 1) // overflow all our math, cant minus this |
- | |
160 | { |
284 | |
161 | strcpy(buf, "9223372036854775808"); |
285 | if (number == -9223372036854775807LL - 1) // overflow all our math, cant minus this |
Line 162... | Line 286... | ||
162 | pbuf += 19; |
286 | { |
Line 163... | Line 287... | ||
163 | *s++ = '-'; |
287 | strcpy(s, "-9223372036854775808"); |
164 | goto verybig; |
288 | return strlen(s); |
165 | } |
289 | } |
166 | 290 | ||
167 | if (flags & flag_point) flags &= ~flag_lead_zeros; // conflicting flags |
291 | if (flags & flag_point) flags &= ~flag_lead_zeros; // conflicting flags |
168 | 292 | ||
Line 169... | Line 293... | ||
169 | if (number < 0) {*s++ = '-'; number = -number; } |
293 | if (number < 0) {sign = '-'; number = -number; } |
Line 170... | Line 294... | ||
170 | else |
294 | else |
Line 181... | Line 305... | ||
181 | { |
305 | { |
182 | if (digit / mul < 10) { fmt = i + 1; break; } |
306 | if (digit / mul < 10) { fmt = i + 1; break; } |
183 | mul *= 10; |
307 | mul *= 10; |
184 | } |
308 | } |
Line 185... | Line 309... | ||
185 | 309 | ||
186 | // add leading zeros |
310 | // add leading zeros by prec |
Line 187... | Line 311... | ||
187 | for(i = 0; i < prec - fmt; i++) *pbuf++ = '0'; |
311 | for(i = 0; i < prec - fmt; i++) *pbuf++ = '0'; |
188 | 312 | ||
189 | for(i = 0; i < fmt - 1; i++) |
313 | for(i = 0; i < fmt - 1; i++) |
Line 194... | Line 318... | ||
194 | mul /= 10; |
318 | mul /= 10; |
195 | if (mul == 1 || mul == -1) break; |
319 | if (mul == 1 || mul == -1) break; |
196 | } |
320 | } |
197 | *pbuf++ = (char)digit + '0'; |
321 | *pbuf++ = (char)digit + '0'; |
Line 198... | Line -... | ||
198 | - | ||
199 | verybig: |
- | |
200 | memcpy(s, buf, pbuf - buf); s += pbuf - buf; |
- | |
201 | - | ||
202 | // right justifiyng and forward zeros |
- | |
203 | div = (s - size); |
- | |
204 | if ((flags & flag_left_just) == 0 && div < format1) |
- | |
205 | { |
- | |
206 | pbuf = size; |
- | |
207 | if ((flags & flag_lead_zeros) != 0) |
- | |
208 | if (*pbuf == '+' || *pbuf == '-' || *pbuf == ' ') { pbuf++; div--; } // sign already at place |
- | |
209 | for (i = 0; i < div; i++) |
- | |
210 | size[format1 - i - 1] = pbuf[div - 1 - i]; |
322 | |
211 | for (i = 0; i < format1 - div - (pbuf - size); i++) |
- | |
212 | if (flags & flag_lead_zeros) |
- | |
213 | pbuf[i] = '0'; |
- | |
214 | else |
- | |
215 | pbuf[i] = ' '; |
- | |
216 | - | ||
217 | return format1; |
323 | return copy_and_align(s, format1, buf, pbuf - buf, sign, flags); |
Line 218... | Line -... | ||
218 | } |
- | |
219 | - | ||
220 | return s - size; |
- | |
221 | } |
324 | } |
222 | 325 | ||
223 | int formatted_hex_to_string(long long number, int fmt1, char *s, int flags) |
- | |
224 | { |
326 | int formatted_hex_to_string(unsigned long long number, int fmt1, int prec, char *s, int flags) |
225 | long n; |
327 | { |
226 | int i,pos; |
- | |
227 | // int fmt; |
- | |
228 | long size; |
328 | unsigned long long digit, mul; |
229 | int difference_pos; |
329 | int i, div, fmt; |
230 | char xdigs_lower[16]="0123456789abcdef"; |
330 | char xdigs_lower[16]="0123456789abcdef"; |
231 | char xdigs_upper[16]="0123456789ABCDEF"; |
- | |
232 | char buf[200]; |
- | |
233 | - | ||
234 | n=(long)number; |
- | |
235 | size=(int)s; |
- | |
236 | if (n<0) {*s='-';s++;n=-n;} |
- | |
237 | - | ||
Line 238... | Line -... | ||
238 | if (n==0) {*s='0';s++;goto end;} |
- | |
239 | for(i=0;i<200;i++) {buf[i]=0;} |
- | |
240 | - | ||
241 | i=0; |
331 | char xdigs_upper[16]="0123456789ABCDEF"; |
242 | if (flag_register==0) |
332 | char buf[50], *pbuf = buf, sign; |
243 | { |
- | |
244 | while (n>0) |
333 | |
245 | { |
334 | if (number == -9223372036854775807LL - 1) // overflow all our math, cant minus this |
246 | buf[i]=xdigs_lower[n & 15]; |
- | |
247 | n=n>>4; |
335 | { |
248 | i++; |
336 | strcpy(buf, "FFFFFFFFFFFFFFFF"); |
249 | } |
337 | pbuf += strlen(buf); |
250 | } |
- | |
251 | else |
- | |
252 | { |
338 | } |
253 | while (n>0) |
- | |
254 | { |
- | |
255 | buf[i]=xdigs_upper[n & 15]; |
- | |
256 | n=n>>4; |
- | |
Line 257... | Line 339... | ||
257 | i++; |
339 | else |
- | 340 | { |
|
258 | } |
341 | if (flags & flag_point) flags &= ~flag_lead_zeros; // conflicting flags |
Line 259... | Line 342... | ||
259 | } |
342 | |
260 | 343 | digit = number; |
|
261 | pos=i; |
344 | |
262 | difference_pos=i; |
345 | mul = (digit < 0) ? -1 : 1; |
263 | 346 | ||
Line 264... | Line 347... | ||
264 | for(i=pos-1;i>=0;i--) |
347 | for(i = 0; i < sizeof buf - 2; i++) |
265 | { |
348 | { |
- | 349 | if (digit / mul < 16) { fmt = i + 1; break; } |
|
266 | *s=buf[i]; |
350 | mul <<= 4; |
267 | s++; |
351 | } |
268 | } |
352 | |
- | 353 | // add leading zeros by prec |
|
269 | 354 | for(i = 0; i < prec - fmt; i++) *pbuf++ = '0'; |
|
270 | if (fmt1-difference_pos>0) |
355 | |
- | 356 | for(i = 0; i < fmt - 1; i++) |
|
271 | { |
357 | { |
272 | for(i=difference_pos+1;i<=fmt1;i++) |
358 | div = digit / mul; |
273 | { |
- | |
274 | *s=' '; |
359 | *pbuf++ = (flags & flag_register) ? xdigs_upper[div] : xdigs_lower[div]; |
Line 275... | Line -... | ||
275 | s++; |
- | |
276 | } |
- | |
277 | } |
360 | digit = digit - div * mul; |
278 | end:size=(int)s-size; |
361 | mul >>= 4; |
279 | return(size); |
- | |
280 | } |
- | |
281 | - | ||
282 | int formatted_octa_to_string(long long number, int fmt1, char *s, int flags) |
362 | if (mul == 1 || mul == -1) break; |
283 | { |
- | |
Line 284... | Line -... | ||
284 | long n; |
- | |
285 | int i,pos; |
- | |
286 | // int fmt; |
363 | } |
287 | long size; |
364 | *pbuf++ = (flags & flag_register) ? xdigs_upper[digit] : xdigs_lower[digit]; |
288 | int difference_pos; |
- | |
289 | char xdigs_lower[16]="012345678"; |
- | |
Line 290... | Line -... | ||
290 | char buf[200]; |
- | |
291 | 365 | } |
|
292 | n=number; |
366 | |
- | 367 | sign = 0; |
|
293 | size=(int)s; |
368 | if(flags & flag_hash_sign) |
- | 369 | sign = (flags & flag_register) ? 'X' : 'x'; |
|
- | 370 | ||
- | 371 | return copy_and_align(s, fmt1, buf, pbuf - buf, sign, flags); |
|
- | 372 | } |
|
294 | if (n<0) {*s='-';s++;n=-n;} |
373 | |
295 | 374 | int formatted_octa_to_string(unsigned long long number, int fmt1, int prec, char *s, int flags) |
|
296 | if (n==0) {*s='0';s++;goto end;} |
- | |
297 | for(i=0;i<200;i++) {buf[i]=0;} |
375 | { |
298 | - | ||
299 | i=0; |
376 | unsigned long long digit, mul; |
- | 377 | int i, div, fmt; |
|
- | 378 | char xdigs_lower[16]="01234567"; |
|
- | 379 | char buf[50], *pbuf = buf; |
|
Line 300... | Line -... | ||
300 | if (flag_register==0) |
- | |
301 | { |
380 | |
Line -... | Line 381... | ||
- | 381 | if (number == -9223372036854775807LL - 1) // overflow all our math, cant minus this |
|
- | 382 | { |
|
302 | while (n>0) |
383 | strcpy(buf, "1777777777777777777777"); |
303 | { |
384 | pbuf += strlen(buf); |
304 | buf[i]=xdigs_lower[n & 7]; |
385 | } |
305 | n=n>>3; |
386 | else |
306 | i++; |
387 | { |
Line 307... | Line 388... | ||
307 | } |
388 | if (flags & flag_point) flags &= ~flag_lead_zeros; // conflicting flags |
308 | } |
389 | |
- | 390 | digit = number; |
|
309 | 391 | ||
310 | pos=i; |
392 | mul = (digit < 0) ? -1 : 1; |
311 | difference_pos=i; |
393 | |
- | 394 | for(i = 0; i < sizeof buf - 2; i++) |
|
- | 395 | { |
|
312 | 396 | if (digit / mul < 8) { fmt = i + 1; break; } |
|
- | 397 | mul <<= 3; |
|
313 | for(i=pos-1;i>=0;i--) |
398 | } |
- | 399 | ||
314 | { |
400 | // add leading zeros by prec |
- | 401 | for(i = 0; i < prec - fmt; i++) *pbuf++ = '0'; |
|
315 | *s=buf[i]; |
402 | |
316 | s++; |
- | |
317 | } |
403 | for(i = 0; i < fmt - 1; i++) |
Line 318... | Line 404... | ||
318 | 404 | { |
|
319 | if (fmt1-difference_pos>0) |
405 | div = digit / mul; |
320 | { |
406 | *pbuf++ = xdigs_lower[div & 0x7]; |
Line 335... | Line 421... | ||
335 | int length; |
421 | int length; |
336 | int fmt1, fmt2; // width, precision |
422 | int fmt1, fmt2; // width, precision |
337 | size_t pos, posc; |
423 | size_t pos, posc; |
338 | long long intdigit; |
424 | long long intdigit; |
339 | long double doubledigit; |
425 | long double doubledigit; |
340 | // float floatdigit; |
- | |
341 | const char *fmt, *fmtc; // first point to %, fmtc points to specifier |
426 | const char *fmt, *fmtc; // first point to %, fmtc points to specifier |
342 | char *s; // pointer to current dest char |
427 | char *s; // pointer to current dest char |
343 | char *str; |
428 | char *str; |
344 | char buf[200]; // buffer for current argument value print representation |
429 | char buf[200]; // buffer for current argument value print representation |
345 | int format_flag; |
430 | int format_flag; |
Line 471... | Line 556... | ||
471 | fmt++; |
556 | fmt++; |
472 | } |
557 | } |
473 | } |
558 | } |
Line 474... | Line 559... | ||
474 | 559 | ||
475 | // do real work - format arguments values |
- | |
476 | 560 | // do real work - format arguments values |
|
477 | length = 0; |
561 | length = 0; |
478 | switch(*fmtc) |
562 | switch(*fmtc) |
479 | { |
563 | { |
480 | case 'n': |
564 | case 'n': |
Line 504... | Line 588... | ||
504 | break; |
588 | break; |
505 | case 'o': |
589 | case 'o': |
506 | if (flag_long == 0) intdigit = va_arg(argp, int); else |
590 | if (flag_long == 0) intdigit = va_arg(argp, int); else |
507 | if (flag_long == 1) intdigit = va_arg(argp, long); else |
591 | if (flag_long == 1) intdigit = va_arg(argp, long); else |
508 | if (flag_long == 2) intdigit = va_arg(argp, long long); |
592 | if (flag_long == 2) intdigit = va_arg(argp, long long); |
509 | length = formatted_octa_to_string(intdigit, fmt1, buf, flags); |
593 | length = formatted_octa_to_string(intdigit, fmt1, fmt2, buf, flags); |
510 | break; |
594 | break; |
511 | case 'p': case 'P': case 'x': case 'X': |
595 | case 'p': case 'P': case 'x': case 'X': |
512 | if (flag_long == 0) intdigit = va_arg(argp, int); else |
596 | if (flag_long == 0) intdigit = va_arg(argp, int); else |
513 | if (flag_long == 1) intdigit = va_arg(argp, long); else |
597 | if (flag_long == 1) intdigit = va_arg(argp, long); else |
514 | if (flag_long == 2) intdigit = va_arg(argp, long long); |
598 | if (flag_long == 2) intdigit = va_arg(argp, long long); |
515 | length=formatted_hex_to_string(intdigit, fmt1, buf, flags); |
599 | length=formatted_hex_to_string(intdigit, fmt1, fmt2, buf, flags); |
516 | break; |
600 | break; |
517 | case 'a': case 'A': case 'f': case 'F': |
601 | case 'a': case 'A': case 'f': case 'F': |
518 | if (flag_long <= 1) doubledigit = va_arg(argp, double); else |
602 | if (flag_long <= 1) doubledigit = va_arg(argp, double); else |
519 | if (flag_long == 2) doubledigit = va_arg(argp, long double); |
603 | if (flag_long == 2) doubledigit = va_arg(argp, long double); |
520 | length = formatted_double_to_string(doubledigit, fmt1, fmt2, buf, flags); |
604 | length = formatted_double_to_string(doubledigit, fmt1, fmt2, buf, flags); |