gpg: Make the double space in the middle of a fingerprint optional.
[gnupg.git] / common / estream-printf.c
index e5976bd..797f9aa 100644 (file)
@@ -1,11 +1,11 @@
-/* estream-printf.c - Versatile C-99 compliant printf formatting
- * Copyright (C) 2007 g10 Code GmbH
+/* estream-printf.c - Versatile mostly C-99 compliant printf formatting
+ * Copyright (C) 2007, 2008, 2009, 2010 g10 Code GmbH
  *
  * This file is part of Libestream.
  *
  * Libestream is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published
  *
  * This file is part of Libestream.
  *
  * Libestream is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 3 of the License,
+ * by the Free Software Foundation; either version 2 of the License,
  * or (at your option) any later version.
  *
  * Libestream is distributed in the hope that it will be useful, but
  * or (at your option) any later version.
  *
  * Libestream is distributed in the hope that it will be useful, but
  * You should have received a copy of the GNU General Public License
  * along with Libestream; if not, see <http://www.gnu.org/licenses/>.
  *
  * You should have received a copy of the GNU General Public License
  * along with Libestream; if not, see <http://www.gnu.org/licenses/>.
  *
- * $Id: estream-printf.c 56 2007-05-15 18:38:43Z wk $
+ * ALTERNATIVELY, Libestream may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, and the entire permission notice in its entirety,
+ *    including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 /*  Required autoconf tests:
  */
 
 /*  Required autoconf tests:
 
   Missing stuff:  wchar and wint_t
                   thousands_sep in pr_float.
 
   Missing stuff:  wchar and wint_t
                   thousands_sep in pr_float.
+
 */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
 */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#if defined(_WIN32) && !defined(HAVE_W32_SYSTEM)
+# define HAVE_W32_SYSTEM 1
+# if defined(__MINGW32CE__) && !defined (HAVE_W32CE_SYSTEM)
+#  define HAVE_W32CE_SYSTEM
+# endif
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stddef.h>
 #include <assert.h>
 #if defined(HAVE_INTMAX_T) || defined(HAVE_UINTMAX_T)
 #include <stddef.h>
 #include <assert.h>
 #if defined(HAVE_INTMAX_T) || defined(HAVE_UINTMAX_T)
-# include <stdint.h>
+# ifdef HAVE_STDINT_H
+#  include <stdint.h>
+# endif
 #endif
 #ifdef HAVE_LANGINFO_THOUSANDS_SEP
 #include <langinfo.h>
 #endif
 #endif
 #ifdef HAVE_LANGINFO_THOUSANDS_SEP
 #include <langinfo.h>
 #endif
-#ifdef TEST
-# include <locale.h>
-#else
-# ifdef _ESTREAM_PRINTF_EXTRA_INCLUDE
-#  include _ESTREAM_PRINTF_EXTRA_INCLUDE
-# endif
+#ifdef HAVE_W32CE_SYSTEM
+#include <gpg-error.h>  /* ERRNO replacement.  */
+#endif
+#ifdef _ESTREAM_PRINTF_EXTRA_INCLUDE
+# include _ESTREAM_PRINTF_EXTRA_INCLUDE
 #endif
 #include "estream-printf.h"
 
 #endif
 #include "estream-printf.h"
 
+/* #define DEBUG 1 */
+
+
 /* Allow redefinition of asprintf used malloc functions.  */
 /* Allow redefinition of asprintf used malloc functions.  */
-#if defined(_ESTREAM_PRINTF_MALLOC) && !defined(TEST)
-#define my_printf_malloc(a) _ESTREAM_PRINTF_MALLOC((a))  
+#if defined(_ESTREAM_PRINTF_MALLOC)
+#define my_printf_malloc(a) _ESTREAM_PRINTF_MALLOC((a))
 #else
 #define my_printf_malloc(a) malloc((a))
 #endif
 #else
 #define my_printf_malloc(a) malloc((a))
 #endif
-#if defined(_ESTREAM_PRINTF_FREE) && !defined(TEST)
-#define my_printf_free(a)   _ESTREAM_PRINTF_FREE((a))  
+#if defined(_ESTREAM_PRINTF_FREE)
+#define my_printf_free(a)   _ESTREAM_PRINTF_FREE((a))
 #else
 #define my_printf_free(a)   free((a))
 #endif
 
 #else
 #define my_printf_free(a)   free((a))
 #endif
 
+/* A wrapper to set ERRNO.  */
+#ifdef HAVE_W32CE_SYSTEM
+# define _set_errno(a)  gpg_err_set_errno ((a))
+#else
+# define _set_errno(a)  do { errno = (a); } while (0)
+#endif
+
 
 /* Calculate array dimension.  */
 #ifndef DIM
 
 /* Calculate array dimension.  */
 #ifndef DIM
@@ -182,7 +233,7 @@ typedef enum
 
 
 /* A union used to store the actual values. */
 
 
 /* A union used to store the actual values. */
-typedef union 
+typedef union
 {
   char a_char;
   signed char a_schar;
 {
   char a_char;
   signed char a_schar;
@@ -259,16 +310,14 @@ struct valueitem_s
 typedef struct valueitem_s *valueitem_t;
 
 
 typedef struct valueitem_s *valueitem_t;
 
 
-#ifdef TEST
-static int verbose; 
-
+#ifdef DEBUG
 static void
 dump_argspecs (argspec_t arg, size_t argcount)
 {
   int idx;
 
   for (idx=0; argcount; argcount--, arg++, idx++)
 static void
 dump_argspecs (argspec_t arg, size_t argcount)
 {
   int idx;
 
   for (idx=0; argcount; argcount--, arg++, idx++)
-    fprintf (stderr, 
+    fprintf (stderr,
              "%2d: len=%u flags=%u width=%d prec=%d mod=%d "
              "con=%d vt=%d pos=%d-%d-%d\n",
              idx,
              "%2d: len=%u flags=%u width=%d prec=%d mod=%d "
              "con=%d vt=%d pos=%d-%d-%d\n",
              idx,
@@ -283,7 +332,7 @@ dump_argspecs (argspec_t arg, size_t argcount)
              arg->width_pos,
              arg->precision_pos);
 }
              arg->width_pos,
              arg->precision_pos);
 }
-#endif /*TEST*/
+#endif /*DEBUG*/
 
 
 /* Set the vt field for ARG.  */
 
 
 /* Set the vt field for ARG.  */
@@ -292,8 +341,8 @@ compute_type (argspec_t arg)
 {
   switch (arg->conspec)
     {
 {
   switch (arg->conspec)
     {
-    case CONSPEC_UNKNOWN: 
-      arg->vt = VALTYPE_UNSUPPORTED; 
+    case CONSPEC_UNKNOWN:
+      arg->vt = VALTYPE_UNSUPPORTED;
       break;
 
     case CONSPEC_DECIMAL:
       break;
 
     case CONSPEC_DECIMAL:
@@ -304,7 +353,7 @@ compute_type (argspec_t arg)
         case LENMOD_LONG: arg->vt = VALTYPE_LONG; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX; break;
         case LENMOD_LONG: arg->vt = VALTYPE_LONG; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX; break;
-        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;   
+        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
         default: arg->vt = VALTYPE_INT; break;
         }
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
         default: arg->vt = VALTYPE_INT; break;
         }
@@ -321,12 +370,12 @@ compute_type (argspec_t arg)
         case LENMOD_LONG: arg->vt = VALTYPE_ULONG; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_ULONGLONG; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_UINTMAX; break;
         case LENMOD_LONG: arg->vt = VALTYPE_ULONG; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_ULONGLONG; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_UINTMAX; break;
-        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;   
+        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
         default: arg->vt = VALTYPE_UINT; break;
         }
       break;
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
         default: arg->vt = VALTYPE_UINT; break;
         }
       break;
-      
+
     case CONSPEC_FLOAT:
     case CONSPEC_FLOAT_UP:
     case CONSPEC_EXP:
     case CONSPEC_FLOAT:
     case CONSPEC_FLOAT_UP:
     case CONSPEC_EXP:
@@ -342,9 +391,9 @@ compute_type (argspec_t arg)
         default: arg->vt = VALTYPE_DOUBLE; break;
         }
       break;
         default: arg->vt = VALTYPE_DOUBLE; break;
         }
       break;
-      
+
     case CONSPEC_CHAR:
     case CONSPEC_CHAR:
-      arg->vt = VALTYPE_INT; 
+      arg->vt = VALTYPE_INT;
       break;
 
     case CONSPEC_STRING:
       break;
 
     case CONSPEC_STRING:
@@ -367,12 +416,12 @@ compute_type (argspec_t arg)
         case LENMOD_LONG: arg->vt = VALTYPE_LONG_PTR; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG_PTR; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX_PTR; break;
         case LENMOD_LONG: arg->vt = VALTYPE_LONG_PTR; break;
         case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG_PTR; break;
         case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX_PTR; break;
-        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE_PTR; break;   
+        case LENMOD_SIZET: arg->vt = VALTYPE_SIZE_PTR; break;
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF_PTR; break;
         default: arg->vt = VALTYPE_INT_PTR; break;
         }
       break;
         case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF_PTR; break;
         default: arg->vt = VALTYPE_INT_PTR; break;
         }
       break;
-      
+
     }
 }
 
     }
 }
 
@@ -397,7 +446,7 @@ parse_format (const char *format,
 
   if (!format)
     goto leave_einval;
 
   if (!format)
     goto leave_einval;
-      
+
   for (; *format; format++)
     {
       unsigned int flags;
   for (; *format; format++)
     {
       unsigned int flags;
@@ -405,7 +454,7 @@ parse_format (const char *format,
       lenmod_t lenmod;
       conspec_t conspec;
       int arg_pos, width_pos, precision_pos;
       lenmod_t lenmod;
       conspec_t conspec;
       int arg_pos, width_pos, precision_pos;
-      
+
       if (*format != '%')
         continue;
       s = ++format;
       if (*format != '%')
         continue;
       s = ++format;
@@ -419,7 +468,7 @@ parse_format (const char *format,
       if (*s >= '1' && *s <= '9')
         {
           const char *save_s = s;
       if (*s >= '1' && *s <= '9')
         {
           const char *save_s = s;
-          
+
           arg_pos = (*s++ - '0');
           for (; *s >= '0' && *s <= '9'; s++)
             arg_pos = 10*arg_pos + (*s - '0');
           arg_pos = (*s++ - '0');
           for (; *s >= '0' && *s <= '9'; s++)
             arg_pos = 10*arg_pos + (*s - '0');
@@ -433,7 +482,7 @@ parse_format (const char *format,
               s = save_s;
             }
         }
               s = save_s;
             }
         }
-         
+
       /* Parse the flags.  */
       flags = 0;
       for ( ; *s; s++)
       /* Parse the flags.  */
       flags = 0;
       for ( ; *s; s++)
@@ -451,7 +500,7 @@ parse_format (const char *format,
             }
         }
     flags_parsed:
             }
         }
     flags_parsed:
-      
+
       /* Parse the field width.  */
       width_pos = 0;
       if (*s == '*')
       /* Parse the field width.  */
       width_pos = 0;
       if (*s == '*')
@@ -534,11 +583,11 @@ parse_format (const char *format,
           if (ignore_value)
             precision = NO_FIELD_VALUE;
         }
           if (ignore_value)
             precision = NO_FIELD_VALUE;
         }
-      
+
       /* Parse the length modifiers.  */
       switch (*s)
         {
       /* Parse the length modifiers.  */
       switch (*s)
         {
-        case 'h': 
+        case 'h':
           if (s[1] == 'h')
             {
               lenmod = LENMOD_CHAR;
           if (s[1] == 'h')
             {
               lenmod = LENMOD_CHAR;
@@ -564,7 +613,7 @@ parse_format (const char *format,
         case 'L': lenmod = LENMOD_LONGDBL; s++; break;
         default:  lenmod = LENMOD_NONE; break;
         }
         case 'L': lenmod = LENMOD_LONGDBL; s++; break;
         default:  lenmod = LENMOD_NONE; break;
         }
-      
+
       /* Parse the conversion specifier.  */
       switch (*s)
         {
       /* Parse the conversion specifier.  */
       switch (*s)
         {
@@ -634,9 +683,9 @@ parse_format (const char *format,
   *argspecs_addr = argspecs;
   *r_argspecs_count = argcount;
   return 0; /* Success.  */
   *argspecs_addr = argspecs;
   *r_argspecs_count = argcount;
   return 0; /* Success.  */
-  
+
  leave_einval:
  leave_einval:
-  errno = EINVAL;
+  _set_errno (EINVAL);
  leave:
   if (argspecs != *argspecs_addr)
     free (argspecs);
  leave:
   if (argspecs != *argspecs_addr)
     free (argspecs);
@@ -665,14 +714,14 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs)
           value->a_char_ptr = va_arg (vaargs, char *);
           break;
         case VALTYPE_SCHAR: value->a_schar = va_arg (vaargs, int); break;
           value->a_char_ptr = va_arg (vaargs, char *);
           break;
         case VALTYPE_SCHAR: value->a_schar = va_arg (vaargs, int); break;
-        case VALTYPE_SCHAR_PTR: 
-          value->a_schar_ptr = va_arg (vaargs, signed char *); 
+        case VALTYPE_SCHAR_PTR:
+          value->a_schar_ptr = va_arg (vaargs, signed char *);
           break;
         case VALTYPE_UCHAR: value->a_uchar = va_arg (vaargs, int); break;
         case VALTYPE_SHORT: value->a_short = va_arg (vaargs, int); break;
         case VALTYPE_USHORT: value->a_ushort = va_arg (vaargs, int); break;
           break;
         case VALTYPE_UCHAR: value->a_uchar = va_arg (vaargs, int); break;
         case VALTYPE_SHORT: value->a_short = va_arg (vaargs, int); break;
         case VALTYPE_USHORT: value->a_ushort = va_arg (vaargs, int); break;
-        case VALTYPE_SHORT_PTR: 
-          value->a_short_ptr = va_arg (vaargs, short *); 
+        case VALTYPE_SHORT_PTR:
+          value->a_short_ptr = va_arg (vaargs, short *);
           break;
         case VALTYPE_INT:
           value->a_int = va_arg (vaargs, int);
           break;
         case VALTYPE_INT:
           value->a_int = va_arg (vaargs, int);
@@ -686,20 +735,20 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs)
         case VALTYPE_LONG:
           value->a_long = va_arg (vaargs, long);
           break;
         case VALTYPE_LONG:
           value->a_long = va_arg (vaargs, long);
           break;
-        case VALTYPE_ULONG: 
+        case VALTYPE_ULONG:
           value->a_ulong = va_arg (vaargs, unsigned long);
           break;
           value->a_ulong = va_arg (vaargs, unsigned long);
           break;
-        case VALTYPE_LONG_PTR: 
-          value->a_long_ptr = va_arg (vaargs, long *); 
+        case VALTYPE_LONG_PTR:
+          value->a_long_ptr = va_arg (vaargs, long *);
           break;
 #ifdef HAVE_LONG_LONG_INT
         case VALTYPE_LONGLONG:
           value->a_longlong = va_arg (vaargs, long long int);
           break;
           break;
 #ifdef HAVE_LONG_LONG_INT
         case VALTYPE_LONGLONG:
           value->a_longlong = va_arg (vaargs, long long int);
           break;
-        case VALTYPE_ULONGLONG: 
-          value->a_ulonglong = va_arg (vaargs, unsigned long long int); 
+        case VALTYPE_ULONGLONG:
+          value->a_ulonglong = va_arg (vaargs, unsigned long long int);
           break;
           break;
-        case VALTYPE_LONGLONG_PTR: 
+        case VALTYPE_LONGLONG_PTR:
           value->a_longlong_ptr = va_arg (vaargs, long long *);
           break;
 #endif
           value->a_longlong_ptr = va_arg (vaargs, long long *);
           break;
 #endif
@@ -714,31 +763,31 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs)
         case VALTYPE_STRING:
           value->a_string = va_arg (vaargs, const char *);
           break;
         case VALTYPE_STRING:
           value->a_string = va_arg (vaargs, const char *);
           break;
-        case VALTYPE_POINTER: 
+        case VALTYPE_POINTER:
           value->a_void_ptr = va_arg (vaargs, void *);
           break;
 #ifdef HAVE_INTMAX_T
         case VALTYPE_INTMAX:
           value->a_intmax = va_arg (vaargs, intmax_t);
           break;
           value->a_void_ptr = va_arg (vaargs, void *);
           break;
 #ifdef HAVE_INTMAX_T
         case VALTYPE_INTMAX:
           value->a_intmax = va_arg (vaargs, intmax_t);
           break;
-        case VALTYPE_INTMAX_PTR: 
-          value->a_intmax_ptr = va_arg (vaargs, intmax_t *); 
+        case VALTYPE_INTMAX_PTR:
+          value->a_intmax_ptr = va_arg (vaargs, intmax_t *);
           break;
 #endif
 #ifdef HAVE_UINTMAX_T
           break;
 #endif
 #ifdef HAVE_UINTMAX_T
-        case VALTYPE_UINTMAX: 
-          value->a_uintmax = va_arg (vaargs, uintmax_t); 
+        case VALTYPE_UINTMAX:
+          value->a_uintmax = va_arg (vaargs, uintmax_t);
           break;
 #endif
         case VALTYPE_SIZE:
           value->a_size = va_arg (vaargs, size_t);
           break;
           break;
 #endif
         case VALTYPE_SIZE:
           value->a_size = va_arg (vaargs, size_t);
           break;
-        case VALTYPE_SIZE_PTR: 
-          value->a_size_ptr = va_arg (vaargs, size_t *); 
+        case VALTYPE_SIZE_PTR:
+          value->a_size_ptr = va_arg (vaargs, size_t *);
           break;
 #ifdef HAVE_PTRDIFF_T
         case VALTYPE_PTRDIFF:
           break;
 #ifdef HAVE_PTRDIFF_T
         case VALTYPE_PTRDIFF:
-          value->a_ptrdiff = va_arg (vaargs, ptrdiff_t); 
+          value->a_ptrdiff = va_arg (vaargs, ptrdiff_t);
           break;
         case VALTYPE_PTRDIFF_PTR:
           value->a_ptrdiff_ptr = va_arg (vaargs, ptrdiff_t *);
           break;
         case VALTYPE_PTRDIFF_PTR:
           value->a_ptrdiff_ptr = va_arg (vaargs, ptrdiff_t *);
@@ -773,7 +822,7 @@ pad_out (estream_printf_out_t outfnc, void *outfncarg,
       *nbytes += n;
       count -= n;
     }
       *nbytes += n;
       count -= n;
     }
-  
+
   return 0;
 }
 
   return 0;
 }
 
@@ -810,18 +859,18 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg,
         {
         case VALTYPE_SHORT: along = value.a_short; break;
         case VALTYPE_INT: along = value.a_int; break;
         {
         case VALTYPE_SHORT: along = value.a_short; break;
         case VALTYPE_INT: along = value.a_int; break;
-        case VALTYPE_LONG: along = value.a_long; break;  
+        case VALTYPE_LONG: along = value.a_long; break;
 #ifdef HAVE_LONG_LONG_INT
 #ifdef HAVE_LONG_LONG_INT
-        case VALTYPE_LONGLONG: along = value.a_longlong; break;  
-        case VALTYPE_SIZE: along = value.a_size; break;  
+        case VALTYPE_LONGLONG: along = value.a_longlong; break;
+        case VALTYPE_SIZE: along = value.a_size; break;
 # ifdef HAVE_INTMAX_T
 # ifdef HAVE_INTMAX_T
-        case VALTYPE_INTMAX: along = value.a_intmax; break;  
+        case VALTYPE_INTMAX: along = value.a_intmax; break;
 # endif
 # ifdef HAVE_PTRDIFF_T
 # endif
 # ifdef HAVE_PTRDIFF_T
-        case VALTYPE_PTRDIFF: along = value.a_ptrdiff; break;  
+        case VALTYPE_PTRDIFF: along = value.a_ptrdiff; break;
 # endif
 #endif /*HAVE_LONG_LONG_INT*/
 # endif
 #endif /*HAVE_LONG_LONG_INT*/
-        default: 
+        default:
           return -1;
         }
       if (along < 0)
           return -1;
         }
       if (along < 0)
@@ -838,18 +887,18 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg,
         {
         case VALTYPE_USHORT: aulong = value.a_ushort; break;
         case VALTYPE_UINT: aulong = value.a_uint; break;
         {
         case VALTYPE_USHORT: aulong = value.a_ushort; break;
         case VALTYPE_UINT: aulong = value.a_uint; break;
-        case VALTYPE_ULONG: aulong = value.a_ulong; break;  
+        case VALTYPE_ULONG: aulong = value.a_ulong; break;
 #ifdef HAVE_LONG_LONG_INT
 #ifdef HAVE_LONG_LONG_INT
-        case VALTYPE_ULONGLONG: aulong = value.a_ulonglong; break;  
-        case VALTYPE_SIZE: aulong = value.a_size; break;  
+        case VALTYPE_ULONGLONG: aulong = value.a_ulonglong; break;
+        case VALTYPE_SIZE: aulong = value.a_size; break;
 # ifdef HAVE_UINTMAX_T
 # ifdef HAVE_UINTMAX_T
-        case VALTYPE_UINTMAX: aulong = value.a_uintmax; break;  
+        case VALTYPE_UINTMAX: aulong = value.a_uintmax; break;
 # endif
 # ifdef HAVE_PTRDIFF_T
 # endif
 # ifdef HAVE_PTRDIFF_T
-        case VALTYPE_PTRDIFF: aulong = value.a_ptrdiff; break;  
+        case VALTYPE_PTRDIFF: aulong = value.a_ptrdiff; break;
 # endif
 #endif /*HAVE_LONG_LONG_INT*/
 # endif
 #endif /*HAVE_LONG_LONG_INT*/
-        default: 
+        default:
           return -1;
         }
     }
           return -1;
         }
     }
@@ -880,7 +929,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg,
 
       do
         {
 
       do
         {
-          if ((arg->flags & FLAG_GROUPING) 
+          if ((arg->flags & FLAG_GROUPING)
               && (++grouping == 3) && *grouping_string)
             {
               *--p = *grouping_string;
               && (++grouping == 3) && *grouping_string)
             {
               *--p = *grouping_string;
@@ -915,7 +964,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg,
       if ((arg->flags & FLAG_ALT_CONV))
         n_extra += 2;
     }
       if ((arg->flags & FLAG_ALT_CONV))
         n_extra += 2;
     }
-  
+
   n = pend - p;
 
   if ((arg->flags & FLAG_ZERO_PAD)
   n = pend - p;
 
   if ((arg->flags & FLAG_ZERO_PAD)
@@ -960,7 +1009,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg,
       if (rc)
         return rc;
     }
       if (rc)
         return rc;
     }
-      
+
   rc = outfnc (outfncarg, p, pend - p);
   if (rc)
     return rc;
   rc = outfnc (outfncarg, p, pend - p);
   if (rc)
     return rc;
@@ -997,7 +1046,7 @@ pr_float (estream_printf_out_t outfnc, void *outfncarg,
   int use_dbl = 0;
 #endif
   double afloat;
   int use_dbl = 0;
 #endif
   double afloat;
-  char numbuf[200];
+  char numbuf[350];
   char formatstr[20];
   char *p, *pend;
   size_t n;
   char formatstr[20];
   char *p, *pend;
   size_t n;
@@ -1013,7 +1062,7 @@ pr_float (estream_printf_out_t outfnc, void *outfncarg,
       adblfloat = value.a_longdouble;
       use_dbl=1; break;
 #endif
       adblfloat = value.a_longdouble;
       use_dbl=1; break;
 #endif
-    default: 
+    default:
       return -1;
     }
 
       return -1;
     }
 
@@ -1124,7 +1173,7 @@ pr_char (estream_printf_out_t outfnc, void *outfncarg,
   if(rc)
     return rc;
   *nbytes += 1;
   if(rc)
     return rc;
   *nbytes += 1;
-  
+
   return 0;
 }
 
   return 0;
 }
 
@@ -1145,7 +1194,7 @@ pr_string (estream_printf_out_t outfnc, void *outfncarg,
     string = "(null)";
   if (arg->precision >= 0)
     {
     string = "(null)";
   if (arg->precision >= 0)
     {
-      for (n=0,s=string; *s && n < arg->precision; s++) 
+      for (n=0,s=string; *s && n < arg->precision; s++)
         n++;
     }
   else
         n++;
     }
   else
@@ -1171,7 +1220,7 @@ pr_string (estream_printf_out_t outfnc, void *outfncarg,
       if (rc)
         return rc;
     }
       if (rc)
         return rc;
     }
-  
+
   return 0;
 }
 
   return 0;
 }
 
@@ -1212,7 +1261,7 @@ pr_pointer (estream_printf_out_t outfnc, void *outfncarg,
     *--p = '0';
   *--p = 'x';
   *--p = '0';
     *--p = '0';
   *--p = 'x';
   *--p = '0';
-  
+
   rc = outfnc (outfncarg, p, pend - p);
   if (rc)
     return rc;
   rc = outfnc (outfncarg, p, pend - p);
   if (rc)
     return rc;
@@ -1226,16 +1275,19 @@ static int
 pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg,
                  argspec_t arg, value_t value, size_t *nbytes)
 {
 pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg,
                  argspec_t arg, value_t value, size_t *nbytes)
 {
+  (void)outfnc;
+  (void)outfncarg;
+
   switch (arg->vt)
     {
   switch (arg->vt)
     {
-    case VALTYPE_SCHAR_PTR: 
-      *value.a_schar_ptr = (signed char)(unsigned int)(*nbytes); 
+    case VALTYPE_SCHAR_PTR:
+      *value.a_schar_ptr = (signed char)(unsigned int)(*nbytes);
       break;
       break;
-    case VALTYPE_SHORT_PTR:  
+    case VALTYPE_SHORT_PTR:
       *value.a_short_ptr = (short)(unsigned int)(*nbytes);
       break;
       *value.a_short_ptr = (short)(unsigned int)(*nbytes);
       break;
-    case VALTYPE_LONG_PTR:     
-      *value.a_long_ptr = (long)(*nbytes); 
+    case VALTYPE_LONG_PTR:
+      *value.a_long_ptr = (long)(*nbytes);
       break;
 #ifdef HAVE_LONG_LONG_INT
     case VALTYPE_LONGLONG_PTR:
       break;
 #ifdef HAVE_LONG_LONG_INT
     case VALTYPE_LONGLONG_PTR:
@@ -1243,12 +1295,12 @@ pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg,
       break;
 #endif
 #ifdef HAVE_INTMAX_T
       break;
 #endif
 #ifdef HAVE_INTMAX_T
-    case VALTYPE_INTMAX_PTR:   
+    case VALTYPE_INTMAX_PTR:
       *value.a_intmax_ptr = (intmax_t)(*nbytes);
       break;
 #endif
     case VALTYPE_SIZE_PTR:
       *value.a_intmax_ptr = (intmax_t)(*nbytes);
       break;
 #endif
     case VALTYPE_SIZE_PTR:
-      *value.a_size_ptr = (*nbytes); 
+      *value.a_size_ptr = (*nbytes);
       break;
 #ifdef HAVE_PTRDIFF_T
     case VALTYPE_PTRDIFF_PTR:
       break;
 #ifdef HAVE_PTRDIFF_T
     case VALTYPE_PTRDIFF_PTR:
@@ -1273,8 +1325,8 @@ pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg,
    holds the values and may be directly addressed using the position
    arguments given by ARGSPECS.  MYERRNO is used for the "%m"
    conversion. NBYTES well be updated to reflect the number of bytes
    holds the values and may be directly addressed using the position
    arguments given by ARGSPECS.  MYERRNO is used for the "%m"
    conversion. NBYTES well be updated to reflect the number of bytes
-   send to the output function. */ 
-static int 
+   send to the output function. */
+static int
 do_format (estream_printf_out_t outfnc, void *outfncarg,
            const char *format, argspec_t argspecs, size_t argspecs_len,
            valueitem_t valuetable, int myerrno, size_t *nbytes)
 do_format (estream_printf_out_t outfnc, void *outfncarg,
            const char *format, argspec_t argspecs, size_t argspecs_len,
            valueitem_t valuetable, int myerrno, size_t *nbytes)
@@ -1318,7 +1370,7 @@ do_format (estream_printf_out_t outfnc, void *outfncarg,
       /* Save the next start.  */
       s += arg->length;
       format = s;
       /* Save the next start.  */
       s += arg->length;
       format = s;
+
       assert (argidx < argspecs_len);
       argidx++;
 
       assert (argidx < argspecs_len);
       argidx++;
 
@@ -1386,9 +1438,9 @@ do_format (estream_printf_out_t outfnc, void *outfncarg,
         }
       if (rc)
         return rc;
         }
       if (rc)
         return rc;
-      arg++;    
+      arg++;
     }
     }
-  
+
   /* Print out any trailing stuff. */
   n = s - format;
   rc = n? outfnc (outfncarg, format, n) : 0;
   /* Print out any trailing stuff. */
   n = s - format;
   rc = n? outfnc (outfncarg, format, n) : 0;
@@ -1406,7 +1458,7 @@ do_format (estream_printf_out_t outfnc, void *outfncarg,
    output of the formatted stuff.  FORMAT is the format specification
    and VAARGS a variable argumemt list matching the arguments of
    FORMAT.  */
    output of the formatted stuff.  FORMAT is the format specification
    and VAARGS a variable argumemt list matching the arguments of
    FORMAT.  */
-int 
+int
 estream_format (estream_printf_out_t outfnc,
                 void *outfncarg,
                 const char *format, va_list vaargs)
 estream_format (estream_printf_out_t outfnc,
                 void *outfncarg,
                 const char *format, va_list vaargs)
@@ -1441,7 +1493,7 @@ estream_format (estream_printf_out_t outfnc,
   /* Check that all ARG_POS fields are set.  */
   for (argidx=0,max_pos=0; argidx < argspecs_len; argidx++)
     {
   /* Check that all ARG_POS fields are set.  */
   for (argidx=0,max_pos=0; argidx < argspecs_len; argidx++)
     {
-      if (argspecs[argidx].arg_pos != -1 
+      if (argspecs[argidx].arg_pos != -1
           && argspecs[argidx].arg_pos > max_pos)
         max_pos = argspecs[argidx].arg_pos;
       if (argspecs[argidx].width_pos > max_pos)
           && argspecs[argidx].arg_pos > max_pos)
         max_pos = argspecs[argidx].arg_pos;
       if (argspecs[argidx].width_pos > max_pos)
@@ -1481,8 +1533,7 @@ estream_format (estream_printf_out_t outfnc,
   if (max_pos < 0 || max_pos >= strlen (format))
     goto leave_einval;
 
   if (max_pos < 0 || max_pos >= strlen (format))
     goto leave_einval;
 
-#ifdef TEST
-  if (verbose > 1)
+#ifdef DEBUG
     dump_argspecs (argspecs, argspecs_len);
 #endif
 
     dump_argspecs (argspecs, argspecs_len);
 #endif
 
@@ -1523,13 +1574,13 @@ estream_format (estream_printf_out_t outfnc,
           valuetable[validx].vt = VALTYPE_INT;
         }
     }
           valuetable[validx].vt = VALTYPE_INT;
         }
     }
-  
+
   /* Read all the arguments.  This will error out for unsupported
      types and for not given positional arguments. */
   rc = read_values (valuetable, max_pos, vaargs);
   if (rc)
   /* Read all the arguments.  This will error out for unsupported
      types and for not given positional arguments. */
   rc = read_values (valuetable, max_pos, vaargs);
   if (rc)
-    goto leave_einval;  
-  
+    goto leave_einval;
+
 /*   for (validx=0; validx < max_pos; validx++) */
 /*     fprintf (stderr, "%2d: vt=%d\n", validx, valuetable[validx].vt); */
 
 /*   for (validx=0; validx < max_pos; validx++) */
 /*     fprintf (stderr, "%2d: vt=%d\n", validx, valuetable[validx].vt); */
 
@@ -1538,9 +1589,9 @@ estream_format (estream_printf_out_t outfnc,
                   argspecs, argspecs_len, valuetable, myerrno, &nbytes);
 
   goto leave;
                   argspecs, argspecs_len, valuetable, myerrno, &nbytes);
 
   goto leave;
-  
+
  leave_einval:
  leave_einval:
-  errno = EINVAL;
+  _set_errno (EINVAL);
  leave_error:
   rc = -1;
  leave:
  leave_error:
   rc = -1;
  leave:
@@ -1572,11 +1623,11 @@ estream_printf (const char *format, ...)
 {
   int rc;
   va_list arg_ptr;
 {
   int rc;
   va_list arg_ptr;
-  
+
   va_start (arg_ptr, format);
   rc = estream_format (plain_stdio_out, stderr, format, arg_ptr);
   va_end (arg_ptr);
   va_start (arg_ptr, format);
   rc = estream_format (plain_stdio_out, stderr, format, arg_ptr);
   va_end (arg_ptr);
-  
+
   return rc;
 }
 
   return rc;
 }
 
@@ -1586,16 +1637,16 @@ estream_fprintf (FILE *fp, const char *format, ...)
 {
   int rc;
   va_list arg_ptr;
 {
   int rc;
   va_list arg_ptr;
-  
+
   va_start (arg_ptr, format);
   rc = estream_format (plain_stdio_out, fp, format, arg_ptr);
   va_end (arg_ptr);
   va_start (arg_ptr, format);
   rc = estream_format (plain_stdio_out, fp, format, arg_ptr);
   va_end (arg_ptr);
-  
+
   return rc;
 }
 
 /* A replacement for vfprintf.  */
   return rc;
 }
 
 /* A replacement for vfprintf.  */
-int 
+int
 estream_vfprintf (FILE *fp, const char *format, va_list arg_ptr)
 {
   return estream_format (plain_stdio_out, fp, format, arg_ptr);
 estream_vfprintf (FILE *fp, const char *format, va_list arg_ptr)
 {
   return estream_format (plain_stdio_out, fp, format, arg_ptr);
@@ -1642,14 +1693,14 @@ fixed_buffer_out (void *outfncarg, const char *buf, size_t buflen)
 
 
 /* A replacement for vsnprintf. */
 
 
 /* A replacement for vsnprintf. */
-int 
+int
 estream_vsnprintf (char *buf, size_t bufsize,
                    const char *format, va_list arg_ptr)
 {
   struct fixed_buffer_parm_s parm;
   int rc;
 
 estream_vsnprintf (char *buf, size_t bufsize,
                    const char *format, va_list arg_ptr)
 {
   struct fixed_buffer_parm_s parm;
   int rc;
 
-  parm.size = bufsize? bufsize-1:0;
+  parm.size = bufsize;
   parm.count = 0;
   parm.used = 0;
   parm.buffer = bufsize?buf:NULL;
   parm.count = 0;
   parm.used = 0;
   parm.buffer = bufsize?buf:NULL;
@@ -1658,15 +1709,16 @@ estream_vsnprintf (char *buf, size_t bufsize,
     rc = fixed_buffer_out (&parm, "", 1); /* Print terminating Nul.  */
   if (rc == -1)
     return -1;
     rc = fixed_buffer_out (&parm, "", 1); /* Print terminating Nul.  */
   if (rc == -1)
     return -1;
-  if (bufsize && buf && parm.count >= parm.size)
+  if (bufsize && buf && parm.size && parm.count >= parm.size)
     buf[parm.size-1] = 0;
 
     buf[parm.size-1] = 0;
 
+  parm.count--; /* Do not count the trailing nul.  */
   return (int)parm.count; /* Return number of bytes which would have
                              been written.  */
 }
 
 /* A replacement for snprintf.  */
   return (int)parm.count; /* Return number of bytes which would have
                              been written.  */
 }
 
 /* A replacement for snprintf.  */
-int 
+int
 estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
 {
   int rc;
 estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
 {
   int rc;
@@ -1675,7 +1727,7 @@ estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
   va_start (arg_ptr, format);
   rc = estream_vsnprintf (buf, bufsize, format, arg_ptr);
   va_end (arg_ptr);
   va_start (arg_ptr, format);
   rc = estream_vsnprintf (buf, bufsize, format, arg_ptr);
   va_end (arg_ptr);
-    
+
   return rc;
 }
 
   return rc;
 }
 
@@ -1685,7 +1737,7 @@ estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
    dynamic_buffer_out.  */
 struct dynamic_buffer_parm_s
 {
    dynamic_buffer_out.  */
 struct dynamic_buffer_parm_s
 {
-  int error_flag; /* Internal helper.  */ 
+  int error_flag; /* Internal helper.  */
   size_t alloced; /* Allocated size of the buffer.  */
   size_t used;    /* Used size of the buffer.  */
   char *buffer;   /* Malloced buffer.  */
   size_t alloced; /* Allocated size of the buffer.  */
   size_t used;    /* Used size of the buffer.  */
   char *buffer;   /* Malloced buffer.  */
@@ -1701,14 +1753,14 @@ dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen)
     {
       /* Just in case some formatting routine did not checked for an
          error. */
     {
       /* Just in case some formatting routine did not checked for an
          error. */
-      errno = parm->error_flag;
+      _set_errno (parm->error_flag);
       return -1;
     }
 
   if (parm->used + buflen >= parm->alloced)
     {
       char *p;
       return -1;
     }
 
   if (parm->used + buflen >= parm->alloced)
     {
       char *p;
-      
+
       parm->alloced += buflen + 512;
       p = realloc (parm->buffer, parm->alloced);
       if (!p)
       parm->alloced += buflen + 512;
       p = realloc (parm->buffer, parm->alloced);
       if (!p)
@@ -1731,7 +1783,7 @@ dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen)
 /* A replacement for vasprintf.  As with the BSD of vasprintf version -1
    will be returned on error and NULL stored at BUFP.  On success the
    number of bytes printed will be returned. */
 /* A replacement for vasprintf.  As with the BSD of vasprintf version -1
    will be returned on error and NULL stored at BUFP.  On success the
    number of bytes printed will be returned. */
-int 
+int
 estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
 {
   struct dynamic_buffer_parm_s parm;
 estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
 {
   struct dynamic_buffer_parm_s parm;
@@ -1746,7 +1798,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
       *bufp = NULL;
       return -1;
     }
       *bufp = NULL;
       return -1;
     }
-  
+
   rc = estream_format (dynamic_buffer_out, &parm, format, arg_ptr);
   if (!rc)
     rc = dynamic_buffer_out (&parm, "", 1); /* Print terminating Nul.  */
   rc = estream_format (dynamic_buffer_out, &parm, format, arg_ptr);
   if (!rc)
     rc = dynamic_buffer_out (&parm, "", 1); /* Print terminating Nul.  */
@@ -1754,7 +1806,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
   if (rc != -1 && parm.error_flag)
     {
       rc = -1;
   if (rc != -1 && parm.error_flag)
     {
       rc = -1;
-      errno = parm.error_flag;
+      _set_errno (parm.error_flag);
     }
   if (rc == -1)
     {
     }
   if (rc == -1)
     {
@@ -1771,7 +1823,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
 /* A replacement for asprintf.  As with the BSD of asprintf version -1
    will be returned on error and NULL stored at BUFP.  On success the
    number of bytes printed will be returned. */
 /* A replacement for asprintf.  As with the BSD of asprintf version -1
    will be returned on error and NULL stored at BUFP.  On success the
    number of bytes printed will be returned. */
-int 
+int
 estream_asprintf (char **bufp, const char *format, ...)
 {
   int rc;
 estream_asprintf (char **bufp, const char *format, ...)
 {
   int rc;
@@ -1780,303 +1832,6 @@ estream_asprintf (char **bufp, const char *format, ...)
   va_start (arg_ptr, format);
   rc = estream_vasprintf (bufp, format, arg_ptr);
   va_end (arg_ptr);
   va_start (arg_ptr, format);
   rc = estream_vasprintf (bufp, format, arg_ptr);
   va_end (arg_ptr);
-    
-  return rc;
-}
-
-
-#ifdef TEST
-
-static int
-one_test (const char *format, ...)
-{
-  int rc1, rc2;
-  va_list arg_ptr;
-  char *buf1, *buf2;
-
-  if (verbose)
-    printf ("format: ->%s<-\n", format);
-
-  va_start (arg_ptr, format);
-  rc1 = vasprintf (&buf1, format, arg_ptr);
-  va_end (arg_ptr);
-  if (rc1 == -1)
-    {
-      printf ("   sys: errno=%d (%s)\n", errno, strerror (errno));
-      buf1 = NULL;
-    }
-  else if (verbose)
-    printf ("   sys: ->%s<-\n", buf1);
-  
-  va_start (arg_ptr, format);
-  rc2 = estream_vasprintf (&buf2, format, arg_ptr);
-  va_end (arg_ptr);
-  if (rc2 == -1)
-    printf ("   our: errno=%d (%s)\n", errno, strerror (errno));
-  else if (verbose)
-    printf ("   our: ->%s<-\n", buf2);
-
-  if (rc1 != -1 && rc2 != -1 && strcmp (buf1, buf2))
-    printf ("error: output does not match\n"
-            "format: ->%s<-\n   sys: ->%s<-\n   our: ->%s<-\n",
-            format, buf1, buf2);
-  else if ( rc1 != rc2 )
-    printf ("error: return codes are different: sys_rc=%d our_rc=%d\n",
-            rc1, rc2);
-
-  free (buf2);
-  free (buf1);
-
-  return 0;
-}
-
-
-static void
-run_tests (void)
-{
-  /*one_test ("%d %% %'d", 17, 19681977);*/
-
-  one_test ("%d %% %d", 17, 768114563);
-  one_test ("%d %% %d", 17, -768114563);
-
-  one_test ("%d", 17);
-  one_test ("%4d", 17);
-  one_test ("%40d", 17);
-  one_test ("%-d", 17);
-  one_test ("%-4d", 17);
-  one_test ("%-140d", 17);
-  one_test ("%d", -17);
-  one_test ("%4d", -17);
-  one_test ("%40d", -17);
-  one_test ("%-d", -17);
-  one_test ("%-4d", -17);
-  one_test ("%-40d", -17);
-
-  one_test ("%+4d", 17);
-  one_test ("%+4d", -17);
-  one_test ("%-+4d", 17);
-  one_test ("%-+4d", -17);
-  one_test ("% 4d", 17);
-  one_test ("% 4d", -17);
-  one_test ("%- +4d", 17);
-  one_test ("%- +4d", -17);
-
-  one_test ("%.4d", 17);
-  one_test ("%.0d", 17);
-  one_test ("%.0d", 0);
-  one_test ("%.4d", -17);
-  one_test ("%.0d", -17);
-  one_test ("%6.4d", 17);
-  one_test ("%6.4d", -17);
-  one_test ("%6.0d", 0);
-  one_test ("%4.6d", 17);
-  one_test ("%4.6d", -17);
-
-  one_test ("% 4.6d", 17);
-  one_test ("% 6.0d", 0);
-
-  one_test ("%.4d", 17);
-  one_test ("%04d", 17);
-  one_test ("%.4d", -17);
-  one_test ("%04d", -17);
-  one_test ("%0.d", 0);
-
-  one_test ("%*d", 7, 42);
-  one_test ("%*d", -7, 42);
-  one_test ("%.*d", 7, 42);
-  one_test ("%.*d", -7, 42);
-  one_test ("%*.*d", 10, 7, 42);
-  one_test ("%*.*d", 10, -7, 42);
-  one_test ("%*.*d", -10, 7, 42);
-  one_test ("%*.*d", -10, -7, 42);
-
-  one_test ("%*x", 7, 42);
-  one_test ("%*x", -7, 42);
-  one_test ("%.*x", 7, 42);
-  one_test ("%.*x", -7, 42);
-  one_test ("%*.*x", 10, 7, 42);
-  one_test ("%*.*x", 10, -7, 42);
-  one_test ("%*.*x", -10, 7, 42);
-  one_test ("%*.*x", -10, -7, 42);
-  one_test ("%#*x", 7, 42);
-  one_test ("%#*x", -7, 42);
-  one_test ("%#.*x", 7, 42);
-  one_test ("%#.*x", -7, 42);
-  one_test ("%#*.*x", 10, 7, 42);
-  one_test ("%#*.*x", 10, -7, 42);
-  one_test ("%#*.*x", -10, 7, 42);
-  one_test ("%#*.*x", -10, -7, 42);
-
-  one_test ("%*X", 7, 42);
-  one_test ("%*X", -7, 42);
-  one_test ("%.*X", 7, 42);
-  one_test ("%.*X", -7, 42);
-  one_test ("%*.*X", 10, 7, 42);
-  one_test ("%*.*X", 10, -7, 42);
-  one_test ("%*.*X", -10, 7, 42);
-  one_test ("%*.*X", -10, -7, 42);
-  one_test ("%#*X", 7, 42);
-  one_test ("%#*X", -7, 42);
-  one_test ("%#.*X", 7, 42);
-  one_test ("%#.*X", -7, 42);
-  one_test ("%#*.*X", 10, 7, 42);
-  one_test ("%#*.*X", 10, -7, 42);
-  one_test ("%#*.*X", -10, 7, 42);
-  one_test ("%#*.*X", -10, -7, 42);
-
-  one_test ("%*o", 7, 42);
-  one_test ("%*o", -7, 42);
-  one_test ("%.*o", 7, 42);
-  one_test ("%.*o", -7, 42);
-  one_test ("%*.*o", 10, 7, 42);
-  one_test ("%*.*o", 10, -7, 42);
-  one_test ("%*.*o", -10, 7, 42);
-  one_test ("%*.*o", -10, -7, 42);
-  one_test ("%#*o", 7, 42);
-  one_test ("%#*o", -7, 42);
-  one_test ("%#.*o", 7, 42);
-  one_test ("%#.*o", -7, 42);
-  one_test ("%#*.*o", 10, 7, 42);
-  one_test ("%#*.*o", 10, -7, 42);
-  one_test ("%#*.*o", -10, 7, 42);
-  one_test ("%#*.*o", -10, -7, 42);
-
-  one_test ("%s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.0s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.10s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.48s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.49s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.50s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%.51s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%48s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%49s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%50s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%51s", "the quick brown fox jumps over the lazy dogs back");
-  one_test ("%-51s", "the quick brown fox jumps over the lazy dogs back");
-
-  one_test ("/%s=", "CN");
-
-  one_test ("%f", 3.1415926535);
-  one_test ("%f", -3.1415926535);
-  one_test ("%.10f", 3.1415926535);
-  one_test ("%.2f", 3.1415926535);
-  one_test ("%.1f", 3.1415926535);
-  one_test ("%.0f", 3.1415926535);
-  one_test ("%.20f", 3.1415926535);
-  one_test ("%10.10f", 3.1415926535);
-  one_test ("%10.2f", 3.1415926535);
-  one_test ("%10.1f", 3.1415926535);
-  one_test ("%10.0f", 3.1415926535);
-  one_test ("%30.20f", 3.1415926535);
-  one_test ("%10.10f", -3.1415926535);
-  one_test ("%10.2f", -3.1415926535);
-  one_test ("%10.1f", -3.1415926535);
-  one_test ("%10.0f", -3.1415926535);
-  one_test ("%30.20f", -3.1415926535);
-
-  one_test ("%-10f", 3.1415926535);
-  one_test ("%-10.10f", 3.1415926535);
-  one_test ("%-10.2f", 3.1415926535);
-  one_test ("%-10.1f", 3.1415926535);
-  one_test ("%-10.0f", 3.1415926535);
-  one_test ("%-30.20f", 3.1415926535);
-  one_test ("%-10f", -3.1415926535);
-  one_test ("%-10.10f", -3.1415926535);
-  one_test ("%-10.2f", -3.1415926535);
-  one_test ("%-10.1f", -3.1415926535);
-  one_test ("%-10.0f", -3.1415926535);
-  one_test ("%-30.20f", -3.1415926535);
-
-  one_test ("%#.0f",  3.1415926535);
-  one_test ("%#10.0f",  3.1415926535);
-  one_test ("%#10.0f", -3.1415926535);
-  one_test ("%-#10.0f",  3.1415926535);
-  one_test ("%-#10.0f", -3.1415926535);
-
-  one_test ("%e", 3.1415926535);
-  one_test ("%g", 3.1415926535);
-
-  one_test ("%a", 1);
-  one_test ("%a", -1);
-  one_test ("%a", 3.1415926535);
 
 
-#ifdef HAVE_LONG_DOUBLE
-  one_test ("%La", 1);
-  one_test ("%La", -1);
-  one_test ("%La", 3.1415926535);
-#endif
-
-#ifdef __GLIBC__
-  /* "%m" is a glibc extension so this _test_ will only work on such a
-     system.  */
-  errno = ENOENT;
-  one_test ("%m");
-  errno = ENOENT;
-  one_test ("%d=%m", 17);
-  errno = ENOENT;
-  one_test ("%2$d:%m:%1$d", 42, 17);
-#endif /*__GLIBC__*/
-
-}
-
-static void
-check_snprintf (void)
-{
-  char buffer[20];
-  int rc;
-
-  rc = estream_snprintf (buffer, 0, "%*s", 18, "");
-  if (rc != 19)
-    printf ("rc=%d\n", rc );
-  rc = estream_snprintf (buffer, sizeof buffer, "%*s", 18, "");
-  if (rc != 19)
-    printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
-  rc = estream_snprintf (buffer, sizeof buffer, "%*s", 19, "");
-  if (rc != 20)
-    printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
-  rc = estream_snprintf (buffer, sizeof buffer, "%*s", 20, "");
-  if (rc != 21)
-    printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
-  rc = estream_snprintf (buffer, sizeof buffer, "%*s", 21, "");
-  if (rc != 22)
-    printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
-}
-
-
-
-int
-main (int argc, char **argv)
-{
-  int rc;
-
-  if (argc) {argc--; argv++; }
-
-  setlocale (LC_NUMERIC, "");
-
-  while (argc && !strcmp (*argv, "--verbose"))
-    {
-      verbose++;
-      argc--;
-      argv++;
-    }
-
-  if (!argc)
-    {
-      run_tests ();
-      check_snprintf () ;
-    }
-  else
-    {
-      rc = estream_vfprintf (stdout, argv[0], NULL);
-      fflush (stdout);
-      fprintf (stderr, "[estream_vfprintf returns: %d]\n", rc);
-    }
-
-  return 0;
+  return rc;
 }
 }
-#endif /*TEST*/
-/*
-Local Variables:
-compile-command: "cc -Wall -O3 -g -I.. -DHAVE_CONFIG_H -DTEST -o estream-printf estream-printf.c"
-End:
-*/