|
@@ -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;
|
|
@@ -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;
|
|
}
|
|
}
|