Pull printf-related code from gnulib, rather than using forked copy.
authorJim Meyering <jim@meyering.net>
Thu, 31 May 2007 14:40:51 +0000 (16:40 +0200)
committerJim Meyering <jim@meyering.net>
Thu, 31 May 2007 14:40:51 +0000 (16:40 +0200)
* bootstrap.conf (gnulib_modules): Don't avoid size_max and xsize
modules.  While I dislike xsize-style overflow avoidance, maintaining
a forked version of e.g., vasnprintf.c was too much work.
* lib/printf-parse.c, lib/vasnprintf.c, lib/unicodeio.c: Remove local
copies, so we now get these files from gnulib.

ChangeLog
bootstrap.conf
lib/ChangeLog
lib/printf-parse.c [deleted file]
lib/unicodeio.c [deleted file]
lib/vasnprintf.c [deleted file]

index 1fcff1ebacc1cd8f914e7a587b66d283b101567c..6373865aff5279a8bb7a01cc1fc19487dafc3651 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-05-31  Jim Meyering  <jim@meyering.net>
+
+       Pull printf-related code from gnulib, rather than using forked copy.
+       * bootstrap.conf (gnulib_modules): Don't avoid size_max and xsize
+       modules.  While I dislike xsize-style overflow avoidance, maintaining
+       a forked version of e.g., vasnprintf.c was too much work.
+
 2007-05-29  Jim Meyering  <jim@meyering.net>
 
        * src/dircolors.hin: Add screen-256color.
index 1ed2978bb27627bbf5bae697ef1a1248662c3d44..11d429bd6c95649b0977609dfcb85ae0dc96e5db 100644 (file)
@@ -22,8 +22,6 @@
 # includes them because of gettext and fchdir dependencies.
 avoided_gnulib_modules='
        --avoid=lock
-       --avoid=size_max
-       --avoid=xsize
        --avoid=canonicalize-lgpl
 '
 
@@ -114,11 +112,8 @@ if test $gettext_external = 1; then
       m4/intdiv0.m4
       m4/lcmessage.m4
       m4/lock.m4
-      m4/printf-posix.m4
-      m4/size_max.m4
       m4/uintmax_t.m4
       m4/ulonglong.m4
       m4/visibility.m4
-      m4/xsize.m4
   '
 fi
index e1b4c7aaca0648c973a918bd8903b509f2cacbac..99eba6641fea6b497611678276a53a75529cd044 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-31  Jim Meyering  <jim@meyering.net>
+
+       * printf-parse.c, vasnprintf.c, unicodeio.c: Remove local
+       copies, so we now get these files from gnulib.
+
 2007-03-20  Jim Meyering  <jim@meyering.net>
 
        Fix a typo in the handling of %x and %X.
diff --git a/lib/printf-parse.c b/lib/printf-parse.c
deleted file mode 100644 (file)
index 9493403..0000000
+++ /dev/null
@@ -1,538 +0,0 @@
-/* Formatted output to strings.
-   This file is intended to provide exactly the same functionality
-   as the version in gnulib, but without the need for the xsize module.
-
-   Copyright (C) 1999-2000, 2002-2003, 2006-2007 Free Software Foundation, Inc.
-
-   This program 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 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#include <config.h>
-
-/* Specification.  */
-#if WIDE_CHAR_VERSION
-# include "wprintf-parse.h"
-#else
-# include "printf-parse.h"
-#endif
-
-/* Get size_t, NULL.  */
-#include <stddef.h>
-
-/* Get intmax_t, SIZE_MAX.  */
-#include <stdint.h>
-
-/* malloc(), realloc(), free().  */
-#include <stdlib.h>
-
-#if WIDE_CHAR_VERSION
-# define PRINTF_PARSE wprintf_parse
-# define CHAR_T wchar_t
-# define DIRECTIVE wchar_t_directive
-# define DIRECTIVES wchar_t_directives
-#else
-# define PRINTF_PARSE printf_parse
-# define CHAR_T char
-# define DIRECTIVE char_directive
-# define DIRECTIVES char_directives
-#endif
-
-#ifdef STATIC
-STATIC
-#endif
-int
-PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
-{
-  const CHAR_T *cp = format;           /* pointer into format */
-  size_t arg_posn = 0;         /* number of regular arguments consumed */
-  size_t d_allocated;                  /* allocated elements of d->dir */
-  size_t a_allocated;                  /* allocated elements of a->arg */
-  size_t max_width_length = 0;
-  size_t max_precision_length = 0;
-
-  d->count = 0;
-  d_allocated = 1;
-  d->dir = malloc (d_allocated * sizeof (DIRECTIVE));
-  if (d->dir == NULL)
-    /* Out of memory.  */
-    return -1;
-
-  a->count = 0;
-  a_allocated = 0;
-  a->arg = NULL;
-
-#define REGISTER_ARG(_index_,_type_) \
-  {                                                                    \
-    size_t n = (_index_);                                              \
-    if (n >= a_allocated)                                              \
-      {                                                                        \
-       size_t memory_size;                                             \
-       argument *memory;                                               \
-                                                                       \
-       a_allocated *= 2;                                               \
-       if (a_allocated <= n)                                           \
-         a_allocated = n + 1;                                          \
-       if (SIZE_MAX / sizeof (argument) < a_allocated)                 \
-         /* Overflow, would lead to out of memory.  */                 \
-         goto error;                                                   \
-       memory_size = a_allocated * sizeof (argument);                  \
-       memory = (a->arg                                                \
-                 ? realloc (a->arg, memory_size)                       \
-                 : malloc (memory_size));                              \
-       if (memory == NULL)                                             \
-         /* Out of memory.  */                                         \
-         goto error;                                                   \
-       a->arg = memory;                                                \
-      }                                                                        \
-    while (a->count <= n)                                              \
-      a->arg[a->count++].type = TYPE_NONE;                             \
-    if (a->arg[n].type == TYPE_NONE)                                   \
-      a->arg[n].type = (_type_);                                       \
-    else if (a->arg[n].type != (_type_))                               \
-      /* Ambiguous type for positional argument.  */                   \
-      goto error;                                                      \
-  }
-
-  while (*cp != '\0')
-    {
-      CHAR_T c = *cp++;
-      if (c == '%')
-       {
-         size_t arg_index = ARG_NONE;
-         DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */
-
-         /* Initialize the next directive.  */
-         dp->dir_start = cp - 1;
-         dp->flags = 0;
-         dp->width_start = NULL;
-         dp->width_end = NULL;
-         dp->width_arg_index = ARG_NONE;
-         dp->precision_start = NULL;
-         dp->precision_end = NULL;
-         dp->precision_arg_index = ARG_NONE;
-         dp->arg_index = ARG_NONE;
-
-         /* Test for positional argument.  */
-         if (*cp >= '0' && *cp <= '9')
-           {
-             const CHAR_T *np;
-
-             for (np = cp; *np >= '0' && *np <= '9'; np++)
-               ;
-             if (*np == '$')
-               {
-                 size_t n = 0;
-
-                 for (np = cp; *np >= '0' && *np <= '9'; np++)
-                   if (n < SIZE_MAX / 10)
-                     n = 10 * n + (*np - '0');
-                   else
-                     /* n too large for memory.  */
-                     goto error;
-                 if (n == 0)
-                   /* Positional argument 0.  */
-                   goto error;
-                 arg_index = n - 1;
-                 cp = np + 1;
-               }
-           }
-
-         /* Read the flags.  */
-         for (;;)
-           {
-             if (*cp == '\'')
-               {
-                 dp->flags |= FLAG_GROUP;
-                 cp++;
-               }
-             else if (*cp == '-')
-               {
-                 dp->flags |= FLAG_LEFT;
-                 cp++;
-               }
-             else if (*cp == '+')
-               {
-                 dp->flags |= FLAG_SHOWSIGN;
-                 cp++;
-               }
-             else if (*cp == ' ')
-               {
-                 dp->flags |= FLAG_SPACE;
-                 cp++;
-               }
-             else if (*cp == '#')
-               {
-                 dp->flags |= FLAG_ALT;
-                 cp++;
-               }
-             else if (*cp == '0')
-               {
-                 dp->flags |= FLAG_ZERO;
-                 cp++;
-               }
-             else
-               break;
-           }
-
-         /* Parse the field width.  */
-         if (*cp == '*')
-           {
-             dp->width_start = cp;
-             cp++;
-             dp->width_end = cp;
-             if (max_width_length < 1)
-               max_width_length = 1;
-
-             /* Test for positional argument.  */
-             if (*cp >= '0' && *cp <= '9')
-               {
-                 const CHAR_T *np;
-
-                 for (np = cp; *np >= '0' && *np <= '9'; np++)
-                   ;
-                 if (*np == '$')
-                   {
-                     size_t n = 0;
-
-                     for (np = cp; *np >= '0' && *np <= '9'; np++)
-                       if (n < SIZE_MAX / 10)
-                         n = 10 * n + (*np - '0');
-                       else
-                         /* n too large for memory.  */
-                         goto error;
-                     if (n == 0)
-                       /* Positional argument 0.  */
-                       goto error;
-                     dp->width_arg_index = n - 1;
-                     cp = np + 1;
-                   }
-               }
-             if (dp->width_arg_index == ARG_NONE)
-               {
-                 dp->width_arg_index = arg_posn++;
-                 if (dp->width_arg_index == ARG_NONE)
-                   /* arg_posn wrapped around.  */
-                   goto error;
-               }
-             REGISTER_ARG (dp->width_arg_index, TYPE_INT);
-           }
-         else if (*cp >= '0' && *cp <= '9')
-           {
-             size_t width_length;
-
-             dp->width_start = cp;
-             for (; *cp >= '0' && *cp <= '9'; cp++)
-               ;
-             dp->width_end = cp;
-             width_length = dp->width_end - dp->width_start;
-             if (max_width_length < width_length)
-               max_width_length = width_length;
-           }
-
-         /* Parse the precision.  */
-         if (*cp == '.')
-           {
-             cp++;
-             if (*cp == '*')
-               {
-                 dp->precision_start = cp - 1;
-                 cp++;
-                 dp->precision_end = cp;
-                 if (max_precision_length < 2)
-                   max_precision_length = 2;
-
-                 /* Test for positional argument.  */
-                 if (*cp >= '0' && *cp <= '9')
-                   {
-                     const CHAR_T *np;
-
-                     for (np = cp; *np >= '0' && *np <= '9'; np++)
-                       ;
-                     if (*np == '$')
-                       {
-                         size_t n = 0;
-
-                         for (np = cp; *np >= '0' && *np <= '9'; np++)
-                           if (n < SIZE_MAX / 10)
-                             n = 10 * n + (*np - '0');
-                           else
-                             /* n too large for memory.  */
-                             goto error;
-                         if (n == 0)
-                           /* Positional argument 0.  */
-                           goto error;
-                         dp->precision_arg_index = n - 1;
-                         cp = np + 1;
-                       }
-                   }
-                 if (dp->precision_arg_index == ARG_NONE)
-                   {
-                     dp->precision_arg_index = arg_posn++;
-                     if (dp->precision_arg_index == ARG_NONE)
-                       /* arg_posn wrapped around.  */
-                       goto error;
-                   }
-                 REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
-               }
-             else
-               {
-                 size_t precision_length;
-
-                 dp->precision_start = cp - 1;
-                 for (; *cp >= '0' && *cp <= '9'; cp++)
-                   ;
-                 dp->precision_end = cp;
-                 precision_length = dp->precision_end - dp->precision_start;
-                 if (max_precision_length < precision_length)
-                   max_precision_length = precision_length;
-               }
-           }
-
-         {
-           arg_type type;
-
-           /* Parse argument type/size specifiers.  */
-           {
-             int flags = 0;
-
-             for (;;)
-               {
-                 if (*cp == 'h')
-                   {
-                     flags |= (1 << (flags & 1));
-                     cp++;
-                   }
-                 else if (*cp == 'L')
-                   {
-                     flags |= 4;
-                     cp++;
-                   }
-                 else if (*cp == 'l')
-                   {
-                     flags += 8;
-                     cp++;
-                   }
-#if HAVE_INTMAX_T
-                 else if (*cp == 'j')
-                   {
-                     if (sizeof (intmax_t) > sizeof (long))
-                       {
-                         /* intmax_t = long long */
-                         flags += 16;
-                       }
-                     else if (sizeof (intmax_t) > sizeof (int))
-                       {
-                         /* intmax_t = long */
-                         flags += 8;
-                       }
-                     cp++;
-                   }
-#endif
-                 else if (*cp == 'z' || *cp == 'Z')
-                   {
-                     /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
-                        because the warning facility in gcc-2.95.2 understands
-                        only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784).  */
-                     if (sizeof (size_t) > sizeof (long))
-                       {
-                         /* size_t = long long */
-                         flags += 16;
-                       }
-                     else if (sizeof (size_t) > sizeof (int))
-                       {
-                         /* size_t = long */
-                         flags += 8;
-                       }
-                     cp++;
-                   }
-                 else if (*cp == 't')
-                   {
-                     if (sizeof (ptrdiff_t) > sizeof (long))
-                       {
-                         /* ptrdiff_t = long long */
-                         flags += 16;
-                       }
-                     else if (sizeof (ptrdiff_t) > sizeof (int))
-                       {
-                         /* ptrdiff_t = long */
-                         flags += 8;
-                       }
-                     cp++;
-                   }
-                 else
-                   break;
-               }
-
-             /* Read the conversion character.  */
-             c = *cp++;
-             switch (c)
-               {
-               case 'd': case 'i':
-#if HAVE_LONG_LONG_INT
-                 /* If 'long long' exists and is larger than 'long':  */
-                 if (flags >= 16 || (flags & 4))
-                   type = TYPE_LONGLONGINT;
-                 else
-#endif
-                 /* If 'long long' exists and is the same as 'long', we parse
-                    "lld" into TYPE_LONGINT.  */
-                 if (flags >= 8)
-                   type = TYPE_LONGINT;
-                 else if (flags & 2)
-                   type = TYPE_SCHAR;
-                 else if (flags & 1)
-                   type = TYPE_SHORT;
-                 else
-                   type = TYPE_INT;
-                 break;
-               case 'o': case 'u': case 'x': case 'X':
-#if HAVE_LONG_LONG_INT
-                 /* If 'long long' exists and is larger than 'long':  */
-                 if (flags >= 16 || (flags & 4))
-                   type = TYPE_ULONGLONGINT;
-                 else
-#endif
-                 /* If 'unsigned long long' exists and is the same as
-                    'unsigned long', we parse "llu" into TYPE_ULONGINT.  */
-                 if (flags >= 8)
-                   type = TYPE_ULONGINT;
-                 else if (flags & 2)
-                   type = TYPE_UCHAR;
-                 else if (flags & 1)
-                   type = TYPE_USHORT;
-                 else
-                   type = TYPE_UINT;
-                 break;
-               case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
-               case 'a': case 'A':
-#if HAVE_LONG_DOUBLE
-                 if (flags >= 16 || (flags & 4))
-                   type = TYPE_LONGDOUBLE;
-                 else
-#endif
-                 type = TYPE_DOUBLE;
-                 break;
-               case 'c':
-                 if (flags >= 8)
-#if HAVE_WINT_T
-                   type = TYPE_WIDE_CHAR;
-#else
-                   goto error;
-#endif
-                 else
-                   type = TYPE_CHAR;
-                 break;
-#if HAVE_WINT_T
-               case 'C':
-                 type = TYPE_WIDE_CHAR;
-                 c = 'c';
-                 break;
-#endif
-               case 's':
-                 if (flags >= 8)
-#if HAVE_WCHAR_T
-                   type = TYPE_WIDE_STRING;
-#else
-                   goto error;
-#endif
-                 else
-                   type = TYPE_STRING;
-                 break;
-#if HAVE_WCHAR_T
-               case 'S':
-                 type = TYPE_WIDE_STRING;
-                 c = 's';
-                 break;
-#endif
-               case 'p':
-                 type = TYPE_POINTER;
-                 break;
-               case 'n':
-#if HAVE_LONG_LONG_INT
-                 /* If 'long long' exists and is larger than 'long':  */
-                 if (flags >= 16 || (flags & 4))
-                   type = TYPE_COUNT_LONGLONGINT_POINTER;
-                 else
-#endif
-                 /* If 'long long' exists and is the same as 'long', we parse
-                    "lln" into TYPE_COUNT_LONGINT_POINTER.  */
-                 if (flags >= 8)
-                   type = TYPE_COUNT_LONGINT_POINTER;
-                 else if (flags & 2)
-                   type = TYPE_COUNT_SCHAR_POINTER;
-                 else if (flags & 1)
-                   type = TYPE_COUNT_SHORT_POINTER;
-                 else
-                   type = TYPE_COUNT_INT_POINTER;
-                 break;
-               case '%':
-                 type = TYPE_NONE;
-                 break;
-               default:
-                 /* Unknown conversion character.  */
-                 goto error;
-               }
-           }
-
-           if (type != TYPE_NONE)
-             {
-               dp->arg_index = arg_index;
-               if (dp->arg_index == ARG_NONE)
-                 {
-                   dp->arg_index = arg_posn++;
-                   if (dp->arg_index == ARG_NONE)
-                     /* arg_posn wrapped around.  */
-                     goto error;
-                 }
-               REGISTER_ARG (dp->arg_index, type);
-             }
-           dp->conversion = c;
-           dp->dir_end = cp;
-         }
-
-         d->count++;
-         if (d->count >= d_allocated)
-           {
-             DIRECTIVE *memory;
-
-             if (SIZE_MAX / (2 * sizeof (DIRECTIVE)) < d_allocated)
-               /* Overflow, would lead to out of memory.  */
-               goto error;
-             d_allocated *= 2;
-             memory = realloc (d->dir, d_allocated * sizeof (DIRECTIVE));
-             if (memory == NULL)
-               /* Out of memory.  */
-               goto error;
-             d->dir = memory;
-           }
-       }
-    }
-  d->dir[d->count].dir_start = cp;
-
-  d->max_width_length = max_width_length;
-  d->max_precision_length = max_precision_length;
-  return 0;
-
-error:
-  if (a->arg)
-    free (a->arg);
-  if (d->dir)
-    free (d->dir);
-  return -1;
-}
-
-#undef DIRECTIVES
-#undef DIRECTIVE
-#undef CHAR_T
-#undef PRINTF_PARSE
diff --git a/lib/unicodeio.c b/lib/unicodeio.c
deleted file mode 100644 (file)
index ceeff89..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-/* Unicode character output to streams with locale dependent encoding.
-
-   Copyright (C) 2000-2003, 2005, 2006 Free Software Foundation, Inc.
-
-   This program 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 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* Written by Bruno Haible <haible@clisp.cons.org>.  */
-
-/* Note: This file requires the locale_charset() function.  See in
-   libiconv-1.8/libcharset/INTEGRATE for how to obtain it.  */
-
-#include <config.h>
-
-/* Specification.  */
-#include "unicodeio.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#if HAVE_ICONV
-# include <iconv.h>
-#endif
-
-#include <error.h>
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-#ifndef __attribute__
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
-#  define __attribute__(x) /* empty */
-# endif
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-#include "localcharset.h"
-
-/* When we pass a Unicode character to iconv(), we must pass it in a
-   suitable encoding. The standardized Unicode encodings are
-   UTF-8, UCS-2, UCS-4, UTF-16, UTF-16BE, UTF-16LE, UTF-7.
-   UCS-2 supports only characters up to \U0000FFFF.
-   UTF-16 and variants support only characters up to \U0010FFFF.
-   UTF-7 is way too complex and not supported by glibc-2.1.
-   UCS-4 specification leaves doubts about endianness and byte order
-   mark. glibc currently interprets it as big endian without byte order
-   mark, but this is not backed by an RFC.
-   So we use UTF-8. It supports characters up to \U7FFFFFFF and is
-   unambiguously defined.  */
-
-/* Stores the UTF-8 representation of the Unicode character wc in r[0..5].
-   Returns the number of bytes stored, or -1 if wc is out of range.  */
-static int
-utf8_wctomb (unsigned char *r, unsigned int wc)
-{
-  int count;
-
-  if (wc < 0x80)
-    count = 1;
-  else if (wc < 0x800)
-    count = 2;
-  else if (wc < 0x10000)
-    count = 3;
-  else if (wc < 0x200000)
-    count = 4;
-  else if (wc < 0x4000000)
-    count = 5;
-  else if (wc <= 0x7fffffff)
-    count = 6;
-  else
-    return -1;
-
-  switch (count)
-    {
-      /* Note: code falls through cases! */
-      case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000;
-      case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000;
-      case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000;
-      case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800;
-      case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0;
-      case 1: r[0] = wc;
-    }
-
-  return count;
-}
-
-/* Luckily, the encoding's name is platform independent.  */
-#define UTF8_NAME "UTF-8"
-
-/* Converts the Unicode character CODE to its multibyte representation
-   in the current locale and calls the SUCCESS callback on the resulting
-   byte sequence.  If an error occurs, invokes the FAILURE callback instead,
-   passing it CODE and an English error string.
-   Returns whatever the callback returned.
-   Assumes that the locale doesn't change between two calls.  */
-long
-unicode_to_mb (unsigned int code,
-              long (*success) (const char *buf, size_t buflen,
-                               void *callback_arg),
-              long (*failure) (unsigned int code, const char *msg,
-                               void *callback_arg),
-              void *callback_arg)
-{
-  static int initialized;
-  static int is_utf8;
-#if HAVE_ICONV
-  static iconv_t utf8_to_local;
-#endif
-
-  char inbuf[6];
-  int count;
-
-  if (!initialized)
-    {
-      const char *charset = locale_charset ();
-
-      is_utf8 = !strcmp (charset, UTF8_NAME);
-#if HAVE_ICONV
-      if (!is_utf8)
-       {
-         utf8_to_local = iconv_open (charset, UTF8_NAME);
-         if (utf8_to_local == (iconv_t)(-1))
-           /* For an unknown encoding, assume ASCII.  */
-           utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
-       }
-#endif
-      initialized = 1;
-    }
-
-  /* Test whether the utf8_to_local converter is available at all.  */
-  if (!is_utf8)
-    {
-#if HAVE_ICONV
-      if (utf8_to_local == (iconv_t)(-1))
-       return failure (code, N_("iconv function not usable"), callback_arg);
-#else
-      return failure (code, N_("iconv function not available"), callback_arg);
-#endif
-    }
-
-  /* Convert the character to UTF-8.  */
-  count = utf8_wctomb ((unsigned char *) inbuf, code);
-  if (count < 0)
-    return failure (code, N_("character out of range"), callback_arg);
-
-#if HAVE_ICONV
-  if (!is_utf8)
-    {
-      char outbuf[25];
-      const char *inptr;
-      size_t inbytesleft;
-      char *outptr;
-      size_t outbytesleft;
-      size_t res;
-
-      inptr = inbuf;
-      inbytesleft = count;
-      outptr = outbuf;
-      outbytesleft = sizeof (outbuf);
-
-      /* Convert the character from UTF-8 to the locale's charset.  */
-      res = iconv (utf8_to_local,
-                  (ICONV_CONST char **)&inptr, &inbytesleft,
-                  &outptr, &outbytesleft);
-      if (inbytesleft > 0 || res == (size_t)(-1)
-         /* Irix iconv() inserts a NUL byte if it cannot convert. */
-# if !defined _LIBICONV_VERSION && (defined sgi || defined __sgi)
-         || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0')
-# endif
-         )
-       return failure (code, NULL, callback_arg);
-
-      /* Avoid glibc-2.1 bug and Solaris 7 bug.  */
-# if defined _LIBICONV_VERSION \
-    || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun)
-
-      /* Get back to the initial shift state.  */
-      res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft);
-      if (res == (size_t)(-1))
-       return failure (code, NULL, callback_arg);
-# endif
-
-      return success (outbuf, outptr - outbuf, callback_arg);
-    }
-#endif
-
-  /* At this point, is_utf8 is true, so no conversion is needed.  */
-  return success (inbuf, count, callback_arg);
-}
-
-/* Simple success callback that outputs the converted string.
-   The STREAM is passed as callback_arg.  */
-long
-fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg)
-{
-  FILE *stream = (FILE *) callback_arg;
-
-  fwrite (buf, 1, buflen, stream);
-  return 0;
-}
-
-/* Simple failure callback that displays an error and exits.  */
-static long
-exit_failure_callback (unsigned int code, const char *msg,
-                      void *callback_arg ATTRIBUTE_UNUSED)
-{
-  if (msg == NULL)
-    error (1, 0, _("cannot convert U+%04X to local character set"), code);
-  else
-    error (1, 0, _("cannot convert U+%04X to local character set: %s"), code,
-          gettext (msg));
-  return -1;
-}
-
-/* Simple failure callback that displays a fallback representation in plain
-   ASCII, using the same notation as ISO C99 strings.  */
-static long
-fallback_failure_callback (unsigned int code, const char *msg ATTRIBUTE_UNUSED
-                          , void *callback_arg)
-{
-  FILE *stream = (FILE *) callback_arg;
-
-  if (code < 0x10000)
-    fprintf (stream, "\\u%04X", code);
-  else
-    fprintf (stream, "\\U%08X", code);
-  return -1;
-}
-
-/* Outputs the Unicode character CODE to the output stream STREAM.
-   Upon failure, exit if exit_on_error is true, otherwise output a fallback
-   notation.  */
-void
-print_unicode_char (FILE *stream, unsigned int code, int exit_on_error)
-{
-  unicode_to_mb (code, fwrite_success_callback,
-                exit_on_error
-                ? exit_failure_callback
-                : fallback_failure_callback,
-                stream);
-}
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
deleted file mode 100644 (file)
index 8a9ec9e..0000000
+++ /dev/null
@@ -1,935 +0,0 @@
-/* vsprintf with automatic memory allocation.
-   This file is intended to provide exactly the same functionality
-   as the version in gnulib, but without the need for the xsize module.
-
-   Copyright (C) 1999, 2002-2007 Free Software Foundation, Inc.
-
-   This program 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 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
-   This must come before <config.h> because <config.h> may include
-   <features.h>, and once <features.h> has been included, it's too late.  */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE    1
-#endif
-
-#include <config.h>
-#ifndef IN_LIBINTL
-# include <alloca.h>
-#endif
-
-/* Specification.  */
-#if WIDE_CHAR_VERSION
-# include "vasnwprintf.h"
-#else
-# include "vasnprintf.h"
-#endif
-
-#include <stdio.h>     /* snprintf(), sprintf() */
-#include <stdlib.h>    /* abort(), malloc(), realloc(), free() */
-#include <stdint.h>    /* SIZE_MAX */
-#include <string.h>    /* memcpy(), strlen() */
-#include <errno.h>     /* errno */
-#include <limits.h>    /* CHAR_BIT, INT_MAX */
-#include <float.h>     /* DBL_MAX_EXP, LDBL_MAX_EXP */
-#if WIDE_CHAR_VERSION
-# include "wprintf-parse.h"
-#else
-# include "printf-parse.h"
-#endif
-
-#if HAVE_WCHAR_T
-# if HAVE_WCSLEN
-#  define local_wcslen wcslen
-# else
-   /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
-      a dependency towards this library, here is a local substitute.
-      Define this substitute only once, even if this file is included
-      twice in the same compilation unit.  */
-#  ifndef local_wcslen_defined
-#   define local_wcslen_defined 1
-static size_t
-local_wcslen (const wchar_t *s)
-{
-  const wchar_t *ptr;
-
-  for (ptr = s; *ptr != (wchar_t) 0; ptr++)
-    ;
-  return ptr - s;
-}
-#  endif
-# endif
-#endif
-
-#if WIDE_CHAR_VERSION
-# define VASNPRINTF vasnwprintf
-# define CHAR_T wchar_t
-# define DIRECTIVE wchar_t_directive
-# define DIRECTIVES wchar_t_directives
-# define PRINTF_PARSE wprintf_parse
-# define USE_SNPRINTF 1
-# if HAVE_DECL__SNWPRINTF
-   /* On Windows, the function swprintf() has a different signature than
-      on Unix; we use the _snwprintf() function instead.  */
-#  define SNPRINTF _snwprintf
-# else
-   /* Unix.  */
-#  define SNPRINTF swprintf
-# endif
-#else
-# define VASNPRINTF vasnprintf
-# define CHAR_T char
-# define DIRECTIVE char_directive
-# define DIRECTIVES char_directives
-# define PRINTF_PARSE printf_parse
-# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF)
-# if HAVE_DECL__SNPRINTF
-   /* Windows.  */
-#  define SNPRINTF _snprintf
-# else
-   /* Unix.  */
-#  define SNPRINTF snprintf
-# endif
-#endif
-
-CHAR_T *
-VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args)
-{
-  DIRECTIVES d;
-  arguments a;
-
-  if (PRINTF_PARSE (format, &d, &a) < 0)
-    {
-      errno = EINVAL;
-      return NULL;
-    }
-
-#define CLEANUP() \
-  free (d.dir);                                                                \
-  if (a.arg)                                                           \
-    free (a.arg);
-
-  if (printf_fetchargs (args, &a) < 0)
-    {
-      CLEANUP ();
-      errno = EINVAL;
-      return NULL;
-    }
-
-  {
-    size_t buf_neededlength;
-    CHAR_T *buf;
-    CHAR_T *buf_malloced;
-    const CHAR_T *cp;
-    size_t i;
-    DIRECTIVE *dp;
-    /* Output string accumulator.  */
-    CHAR_T *result;
-    size_t allocated;
-    size_t length;
-
-    /* Allocate a small buffer that will hold a directive passed to
-       sprintf or snprintf.  */
-    buf_neededlength = 7 + d.max_width_length + d.max_precision_length + 6;
-#if HAVE_ALLOCA
-    if (buf_neededlength < 4000 / sizeof (CHAR_T))
-      {
-       buf = alloca (buf_neededlength * sizeof (CHAR_T));
-       buf_malloced = NULL;
-      }
-    else
-#endif
-      {
-       if (SIZE_MAX / sizeof (CHAR_T) < buf_neededlength)
-         goto out_of_memory_1;
-       buf = (CHAR_T *) malloc (buf_neededlength * sizeof (CHAR_T));
-       if (buf == NULL)
-         goto out_of_memory_1;
-       buf_malloced = buf;
-      }
-
-    if (resultbuf != NULL)
-      {
-       result = resultbuf;
-       allocated = *lengthp;
-      }
-    else
-      {
-       result = NULL;
-       allocated = 0;
-      }
-    length = 0;
-    /* Invariants:
-       result is either == resultbuf or == NULL or malloc-allocated.
-       If length > 0, then result != NULL.  */
-
-    /* Ensures that allocated >= length + extra.  Aborts through a jump to
-       out_of_memory if size is too big.  */
-#define ENSURE_ALLOCATION(extra) \
-  {                                                                         \
-    size_t needed = length + (extra);                                       \
-    if (needed < length)                                                    \
-      goto out_of_memory;                                                   \
-    if (needed > allocated)                                                 \
-      {                                                                             \
-       size_t memory_size;                                                  \
-       CHAR_T *memory;                                                      \
-                                                                            \
-       allocated = (allocated > 0 ? 2 * allocated : 12);                    \
-       if (needed > allocated)                                              \
-         allocated = needed;                                                \
-       if (SIZE_MAX / sizeof (CHAR_T) < allocated)                          \
-         goto out_of_memory;                                                \
-       memory_size = allocated * sizeof (CHAR_T);                           \
-       if (result == resultbuf || result == NULL)                           \
-         memory = (CHAR_T *) malloc (memory_size);                          \
-       else                                                                 \
-         memory = (CHAR_T *) realloc (result, memory_size);                 \
-       if (memory == NULL)                                                  \
-         goto out_of_memory;                                                \
-       if (result == resultbuf && length > 0)                               \
-         memcpy (memory, result, length * sizeof (CHAR_T));                 \
-       result = memory;                                                     \
-      }                                                                             \
-  }
-
-    for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
-      {
-       if (cp != dp->dir_start)
-         {
-           size_t n = dp->dir_start - cp;
-
-           ENSURE_ALLOCATION (n);
-           memcpy (result + length, cp, n * sizeof (CHAR_T));
-           length += n;
-         }
-       if (i == d.count)
-         break;
-
-       /* Execute a single directive.  */
-       if (dp->conversion == '%')
-         {
-           if (!(dp->arg_index == ARG_NONE))
-             abort ();
-           ENSURE_ALLOCATION (1);
-           result[length] = '%';
-           length += 1;
-         }
-       else
-         {
-           if (!(dp->arg_index != ARG_NONE))
-             abort ();
-
-           if (dp->conversion == 'n')
-             {
-               switch (a.arg[dp->arg_index].type)
-                 {
-                 case TYPE_COUNT_SCHAR_POINTER:
-                   *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
-                   break;
-                 case TYPE_COUNT_SHORT_POINTER:
-                   *a.arg[dp->arg_index].a.a_count_short_pointer = length;
-                   break;
-                 case TYPE_COUNT_INT_POINTER:
-                   *a.arg[dp->arg_index].a.a_count_int_pointer = length;
-                   break;
-                 case TYPE_COUNT_LONGINT_POINTER:
-                   *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
-                   break;
-#if HAVE_LONG_LONG_INT
-                 case TYPE_COUNT_LONGLONGINT_POINTER:
-                   *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
-                   break;
-#endif
-                 default:
-                   abort ();
-                 }
-             }
-           else
-             {
-               arg_type type = a.arg[dp->arg_index].type;
-               CHAR_T *p;
-               unsigned int prefix_count;
-               int prefixes[2];
-#if !USE_SNPRINTF
-               size_t tmp_length;
-               CHAR_T tmpbuf[700];
-               CHAR_T *tmp;
-
-               /* Allocate a temporary buffer of sufficient size for calling
-                  sprintf.  */
-               {
-                 size_t width;
-                 size_t precision;
-
-                 width = 0;
-                 if (dp->width_start != dp->width_end)
-                   {
-                     if (dp->width_arg_index != ARG_NONE)
-                       {
-                         int arg;
-
-                         if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
-                           abort ();
-                         arg = a.arg[dp->width_arg_index].a.a_int;
-                         width = (arg < 0 ? (unsigned int) (-arg) : arg);
-                       }
-                     else
-                       {
-                         const CHAR_T *digitp = dp->width_start;
-
-                         do
-                           {
-                             size_t w_tmp = width * 10 + (*digitp++ - '0');
-                             if (SIZE_MAX / 10 < width || w_tmp < width)
-                               goto out_of_memory;
-                             width = w_tmp;
-                           }
-                         while (digitp != dp->width_end);
-                       }
-                   }
-
-                 precision = 6;
-                 if (dp->precision_start != dp->precision_end)
-                   {
-                     if (dp->precision_arg_index != ARG_NONE)
-                       {
-                         int arg;
-
-                         if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
-                           abort ();
-                         arg = a.arg[dp->precision_arg_index].a.a_int;
-                         precision = (arg < 0 ? 0 : arg);
-                       }
-                     else
-                       {
-                         const CHAR_T *digitp = dp->precision_start + 1;
-
-                         precision = 0;
-                         while (digitp != dp->precision_end)
-                           {
-                             size_t p1 = 10 * precision + (*digitp++ - '0');
-                             precision = ((SIZE_MAX / 10 < precision
-                                           || p1 < precision)
-                                          ? SIZE_MAX : p1);
-                           }
-                       }
-                   }
-
-                 switch (dp->conversion)
-                   {
-
-                   case 'd': case 'i': case 'u':
-# if HAVE_LONG_LONG_INT
-                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
-                                         * 0.30103 /* binary -> decimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-# endif
-                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
-                                         * 0.30103 /* binary -> decimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
-                                         * 0.30103 /* binary -> decimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     if (tmp_length < precision)
-                       tmp_length = precision;
-                     /* Multiply by 2, as an estimate for FLAG_GROUP.  */
-                     /* Add 1, to account for a leading sign.  */
-                     tmp_length = (tmp_length < SIZE_MAX / 2
-                                   ? 2 * tmp_length + 1
-                                   : SIZE_MAX);
-                     break;
-
-                   case 'o':
-# if HAVE_LONG_LONG_INT
-                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
-                                         * 0.333334 /* binary -> octal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-# endif
-                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
-                                         * 0.333334 /* binary -> octal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
-                                         * 0.333334 /* binary -> octal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     if (tmp_length < precision)
-                       tmp_length = precision;
-                     /* Add 1, to account for a leading sign.  */
-                     tmp_length += (tmp_length < SIZE_MAX);
-                     break;
-
-                   case 'x': case 'X':
-# if HAVE_LONG_LONG_INT
-                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
-                                         * 0.25 /* binary -> hexadecimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-# endif
-                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
-                                         * 0.25 /* binary -> hexadecimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-                       tmp_length =
-                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
-                                         * 0.25 /* binary -> hexadecimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     if (tmp_length < precision)
-                       tmp_length = precision;
-                     /* Add 2, to account for a leading sign or alternate form.  */
-                     tmp_length += 2;
-                     if (tmp_length < 2)
-                       goto out_of_memory;
-                     break;
-
-                   case 'f': case 'F':
-# if HAVE_LONG_DOUBLE
-                     if (type == TYPE_LONGDOUBLE)
-                       tmp_length =
-                         (unsigned int) (LDBL_MAX_EXP
-                                         * 0.30103 /* binary -> decimal */
-                                         * 2 /* estimate for FLAG_GROUP */
-                                        )
-                         + 1 /* turn floor into ceil */
-                         + 10; /* sign, decimal point etc. */
-                     else
-# endif
-                       tmp_length =
-                         (unsigned int) (DBL_MAX_EXP
-                                         * 0.30103 /* binary -> decimal */
-                                         * 2 /* estimate for FLAG_GROUP */
-                                        )
-                         + 1 /* turn floor into ceil */
-                         + 10; /* sign, decimal point etc. */
-                     tmp_length += precision;
-                     if (tmp_length < precision)
-                       goto out_of_memory;
-                     break;
-
-                   case 'e': case 'E': case 'g': case 'G':
-                     tmp_length =
-                       12; /* sign, decimal point, exponent etc. */
-                     tmp_length += precision;
-                     if (tmp_length < precision)
-                       goto out_of_memory;
-                     break;
-
-                   case 'a': case 'A':
-# if HAVE_LONG_DOUBLE
-                     if (type == TYPE_LONGDOUBLE)
-                       tmp_length =
-                         (unsigned int) (LDBL_DIG
-                                         * 0.831 /* decimal -> hexadecimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     else
-# endif
-                       tmp_length =
-                         (unsigned int) (DBL_DIG
-                                         * 0.831 /* decimal -> hexadecimal */
-                                        )
-                         + 1; /* turn floor into ceil */
-                     if (tmp_length < precision)
-                       tmp_length = precision;
-                     /* Account for sign, decimal point etc. */
-                     tmp_length += 12;
-                     if (tmp_length < 12)
-                       goto out_of_memory;
-                     break;
-
-                   case 'c':
-# if HAVE_WINT_T && !WIDE_CHAR_VERSION
-                     if (type == TYPE_WIDE_CHAR)
-                       tmp_length = MB_CUR_MAX;
-                     else
-# endif
-                       tmp_length = 1;
-                     break;
-
-                   case 's':
-# if HAVE_WCHAR_T
-                     if (type == TYPE_WIDE_STRING)
-                       {
-                         tmp_length =
-                           local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
-
-#  if !WIDE_CHAR_VERSION
-                         if (SIZE_MAX / MB_CUR_MAX < tmp_length)
-                           goto out_of_memory;
-                         tmp_length *= MB_CUR_MAX;
-#  endif
-                       }
-                     else
-# endif
-                       tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
-                     break;
-
-                   case 'p':
-                     tmp_length =
-                       (unsigned int) (sizeof (void *) * CHAR_BIT
-                                       * 0.25 /* binary -> hexadecimal */
-                                      )
-                         + 1 /* turn floor into ceil */
-                         + 2; /* account for leading 0x */
-                     break;
-
-                   default:
-                     abort ();
-                   }
-
-                 if (tmp_length < width)
-                   tmp_length = width;
-
-                 tmp_length++; /* account for trailing NUL */
-                 if (!tmp_length)
-                   goto out_of_memory;
-               }
-
-               if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
-                 tmp = tmpbuf;
-               else
-                 {
-                   if (SIZE_MAX / sizeof (CHAR_T) < tmp_length)
-                     /* Overflow, would lead to out of memory.  */
-                     goto out_of_memory;
-                   tmp = (CHAR_T *) malloc (tmp_length * sizeof (CHAR_T));
-                   if (tmp == NULL)
-                     /* Out of memory.  */
-                     goto out_of_memory;
-                 }
-#endif
-
-               /* Construct the format string for calling snprintf or
-                  sprintf.  */
-               p = buf;
-               *p++ = '%';
-               if (dp->flags & FLAG_GROUP)
-                 *p++ = '\'';
-               if (dp->flags & FLAG_LEFT)
-                 *p++ = '-';
-               if (dp->flags & FLAG_SHOWSIGN)
-                 *p++ = '+';
-               if (dp->flags & FLAG_SPACE)
-                 *p++ = ' ';
-               if (dp->flags & FLAG_ALT)
-                 *p++ = '#';
-               if (dp->flags & FLAG_ZERO)
-                 *p++ = '0';
-               if (dp->width_start != dp->width_end)
-                 {
-                   size_t n = dp->width_end - dp->width_start;
-                   memcpy (p, dp->width_start, n * sizeof (CHAR_T));
-                   p += n;
-                 }
-               if (dp->precision_start != dp->precision_end)
-                 {
-                   size_t n = dp->precision_end - dp->precision_start;
-                   memcpy (p, dp->precision_start, n * sizeof (CHAR_T));
-                   p += n;
-                 }
-
-               switch (type)
-                 {
-#if HAVE_LONG_LONG_INT
-                 case TYPE_LONGLONGINT:
-                 case TYPE_ULONGLONGINT:
-                   *p++ = 'l';
-                   /*FALLTHROUGH*/
-#endif
-                 case TYPE_LONGINT:
-                 case TYPE_ULONGINT:
-#if HAVE_WINT_T
-                 case TYPE_WIDE_CHAR:
-#endif
-#if HAVE_WCHAR_T
-                 case TYPE_WIDE_STRING:
-#endif
-                   *p++ = 'l';
-                   break;
-#if HAVE_LONG_DOUBLE
-                 case TYPE_LONGDOUBLE:
-                   *p++ = 'L';
-                   break;
-#endif
-                 default:
-                   break;
-                 }
-               *p = dp->conversion;
-#if USE_SNPRINTF
-               p[1] = '%';
-               p[2] = 'n';
-               p[3] = '\0';
-#else
-               p[1] = '\0';
-#endif
-
-               /* Construct the arguments for calling snprintf or sprintf.  */
-               prefix_count = 0;
-               if (dp->width_arg_index != ARG_NONE)
-                 {
-                   if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
-                     abort ();
-                   prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
-                 }
-               if (dp->precision_arg_index != ARG_NONE)
-                 {
-                   if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
-                     abort ();
-                   prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
-                 }
-
-#if USE_SNPRINTF
-               /* Prepare checking whether snprintf returns the count
-                  via %n.  */
-               ENSURE_ALLOCATION (1);
-               result[length] = '\0';
-#endif
-
-               for (;;)
-                 {
-                   size_t maxlen;
-                   int count;
-                   int retcount;
-
-                   maxlen = allocated - length;
-                   count = -1;
-                   retcount = 0;
-
-#if USE_SNPRINTF
-# define SNPRINTF_BUF(arg) \
-                   switch (prefix_count)                                   \
-                     {                                                     \
-                     case 0:                                               \
-                       retcount = SNPRINTF (result + length, maxlen, buf,  \
-                                            arg, &count);                  \
-                       break;                                              \
-                     case 1:                                               \
-                       retcount = SNPRINTF (result + length, maxlen, buf,  \
-                                            prefixes[0], arg, &count);     \
-                       break;                                              \
-                     case 2:                                               \
-                       retcount = SNPRINTF (result + length, maxlen, buf,  \
-                                            prefixes[0], prefixes[1], arg, \
-                                            &count);                       \
-                       break;                                              \
-                     default:                                              \
-                       abort ();                                           \
-                     }
-#else
-# define SNPRINTF_BUF(arg) \
-                   switch (prefix_count)                                   \
-                     {                                                     \
-                     case 0:                                               \
-                       count = sprintf (tmp, buf, arg);                    \
-                       break;                                              \
-                     case 1:                                               \
-                       count = sprintf (tmp, buf, prefixes[0], arg);       \
-                       break;                                              \
-                     case 2:                                               \
-                       count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
-                                        arg);                              \
-                       break;                                              \
-                     default:                                              \
-                       abort ();                                           \
-                     }
-#endif
-
-                   switch (type)
-                     {
-                     case TYPE_SCHAR:
-                       {
-                         int arg = a.arg[dp->arg_index].a.a_schar;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_UCHAR:
-                       {
-                         unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_SHORT:
-                       {
-                         int arg = a.arg[dp->arg_index].a.a_short;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_USHORT:
-                       {
-                         unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_INT:
-                       {
-                         int arg = a.arg[dp->arg_index].a.a_int;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_UINT:
-                       {
-                         unsigned int arg = a.arg[dp->arg_index].a.a_uint;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_LONGINT:
-                       {
-                         long int arg = a.arg[dp->arg_index].a.a_longint;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_ULONGINT:
-                       {
-                         unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#if HAVE_LONG_LONG_INT
-                     case TYPE_LONGLONGINT:
-                       {
-                         long long int arg = a.arg[dp->arg_index].a.a_longlongint;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     case TYPE_ULONGLONGINT:
-                       {
-                         unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#endif
-                     case TYPE_DOUBLE:
-                       {
-                         double arg = a.arg[dp->arg_index].a.a_double;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#if HAVE_LONG_DOUBLE
-                     case TYPE_LONGDOUBLE:
-                       {
-                         long double arg = a.arg[dp->arg_index].a.a_longdouble;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#endif
-                     case TYPE_CHAR:
-                       {
-                         int arg = a.arg[dp->arg_index].a.a_char;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#if HAVE_WINT_T
-                     case TYPE_WIDE_CHAR:
-                       {
-                         wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#endif
-                     case TYPE_STRING:
-                       {
-                         const char *arg = a.arg[dp->arg_index].a.a_string;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#if HAVE_WCHAR_T
-                     case TYPE_WIDE_STRING:
-                       {
-                         const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-#endif
-                     case TYPE_POINTER:
-                       {
-                         void *arg = a.arg[dp->arg_index].a.a_pointer;
-                         SNPRINTF_BUF (arg);
-                       }
-                       break;
-                     default:
-                       abort ();
-                     }
-
-#if USE_SNPRINTF
-                   /* Portability: Not all implementations of snprintf()
-                      are ISO C 99 compliant.  Determine the number of
-                      bytes that snprintf() has produced or would have
-                      produced.  */
-                   if (count >= 0)
-                     {
-                       /* Verify that snprintf() has NUL-terminated its
-                          result.  */
-                       if (count < maxlen && result[length + count] != '\0')
-                         abort ();
-                       /* Portability hack.  */
-                       if (retcount > count)
-                         count = retcount;
-                     }
-                   else
-                     {
-                       /* snprintf() doesn't understand the '%n'
-                          directive.  */
-                       if (p[1] != '\0')
-                         {
-                           /* Don't use the '%n' directive; instead, look
-                              at the snprintf() return value.  */
-                           p[1] = '\0';
-                           continue;
-                         }
-                       else
-                         {
-                           /* Look at the snprintf() return value.  */
-                           if (retcount < 0)
-                             {
-                               /* HP-UX 10.20 snprintf() is doubly deficient:
-                                  It doesn't understand the '%n' directive,
-                                  *and* it returns -1 (rather than the length
-                                  that would have been required) when the
-                                  buffer is too small.  */
-                               size_t bigger_need =
-                                 (allocated > 12 ? allocated : 12);
-                               ENSURE_ALLOCATION (bigger_need);
-                               continue;
-                             }
-                           else
-                             count = retcount;
-                         }
-                     }
-#endif
-
-                   /* Attempt to handle failure.  */
-                   if (count < 0)
-                     {
-                       if (!(result == resultbuf || result == NULL))
-                         free (result);
-                       if (buf_malloced != NULL)
-                         free (buf_malloced);
-                       CLEANUP ();
-                       errno = EINVAL;
-                       return NULL;
-                     }
-
-#if !USE_SNPRINTF
-                   if (count >= tmp_length)
-                     /* tmp_length was incorrectly calculated - fix the
-                        code above!  */
-                     abort ();
-#endif
-
-                   /* Make room for the result.  */
-                   if (count >= maxlen)
-                     {
-                       /* Need at least count bytes.  But allocate
-                          proportionally, to avoid looping eternally if
-                          snprintf() reports a too small count.  */
-                       ENSURE_ALLOCATION (count < allocated
-                                          ? allocated : count);
-#if USE_SNPRINTF
-                       continue;
-#endif
-                     }
-
-#if USE_SNPRINTF
-                   /* The snprintf() result did fit.  */
-#else
-                   /* Append the sprintf() result.  */
-                   memcpy (result + length, tmp, count * sizeof (CHAR_T));
-                   if (tmp != tmpbuf)
-                     free (tmp);
-#endif
-
-                   length += count;
-                   break;
-                 }
-             }
-         }
-      }
-
-    /* Add the final NUL.  */
-    ENSURE_ALLOCATION (1);
-    result[length] = '\0';
-
-    if (result != resultbuf && length + 1 < allocated)
-      {
-       /* Shrink the allocated memory if possible.  */
-       CHAR_T *memory;
-
-       memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T));
-       if (memory != NULL)
-         result = memory;
-      }
-
-    if (buf_malloced != NULL)
-      free (buf_malloced);
-    CLEANUP ();
-    *lengthp = length;
-    if (length > INT_MAX)
-      goto length_overflow;
-    return result;
-
-  length_overflow:
-    /* We could produce such a big string, but its length doesn't fit into
-       an 'int'.  POSIX says that snprintf() fails with errno = EOVERFLOW in
-       this case.  */
-    if (result != resultbuf)
-      free (result);
-    errno = EOVERFLOW;
-    return NULL;
-
-  out_of_memory:
-    if (!(result == resultbuf || result == NULL))
-      free (result);
-    if (buf_malloced != NULL)
-      free (buf_malloced);
-  out_of_memory_1:
-    CLEANUP ();
-    errno = ENOMEM;
-    return NULL;
-  }
-}
-
-#undef SNPRINTF
-#undef USE_SNPRINTF
-#undef PRINTF_PARSE
-#undef DIRECTIVES
-#undef DIRECTIVE
-#undef CHAR_T
-#undef VASNPRINTF