]> sjero.net Git - wget/blobdiff - src/snprintf.c
Updated config.guess, config.sub, install.sh.
[wget] / src / snprintf.c
index 8dc96e17d7864fb4cd05dbdb39bde42980e2180f..2f2698bea47d2c958f394ece7d7970a420b0c4f2 100644 (file)
@@ -78,7 +78,6 @@
  *    actually print args for %g and %e
  *
  *  Hrvoje Niksic <hniksic@xemacs.org> 2005-04-15
- *    use the PARAMS macro to handle prototypes.
  *    write function definitions in the ansi2knr-friendly way.
  *    if string precision is specified, don't read VALUE past it.
  *    fix bug in fmtfp that caused 0.01 to be printed as 0.1.
@@ -88,9 +87,7 @@
  *
  **************************************************************/
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "wget.h"
 
 /* For testing purposes, always compile in the code. */
 #ifdef TEST_SNPRINTF
 
 #if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)
 
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
+#include <string.h>
 #include <sys/types.h>
-#include <stdio.h>             /* for NULL */
-
-/* varargs declarations: */
+#include <stdio.h>              /* for NULL */
 
-#if defined(HAVE_STDARG_H)
-# include <stdarg.h>
-# define HAVE_STDARGS    /* let's hope that works everywhere (mj) */
-# define VA_LOCAL_DECL   va_list ap
-# define VA_START(f)     va_start(ap, f)
-# define VA_SHIFT(v,t)  ;   /* no-op for ANSI */
-# define VA_END          va_end(ap)
-#else
-# include <varargs.h>
-# undef HAVE_STDARGS
-# define VA_LOCAL_DECL   va_list ap
-# define VA_START(f)     va_start(ap)      /* f is ignored! */
-# define VA_SHIFT(v,t) v = va_arg(ap,t)
-# define VA_END        va_end(ap)
-#endif
+#include <stdarg.h>
 
 #ifdef HAVE_LONG_DOUBLE
 #define LDOUBLE long double
 # define vsnprintf test_vsnprintf
 #endif
 
-#ifdef HAVE_STDARGS
 int snprintf (char *str, size_t count, const char *fmt, ...);
 int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
-#else
-int snprintf ();
-int vsnprintf ();
-#endif
 
-#ifndef PARAMS
-# define PARAMS(x) x
-#endif
-
-static int dopr PARAMS ((char *buffer, size_t maxlen, const char *format, 
-                        va_list args));
-static int fmtstr PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
-                          char *value, int flags, int min, int max));
-static int fmtint PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
-                          LLONG value, int base, int min, int max, int flags));
-static int fmtfp PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
-                         LDOUBLE fvalue, int min, int max, int flags));
-static int dopr_outch PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
-                              char c));
+static int dopr (char *buffer, size_t maxlen, const char *format,
+                 va_list args);
+static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
+                   const char *value, int flags, int min, int max);
+static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
+                   LLONG value, int base, int min, int max, int flags);
+static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
+                  LDOUBLE fvalue, int min, int max, int flags);
+static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c);
 
 /*
  * dopr(): poor man's version of doprintf
@@ -189,14 +156,14 @@ static int dopr_outch PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
 #define DP_S_DONE    8
 
 /* format flags - Bits */
-#define DP_F_MINUS     (1 << 0)
-#define DP_F_PLUS      (1 << 1)
-#define DP_F_SPACE     (1 << 2)
-#define DP_F_NUM       (1 << 3)
-#define DP_F_ZERO      (1 << 4)
-#define DP_F_UP        (1 << 5)
-#define DP_F_UNSIGNED  (1 << 6)
-#define DP_F_FP_G      (1 << 7)
+#define DP_F_MINUS      (1 << 0)
+#define DP_F_PLUS       (1 << 1)
+#define DP_F_SPACE      (1 << 2)
+#define DP_F_NUM        (1 << 3)
+#define DP_F_ZERO       (1 << 4)
+#define DP_F_UP         (1 << 5)
+#define DP_F_UNSIGNED   (1 << 6)
+#define DP_F_FP_G       (1 << 7)
 
 /* Conversion Flags */
 #define DP_C_SHORT   1
@@ -208,8 +175,7 @@ static int dopr_outch PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
 #define MAX(p,q) ((p >= q) ? p : q)
 #define MIN(p,q) ((p <= q) ? p : q)
 
-static int
-dopr (char *buffer, size_t maxlen, const char *format, va_list args)
+static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
 {
   char ch;
   LLONG value;
@@ -238,113 +204,113 @@ dopr (char *buffer, size_t maxlen, const char *format, va_list args)
     {
     case DP_S_DEFAULT:
       if (ch == '%') 
-       state = DP_S_FLAGS;
+        state = DP_S_FLAGS;
       else 
-       total += dopr_outch (buffer, &currlen, maxlen, ch);
+        total += dopr_outch (buffer, &currlen, maxlen, ch);
       ch = *format++;
       break;
     case DP_S_FLAGS:
       switch (ch) 
       {
       case '-':
-       flags |= DP_F_MINUS;
+        flags |= DP_F_MINUS;
         ch = *format++;
-       break;
+        break;
       case '+':
-       flags |= DP_F_PLUS;
+        flags |= DP_F_PLUS;
         ch = *format++;
-       break;
+        break;
       case ' ':
-       flags |= DP_F_SPACE;
+        flags |= DP_F_SPACE;
         ch = *format++;
-       break;
+        break;
       case '#':
-       flags |= DP_F_NUM;
+        flags |= DP_F_NUM;
         ch = *format++;
-       break;
+        break;
       case '0':
-       flags |= DP_F_ZERO;
+        flags |= DP_F_ZERO;
         ch = *format++;
-       break;
+        break;
       default:
-       state = DP_S_MIN;
-       break;
+        state = DP_S_MIN;
+        break;
       }
       break;
     case DP_S_MIN:
       if ('0' <= ch && ch <= '9')
       {
-       min = 10*min + char_to_int (ch);
-       ch = *format++;
+        min = 10*min + char_to_int (ch);
+        ch = *format++;
       } 
       else if (ch == '*') 
       {
-       min = va_arg (args, int);
-       ch = *format++;
-       state = DP_S_DOT;
+        min = va_arg (args, int);
+        ch = *format++;
+        state = DP_S_DOT;
       } 
       else 
-       state = DP_S_DOT;
+        state = DP_S_DOT;
       break;
     case DP_S_DOT:
       if (ch == '.') 
       {
-       state = DP_S_MAX;
-       ch = *format++;
+        state = DP_S_MAX;
+        ch = *format++;
       } 
       else 
-       state = DP_S_MOD;
+        state = DP_S_MOD;
       break;
     case DP_S_MAX:
       if ('0' <= ch && ch <= '9')
       {
-       if (max < 0)
-         max = 0;
-       max = 10*max + char_to_int (ch);
-       ch = *format++;
+        if (max < 0)
+          max = 0;
+        max = 10*max + char_to_int (ch);
+        ch = *format++;
       } 
       else if (ch == '*') 
       {
-       max = va_arg (args, int);
-       ch = *format++;
-       state = DP_S_MOD;
+        max = va_arg (args, int);
+        ch = *format++;
+        state = DP_S_MOD;
       } 
       else 
-       state = DP_S_MOD;
+        state = DP_S_MOD;
       break;
     case DP_S_MOD:
       switch (ch) 
       {
       case 'h':
-       cflags = DP_C_SHORT;
-       ch = *format++;
-       break;
+        cflags = DP_C_SHORT;
+        ch = *format++;
+        break;
       case 'l':
-       cflags = DP_C_LONG;
-       ch = *format++;
-       break;
+        cflags = DP_C_LONG;
+        ch = *format++;
+        break;
       case 'L':
-       cflags = DP_C_LDOUBLE;
-       ch = *format++;
-       break;
+        cflags = DP_C_LDOUBLE;
+        ch = *format++;
+        break;
       default:
-       break;
+        break;
       }
       if (cflags != DP_C_LONG)
-       state = DP_S_CONV;
+        state = DP_S_CONV;
       else
-       state = DP_S_MOD_L;
+        state = DP_S_MOD_L;
       break;
     case DP_S_MOD_L:
       switch (ch)
-       {
-       case 'l':
-         cflags = DP_C_LLONG;
-         ch = *format++;
-         break;
-       default:
-         break;
-       }
+        {
+        case 'l':
+          cflags = DP_C_LLONG;
+          ch = *format++;
+          break;
+        default:
+          break;
+        }
       state = DP_S_CONV;
       break;
     case DP_S_CONV:
@@ -352,131 +318,131 @@ dopr (char *buffer, size_t maxlen, const char *format, va_list args)
       {
       case 'd':
       case 'i':
-       if (cflags == DP_C_SHORT) 
-         value = (short int) va_arg (args, int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, long int);
-       else if (cflags == DP_C_LLONG)
-         value = va_arg (args, LLONG);
-       else
-         value = va_arg (args, int);
-       total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-       break;
+        if (cflags == DP_C_SHORT) 
+          value = (short int) va_arg (args, int);
+        else if (cflags == DP_C_LONG)
+          value = va_arg (args, long int);
+        else if (cflags == DP_C_LLONG)
+          value = va_arg (args, LLONG);
+        else
+          value = va_arg (args, int);
+        total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
+        break;
       case 'o':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-       else if (cflags == DP_C_LLONG)
-         value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
-       break;
+        flags |= DP_F_UNSIGNED;
+        if (cflags == DP_C_SHORT)
+          value = (unsigned short int) va_arg (args, unsigned int);
+        else if (cflags == DP_C_LONG)
+          value = va_arg (args, unsigned long int);
+        else if (cflags == DP_C_LLONG)
+          value = va_arg (args, unsigned LLONG);
+        else
+          value = va_arg (args, unsigned int);
+        total += fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
+        break;
       case 'u':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-       else if (cflags == DP_C_LLONG)
-         value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-       break;
+        flags |= DP_F_UNSIGNED;
+        if (cflags == DP_C_SHORT)
+          value = (unsigned short int) va_arg (args, unsigned int);
+        else if (cflags == DP_C_LONG)
+          value = va_arg (args, unsigned long int);
+        else if (cflags == DP_C_LLONG)
+          value = va_arg (args, unsigned LLONG);
+        else
+          value = va_arg (args, unsigned int);
+        total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
+        break;
       case 'X':
-       flags |= DP_F_UP;
+        flags |= DP_F_UP;
       case 'x':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-       else if (cflags == DP_C_LLONG)
-         value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
-       break;
+        flags |= DP_F_UNSIGNED;
+        if (cflags == DP_C_SHORT)
+          value = (unsigned short int) va_arg (args, unsigned int);
+        else if (cflags == DP_C_LONG)
+          value = va_arg (args, unsigned long int);
+        else if (cflags == DP_C_LLONG)
+          value = va_arg (args, unsigned LLONG);
+        else
+          value = va_arg (args, unsigned int);
+        total += fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
+        break;
       case 'f':
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = va_arg (args, double);
-       total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
+        if (cflags == DP_C_LDOUBLE)
+          fvalue = va_arg (args, LDOUBLE);
+        else
+          fvalue = va_arg (args, double);
+        total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+        break;
       case 'E':
-       flags |= DP_F_UP;
+        flags |= DP_F_UP;
       case 'e':
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = va_arg (args, double);
-       total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
+        if (cflags == DP_C_LDOUBLE)
+          fvalue = va_arg (args, LDOUBLE);
+        else
+          fvalue = va_arg (args, double);
+        total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+        break;
       case 'G':
-       flags |= DP_F_UP;
+        flags |= DP_F_UP;
       case 'g':
-       flags |= DP_F_FP_G;
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = va_arg (args, double);
-       if (max == 0)
-         /* C99 says: if precision [for %g] is zero, it is taken as one */
-         max = 1;
-       total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
+        flags |= DP_F_FP_G;
+        if (cflags == DP_C_LDOUBLE)
+          fvalue = va_arg (args, LDOUBLE);
+        else
+          fvalue = va_arg (args, double);
+        if (max == 0)
+          /* C99 says: if precision [for %g] is zero, it is taken as one */
+          max = 1;
+        total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+        break;
       case 'c':
-       total += dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
-       break;
+        total += dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
+        break;
       case 's':
-       strvalue = va_arg (args, char *);
-       total += fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
-       break;
+        strvalue = va_arg (args, char *);
+        total += fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
+        break;
       case 'p':
-       strvalue = va_arg (args, void *);
-       total += fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min,
+        strvalue = va_arg (args, void *);
+        total += fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min,
                          max, flags);
-       break;
+        break;
       case 'n':
-       if (cflags == DP_C_SHORT) 
-       {
-         short int *num;
-         num = va_arg (args, short int *);
-         *num = currlen;
+        if (cflags == DP_C_SHORT) 
+        {
+          short int *num;
+          num = va_arg (args, short int *);
+          *num = currlen;
         }
-       else if (cflags == DP_C_LONG) 
-       {
-         long int *num;
-         num = va_arg (args, long int *);
-         *num = currlen;
+        else if (cflags == DP_C_LONG) 
+        {
+          long int *num;
+          num = va_arg (args, long int *);
+          *num = currlen;
         } 
-       else if (cflags == DP_C_LLONG) 
-       {
-         LLONG *num;
-         num = va_arg (args, LLONG *);
-         *num = currlen;
+        else if (cflags == DP_C_LLONG) 
+        {
+          LLONG *num;
+          num = va_arg (args, LLONG *);
+          *num = currlen;
         } 
-       else 
-       {
-         int *num;
-         num = va_arg (args, int *);
-         *num = currlen;
+        else 
+        {
+          int *num;
+          num = va_arg (args, int *);
+          *num = currlen;
         }
-       break;
+        break;
       case '%':
-       total += dopr_outch (buffer, &currlen, maxlen, ch);
-       break;
+        total += dopr_outch (buffer, &currlen, maxlen, ch);
+        break;
       case 'w':
-       /* not supported yet, treat as next char */
-       ch = *format++;
-       break;
+        /* not supported yet, treat as next char */
+        ch = *format++;
+        break;
       default:
-       /* Unknown, skip */
-       break;
+        /* Unknown, skip */
+        break;
       }
       ch = *format++;
       state = DP_S_DEFAULT;
@@ -500,9 +466,8 @@ dopr (char *buffer, size_t maxlen, const char *format, va_list args)
   return total;
 }
 
-static int
-fmtstr (char *buffer, size_t *currlen, size_t maxlen,
-       char *value, int flags, int min, int max)
+static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
+                   const char *value, int flags, int min, int max)
 {
   int padlen, strln;     /* amount to pad */
   int cnt = 0;
@@ -518,7 +483,8 @@ fmtstr (char *buffer, size_t *currlen, size_t maxlen,
   else
     /* When precision is specified, don't read VALUE past precision. */
     /*strln = strnlen (value, max);*/
-    for (strln = 0; strln < max && value[strln]; ++strln);
+    for (strln = 0; strln < max && value[strln]; ++strln)
+      ;
   padlen = min - strln;
   if (padlen < 0) 
     padlen = 0;
@@ -545,9 +511,8 @@ fmtstr (char *buffer, size_t *currlen, size_t maxlen,
 
 /* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
 
-static int
-fmtint (char *buffer, size_t *currlen, size_t maxlen,
-       LLONG value, int base, int min, int max, int flags)
+static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
+                   LLONG value, int base, int min, int max, int flags)
 {
   int signvalue = 0;
   unsigned LLONG uvalue;
@@ -571,10 +536,10 @@ fmtint (char *buffer, size_t *currlen, size_t maxlen,
     }
     else
       if (flags & DP_F_PLUS)  /* Do a sign (+/i) */
-       signvalue = '+';
+        signvalue = '+';
     else
       if (flags & DP_F_SPACE)
-       signvalue = ' ';
+        signvalue = ' ';
   }
   
   if (flags & DP_F_UP)
@@ -641,8 +606,7 @@ fmtint (char *buffer, size_t *currlen, size_t maxlen,
   return total;
 }
 
-static LDOUBLE
-abs_val (LDOUBLE value)
+static LDOUBLE abs_val (LDOUBLE value)
 {
   LDOUBLE result = value;
 
@@ -652,8 +616,7 @@ abs_val (LDOUBLE value)
   return result;
 }
 
-static LDOUBLE
-pow10 (int exp)
+static LDOUBLE pow10_int (int exp)
 {
   LDOUBLE result = 1;
 
@@ -666,8 +629,7 @@ pow10 (int exp)
   return result;
 }
 
-static LLONG
-round (LDOUBLE value)
+static LLONG round_int (LDOUBLE value)
 {
   LLONG intpart;
 
@@ -679,9 +641,8 @@ round (LDOUBLE value)
   return intpart;
 }
 
-static int
-fmtfp (char *buffer, size_t *currlen, size_t maxlen,
-       LDOUBLE fvalue, int min, int max, int flags)
+static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
+                  LDOUBLE fvalue, int min, int max, int flags)
 {
   int signvalue = 0;
   LDOUBLE ufvalue;
@@ -715,7 +676,7 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
       signvalue = '+';
     else
       if (flags & DP_F_SPACE)
-       signvalue = ' ';
+        signvalue = ' ';
 
 #if 0
   if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
@@ -727,11 +688,24 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
      includes the digits in intpart. */
   if (flags & DP_F_FP_G)
     {
-      LLONG temp = intpart;
-      for (temp = intpart; temp != 0; temp /= 10)
-       --max;
-      if (max < 0)
-       max = 0;
+      if (intpart != 0)
+        {
+          /* For each digit of INTPART, print one less fractional digit. */
+          LLONG temp = intpart;
+          for (temp = intpart; temp != 0; temp /= 10)
+            --max;
+          if (max < 0)
+            max = 0;
+        }
+      else
+        {
+          /* For each leading 0 in fractional part, print one more
+             fractional digit. */
+          LDOUBLE temp;
+          if (ufvalue != 0)
+            for (temp = ufvalue; temp < 0.1; temp *= 10)
+              ++max;
+        }
     }
 
   /* C99: trailing zeros are removed from the fractional portion of the
@@ -740,9 +714,9 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
     omitzeros = 1;
 
 #if SIZEOF_LONG_LONG > 0
-# define MAX_DIGITS 18         /* grok more digits with long long */
+# define MAX_DIGITS 18          /* grok more digits with long long */
 #else
-# define MAX_DIGITS 9          /* just long */
+# define MAX_DIGITS 9           /* just long */
 #endif
 
   /* 
@@ -753,12 +727,12 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
     max = MAX_DIGITS;
 
   /* Factor of 10 with the needed number of digits, e.g. 1000 for max==3 */
-  mask10 = pow10 (max);
+  mask10 = pow10_int (max);
 
   /* We "cheat" by converting the fractional part to integer by
    * multiplying by a factor of 10
    */
-  fracpart = round (mask10 * (ufvalue - intpart));
+  fracpart = round_int (mask10 * (ufvalue - intpart));
 
   if (fracpart >= mask10)
   {
@@ -771,8 +745,8 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
        requires one leading zero to distinguish it from 2.1. */
     while (fracpart < mask10 / 10)
       {
-       ++leadingfrac0s;
-       mask10 /= 10;
+        ++leadingfrac0s;
+        mask10 /= 10;
       }
 
 #ifdef DEBUG_SNPRINTF
@@ -863,8 +837,7 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
   return total;
 }
 
-static int
-dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
+static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
 {
   if (*currlen + 1 < maxlen)
     buffer[(*currlen)++] = c;
@@ -872,8 +845,7 @@ dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
 }
 
 #ifndef HAVE_VSNPRINTF
-int
-vsnprintf (char *str, size_t count, const char *fmt, va_list args)
+int vsnprintf (char *str, size_t count, const char *fmt, va_list args)
 {
   if (str != NULL)
     str[0] = 0;
@@ -882,23 +854,14 @@ vsnprintf (char *str, size_t count, const char *fmt, va_list args)
 #endif /* !HAVE_VSNPRINTF */
 
 #ifndef HAVE_SNPRINTF
-int
-snprintf (char *str, size_t count,const char *fmt,...)
+int snprintf (char *str, size_t count, const char *fmt,...)
 {
-#ifndef HAVE_STDARGS
-  char *str;
-  size_t count;
-  char *fmt;
-#endif
-  VA_LOCAL_DECL;
+  va_list ap;
   int total;
-    
-  VA_START (fmt);
-  VA_SHIFT (str, char *);
-  VA_SHIFT (count, size_t );
-  VA_SHIFT (fmt, char *);
-  total = vsnprintf(str, count, fmt, ap);
-  VA_END;
+
+  va_start (ap, fmt);
+  total = vsnprintf (str, count, fmt, ap);
+  va_end (ap);
   return total;
 }
 #endif /* !HAVE_SNPRINTF */
@@ -910,12 +873,13 @@ snprintf (char *str, size_t count,const char *fmt,...)
 #  define LONG_STRING 1024
 # endif
 
-int
-main (void)
+int main (void)
 {
   char buf1[LONG_STRING];
   char buf2[LONG_STRING];
   char *fp_fmt[] = {
+    /* %f formats */
+    "%f",
     "%-1.5f",
     "%1.5f",
     "%123.9f",
@@ -929,13 +893,28 @@ main (void)
     "%3.2f",
     "%.0f",
     "%.1f",
-    "%-1.5g",
+    "%#10.1f",
+#if SIZEOF_LONG_LONG != 0
+    "%.16f",
+    "%18.16f",
+    "%-16.16f",
+#endif
+    /* %g formats */
+    "%g",
     "%1.5g",
+    "%-1.5g",
+    "%.9g",
     "%123.9g",
+    "%#123.9g",
+#if SIZEOF_LONG_LONG != 0
+    "%.16g",
+    "%20.16g",
+#endif
     NULL
   };
   double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, 
-    0.9996, 1.996, 4.136, 0.00205, 0};
+                       0.9996, 1.996, 4.136, 0.00205, 0.0001, 321.000009,
+                       0};
   char *int_fmt[] = {
     "%-1.5d",
     "%1.5d",
@@ -951,20 +930,20 @@ main (void)
   long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
 #if SIZEOF_LONG_LONG != 0
   char *llong_fmt[] = {
-    "%lld",            "%llu",
-    "%-1.5lld",                "%-1.5llu",
-    "%1.5lld",         "%1.5llu",
-    "%123.9lld",       "%123.9llu",
-    "%5.5lld",         "%5.5llu",
-    "%10.5lld",                "%10.5llu",
-    "% 10.5lld",       "% 10.5llu",
-    "%+22.33lld",      "%+22.33llu",
-    "%01.3lld",                "%01.3llu",
-    "%4lld",           "%4llu",
+    "%lld",             "%llu",
+    "%-1.5lld",         "%-1.5llu",
+    "%1.5lld",          "%1.5llu",
+    "%123.9lld",        "%123.9llu",
+    "%5.5lld",          "%5.5llu",
+    "%10.5lld",         "%10.5llu",
+    "% 10.5lld",        "% 10.5llu",
+    "%+22.33lld",       "%+22.33llu",
+    "%01.3lld",         "%01.3llu",
+    "%4lld",            "%4llu",
     NULL
   };
   long long llong_nums[] = {
-    ~(long long)0,             /* all-1 bit pattern */
+    ~(long long)0,              /* all-1 bit pattern */
     (~(unsigned long long)0) >> 1, /* largest signed long long */
     /* random... */
     -150, 134, 91340, 341,
@@ -984,9 +963,9 @@ main (void)
       sprintf (buf2, fp_fmt[x], fp_nums[y]);
       if (strcmp (buf1, buf2))
       {
-       printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
-           fp_fmt[x], buf1, buf2);
-       fail++;
+        printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
+            fp_fmt[x], buf1, buf2);
+        fail++;
       }
       num++;
     }
@@ -998,9 +977,9 @@ main (void)
       sprintf (buf2, int_fmt[x], int_nums[y]);
       if (strcmp (buf1, buf2))
       {
-       printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
-           int_fmt[x], buf1, buf2);
-       fail++;
+        printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
+            int_fmt[x], buf1, buf2);
+        fail++;
       }
       num++;
     }
@@ -1013,9 +992,9 @@ main (void)
       sprintf (buf2, llong_fmt[x], llong_nums[y]);
       if (strcmp (buf1, buf2))
       {
-       printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
-           llong_fmt[x], buf1, buf2);
-       fail++;
+        printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
+            llong_fmt[x], buf1, buf2);
+        fail++;
       }
       num++;
     }