|
@@ -178,10 +178,14 @@ static char *fmt_u(uintmax_t x, char *s)
|
|
typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)];
|
|
typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)];
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
|
|
|
|
|
|
+static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t, int ps)
|
|
{
|
|
{
|
|
- uint32_t big[(LDBL_MANT_DIG+28)/29 + 1 // mantissa expansion
|
|
|
|
- + (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9]; // exponent expansion
|
|
|
|
|
|
+ int bufsize = (ps==BIGLPRE)
|
|
|
|
+ ? (LDBL_MANT_DIG+28)/29 + 1 + // mantissa expansion
|
|
|
|
+ (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9 // exponent expansion
|
|
|
|
+ : (DBL_MANT_DIG+28)/29 + 1 +
|
|
|
|
+ (DBL_MAX_EXP+DBL_MANT_DIG+28+8)/9;
|
|
|
|
+ uint32_t big[bufsize];
|
|
uint32_t *a, *d, *r, *z;
|
|
uint32_t *a, *d, *r, *z;
|
|
int e2=0, e, i, j, l;
|
|
int e2=0, e, i, j, l;
|
|
char buf[9+LDBL_MANT_DIG/4], *s;
|
|
char buf[9+LDBL_MANT_DIG/4], *s;
|
|
@@ -557,11 +561,11 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
|
case 'x': case 'X':
|
|
case 'x': case 'X':
|
|
a = fmt_x(arg.i, z, t&32);
|
|
a = fmt_x(arg.i, z, t&32);
|
|
if (arg.i && (fl & ALT_FORM)) prefix+=(t>>4), pl=2;
|
|
if (arg.i && (fl & ALT_FORM)) prefix+=(t>>4), pl=2;
|
|
- if (0) {
|
|
|
|
|
|
+ goto ifmt_tail;
|
|
case 'o':
|
|
case 'o':
|
|
a = fmt_o(arg.i, z);
|
|
a = fmt_o(arg.i, z);
|
|
if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
|
|
if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
|
|
- } if (0) {
|
|
|
|
|
|
+ goto ifmt_tail;
|
|
case 'd': case 'i':
|
|
case 'd': case 'i':
|
|
pl=1;
|
|
pl=1;
|
|
if (arg.i>INTMAX_MAX) {
|
|
if (arg.i>INTMAX_MAX) {
|
|
@@ -573,7 +577,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
|
} else pl=0;
|
|
} else pl=0;
|
|
case 'u':
|
|
case 'u':
|
|
a = fmt_u(arg.i, z);
|
|
a = fmt_u(arg.i, z);
|
|
- }
|
|
|
|
|
|
+ ifmt_tail:
|
|
if (xp && p<0) goto overflow;
|
|
if (xp && p<0) goto overflow;
|
|
if (xp) fl &= ~ZERO_PAD;
|
|
if (xp) fl &= ~ZERO_PAD;
|
|
if (!arg.i && !p) {
|
|
if (!arg.i && !p) {
|
|
@@ -618,7 +622,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
|
|
case 'e': case 'f': case 'g': case 'a':
|
|
case 'e': case 'f': case 'g': case 'a':
|
|
case 'E': case 'F': case 'G': case 'A':
|
|
case 'E': case 'F': case 'G': case 'A':
|
|
if (xp && p<0) goto overflow;
|
|
if (xp && p<0) goto overflow;
|
|
- l = fmt_fp(f, arg.f, w, p, fl, t);
|
|
|
|
|
|
+ l = fmt_fp(f, arg.f, w, p, fl, t, ps);
|
|
if (l<0) goto overflow;
|
|
if (l<0) goto overflow;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|