changeset 8916:353e81af4858

Do the extra handling of NaN and Inf also the %a / %A. Swap two code blocks.
author Bruno Haible <bruno@clisp.org>
date Wed, 06 Jun 2007 01:46:06 +0000
parents f15c03805bd9
children 296a84124dcd
files ChangeLog lib/vasnprintf.c
diffstat 2 files changed, 454 insertions(+), 448 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-05  Bruno Haible  <bruno@clisp.org>
+
+	* lib/vasnprintf.c (VASNPRINTF): Do the extra handling of NaN and Inf
+	also the %a / %A. Handle the %a / %A code before this extra handling.
+
 2007-06-05  Bruno Haible  <bruno@clisp.org>
 
 	* lib/vasnprintf.c [NEED_PRINTF_LONG_DOUBLE ||
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -1291,10 +1291,458 @@
 		    abort ();
 		  }
 	      }
+#if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL
+	    else if (dp->conversion == 'a' || dp->conversion == 'A')
+	      {
+		arg_type type = a.arg[dp->arg_index].type;
+		int flags = dp->flags;
+		int has_width;
+		size_t width;
+		int has_precision;
+		size_t precision;
+		size_t tmp_length;
+		CHAR_T tmpbuf[700];
+		CHAR_T *tmp;
+		CHAR_T *pad_ptr;
+		CHAR_T *p;
+
+		has_width = 0;
+		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;
+			if (arg < 0)
+			  {
+			    /* "A negative field width is taken as a '-' flag
+			        followed by a positive field width."  */
+			    flags |= FLAG_LEFT;
+			    width = (unsigned int) (-arg);
+			  }
+			else
+			  width = arg;
+		      }
+		    else
+		      {
+			const CHAR_T *digitp = dp->width_start;
+
+			do
+			  width = xsum (xtimes (width, 10), *digitp++ - '0');
+			while (digitp != dp->width_end);
+		      }
+		    has_width = 1;
+		  }
+
+		has_precision = 0;
+		precision = 0;
+		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;
+			/* "A negative precision is taken as if the precision
+			    were omitted."  */
+			if (arg >= 0)
+			  {
+			    precision = arg;
+			    has_precision = 1;
+			  }
+		      }
+		    else
+		      {
+			const CHAR_T *digitp = dp->precision_start + 1;
+
+			precision = 0;
+			while (digitp != dp->precision_end)
+			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+			has_precision = 1;
+		      }
+		  }
+
+		/* Allocate a temporary buffer of sufficient size.  */
+		if (type == TYPE_LONGDOUBLE)
+		  tmp_length =
+		    (unsigned int) ((LDBL_DIG + 1)
+				    * 0.831 /* decimal -> hexadecimal */
+				   )
+		    + 1; /* turn floor into ceil */
+		else
+		  tmp_length =
+		    (unsigned int) ((DBL_DIG + 1)
+				    * 0.831 /* decimal -> hexadecimal */
+				   )
+		    + 1; /* turn floor into ceil */
+		if (tmp_length < precision)
+		  tmp_length = precision;
+		/* Account for sign, decimal point etc. */
+		tmp_length = xsum (tmp_length, 12);
+
+		if (tmp_length < width)
+		  tmp_length = width;
+
+		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+		if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
+		  tmp = tmpbuf;
+		else
+		  {
+		    size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T));
+
+		    if (size_overflow_p (tmp_memsize))
+		      /* Overflow, would lead to out of memory.  */
+		      goto out_of_memory;
+		    tmp = (CHAR_T *) malloc (tmp_memsize);
+		    if (tmp == NULL)
+		      /* Out of memory.  */
+		      goto out_of_memory;
+		  }
+
+		pad_ptr = NULL;
+		p = tmp;
+		if (type == TYPE_LONGDOUBLE)
+		  {
+		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+		    if (isnanl (arg))
+		      {
+			if (dp->conversion == 'A')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+			DECL_LONG_DOUBLE_ROUNDING
+
+			BEGIN_LONG_DOUBLE_ROUNDING ();
+
+			if (signbit (arg)) /* arg < 0.0L or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0L && arg + arg == arg)
+			  {
+			    if (dp->conversion == 'A')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+			    int exponent;
+			    long double mantissa;
+
+			    if (arg > 0.0L)
+			      mantissa = printf_frexpl (arg, &exponent);
+			    else
+			      {
+				exponent = 0;
+				mantissa = 0.0L;
+			      }
+
+			    if (has_precision
+				&& precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+			      {
+				/* Round the mantissa.  */
+				long double tail = mantissa;
+				size_t q;
+
+				for (q = precision; ; q--)
+				  {
+				    int digit = (int) tail;
+				    tail -= digit;
+				    if (q == 0)
+				      {
+					if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+					  tail = 1 - tail;
+					else
+					  tail = - tail;
+					break;
+				      }
+				    tail *= 16.0L;
+				  }
+				if (tail != 0.0L)
+				  for (q = precision; q > 0; q--)
+				    tail *= 0.0625L;
+				mantissa += tail;
+			      }
+
+			    *p++ = '0';
+			    *p++ = dp->conversion - 'A' + 'X';
+			    pad_ptr = p;
+			    {
+			      int digit;
+
+			      digit = (int) mantissa;
+			      mantissa -= digit;
+			      *p++ = '0' + digit;
+			      if ((flags & FLAG_ALT)
+				  || mantissa > 0.0L || precision > 0)
+				{
+				  *p++ = decimal_point_char ();
+				  /* This loop terminates because we assume
+				     that FLT_RADIX is a power of 2.  */
+				  while (mantissa > 0.0L)
+				    {
+				      mantissa *= 16.0L;
+				      digit = (int) mantissa;
+				      mantissa -= digit;
+				      *p++ = digit
+					     + (digit < 10
+						? '0'
+						: dp->conversion - 10);
+				      if (precision > 0)
+					precision--;
+				    }
+				  while (precision > 0)
+				    {
+				      *p++ = '0';
+				      precision--;
+				    }
+				}
+			      }
+			      *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+			      {
+				static const wchar_t decimal_format[] =
+				  { '%', '+', 'd', '\0' };
+				SNPRINTF (p, 6 + 1, decimal_format, exponent);
+			      }
+# else
+			      sprintf (p, "%+d", exponent);
+# endif
+			      while (*p != '\0')
+				p++;
+			  }
+
+			END_LONG_DOUBLE_ROUNDING ();
+		      }
+		  }
+		else
+		  {
+		    double arg = a.arg[dp->arg_index].a.a_double;
+
+		    if (isnan (arg))
+		      {
+			if (dp->conversion == 'A')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+
+			if (signbit (arg)) /* arg < 0.0 or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0 && arg + arg == arg)
+			  {
+			    if (dp->conversion == 'A')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+			    int exponent;
+			    double mantissa;
+
+			    if (arg > 0.0)
+			      mantissa = printf_frexp (arg, &exponent);
+			    else
+			      {
+				exponent = 0;
+				mantissa = 0.0;
+			      }
+
+			    if (has_precision
+				&& precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+			      {
+				/* Round the mantissa.  */
+				double tail = mantissa;
+				size_t q;
+
+				for (q = precision; ; q--)
+				  {
+				    int digit = (int) tail;
+				    tail -= digit;
+				    if (q == 0)
+				      {
+					if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+					  tail = 1 - tail;
+					else
+					  tail = - tail;
+					break;
+				      }
+				    tail *= 16.0;
+				  }
+				if (tail != 0.0)
+				  for (q = precision; q > 0; q--)
+				    tail *= 0.0625;
+				mantissa += tail;
+			      }
+
+			    *p++ = '0';
+			    *p++ = dp->conversion - 'A' + 'X';
+			    pad_ptr = p;
+			    {
+			      int digit;
+
+			      digit = (int) mantissa;
+			      mantissa -= digit;
+			      *p++ = '0' + digit;
+			      if ((flags & FLAG_ALT)
+				  || mantissa > 0.0 || precision > 0)
+				{
+				  *p++ = decimal_point_char ();
+				  /* This loop terminates because we assume
+				     that FLT_RADIX is a power of 2.  */
+				  while (mantissa > 0.0)
+				    {
+				      mantissa *= 16.0;
+				      digit = (int) mantissa;
+				      mantissa -= digit;
+				      *p++ = digit
+					     + (digit < 10
+						? '0'
+						: dp->conversion - 10);
+				      if (precision > 0)
+					precision--;
+				    }
+				  while (precision > 0)
+				    {
+				      *p++ = '0';
+				      precision--;
+				    }
+				}
+			      }
+			      *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+			      {
+				static const wchar_t decimal_format[] =
+				  { '%', '+', 'd', '\0' };
+				SNPRINTF (p, 6 + 1, decimal_format, exponent);
+			      }
+# else
+			      sprintf (p, "%+d", exponent);
+# endif
+			      while (*p != '\0')
+				p++;
+			  }
+		      }
+		  }
+		/* The generated string now extends from tmp to p, with the
+		   zero padding insertion point being at pad_ptr.  */
+		if (has_width && p - tmp < width)
+		  {
+		    size_t pad = width - (p - tmp);
+		    CHAR_T *end = p + pad;
+
+		    if (flags & FLAG_LEFT)
+		      {
+			/* Pad with spaces on the right.  */
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+		      {
+			/* Pad with zeroes.  */
+			CHAR_T *q = end;
+
+			while (p > pad_ptr)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = '0';
+		      }
+		    else
+		      {
+			/* Pad with spaces on the left.  */
+			CHAR_T *q = end;
+
+			while (p > tmp)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+
+		    p = end;
+		  }
+
+		{
+		  size_t count = p - tmp;
+
+		  if (count >= tmp_length)
+		    /* tmp_length was incorrectly calculated - fix the
+		       code above!  */
+		    abort ();
+
+		  /* Make room for the result.  */
+		  if (count >= allocated - length)
+		    {
+		      size_t n = xsum (length, count);
+
+		      ENSURE_ALLOCATION (n);
+		    }
+
+		  /* Append the result.  */
+		  memcpy (result + length, tmp, count * sizeof (CHAR_T));
+		  if (tmp != tmpbuf)
+		    free (tmp);
+		  length += count;
+		}
+	      }
+#endif
 #if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
 	    else if ((dp->conversion == 'f' || dp->conversion == 'F'
 		      || dp->conversion == 'e' || dp->conversion == 'E'
-		      || dp->conversion == 'g' || dp->conversion == 'G')
+		      || dp->conversion == 'g' || dp->conversion == 'G'
+		      || dp->conversion == 'a' || dp->conversion == 'A')
 		     && (0
 # if NEED_PRINTF_INFINITE_DOUBLE
 			 || (a.arg[dp->arg_index].type == TYPE_DOUBLE
@@ -1946,453 +2394,6 @@
 		}
 	      }
 #endif
-#if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL
-	    else if (dp->conversion == 'a' || dp->conversion == 'A')
-	      {
-		arg_type type = a.arg[dp->arg_index].type;
-		int flags = dp->flags;
-		int has_width;
-		size_t width;
-		int has_precision;
-		size_t precision;
-		size_t tmp_length;
-		CHAR_T tmpbuf[700];
-		CHAR_T *tmp;
-		CHAR_T *pad_ptr;
-		CHAR_T *p;
-
-		has_width = 0;
-		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;
-			if (arg < 0)
-			  {
-			    /* "A negative field width is taken as a '-' flag
-			        followed by a positive field width."  */
-			    flags |= FLAG_LEFT;
-			    width = (unsigned int) (-arg);
-			  }
-			else
-			  width = arg;
-		      }
-		    else
-		      {
-			const CHAR_T *digitp = dp->width_start;
-
-			do
-			  width = xsum (xtimes (width, 10), *digitp++ - '0');
-			while (digitp != dp->width_end);
-		      }
-		    has_width = 1;
-		  }
-
-		has_precision = 0;
-		precision = 0;
-		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;
-			/* "A negative precision is taken as if the precision
-			    were omitted."  */
-			if (arg >= 0)
-			  {
-			    precision = arg;
-			    has_precision = 1;
-			  }
-		      }
-		    else
-		      {
-			const CHAR_T *digitp = dp->precision_start + 1;
-
-			precision = 0;
-			while (digitp != dp->precision_end)
-			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
-			has_precision = 1;
-		      }
-		  }
-
-		/* Allocate a temporary buffer of sufficient size.  */
-		if (type == TYPE_LONGDOUBLE)
-		  tmp_length =
-		    (unsigned int) ((LDBL_DIG + 1)
-				    * 0.831 /* decimal -> hexadecimal */
-				   )
-		    + 1; /* turn floor into ceil */
-		else
-		  tmp_length =
-		    (unsigned int) ((DBL_DIG + 1)
-				    * 0.831 /* decimal -> hexadecimal */
-				   )
-		    + 1; /* turn floor into ceil */
-		if (tmp_length < precision)
-		  tmp_length = precision;
-		/* Account for sign, decimal point etc. */
-		tmp_length = xsum (tmp_length, 12);
-
-		if (tmp_length < width)
-		  tmp_length = width;
-
-		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
-
-		if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
-		  tmp = tmpbuf;
-		else
-		  {
-		    size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T));
-
-		    if (size_overflow_p (tmp_memsize))
-		      /* Overflow, would lead to out of memory.  */
-		      goto out_of_memory;
-		    tmp = (CHAR_T *) malloc (tmp_memsize);
-		    if (tmp == NULL)
-		      /* Out of memory.  */
-		      goto out_of_memory;
-		  }
-
-		pad_ptr = NULL;
-		p = tmp;
-		if (type == TYPE_LONGDOUBLE)
-		  {
-		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
-
-		    if (isnanl (arg))
-		      {
-			if (dp->conversion == 'A')
-			  {
-			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
-			  }
-			else
-			  {
-			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
-			  }
-		      }
-		    else
-		      {
-			int sign = 0;
-			DECL_LONG_DOUBLE_ROUNDING
-
-			BEGIN_LONG_DOUBLE_ROUNDING ();
-
-			if (signbit (arg)) /* arg < 0.0L or negative zero */
-			  {
-			    sign = -1;
-			    arg = -arg;
-			  }
-
-			if (sign < 0)
-			  *p++ = '-';
-			else if (flags & FLAG_SHOWSIGN)
-			  *p++ = '+';
-			else if (flags & FLAG_SPACE)
-			  *p++ = ' ';
-
-			if (arg > 0.0L && arg + arg == arg)
-			  {
-			    if (dp->conversion == 'A')
-			      {
-				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
-			      }
-			    else
-			      {
-				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
-			      }
-			  }
-			else
-			  {
-			    int exponent;
-			    long double mantissa;
-
-			    if (arg > 0.0L)
-			      mantissa = printf_frexpl (arg, &exponent);
-			    else
-			      {
-				exponent = 0;
-				mantissa = 0.0L;
-			      }
-
-			    if (has_precision
-				&& precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
-			      {
-				/* Round the mantissa.  */
-				long double tail = mantissa;
-				size_t q;
-
-				for (q = precision; ; q--)
-				  {
-				    int digit = (int) tail;
-				    tail -= digit;
-				    if (q == 0)
-				      {
-					if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
-					  tail = 1 - tail;
-					else
-					  tail = - tail;
-					break;
-				      }
-				    tail *= 16.0L;
-				  }
-				if (tail != 0.0L)
-				  for (q = precision; q > 0; q--)
-				    tail *= 0.0625L;
-				mantissa += tail;
-			      }
-
-			    *p++ = '0';
-			    *p++ = dp->conversion - 'A' + 'X';
-			    pad_ptr = p;
-			    {
-			      int digit;
-
-			      digit = (int) mantissa;
-			      mantissa -= digit;
-			      *p++ = '0' + digit;
-			      if ((flags & FLAG_ALT)
-				  || mantissa > 0.0L || precision > 0)
-				{
-				  *p++ = decimal_point_char ();
-				  /* This loop terminates because we assume
-				     that FLT_RADIX is a power of 2.  */
-				  while (mantissa > 0.0L)
-				    {
-				      mantissa *= 16.0L;
-				      digit = (int) mantissa;
-				      mantissa -= digit;
-				      *p++ = digit
-					     + (digit < 10
-						? '0'
-						: dp->conversion - 10);
-				      if (precision > 0)
-					precision--;
-				    }
-				  while (precision > 0)
-				    {
-				      *p++ = '0';
-				      precision--;
-				    }
-				}
-			      }
-			      *p++ = dp->conversion - 'A' + 'P';
-# if WIDE_CHAR_VERSION
-			      {
-				static const wchar_t decimal_format[] =
-				  { '%', '+', 'd', '\0' };
-				SNPRINTF (p, 6 + 1, decimal_format, exponent);
-			      }
-# else
-			      sprintf (p, "%+d", exponent);
-# endif
-			      while (*p != '\0')
-				p++;
-			  }
-
-			END_LONG_DOUBLE_ROUNDING ();
-		      }
-		  }
-		else
-		  {
-		    double arg = a.arg[dp->arg_index].a.a_double;
-
-		    if (isnan (arg))
-		      {
-			if (dp->conversion == 'A')
-			  {
-			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
-			  }
-			else
-			  {
-			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
-			  }
-		      }
-		    else
-		      {
-			int sign = 0;
-
-			if (signbit (arg)) /* arg < 0.0 or negative zero */
-			  {
-			    sign = -1;
-			    arg = -arg;
-			  }
-
-			if (sign < 0)
-			  *p++ = '-';
-			else if (flags & FLAG_SHOWSIGN)
-			  *p++ = '+';
-			else if (flags & FLAG_SPACE)
-			  *p++ = ' ';
-
-			if (arg > 0.0 && arg + arg == arg)
-			  {
-			    if (dp->conversion == 'A')
-			      {
-				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
-			      }
-			    else
-			      {
-				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
-			      }
-			  }
-			else
-			  {
-			    int exponent;
-			    double mantissa;
-
-			    if (arg > 0.0)
-			      mantissa = printf_frexp (arg, &exponent);
-			    else
-			      {
-				exponent = 0;
-				mantissa = 0.0;
-			      }
-
-			    if (has_precision
-				&& precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
-			      {
-				/* Round the mantissa.  */
-				double tail = mantissa;
-				size_t q;
-
-				for (q = precision; ; q--)
-				  {
-				    int digit = (int) tail;
-				    tail -= digit;
-				    if (q == 0)
-				      {
-					if (digit & 1 ? tail >= 0.5 : tail > 0.5)
-					  tail = 1 - tail;
-					else
-					  tail = - tail;
-					break;
-				      }
-				    tail *= 16.0;
-				  }
-				if (tail != 0.0)
-				  for (q = precision; q > 0; q--)
-				    tail *= 0.0625;
-				mantissa += tail;
-			      }
-
-			    *p++ = '0';
-			    *p++ = dp->conversion - 'A' + 'X';
-			    pad_ptr = p;
-			    {
-			      int digit;
-
-			      digit = (int) mantissa;
-			      mantissa -= digit;
-			      *p++ = '0' + digit;
-			      if ((flags & FLAG_ALT)
-				  || mantissa > 0.0 || precision > 0)
-				{
-				  *p++ = decimal_point_char ();
-				  /* This loop terminates because we assume
-				     that FLT_RADIX is a power of 2.  */
-				  while (mantissa > 0.0)
-				    {
-				      mantissa *= 16.0;
-				      digit = (int) mantissa;
-				      mantissa -= digit;
-				      *p++ = digit
-					     + (digit < 10
-						? '0'
-						: dp->conversion - 10);
-				      if (precision > 0)
-					precision--;
-				    }
-				  while (precision > 0)
-				    {
-				      *p++ = '0';
-				      precision--;
-				    }
-				}
-			      }
-			      *p++ = dp->conversion - 'A' + 'P';
-# if WIDE_CHAR_VERSION
-			      {
-				static const wchar_t decimal_format[] =
-				  { '%', '+', 'd', '\0' };
-				SNPRINTF (p, 6 + 1, decimal_format, exponent);
-			      }
-# else
-			      sprintf (p, "%+d", exponent);
-# endif
-			      while (*p != '\0')
-				p++;
-			  }
-		      }
-		  }
-		/* The generated string now extends from tmp to p, with the
-		   zero padding insertion point being at pad_ptr.  */
-		if (has_width && p - tmp < width)
-		  {
-		    size_t pad = width - (p - tmp);
-		    CHAR_T *end = p + pad;
-
-		    if (flags & FLAG_LEFT)
-		      {
-			/* Pad with spaces on the right.  */
-			for (; pad > 0; pad--)
-			  *p++ = ' ';
-		      }
-		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
-		      {
-			/* Pad with zeroes.  */
-			CHAR_T *q = end;
-
-			while (p > pad_ptr)
-			  *--q = *--p;
-			for (; pad > 0; pad--)
-			  *p++ = '0';
-		      }
-		    else
-		      {
-			/* Pad with spaces on the left.  */
-			CHAR_T *q = end;
-
-			while (p > tmp)
-			  *--q = *--p;
-			for (; pad > 0; pad--)
-			  *p++ = ' ';
-		      }
-
-		    p = end;
-		  }
-
-		{
-		  size_t count = p - tmp;
-
-		  if (count >= tmp_length)
-		    /* tmp_length was incorrectly calculated - fix the
-		       code above!  */
-		    abort ();
-
-		  /* Make room for the result.  */
-		  if (count >= allocated - length)
-		    {
-		      size_t n = xsum (length, count);
-
-		      ENSURE_ALLOCATION (n);
-		    }
-
-		  /* Append the result.  */
-		  memcpy (result + length, tmp, count * sizeof (CHAR_T));
-		  if (tmp != tmpbuf)
-		    free (tmp);
-		  length += count;
-		}
-	      }
-#endif
 	    else
 	      {
 		arg_type type = a.arg[dp->arg_index].type;