Subversion Repositories Kolibri OS

Rev

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);