xdigs = xdigs_upper;\r
expchar = 'P';\r
}\r
- if (prec >= 0)\r
- prec++;\r
if (flags & LONGDBL) {\r
fparg.ldbl = GETARG(long double);\r
dtoaresult =\r
case 'e':\r
case 'E':\r
expchar = ch;\r
- if (prec < 0) /* account for digit before decpt */\r
- prec = DEFPREC + 1;\r
- else\r
- prec++;\r
+ if (prec < 0)\r
+ prec = DEFPREC;\r
goto fp_begin;\r
case 'f':\r
case 'F':\r
case 'e':\r
case 'E':\r
expchar = ch;\r
- if (prec < 0) /* account for digit before decpt */\r
- prec = DEFPREC /* + 1*/ ;\r
- else\r
- prec++;\r
+ if (prec < 0)\r
+ prec = DEFPREC;\r
goto fp_begin;\r
case 'f':\r
case 'F':\r
/*\r
* Make %[gG] smell like %[eE], but\r
* trim trailing zeroes if no # flag.\r
+ *\r
+ * Note: The precision field used with [gG] is the number significant\r
+ * digits to print. When converting to [eE] the digit before the\r
+ * decimal must not be included in the precision value.\r
*/\r
if (!(flags & ALT))\r
- prec = ndig;\r
+ prec = ndig - 1;\r
}\r
}\r
if (expchar) {\r
+ dprec = prec; /* In some cases dprec will not be set. Make sure it is set now */\r
expsize = exponent(expstr, expt - 1, expchar);\r
- size = expsize + prec;\r
- if (prec > 1 || flags & ALT)\r
- ++size;\r
+ size = expsize + prec + 1; /* Leading digit + exponent string + precision */\r
+ if (prec >= 1 || flags & ALT)\r
+ ++size; /* Decimal point is added to character count */\r
} else {\r
/* space for digits before decimal point */\r
if (expt > 0)\r
* defined manner.''\r
* -- ANSI X3J11\r
*/\r
- ujval = (uintmax_t)GETARG(void *);\r
+ ujval = (uintmax_t) (UINTN) GETARG(void *);\r
base = 16;\r
xdigs = xdigs_lower;\r
flags = flags | INTMAXT;\r
flags |= LONGINT;\r
/*FALLTHROUGH*/\r
case 's':\r
- if ((flags & LONGINT) != MULTI) {\r
+ if (((flags & LONGINT) ? 1:0) != MULTI) {\r
if ((result = GETARG(CHAR_T *)) == NULL)\r
result = STRCONST("(null)");\r
} else {\r
PRINTANDPAD(result, convbuf + ndig, prec,\r
zeroes);\r
} else { /* %[eE] or sufficiently long %[gG] */\r
- if (prec > 1 || flags & ALT) {\r
+ if (prec >= 1 || flags & ALT) {\r
buf[0] = *result++;\r
buf[1] = *decimal_point;\r
PRINT(buf, 2);\r
*decpt = -ndigits + 1;\r
bp += *decpt;\r
}\r
- if (value == 0) /* kludge for __dtoa irregularity */\r
- rve = bp;\r
while (rve < bp)\r
*rve++ = '0';\r
}\r