[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Changes to m4/src/Attic/format.c,v [branch-1_4]
From: |
Eric Blake |
Subject: |
Changes to m4/src/Attic/format.c,v [branch-1_4] |
Date: |
Fri, 30 Jun 2006 03:38:50 +0000 |
CVSROOT: /sources/m4
Module name: m4
Branch: branch-1_4
Changes by: Eric Blake <ericb> 06/06/30 03:38:49
Index: src/format.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/format.c,v
retrieving revision 1.1.1.1.2.2
retrieving revision 1.1.1.1.2.3
diff -u -b -r1.1.1.1.2.2 -r1.1.1.1.2.3
--- src/format.c 15 Jun 2006 21:51:37 -0000 1.1.1.1.2.2
+++ src/format.c 30 Jun 2006 03:38:49 -0000 1.1.1.1.2.3
@@ -22,65 +22,7 @@
/* printf like formatting for m4. */
#include "m4.h"
-
-#ifdef HAVE_EFGCVT
-
-/* Various constants for floating point formatting. */
-#define MAXFIELD 128 /* size of buffer for formatted text */
-/* The following two are hardware dependant. */
-#define ECVTMAX 18 /* max number of significant digits for
%e */
-#define FCVTMAX (18+38+4) /* max number of significant digits
for %f */
-
-/* Externs used herein. */
-#if HAVE_EFGCVT <= 1
-extern char *ecvt (), *fcvt (), *gcvt ();
-#endif
-
-#ifndef STDC_HEADERS
-extern int atoi ();
-extern long atol ();
-extern double atof ();
-#endif /* STDC_HEADERS */
-
-#define min(a, b) ((a) < (b) ? (a) : (b))
-
-static char const digits[] = "0123456789abcdef";
-static char const Digits[] = "0123456789ABCDEF";
-
-/* STR has dimension MAXFIELD (?). */
-
-static char *
-ulong_to_str (register unsigned long val, char *str, int base,
- const char *digits)
-{
- register char *s = &str[MAXFIELD];
-
- *--s = '\0';
- do
- {
- *--s = digits[val % base];
- val /= base;
- }
- while (val > 0);
-
- return s;
-}
-
-/*-----------------------------------------.
-| Clear trailing zeroes, return argument. |
-`-----------------------------------------*/
-
-static char *
-clr0 (char *s)
-{
- register char *t;
-
- for (t = s + strlen (s); *--t == '0' && t > s;)
- *t = '\0';
- return s;
-}
-
-#endif /* HAVE_EFGCVT */
+#include "xvasprintf.h"
/* Simple varargs substitute. */
@@ -118,407 +60,6 @@
void
format (struct obstack *obs, int argc, token_data **argv)
{
-#ifdef HAVE_EFGCVT
-
- const char *fmt; /* format control string */
- int c; /* a simple character */
- char fc; /* format code */
-
- /* Flags. */
- char flags; /* 1 iff treating flags */
- char ljust; /* left justification */
- char mandsign; /* mandatory sign */
- char noplus; /* use space if no sign */
- char alternate; /* use alternate form */
- char zeropad; /* do zero padding */
- char plus; /* plus-sign, according to mandatory and noplus
*/
-
- /* Precision specifiers. */
- int width; /* minimum field width */
- int prec; /* precision */
- int maxch; /* maximum no. of chars to print */
- char lflag; /* long flag */
- char hflag; /* short flag */
-
- /* Different parts of each specification. */
- char sign; /* wanted sign, iff any */
- int ppad; /* pre-prefix zero padding */
- const char *prefix; /* value prefix */
- int lpad; /* zero padding on the left */
- register char *s; /* ptr to formatted text */
- int rpad; /* zero padding on the rigth*/
- const char *suffix; /* value suffix */
-
- /* Buffer and stuff. */
- char str[MAXFIELD]; /* buffer for formatted text */
- int length; /* length of str */
- int padding; /* padding at the left or rigth */
- register int i; /* an index */
-
-/* Length of trailing string in str. */
-#define LENGTH(s) (&str[MAXFIELD-1] - (s))
-#define HAS_SIGN (sign != '\0')
-
- fmt = ARG_STR (argc, argv);
- for (;;)
- {
- while ((c = *fmt++) != '%')
- {
- if (c == 0)
- return;
- obstack_1grow (obs, c);
- }
- if (*fmt == '%')
- {
- obstack_1grow (obs, '%');
- fmt++;
- continue;
- }
-
- /* Parse flags. */
- flags = 1;
- ljust = mandsign = noplus = alternate = zeropad = 0;
- do
- {
- switch (*fmt)
- {
- case '-': /* left justification */
- ljust = 1;
- break;
-
- case '+': /* mandatory sign */
- mandsign = 1;
- break;
-
- case ' ': /* space instead of positive sign */
- noplus = 1;
- break;
-
- case '0': /* zero padding */
- zeropad = 1;
- break;
-
- case '#': /* alternate output */
- alternate = 1;
- break;
-
- default:
- flags = 0;
- break;
- }
- }
- while (flags && fmt++);
-
- plus = '\0'; /* what to use as a plus ??? */
- if (mandsign)
- plus = '+';
- else if (noplus)
- plus = ' ';
-
- if (ljust)
- zeropad = 0;
-
- /* Minimum field width. */
- width = -1;
- if (*fmt == '*')
- {
- width = ARG_INT (argc, argv);
- fmt++;
- }
- else if (isdigit (to_uchar (*fmt)))
- {
- width = 0;
- do
- {
- width = width * 10 + *fmt++ - '0';
- }
- while (isdigit (to_uchar (*fmt)));
- }
-
- /* Maximum precision. */
- prec = -1;
- if (*fmt == '.')
- {
- if (*(++fmt) == '*')
- {
- prec = ARG_INT (argc, argv);
- ++fmt;
- }
- else if (isdigit (to_uchar (*fmt)))
- {
- prec = 0;
- do
- {
- prec = prec * 10 + *fmt++ - '0';
- }
- while (isdigit (to_uchar (*fmt)))
- ;
- }
- }
-
- /* Length modifiers. */
- lflag = (*fmt == 'l');
- hflag = (*fmt == 'h');
- if (lflag || hflag)
- fmt++;
-
- sign = '\0';
- ppad = lpad = rpad = 0;
- maxch = -1;
- prefix = suffix = "";
-
- switch (fc = *fmt++)
- {
-
- case '\0':
- return;
-
- case 'c':
- c = ARG_INT (argc, argv);
- str[0] = (unsigned char) c;
- str[1] = '\0';
- s = str;
- break;
-
- case 's':
- s = ARG_STR (argc, argv);
- maxch = prec;
- break;
-
- case 'd':
- case 'i':
- if (lflag)
- {
- long val = ARG_LONG (argc, argv);
- if (val < 0)
- {
- val = -val; /* does not work for MINLONG */
- sign = '-';
- }
- else
- sign = plus;
- s = ulong_to_str ((unsigned long) val, str, 10, digits);
- }
- else
- {
- int val = ARG_INT (argc, argv);
- if (hflag)
- val = (short) val;
- if (val < 0)
- {
- val = -val; /* does not work for MININT */
- sign = '-';
- }
- else
- sign = plus;
- s = ulong_to_str ((unsigned long) val, str, 10, digits);
- }
- if (zeropad)
- lpad = width - LENGTH (s) - HAS_SIGN;
- break;
-
- case 'o':
- if (lflag)
- {
- unsigned long val = ARG_ULONG (argc, argv);
- s = ulong_to_str ((unsigned long) val, str, 8, digits);
- }
- else
- {
- unsigned int val = ARG_UINT (argc, argv);
- if (hflag)
- val = (unsigned short) val;
- s = ulong_to_str ((unsigned long) val, str, 8, digits);
- }
- if (alternate)
- prefix = "0";
- if (zeropad)
- lpad = width - LENGTH (s) - alternate;
- break;
-
- case 'x':
- case 'X':
- if (lflag)
- {
- unsigned long val = ARG_ULONG (argc, argv);
- s = ulong_to_str ((unsigned long) val, str, 16,
- (fc == 'x') ? digits : Digits);
- }
- else
- {
- unsigned int val = ARG_UINT (argc, argv);
- if (hflag)
- val = (unsigned short) val;
- s = ulong_to_str ((unsigned long) val, str, 16,
- (fc == 'x') ? digits : Digits);
- }
- if (alternate)
- prefix = (fc == 'X') ? "0X" : "0x";
- if (zeropad)
- lpad = width - LENGTH (s) - 2*alternate;
- break;
-
- case 'u':
- if (lflag)
- {
- unsigned long val = ARG_ULONG (argc, argv);
- s = ulong_to_str ((unsigned long) val, str, 10, digits);
- }
- else
- {
- unsigned int val = ARG_UINT (argc, argv);
- if (hflag)
- val = (unsigned short) val;
- s = ulong_to_str ((unsigned long) val, str, 10, digits);
- }
- if (zeropad)
- lpad = width - LENGTH (s);
- break;
-
- case 'e':
- case 'E':
- {
- char *t;
- int sgn, decpt, exp, n;
- double val = ARG_DOUBLE (argc, argv);
-
- if (prec < 0)
- prec = 6;
- t = clr0 (ecvt (val, min (prec + 1, ECVTMAX), &decpt, &sgn));
- sign = sgn ? '-' : plus;
-
- n = prec;
- s = str;
- exp = (t[0] == '0' && t[1] == '\0') ? 0 : decpt - 1;
-
- *s++ = *t++;
- if (n > 0 || alternate)
- *s++ = '.';
- while (*t != '\0' && --n >= 0)
- *s++ = *t++;
- *s = '\0';
- rpad = n;
-
- sgn = 0;
- if (exp < 0)
- {
- exp = -exp;
- sgn = 1;
- }
- t = ulong_to_str ((unsigned long) exp, str, 10, digits);
- if (exp < 10)
- *--t = '0'; /* always at least two digits */
- *--t = sgn ? '-' : '+';
- *--t = fc;
-
- if (zeropad)
- {
- lpad = width - HAS_SIGN - (s - str) - LENGTH (t);
- if (rpad > 0)
- lpad -= rpad;
- }
-
- suffix = t;
- s = str;
- }
- break;
-
- case 'f':
- {
- const char *t;
- int sgn, decpt, n;
- double val = ARG_DOUBLE (argc, argv);
-
- if (prec < 0)
- prec = 6;
-
- /* FIXME: For the following line, Dave Anglin reports
- ``warning: passing arg 1 of `clr0' discards `const' from
- pointer target type''. I suspect fcvt might be declared
- as returning const on some systems. Pouah! I should
- revise this whole module, one of these days... */
-
- t = clr0 (fcvt (val, min (prec, FCVTMAX), &decpt, &sgn));
-
- sign = sgn ? '-' : plus;
-
- n = prec;
- s = str;
-
- if (decpt <= 0)
- {
- prefix = (n > 0 || alternate) ? "0." : "0";
- lpad = min (-decpt, prec);
- n -= lpad;
- }
- else
- {
- while (--decpt >= 0)
- *s++ = *t++;
- if (n > 0 || alternate)
- *s++ = '.';
- }
- while (*t && --n >= 0)
- *s++ = *t++;
-
- *s = '\0';
- rpad = n;
-
- if (zeropad)
- ppad = width - HAS_SIGN - (prefix[1] ? 2 : 1) - lpad -
- (s - str) - rpad;
-
- s = str;
- }
- break;
-
- default:
- continue;
- }
-
- if (lpad < 0)
- lpad = 0;
- if (rpad < 0)
- rpad = 0;
- if (width < 0)
- width = 0;
-
- i = strlen (s);
- if (maxch <= 0 || maxch > i)
- maxch = i;
-
- length = (HAS_SIGN + ppad + strlen (prefix) + lpad + maxch
- + rpad + strlen (suffix));
- padding = 0;
- if (width != 0)
- {
- padding = width - length;
- }
-
- if (ljust == 0) /* left padding */
- for (i = padding; --i >= 0;)
- obstack_1grow (obs, ' ');
- if (HAS_SIGN) /* sign */
- obstack_1grow (obs, sign);
- for (i = ppad; --i >= 0;) /* pre-prefix zero padding */
- obstack_1grow (obs, '0');
- for (; *prefix; ++prefix) /* prefix */
- obstack_1grow (obs, *prefix);
- for (i = lpad; --i >= 0;) /* left zero padding */
- obstack_1grow (obs, '0');
- for (i = maxch; --i >= 0; ++s) /* actual text */
- obstack_1grow (obs, *s);
- for (i = rpad; --i >= 0;) /* right zero padding */
- obstack_1grow (obs, '0');
- for (; *suffix; ++suffix) /* suffix */
- obstack_1grow (obs, *suffix);
- if (ljust != 0) /* right padding */
- for (i = padding; --i >= 0;)
- obstack_1grow (obs, ' ');
- }
-
-#else /* not HAVE_EFGCVT */
-
char *fmt; /* format control string */
const char *fstart; /* beginning of current format spec */
int c; /* a simple character */
@@ -533,7 +74,7 @@
char hflag; /* short flag */
/* Buffer and stuff. */
- char str[256]; /* buffer for formatted text */
+ char *str; /* malloc'd buffer of formatted text */
enum {INT, UINT, LONG, ULONG, DOUBLE, STR} datatype;
fmt = ARG_STR (argc, argv);
@@ -673,75 +214,79 @@
{
case INT:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_INT(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_INT(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_INT(argc, argv));
+ str = xasprintf (fstart, width, ARG_INT(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_INT(argc, argv));
+ str = xasprintf (fstart, prec, ARG_INT(argc, argv));
else
- sprintf (str, fstart, ARG_INT(argc, argv));
+ str = xasprintf (fstart, ARG_INT(argc, argv));
break;
case UINT:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_UINT(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_UINT(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_UINT(argc, argv));
+ str = xasprintf (fstart, width, ARG_UINT(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_UINT(argc, argv));
+ str = xasprintf (fstart, prec, ARG_UINT(argc, argv));
else
- sprintf (str, fstart, ARG_UINT(argc, argv));
+ str = xasprintf (fstart, ARG_UINT(argc, argv));
break;
case LONG:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_LONG(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_LONG(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_LONG(argc, argv));
+ str = xasprintf (fstart, width, ARG_LONG(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_LONG(argc, argv));
+ str = xasprintf (fstart, prec, ARG_LONG(argc, argv));
else
- sprintf (str, fstart, ARG_LONG(argc, argv));
+ str = xasprintf (fstart, ARG_LONG(argc, argv));
break;
case ULONG:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_ULONG(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_ULONG(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_ULONG(argc, argv));
+ str = xasprintf (fstart, width, ARG_ULONG(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_ULONG(argc, argv));
+ str = xasprintf (fstart, prec, ARG_ULONG(argc, argv));
else
- sprintf (str, fstart, ARG_ULONG(argc, argv));
+ str = xasprintf (fstart, ARG_ULONG(argc, argv));
break;
case DOUBLE:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_DOUBLE(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_DOUBLE(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_DOUBLE(argc, argv));
+ str = xasprintf (fstart, width, ARG_DOUBLE(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_DOUBLE(argc, argv));
+ str = xasprintf (fstart, prec, ARG_DOUBLE(argc, argv));
else
- sprintf (str, fstart, ARG_DOUBLE(argc, argv));
+ str = xasprintf (fstart, ARG_DOUBLE(argc, argv));
break;
case STR:
if (width != -1 && prec != -1)
- sprintf (str, fstart, width, prec, ARG_STR(argc, argv));
+ str = xasprintf (fstart, width, prec, ARG_STR(argc, argv));
else if (width != -1)
- sprintf (str, fstart, width, ARG_STR(argc, argv));
+ str = xasprintf (fstart, width, ARG_STR(argc, argv));
else if (prec != -1)
- sprintf (str, fstart, prec, ARG_STR(argc, argv));
+ str = xasprintf (fstart, prec, ARG_STR(argc, argv));
else
- sprintf (str, fstart, ARG_STR(argc, argv));
+ str = xasprintf (fstart, ARG_STR(argc, argv));
break;
}
*fmt = c;
+ /* NULL was returned on failure, such as invalid format string. For
+ now, just silently ignore that bad specifier. */
+ if (str == NULL)
+ continue;
+
obstack_grow (obs, str, strlen (str));
+ free (str);
}
-
-#endif /* not HAVE_EFGCVT */
}