Diff for /embedaddon/sudo/compat/snprintf.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2013/07/22 10:46:11 version 1.1.1.3, 2014/06/15 16:12:54
Line 41 Line 41
   
 #include <config.h>  #include <config.h>
   
#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_SNPRINTF) || !defined(HAVE_VASPRINTF) || !defined(HAVE_ASPRINTF)#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_SNPRINTF) || \
     !defined(HAVE_VASPRINTF) || !defined(HAVE_ASPRINTF) || \
     defined(PREFER_PORTABLE_SNPRINTF)
   
 #include <sys/types.h>  #include <sys/types.h>
   
Line 79 Line 81
 static int xxxprintf(char **, size_t, int, const char *, va_list);  static int xxxprintf(char **, size_t, int, const char *, va_list);
   
 /*  /*
  * Some systems may not have these defined in <limits.h>  
  */  
 #ifndef ULONG_MAX  
 # define ULONG_MAX      ((unsigned long)-1)  
 #endif  
 #ifndef LONG_MAX  
 # define LONG_MAX       (ULONG_MAX / 2)  
 #endif  
 #ifdef HAVE_LONG_LONG_INT  
 # ifndef ULLONG_MAX  
 #  ifdef UQUAD_MAX  
 #   define ULLONG_MAX   UQUAD_MAX  
 #  else  
 #   define ULLONG_MAX   ((unsigned long long)-1)  
 #  endif  
 # endif  
 # ifndef LLONG_MAX  
 #  ifdef QUAD_MAX  
 #   define LLONG_MAX    QUAD_MAX  
 #  else  
 #   define LLONG_MAX    (ULLONG_MAX / 2)  
 #  endif  
 # endif  
 #endif /* HAVE_LONG_LONG_INT */  
   
 /*  
  * Macros for converting digits to letters and vice versa   * Macros for converting digits to letters and vice versa
  */   */
 #define to_digit(c)     ((c) - '0')  #define to_digit(c)     ((c) - '0')
Line 187  __ultoa(unsigned long val, char *endp, int base, int o Line 163  __ultoa(unsigned long val, char *endp, int base, int o
 }  }
   
 /* Identical to __ultoa, but for quads. */  /* Identical to __ultoa, but for quads. */
#ifdef HAVE_LONG_LONG_INT#if SIZEOF_LONG_INT == 8
# if SIZEOF_LONG_INT == 8define __ulltoa(v, e, b, o, x) __ultoa((unsigned long)(v), (e), (b), (o), (x))
#  define __uqtoa(v, e, b, o, x) __ultoa((unsigned long)(v), (e), (b), (o), (x))#else
else 
 static char *  static char *
__uqtoa(unsigned long long val, char *endp, int base, int octzero, char *xdigs)__ulltoa(unsigned long long val, char *endp, int base, int octzero, char *xdigs)
 {  {
         char *cp = endp;          char *cp = endp;
         long long sval;          long long sval;
Line 239  __uqtoa(unsigned long long val, char *endp, int base,  Line 214  __uqtoa(unsigned long long val, char *endp, int base, 
         }          }
         return cp;          return cp;
 }  }
# endif /* !SIZEOF_LONG_INT */#endif /* !SIZEOF_LONG_INT */
#endif /* HAVE_LONG_LONG_INT */ 
   
 /*  /*
  * Actual printf innards.   * Actual printf innards.
Line 258  xxxprintf(char **strp, size_t strsize, int alloc, cons Line 232  xxxprintf(char **strp, size_t strsize, int alloc, cons
         int prec;               /* precision from format (%.3d), or -1 */          int prec;               /* precision from format (%.3d), or -1 */
         char sign;              /* sign prefix (' ', '+', '-', or \0) */          char sign;              /* sign prefix (' ', '+', '-', or \0) */
         unsigned long ulval = 0; /* integer arguments %[diouxX] */          unsigned long ulval = 0; /* integer arguments %[diouxX] */
#ifdef HAVE_LONG_LONG_INT        unsigned long long ullval = 0; /* long long arguments %ll[diouxX] */
        unsigned long long uqval = 0; /* %q (quad) integers */ 
#endif 
         int base;               /* base for [diouxX] conversion */          int base;               /* base for [diouxX] conversion */
         int dprec;              /* a copy of prec if [diouxX], 0 otherwise */          int dprec;              /* a copy of prec if [diouxX], 0 otherwise */
         int fieldsz;            /* field size expanded by sign, etc */          int fieldsz;            /* field size expanded by sign, etc */
Line 440  reswitch: switch (ch) { Line 412  reswitch: switch (ch) {
                                 flags |= LONGINT;                                  flags |= LONGINT;
                         }                          }
                         goto rflag;                          goto rflag;
 #ifdef HAVE_LONG_LONG_INT  
                 case 'q':  
                         flags |= LLONGINT;  
                         goto rflag;  
 #endif /* HAVE_LONG_LONG_INT */  
                 case 'c':                  case 'c':
                         *(cp = buf) = va_arg(ap, int);                          *(cp = buf) = va_arg(ap, int);
                         size = 1;                          size = 1;
Line 455  reswitch: switch (ch) { Line 422  reswitch: switch (ch) {
                         /*FALLTHROUGH*/                          /*FALLTHROUGH*/
                 case 'd':                  case 'd':
                 case 'i':                  case 'i':
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT) {                          if (flags & LLONGINT) {
                                uqval = va_arg(ap, long long);                                ullval = va_arg(ap, long long);
                                if ((long long)uqval < 0) {                                if ((long long)ullval < 0) {
                                        uqval = -uqval;                                        ullval = -ullval;
                                         sign = '-';                                          sign = '-';
                                 }                                  }
                        }                        } else {
                        else 
#endif /* HAVE_LONG_LONG_INT */ 
                        { 
                                 ulval = SARG();                                  ulval = SARG();
                                 if ((long)ulval < 0) {                                  if ((long)ulval < 0) {
                                         ulval = -ulval;                                          ulval = -ulval;
Line 475  reswitch: switch (ch) { Line 438  reswitch: switch (ch) {
                         base = 10;                          base = 10;
                         goto number;                          goto number;
                 case 'n':                  case 'n':
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT)                          if (flags & LLONGINT)
                                 *va_arg(ap, long long *) = ret;                                  *va_arg(ap, long long *) = ret;
                        else                        else if (flags & LONGINT)
#endif /* HAVE_LONG_LONG_INT */ 
                        if (flags & LONGINT) 
                                 *va_arg(ap, long *) = ret;                                  *va_arg(ap, long *) = ret;
                         else if (flags & SHORTINT)                          else if (flags & SHORTINT)
                                 *va_arg(ap, short *) = ret;                                  *va_arg(ap, short *) = ret;
Line 491  reswitch: switch (ch) { Line 451  reswitch: switch (ch) {
                         flags |= LONGINT;                          flags |= LONGINT;
                         /*FALLTHROUGH*/                          /*FALLTHROUGH*/
                 case 'o':                  case 'o':
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT)                          if (flags & LLONGINT)
                                uqval = va_arg(ap, unsigned long long);                                ullval = va_arg(ap, unsigned long long);
                         else                          else
 #endif /* HAVE_LONG_LONG_INT */  
                                 ulval = UARG();                                  ulval = UARG();
                         base = 8;                          base = 8;
                         goto nosign;                          goto nosign;
Line 538  reswitch: switch (ch) { Line 496  reswitch: switch (ch) {
                         flags |= LONGINT;                          flags |= LONGINT;
                         /*FALLTHROUGH*/                          /*FALLTHROUGH*/
                 case 'u':                  case 'u':
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT)                          if (flags & LLONGINT)
                                uqval = va_arg(ap, unsigned long long);                                ullval = va_arg(ap, unsigned long long);
                         else                          else
 #endif /* HAVE_LONG_LONG_INT */  
                                 ulval = UARG();                                  ulval = UARG();
                         base = 10;                          base = 10;
                         goto nosign;                          goto nosign;
Line 552  reswitch: switch (ch) { Line 508  reswitch: switch (ch) {
                 case 'x':                  case 'x':
                         xdigs = "0123456789abcdef";                          xdigs = "0123456789abcdef";
 hex:  hex:
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT)                          if (flags & LLONGINT)
                                uqval = va_arg(ap, unsigned long long);                                ullval = va_arg(ap, unsigned long long);
                         else                          else
 #endif /* HAVE_LONG_LONG_INT */  
                                 ulval = UARG();                                  ulval = UARG();
                         base = 16;                          base = 16;
                         /* leading 0x/X only if non-zero */                          /* leading 0x/X only if non-zero */
                         if (flags & ALT &&                          if (flags & ALT &&
#ifdef HAVE_LONG_LONG_INT                            (flags & LLONGINT ? ullval != 0 : ulval != 0))
                            (flags & LLONGINT ? uqval != 0 : ulval != 0)) 
#else 
                            ulval != 0) 
#endif /* HAVE_LONG_LONG_INT */ 
                                 flags |= HEXPREFIX;                                  flags |= HEXPREFIX;
   
                         /* unsigned conversions */                          /* unsigned conversions */
Line 584  number:   if ((dprec = prec) >= 0) Line 534  number:   if ((dprec = prec) >= 0)
                          *      -- ANSI X3J11                           *      -- ANSI X3J11
                          */                           */
                         cp = buf + BUF;                          cp = buf + BUF;
 #ifdef HAVE_LONG_LONG_INT  
                         if (flags & LLONGINT) {                          if (flags & LLONGINT) {
                                if (uqval != 0 || prec != 0)                                if (ullval != 0 || prec != 0)
                                        cp = __uqtoa(uqval, cp, base,                                        cp = __ulltoa(ullval, cp, base,
                                             flags & ALT, xdigs);                                              flags & ALT, xdigs);
                        }                        } else {
                        else 
#endif /* HAVE_LONG_LONG_INT */ 
                        { 
                                 if (ulval != 0 || prec != 0)                                  if (ulval != 0 || prec != 0)
                                         cp = __ultoa(ulval, cp, base,                                          cp = __ultoa(ulval, cp, base,
                                             flags & ALT, xdigs);                                              flags & ALT, xdigs);
Line 668  done: Line 614  done:
         /* NOTREACHED */          /* NOTREACHED */
 }  }
   
#ifndef HAVE_VSNPRINTF#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
 int  int
vsnprintf(char *str, size_t n, const char *fmt, va_list ap)rpl_vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
 {  {
   
         return xxxprintf(&str, n, 0, fmt, ap);          return xxxprintf(&str, n, 0, fmt, ap);
 }  }
#endif /* HAVE_VSNPRINTF */#endif /* !HAVE_VSNPRINTF || PREFER_PORTABLE_SNPRINTF */
   
#ifndef HAVE_SNPRINTF#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
 int  int
snprintf(char *str, size_t n, char const *fmt, ...)rpl_snprintf(char *str, size_t n, char const *fmt, ...)
 {  {
         int ret;          int ret;
         va_list ap;          va_list ap;
Line 689  snprintf(char *str, size_t n, char const *fmt, ...) Line 635  snprintf(char *str, size_t n, char const *fmt, ...)
         va_end(ap);          va_end(ap);
         return ret;          return ret;
 }  }
#endif /* HAVE_SNPRINTF */#endif /* !HAVE_SNPRINTF || PREFER_PORTABLE_SNPRINTF */
   
#ifndef HAVE_VASPRINTF#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
 int  int
vasprintf(char **str, const char *fmt, va_list ap)rpl_vasprintf(char **str, const char *fmt, va_list ap)
 {  {
   
         return xxxprintf(str, 0, 1, fmt, ap);          return xxxprintf(str, 0, 1, fmt, ap);
 }  }
#endif /* HAVE_VASPRINTF */#endif /* !HAVE_VASPRINTF || PREFER_PORTABLE_SNPRINTF */
   
#ifndef HAVE_ASPRINTF#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
 int  int
asprintf(char **str, char const *fmt, ...)rpl_asprintf(char **str, char const *fmt, ...)
 {  {
         int ret;          int ret;
         va_list ap;          va_list ap;
Line 712  asprintf(char **str, char const *fmt, ...) Line 658  asprintf(char **str, char const *fmt, ...)
         va_end(ap);          va_end(ap);
         return ret;          return ret;
 }  }
#endif /* HAVE_ASPRINTF */#endif /* !HAVE_ASPRINTF || PREFER_PORTABLE_SNPRINTF */
   
#endif /* !HAVE_VSNPRINTF || !HAVE_SNPRINTF || !HAVE_VASPRINTF || !HAVE_ASPRINTF */#endif /* !HAVE_VSNPRINTF || !HAVE_SNPRINTF || !HAVE_VASPRINTF || !HAVE_ASPRINTF || PREFER_PORTABLE_SNPRINTF */

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>