* original. Also, there is now a builtin-test, just compile with:
* gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
* and run snprintf for results.
- *
+ *
* Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
- * The PGP code was using unsigned hexadecimal formats.
+ * The PGP code was using unsigned hexadecimal formats.
* Unfortunately, unsigned formats simply didn't work.
*
* Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
* actually print args for %g and %e
*
* Hrvoje Niksic <hniksic@xemacs.org> 2005-04-15
- * use the PARAMS macro to handle prototypes.
* write function definitions in the ansi2knr-friendly way.
* if string precision is specified, don't read VALUE past it.
* fix bug in fmtfp that caused 0.01 to be printed as 0.1.
*
**************************************************************/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "wget.h"
/* For testing purposes, always compile in the code. */
#ifdef TEST_SNPRINTF
#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
+#include <string.h>
#include <sys/types.h>
-#include <stdio.h> /* for NULL */
+#include <stdio.h> /* for NULL */
-/* varargs declarations: */
-
-#if defined(HAVE_STDARG_H)
-# include <stdarg.h>
-# define HAVE_STDARGS /* let's hope that works everywhere (mj) */
-# define VA_LOCAL_DECL va_list ap
-# define VA_START(f) va_start(ap, f)
-# define VA_SHIFT(v,t) ; /* no-op for ANSI */
-# define VA_END va_end(ap)
-#else
-# include <varargs.h>
-# undef HAVE_STDARGS
-# define VA_LOCAL_DECL va_list ap
-# define VA_START(f) va_start(ap) /* f is ignored! */
-# define VA_SHIFT(v,t) v = va_arg(ap,t)
-# define VA_END va_end(ap)
-#endif
+#include <stdarg.h>
#ifdef HAVE_LONG_DOUBLE
#define LDOUBLE long double
# define vsnprintf test_vsnprintf
#endif
-#ifdef HAVE_STDARGS
int snprintf (char *str, size_t count, const char *fmt, ...);
int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
-#else
-int snprintf ();
-int vsnprintf ();
-#endif
-
-#ifndef PARAMS
-# define PARAMS(x) x
-#endif
-static int dopr PARAMS ((char *buffer, size_t maxlen, const char *format,
- va_list args));
-static int fmtstr PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
- char *value, int flags, int min, int max));
-static int fmtint PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
- LLONG value, int base, int min, int max, int flags));
-static int fmtfp PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
- LDOUBLE fvalue, int min, int max, int flags));
-static int dopr_outch PARAMS ((char *buffer, size_t *currlen, size_t maxlen,
- char c));
+static int dopr (char *buffer, size_t maxlen, const char *format,
+ va_list args);
+static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
+ const char *value, int flags, int min, int max);
+static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
+ LLONG value, int base, int min, int max, int flags);
+static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
+ LDOUBLE fvalue, int min, int max, int flags);
+static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c);
/*
* dopr(): poor man's version of doprintf
#define DP_S_DONE 8
/* format flags - Bits */
-#define DP_F_MINUS (1 << 0)
-#define DP_F_PLUS (1 << 1)
-#define DP_F_SPACE (1 << 2)
-#define DP_F_NUM (1 << 3)
-#define DP_F_ZERO (1 << 4)
-#define DP_F_UP (1 << 5)
-#define DP_F_UNSIGNED (1 << 6)
-#define DP_F_FP_G (1 << 7)
+#define DP_F_MINUS (1 << 0)
+#define DP_F_PLUS (1 << 1)
+#define DP_F_SPACE (1 << 2)
+#define DP_F_NUM (1 << 3)
+#define DP_F_ZERO (1 << 4)
+#define DP_F_UP (1 << 5)
+#define DP_F_UNSIGNED (1 << 6)
+#define DP_F_FP_G (1 << 7)
/* Conversion Flags */
#define DP_C_SHORT 1
#define MAX(p,q) ((p >= q) ? p : q)
#define MIN(p,q) ((p <= q) ? p : q)
-static int
-dopr (char *buffer, size_t maxlen, const char *format, va_list args)
+static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
{
char ch;
LLONG value;
int cflags;
int total;
size_t currlen;
-
+
state = DP_S_DEFAULT;
currlen = flags = cflags = min = 0;
max = -1;
if (ch == '\0')
state = DP_S_DONE;
- switch(state)
+ switch(state)
{
case DP_S_DEFAULT:
- if (ch == '%')
- state = DP_S_FLAGS;
- else
- total += dopr_outch (buffer, &currlen, maxlen, ch);
+ if (ch == '%')
+ state = DP_S_FLAGS;
+ else
+ total += dopr_outch (buffer, &currlen, maxlen, ch);
ch = *format++;
break;
case DP_S_FLAGS:
- switch (ch)
+ switch (ch)
{
case '-':
- flags |= DP_F_MINUS;
+ flags |= DP_F_MINUS;
ch = *format++;
- break;
+ break;
case '+':
- flags |= DP_F_PLUS;
+ flags |= DP_F_PLUS;
ch = *format++;
- break;
+ break;
case ' ':
- flags |= DP_F_SPACE;
+ flags |= DP_F_SPACE;
ch = *format++;
- break;
+ break;
case '#':
- flags |= DP_F_NUM;
+ flags |= DP_F_NUM;
ch = *format++;
- break;
+ break;
case '0':
- flags |= DP_F_ZERO;
+ flags |= DP_F_ZERO;
ch = *format++;
- break;
+ break;
default:
- state = DP_S_MIN;
- break;
+ state = DP_S_MIN;
+ break;
}
break;
case DP_S_MIN:
if ('0' <= ch && ch <= '9')
{
- min = 10*min + char_to_int (ch);
- ch = *format++;
- }
- else if (ch == '*')
+ min = 10*min + char_to_int (ch);
+ ch = *format++;
+ }
+ else if (ch == '*')
{
- min = va_arg (args, int);
- ch = *format++;
- state = DP_S_DOT;
- }
- else
- state = DP_S_DOT;
+ min = va_arg (args, int);
+ ch = *format++;
+ state = DP_S_DOT;
+ }
+ else
+ state = DP_S_DOT;
break;
case DP_S_DOT:
- if (ch == '.')
+ if (ch == '.')
{
- state = DP_S_MAX;
- ch = *format++;
- }
- else
- state = DP_S_MOD;
+ state = DP_S_MAX;
+ ch = *format++;
+ }
+ else
+ state = DP_S_MOD;
break;
case DP_S_MAX:
if ('0' <= ch && ch <= '9')
{
- if (max < 0)
- max = 0;
- max = 10*max + char_to_int (ch);
- ch = *format++;
- }
- else if (ch == '*')
+ if (max < 0)
+ max = 0;
+ max = 10*max + char_to_int (ch);
+ ch = *format++;
+ }
+ else if (ch == '*')
{
- max = va_arg (args, int);
- ch = *format++;
- state = DP_S_MOD;
- }
- else
- state = DP_S_MOD;
+ max = va_arg (args, int);
+ ch = *format++;
+ state = DP_S_MOD;
+ }
+ else
+ state = DP_S_MOD;
break;
case DP_S_MOD:
- switch (ch)
+ switch (ch)
{
case 'h':
- cflags = DP_C_SHORT;
- ch = *format++;
- break;
+ cflags = DP_C_SHORT;
+ ch = *format++;
+ break;
case 'l':
- cflags = DP_C_LONG;
- ch = *format++;
- break;
+ cflags = DP_C_LONG;
+ ch = *format++;
+ break;
case 'L':
- cflags = DP_C_LDOUBLE;
- ch = *format++;
- break;
+ cflags = DP_C_LDOUBLE;
+ ch = *format++;
+ break;
default:
- break;
+ break;
}
if (cflags != DP_C_LONG)
- state = DP_S_CONV;
+ state = DP_S_CONV;
else
- state = DP_S_MOD_L;
+ state = DP_S_MOD_L;
break;
case DP_S_MOD_L:
switch (ch)
- {
- case 'l':
- cflags = DP_C_LLONG;
- ch = *format++;
- break;
- default:
- break;
- }
+ {
+ case 'l':
+ cflags = DP_C_LLONG;
+ ch = *format++;
+ break;
+ default:
+ break;
+ }
state = DP_S_CONV;
break;
case DP_S_CONV:
- switch (ch)
+ switch (ch)
{
case 'd':
case 'i':
- if (cflags == DP_C_SHORT)
- value = (short int) va_arg (args, int);
- else if (cflags == DP_C_LONG)
- value = va_arg (args, long int);
- else if (cflags == DP_C_LLONG)
- value = va_arg (args, LLONG);
- else
- value = va_arg (args, int);
- total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
- break;
+ if (cflags == DP_C_SHORT)
+ value = (short int) va_arg (args, int);
+ else if (cflags == DP_C_LONG)
+ value = va_arg (args, long int);
+ else if (cflags == DP_C_LLONG)
+ value = va_arg (args, LLONG);
+ else
+ value = va_arg (args, int);
+ total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
+ break;
case 'o':
- flags |= DP_F_UNSIGNED;
- if (cflags == DP_C_SHORT)
- value = (unsigned short int) va_arg (args, unsigned int);
- else if (cflags == DP_C_LONG)
- value = va_arg (args, unsigned long int);
- else if (cflags == DP_C_LLONG)
- value = va_arg (args, unsigned LLONG);
- else
- value = va_arg (args, unsigned int);
- total += fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
- break;
+ flags |= DP_F_UNSIGNED;
+ if (cflags == DP_C_SHORT)
+ value = (unsigned short int) va_arg (args, unsigned int);
+ else if (cflags == DP_C_LONG)
+ value = va_arg (args, unsigned long int);
+ else if (cflags == DP_C_LLONG)
+ value = va_arg (args, unsigned LLONG);
+ else
+ value = va_arg (args, unsigned int);
+ total += fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
+ break;
case 'u':
- flags |= DP_F_UNSIGNED;
- if (cflags == DP_C_SHORT)
- value = (unsigned short int) va_arg (args, unsigned int);
- else if (cflags == DP_C_LONG)
- value = va_arg (args, unsigned long int);
- else if (cflags == DP_C_LLONG)
- value = va_arg (args, unsigned LLONG);
- else
- value = va_arg (args, unsigned int);
- total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
- break;
+ flags |= DP_F_UNSIGNED;
+ if (cflags == DP_C_SHORT)
+ value = (unsigned short int) va_arg (args, unsigned int);
+ else if (cflags == DP_C_LONG)
+ value = va_arg (args, unsigned long int);
+ else if (cflags == DP_C_LLONG)
+ value = va_arg (args, unsigned LLONG);
+ else
+ value = va_arg (args, unsigned int);
+ total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
+ break;
case 'X':
- flags |= DP_F_UP;
+ flags |= DP_F_UP;
case 'x':
- flags |= DP_F_UNSIGNED;
- if (cflags == DP_C_SHORT)
- value = (unsigned short int) va_arg (args, unsigned int);
- else if (cflags == DP_C_LONG)
- value = va_arg (args, unsigned long int);
- else if (cflags == DP_C_LLONG)
- value = va_arg (args, unsigned LLONG);
- else
- value = va_arg (args, unsigned int);
- total += fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
- break;
+ flags |= DP_F_UNSIGNED;
+ if (cflags == DP_C_SHORT)
+ value = (unsigned short int) va_arg (args, unsigned int);
+ else if (cflags == DP_C_LONG)
+ value = va_arg (args, unsigned long int);
+ else if (cflags == DP_C_LLONG)
+ value = va_arg (args, unsigned LLONG);
+ else
+ value = va_arg (args, unsigned int);
+ total += fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
+ break;
case 'f':
- if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg (args, LDOUBLE);
- else
- fvalue = va_arg (args, double);
- total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
- break;
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg (args, LDOUBLE);
+ else
+ fvalue = va_arg (args, double);
+ total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+ break;
case 'E':
- flags |= DP_F_UP;
+ flags |= DP_F_UP;
case 'e':
- if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg (args, LDOUBLE);
- else
- fvalue = va_arg (args, double);
- total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
- break;
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg (args, LDOUBLE);
+ else
+ fvalue = va_arg (args, double);
+ total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+ break;
case 'G':
- flags |= DP_F_UP;
+ flags |= DP_F_UP;
case 'g':
- flags |= DP_F_FP_G;
- if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg (args, LDOUBLE);
- else
- fvalue = va_arg (args, double);
- if (max == 0)
- /* C99 says: if precision [for %g] is zero, it is taken as one */
- max = 1;
- total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
- break;
+ flags |= DP_F_FP_G;
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg (args, LDOUBLE);
+ else
+ fvalue = va_arg (args, double);
+ if (max == 0)
+ /* C99 says: if precision [for %g] is zero, it is taken as one */
+ max = 1;
+ total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
+ break;
case 'c':
- total += dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
- break;
+ total += dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
+ break;
case 's':
- strvalue = va_arg (args, char *);
- total += fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
- break;
+ strvalue = va_arg (args, char *);
+ total += fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
+ break;
case 'p':
- strvalue = va_arg (args, void *);
- total += fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min,
+ flags |= DP_F_UNSIGNED;
+ strvalue = va_arg (args, void *);
+ total += fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min,
max, flags);
- break;
+ break;
case 'n':
- if (cflags == DP_C_SHORT)
- {
- short int *num;
- num = va_arg (args, short int *);
- *num = currlen;
+ if (cflags == DP_C_SHORT)
+ {
+ short int *num;
+ num = va_arg (args, short int *);
+ *num = currlen;
}
- else if (cflags == DP_C_LONG)
- {
- long int *num;
- num = va_arg (args, long int *);
- *num = currlen;
- }
- else if (cflags == DP_C_LLONG)
- {
- LLONG *num;
- num = va_arg (args, LLONG *);
- *num = currlen;
- }
- else
- {
- int *num;
- num = va_arg (args, int *);
- *num = currlen;
+ else if (cflags == DP_C_LONG)
+ {
+ long int *num;
+ num = va_arg (args, long int *);
+ *num = currlen;
}
- break;
+ else if (cflags == DP_C_LLONG)
+ {
+ LLONG *num;
+ num = va_arg (args, LLONG *);
+ *num = currlen;
+ }
+ else
+ {
+ int *num;
+ num = va_arg (args, int *);
+ *num = currlen;
+ }
+ break;
case '%':
- total += dopr_outch (buffer, &currlen, maxlen, ch);
- break;
+ total += dopr_outch (buffer, &currlen, maxlen, ch);
+ break;
case 'w':
- /* not supported yet, treat as next char */
- ch = *format++;
- break;
+ /* not supported yet, treat as next char */
+ ch = *format++;
+ break;
default:
- /* Unknown, skip */
- break;
+ /* Unknown, skip */
+ break;
}
ch = *format++;
state = DP_S_DEFAULT;
}
if (buffer != NULL)
{
- if (currlen < maxlen - 1)
+ if (currlen < maxlen - 1)
buffer[currlen] = '\0';
- else
+ else
buffer[maxlen - 1] = '\0';
}
return total;
}
-static int
-fmtstr (char *buffer, size_t *currlen, size_t maxlen,
- char *value, int flags, int min, int max)
+static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
+ const char *value, int flags, int min, int max)
{
int padlen, strln; /* amount to pad */
int cnt = 0;
int total = 0;
-
+
if (value == 0)
{
value = "(null)";
else
/* When precision is specified, don't read VALUE past precision. */
/*strln = strnlen (value, max);*/
- for (strln = 0; strln < max && value[strln]; ++strln);
+ for (strln = 0; strln < max && value[strln]; ++strln)
+ ;
padlen = min - strln;
- if (padlen < 0)
+ if (padlen < 0)
padlen = 0;
- if (flags & DP_F_MINUS)
+ if (flags & DP_F_MINUS)
padlen = -padlen; /* Left Justify */
while (padlen > 0)
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
-static int
-fmtint (char *buffer, size_t *currlen, size_t maxlen,
- LLONG value, int base, int min, int max, int flags)
+static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
+ LLONG value, int base, int min, int max, int flags)
{
int signvalue = 0;
unsigned LLONG uvalue;
int zpadlen = 0; /* amount to zero pad */
const char *digits;
int total = 0;
-
+
if (max < 0)
max = 0;
}
else
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
- signvalue = '+';
+ signvalue = '+';
else
if (flags & DP_F_SPACE)
- signvalue = ' ';
+ signvalue = ' ';
}
-
+
if (flags & DP_F_UP)
/* Should characters be upper case? */
digits = "0123456789ABCDEF";
zpadlen = MAX(zpadlen, spadlen);
spadlen = 0;
}
- if (flags & DP_F_MINUS)
+ if (flags & DP_F_MINUS)
spadlen = -spadlen; /* Left Justifty */
#ifdef DEBUG_SNPRINTF
#endif
/* Spaces */
- while (spadlen > 0)
+ while (spadlen > 0)
{
total += dopr_outch (buffer, currlen, maxlen, ' ');
--spadlen;
}
/* Sign */
- if (signvalue)
+ if (signvalue)
total += dopr_outch (buffer, currlen, maxlen, signvalue);
/* Zeros */
- if (zpadlen > 0)
+ if (zpadlen > 0)
{
while (zpadlen > 0)
{
}
/* Digits */
- while (place > 0)
+ while (place > 0)
total += dopr_outch (buffer, currlen, maxlen, convert[--place]);
-
+
/* Left Justified spaces */
while (spadlen < 0) {
total += dopr_outch (buffer, currlen, maxlen, ' ');
return total;
}
-static LDOUBLE
-abs_val (LDOUBLE value)
+static LDOUBLE abs_val (LDOUBLE value)
{
LDOUBLE result = value;
return result;
}
-static LDOUBLE
-pow10 (int exp)
+static LDOUBLE pow10_int (int exp)
{
LDOUBLE result = 1;
result *= 10;
exp--;
}
-
+
return result;
}
-static LLONG
-round (LDOUBLE value)
+static LLONG round_int (LDOUBLE value)
{
LLONG intpart;
return intpart;
}
-static int
-fmtfp (char *buffer, size_t *currlen, size_t maxlen,
- LDOUBLE fvalue, int min, int max, int flags)
+static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
+ LDOUBLE fvalue, int min, int max, int flags)
{
int signvalue = 0;
LDOUBLE ufvalue;
int iplace = 0;
int fplace = 0;
int padlen = 0; /* amount to pad */
- int zpadlen = 0;
+ int zpadlen = 0;
int total = 0;
LLONG intpart;
LLONG fracpart;
int leadingfrac0s = 0; /* zeros at the start of fractional part */
int omitzeros = 0;
int omitcount = 0;
-
- /*
+
+ /*
* AIX manpage says the default is 0, but Solaris says the default
* is 6, and sprintf on AIX defaults to 6
*/
signvalue = '+';
else
if (flags & DP_F_SPACE)
- signvalue = ' ';
+ signvalue = ' ';
#if 0
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
includes the digits in intpart. */
if (flags & DP_F_FP_G)
{
- LLONG temp = intpart;
- for (temp = intpart; temp != 0; temp /= 10)
- --max;
- if (max < 0)
- max = 0;
+ if (intpart != 0)
+ {
+ /* For each digit of INTPART, print one less fractional digit. */
+ LLONG temp = intpart;
+ for (temp = intpart; temp != 0; temp /= 10)
+ --max;
+ if (max < 0)
+ max = 0;
+ }
+ else
+ {
+ /* For each leading 0 in fractional part, print one more
+ fractional digit. */
+ LDOUBLE temp;
+ if (ufvalue != 0)
+ for (temp = ufvalue; temp < 0.1; temp *= 10)
+ ++max;
+ }
}
/* C99: trailing zeros are removed from the fractional portion of the
omitzeros = 1;
#if SIZEOF_LONG_LONG > 0
-# define MAX_DIGITS 18 /* grok more digits with long long */
+# define MAX_DIGITS 18 /* grok more digits with long long */
#else
-# define MAX_DIGITS 9 /* just long */
+# define MAX_DIGITS 9 /* just long */
#endif
- /*
+ /*
* Sorry, we only support several digits past the decimal because of
* our conversion method
*/
max = MAX_DIGITS;
/* Factor of 10 with the needed number of digits, e.g. 1000 for max==3 */
- mask10 = pow10 (max);
+ mask10 = pow10_int (max);
/* We "cheat" by converting the fractional part to integer by
* multiplying by a factor of 10
*/
- fracpart = round (mask10 * (ufvalue - intpart));
+ fracpart = round_int (mask10 * (ufvalue - intpart));
if (fracpart >= mask10)
{
requires one leading zero to distinguish it from 2.1. */
while (fracpart < mask10 / 10)
{
- ++leadingfrac0s;
- mask10 /= 10;
+ ++leadingfrac0s;
+ mask10 /= 10;
}
#ifdef DEBUG_SNPRINTF
zpadlen = max - fplace;
if (zpadlen < 0)
zpadlen = 0;
- if (padlen < 0)
+ if (padlen < 0)
padlen = 0;
- if (flags & DP_F_MINUS)
+ if (flags & DP_F_MINUS)
padlen = -padlen; /* Left Justifty */
- if ((flags & DP_F_ZERO) && (padlen > 0))
+ if ((flags & DP_F_ZERO) && (padlen > 0))
{
- if (signvalue)
+ if (signvalue)
{
total += dopr_outch (buffer, currlen, maxlen, signvalue);
--padlen;
total += dopr_outch (buffer, currlen, maxlen, ' ');
--padlen;
}
- if (signvalue)
+ if (signvalue)
total += dopr_outch (buffer, currlen, maxlen, signvalue);
- while (iplace > 0)
+ while (iplace > 0)
total += dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
/*
{
total += dopr_outch (buffer, currlen, maxlen, '.');
- while (fplace > omitcount)
+ while (fplace > omitcount)
total += dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
}
--zpadlen;
}
- while (padlen < 0)
+ while (padlen < 0)
{
total += dopr_outch (buffer, currlen, maxlen, ' ');
++padlen;
return total;
}
-static int
-dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
+static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
{
if (*currlen + 1 < maxlen)
buffer[(*currlen)++] = c;
}
#ifndef HAVE_VSNPRINTF
-int
-vsnprintf (char *str, size_t count, const char *fmt, va_list args)
+int vsnprintf (char *str, size_t count, const char *fmt, va_list args)
{
if (str != NULL)
str[0] = 0;
#endif /* !HAVE_VSNPRINTF */
#ifndef HAVE_SNPRINTF
-int
-snprintf (char *str, size_t count,const char *fmt,...)
+int snprintf (char *str, size_t count, const char *fmt,...)
{
-#ifndef HAVE_STDARGS
- char *str;
- size_t count;
- char *fmt;
-#endif
- VA_LOCAL_DECL;
+ va_list ap;
int total;
-
- VA_START (fmt);
- VA_SHIFT (str, char *);
- VA_SHIFT (count, size_t );
- VA_SHIFT (fmt, char *);
- total = vsnprintf(str, count, fmt, ap);
- VA_END;
+
+ va_start (ap, fmt);
+ total = vsnprintf (str, count, fmt, ap);
+ va_end (ap);
return total;
}
#endif /* !HAVE_SNPRINTF */
# define LONG_STRING 1024
# endif
-int
-main (void)
+int main (void)
{
char buf1[LONG_STRING];
char buf2[LONG_STRING];
char *fp_fmt[] = {
+ /* %f formats */
+ "%f",
"%-1.5f",
"%1.5f",
"%123.9f",
"%3.2f",
"%.0f",
"%.1f",
- "%-1.5g",
+ "%#10.1f",
+#if SIZEOF_LONG_LONG != 0
+ "%.16f",
+ "%18.16f",
+ "%-16.16f",
+#endif
+ /* %g formats */
+ "%g",
"%1.5g",
+ "%-1.5g",
+ "%.9g",
"%123.9g",
+ "%#123.9g",
+#if SIZEOF_LONG_LONG != 0
+ "%.16g",
+ "%20.16g",
+#endif
NULL
};
- double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
- 0.9996, 1.996, 4.136, 0.00205, 0};
+ double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
+ 0.9996, 1.996, 4.136, 0.00205, 0.0001, 321.000009,
+ 0};
char *int_fmt[] = {
"%-1.5d",
"%1.5d",
long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
#if SIZEOF_LONG_LONG != 0
char *llong_fmt[] = {
- "%lld", "%llu",
- "%-1.5lld", "%-1.5llu",
- "%1.5lld", "%1.5llu",
- "%123.9lld", "%123.9llu",
- "%5.5lld", "%5.5llu",
- "%10.5lld", "%10.5llu",
- "% 10.5lld", "% 10.5llu",
- "%+22.33lld", "%+22.33llu",
- "%01.3lld", "%01.3llu",
- "%4lld", "%4llu",
+ "%lld", "%llu",
+ "%-1.5lld", "%-1.5llu",
+ "%1.5lld", "%1.5llu",
+ "%123.9lld", "%123.9llu",
+ "%5.5lld", "%5.5llu",
+ "%10.5lld", "%10.5llu",
+ "% 10.5lld", "% 10.5llu",
+ "%+22.33lld", "%+22.33llu",
+ "%01.3lld", "%01.3llu",
+ "%4lld", "%4llu",
NULL
};
long long llong_nums[] = {
- ~(long long)0, /* all-1 bit pattern */
+ ~(long long)0, /* all-1 bit pattern */
(~(unsigned long long)0) >> 1, /* largest signed long long */
/* random... */
-150, 134, 91340, 341,
sprintf (buf2, fp_fmt[x], fp_nums[y]);
if (strcmp (buf1, buf2))
{
- printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
- fp_fmt[x], buf1, buf2);
- fail++;
+ printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
+ fp_fmt[x], buf1, buf2);
+ fail++;
}
num++;
}
sprintf (buf2, int_fmt[x], int_nums[y]);
if (strcmp (buf1, buf2))
{
- printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
- int_fmt[x], buf1, buf2);
- fail++;
+ printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
+ int_fmt[x], buf1, buf2);
+ fail++;
}
num++;
}
sprintf (buf2, llong_fmt[x], llong_nums[y]);
if (strcmp (buf1, buf2))
{
- printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
- llong_fmt[x], buf1, buf2);
- fail++;
+ printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
+ llong_fmt[x], buf1, buf2);
+ fail++;
}
num++;
}