/*
- * Copyright (c) 1999-2005 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1999-2005, 2008, 2010
+ * Todd C. Miller <Todd.Miller@courtesan.com>
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
# include <stdlib.h>
# endif
#endif /* STDC_HEADERS */
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
#ifdef HAVE_STRING_H
# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
# include <memory.h>
# endif
# include <string.h>
-#else
-# ifdef HAVE_STRINGS_H
-# include <strings.h>
-# endif
#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
#if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS)
# include <malloc.h>
#endif /* HAVE_MALLOC_H && !STDC_HEADERS */
#include <compat.h>
-#ifndef lint
-__unused static const char rcsid[] = "$Sudo: snprintf.c,v 1.14.4.2 2007/06/12 01:28:42 millert Exp $";
-#endif /* lint */
-
static int xxxprintf __P((char **, size_t, int, const char *, va_list));
/*
#ifndef LONG_MAX
# define LONG_MAX (ULONG_MAX / 2)
#endif
-#ifdef HAVE_LONG_LONG
-# ifndef UQUAD_MAX
-# ifdef ULONG_LONG_MAX
-# define UQUAD_MAX ULONG_LONG_MAX
+#ifdef HAVE_LONG_LONG_INT
+# ifndef ULLONG_MAX
+# ifdef UQUAD_MAX
+# define ULLONG_MAX UQUAD_MAX
# else
-# define UQUAD_MAX ((unsigned long long)-1)
+# define ULLONG_MAX ((unsigned long long)-1)
# endif
# endif
-# ifndef QUAD_MAX
-# ifdef LONG_LONG_MAX
-# define QUAD_MAX LONG_LONG_MAX
+# ifndef LLONG_MAX
+# ifdef QUAD_MAX
+# define LLONG_MAX QUAD_MAX
# else
-# define QUAD_MAX (UQUAD_MAX / 2)
+# define LLONG_MAX (ULLONG_MAX / 2)
# endif
# endif
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
/*
* Macros for converting digits to letters and vice versa
#define BUF 68
#ifndef HAVE_MEMCHR
-VOID *
+void *
memchr(s, c, n)
- const VOID *s;
+ const void *s;
unsigned char c;
size_t n;
{
do {
if (*p++ == c)
- return ((VOID *)(p - 1));
+ return ((void *)(p - 1));
} while (--n != 0);
}
return (NULL);
}
/* Identical to __ultoa, but for quads. */
-#ifdef HAVE_LONG_LONG
-# ifdef LONG_IS_QUAD
+#ifdef HAVE_LONG_LONG_INT
+# if SIZEOF_LONG_INT == 8
# define __uqtoa(v, e, b, o, x) __ultoa((unsigned long)(v), (e), (b), (o), (x))
# else
static char *
*--cp = to_char(val % 10);
return (cp);
}
- if (val > QUAD_MAX) {
+ if (val > LLONG_MAX) {
*--cp = to_char(val % 10);
sval = val / 10;
} else
}
return (cp);
}
-# endif /* !LONG_IS_QUAD */
-#endif /* HAVE_LONG_LONG */
+# endif /* !SIZEOF_LONG_INT */
+#endif /* HAVE_LONG_LONG_INT */
/*
* Actual printf innards.
int prec; /* precision from format (%.3d), or -1 */
char sign; /* sign prefix (' ', '+', '-', or \0) */
unsigned long ulval; /* integer arguments %[diouxX] */
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
unsigned long long uqval; /* %q (quad) integers */
#endif
int base; /* base for [diouxX] conversion */
case 'l':
flags |= LONGINT;
goto rflag;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
case 'q':
flags |= QUADINT;
goto rflag;
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
case 'c':
*(cp = buf) = va_arg(ap, int);
size = 1;
/*FALLTHROUGH*/
case 'd':
case 'i':
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT) {
uqval = va_arg(ap, long long);
if ((long long)uqval < 0) {
}
}
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
{
ulval = SARG();
if ((long)ulval < 0) {
base = 10;
goto number;
case 'n':
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT)
*va_arg(ap, long long *) = ret;
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
if (flags & LONGINT)
*va_arg(ap, long *) = ret;
else if (flags & SHORTINT)
flags |= LONGINT;
/*FALLTHROUGH*/
case 'o':
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT)
uqval = va_arg(ap, unsigned long long);
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
ulval = UARG();
base = 8;
goto nosign;
* defined manner.''
* -- ANSI X3J11
*/
- ulval = (unsigned long)va_arg(ap, VOID *);
+ ulval = (unsigned long)va_arg(ap, void *);
base = 16;
xdigs = "0123456789abcdef";
flags = (flags & ~QUADINT) | HEXPREFIX;
flags |= LONGINT;
/*FALLTHROUGH*/
case 'u':
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT)
uqval = va_arg(ap, unsigned long long);
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
ulval = UARG();
base = 10;
goto nosign;
case 'x':
xdigs = "0123456789abcdef";
hex:
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT)
uqval = va_arg(ap, unsigned long long);
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
ulval = UARG();
base = 16;
/* leading 0x/X only if non-zero */
if (flags & ALT &&
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
(flags & QUADINT ? uqval != 0 : ulval != 0))
#else
ulval != 0)
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
flags |= HEXPREFIX;
/* unsigned conversions */
* -- ANSI X3J11
*/
cp = buf + BUF;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
if (flags & QUADINT) {
if (uqval != 0 || prec != 0)
cp = __uqtoa(uqval, cp, base,
flags & ALT, xdigs);
}
else
-#endif /* HAVE_LONG_LONG */
+#endif /* HAVE_LONG_LONG_INT */
{
if (ulval != 0 || prec != 0)
cp = __ultoa(ulval, cp, base,