]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/LibC/Stdio/vfwprintf.c
Add Socket Libraries.
[mirror_edk2.git] / StdLib / LibC / Stdio / vfwprintf.c
index 3c5332ac4aab50d5c7cb68b498832b8c41a89654..0554edb64516656572f2d811ddbdd54061280e49 100644 (file)
@@ -1056,8 +1056,6 @@ reswitch: switch (ch) {
         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
@@ -1092,10 +1090,8 @@ reswitch: switch (ch) {
     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
@@ -1165,10 +1161,8 @@ fp_common:
     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
@@ -1242,16 +1236,21 @@ fp_begin:
           /*\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
@@ -1322,7 +1321,7 @@ fp_begin:
        * 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
@@ -1332,7 +1331,7 @@ fp_begin:
       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
@@ -1538,7 +1537,7 @@ number:     if ((dprec = prec) >= 0)
         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
@@ -2003,8 +2002,6 @@ cvt(double value, int ndigits, int flags, char *sign, int *decpt, int ch,
         *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