afs_snprintf is dead, long live rk_snprintf
[openafs.git] / src / util / snprintf.c
diff --git a/src/util/snprintf.c b/src/util/snprintf.c
deleted file mode 100644 (file)
index 1f79105..0000000
+++ /dev/null
@@ -1,906 +0,0 @@
-/*
- * Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan
- * (Royal Institute of Technology, Stockholm, Sweden).
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the Institute nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* snprintf.c - Formatted, length-limited print to a string */
-
-#include <afsconfig.h>
-#include <afs/param.h>
-
-#include <roken.h>
-#include <ctype.h>
-
-/* This is an enhanced version of the *printf functionality shipped
- * with Heimdal.  In addition to the standard Unix formatting types
- * this version also supports Microsoft's I32 and I64 type modifiers
- * and the OpenAFS I type which is used to generate output from
- * network byte order IPv4 addresses (either dotted notation or
- * hostname lookups.  Implementation details follow:
- *
- *   - Actually obeys the length limit, which (unfortunately) many
- *     implementations of snprintf do not.
- *
- *   - Supports all the standard format specifiers for integers
- *     (d, i, o, u, x, X), floating-point values (f, e, E, g, G),
- *     and strings and characters (c, s, %), plus a few unusual
- *     but useful ones described below.
- *
- *   - The Microsoft integral size modifiers I32 and I64 are
- *     supported.  I32 is equivalent to 'l'.
- *     I64 is equivalent to 'll'.
- *
- *   - Supports all the standard flags (-, 0, +, space, #).  These
- *     flags are ignored if used when they are not appropriate.
- *
- *   - Supports the standard size modifiers for short (h), long (h),
- *     and double (L) arguments.  These modifiers are ignored if used
- *     when they are not appropriate.
- *
- *   - Supports minimum field width and precision, where appropriate,
- *     including the use of '*' to specify a value given as an argument
- *     instead of in the format string.  There is a maximum precision
- *     of 100 digits.
- *
- *   - The 'p' specifier for printing pointers is implemented using
- *     intptr_t (C99-standard).
- *
- *   - Floating-point specifier (%e, %f, %g) are implemented by
- *     calling the standard sprintf, and thus may be unsafe.
- *
- *   - The '%...$' notation is used primarily when the format string
- *     is specified by the user, who knows but cannot change the order
- *     of the arguments.  Such usage is inherently dangerous and
- *     insecure; thus, it is not supported.
- *
- *   - Passing in a format and an NULL buffer is supported.  This
- *     will compute the size of the buffer required by the format
- *     and the provided input parameters.
- *
- * The custom format specifier '%I' is supported.  This specifier
- * takes as its argument an unsigned long integer containing an
- * IPv4 address in network byte order.  The address is rendered
- * either as a hostname or as a dotted quad, as follows:
- *
- *   - If precision is nonzero or unspecified, a hostname lookup
- *     is attempted; if it is successful, the hostname is printed.
- *     If the hostname lookup fails, the address is printed in
- *     dotted-quad notation.
- *
- *   - If precision is explicitly specified as 0, then the hostname
- *     lookup is skipped, and dotted-quad notation is always used.
- *
- *   - If a hostname is to be printed:
- *     + The precision controls the maximum number of characters
- *       printed, as with %s.
- *     + If the '#' flag is specified, any letters in the hostname
- *       will be forced to lower case before printing.
- *     + If the '+' flag is specified, any letters in the hostname
- *       will be forced to upper case before printing.  If both
- *       '#' and '+' are given, the '+' flag will be ignored.
- *     + The '0' and ' ' flags have no effect.
- *
- *   - If a dotted quad is to be printed:
- *     + The precision has no effect; dotted quads are always
- *       7 to 12 characters in length, depending on the value
- *       to be printed and the format flags used.
- *     + If the '0' flag is given, each field (byte) of the address
- *       will be padded with '0' on the left to three digits.
- *     + If the ' ' flag is given, each field (byte) of the address
- *       will be padded with spaces on the left to three digits.  If
- *       both '0' and ' ' are given, the ' ' flag will be ignored.
- *     + The '#' and '+' flags have no effect.
- *
- * A test program exists in src/util/tests/snprintf_tests.c.
- */
-
-#define MAXPREC 100
-
-enum format_flags {
-    minus_flag     =  1,
-    plus_flag      =  2,
-    space_flag     =  4,
-    alternate_flag =  8,
-    zero_flag      = 16
-};
-
-/*
- * Common state
- */
-
-struct snprintf_state {
-    unsigned char *str;
-    unsigned char *s;
-    unsigned char *theend;
-    size_t sz;
-    size_t max_sz;
-    void (*append_char)(struct snprintf_state *, unsigned char);
-    /* XXX - methods */
-};
-
-static int
-afs_sn_reserve (struct snprintf_state *state, size_t n)
-{
-    return state->s + n > state->theend;
-}
-
-static void
-afs_sn_append_char (struct snprintf_state *state, unsigned char c)
-{
-    if (!afs_sn_reserve (state, 1))
-       *state->s++ = c;
-}
-
-static int
-as_reserve (struct snprintf_state *state, size_t n)
-{
-    if (state->s + n > state->theend) {
-       size_t off = state->s - state->str;
-       unsigned char *tmp;
-
-       if (state->max_sz && state->sz >= state->max_sz)
-           return 1;
-
-       state->sz = max(state->sz * 2, state->sz + n);
-       if (state->max_sz)
-           state->sz = min(state->sz, state->max_sz);
-       tmp = (unsigned char *)realloc (state->str, state->sz);
-       if (tmp == NULL)
-           return 1;
-       state->str = tmp;
-       state->s = state->str + off;
-       state->theend = state->str + state->sz - 1;
-    }
-    return 0;
-}
-
-static void
-as_append_char (struct snprintf_state *state, unsigned char c)
-{
-    if(!as_reserve (state, 1))
-       *state->s++ = c;
-}
-
-static int
-pad(struct snprintf_state *state, int width, char c)
-{
-    int len = 0;
-    while(width-- > 0){
-       (*state->append_char)(state,  c);
-       ++len;
-    }
-    return len;
-}
-
-/* return true if we should use alternatve hex form */
-static int
-use_alternative (int flags, afs_uint64 num, unsigned base)
-{
-    return (flags & alternate_flag) && base == 16 && num != 0;
-}
-
-static int
-append_number(struct snprintf_state *state,
-             afs_uint64 num, unsigned base, const char *rep,
-             int width, int prec, int flags, int minusp)
-{
-    int len = 0;
-    afs_uint64 n = num;
-    char nstr[MAXPREC]; /* enough for <192 bit octal integers */
-    int nstart, nlen;
-    char signchar;
-
-    /* given precision, ignore zero flag */
-    if(prec != -1)
-       flags &= ~zero_flag;
-    else
-       prec = 1;
-
-    /* format number as string */
-    nstart = sizeof(nstr);
-    nlen = 0;
-    nstr[--nstart] = '\0';
-
-    do {
-       nstr[--nstart] = rep[n % base];
-       ++nlen;
-       n /= base;
-    } while(n);
-
-    /* zero value with zero precision should produce no digits */
-    if(prec == 0 && num == 0) {
-       nlen--;
-       nstart++;
-    }
-
-    /* figure out what char to use for sign */
-    if(minusp)
-       signchar = '-';
-    else if((flags & plus_flag))
-       signchar = '+';
-    else if((flags & space_flag))
-       signchar = ' ';
-    else
-       signchar = '\0';
-
-    if((flags & alternate_flag) && base == 8) {
-       /* if necessary, increase the precision to
-          make first digit a zero */
-
-       /* XXX C99 claims (regarding # and %o) that "if the value and
-           precision are both 0, a single 0 is printed", but there is
-           no such wording for %x. This would mean that %#.o would
-           output "0", but %#.x "". This does not make sense, and is
-           also not what other printf implementations are doing. */
-
-       if(prec <= nlen && nstr[nstart] != '0' && nstr[nstart] != '\0')
-           prec = nlen + 1;
-    }
-
-    /* possible formats:
-       pad | sign | alt | zero | digits
-       sign | alt | zero | digits | pad   minus_flag
-       sign | alt | zero | digits zero_flag */
-
-    /* if not right justifying or padding with zeros, we need to
-       compute the length of the rest of the string, and then pad with
-       spaces */
-    if(!(flags & (minus_flag | zero_flag))) {
-       if(prec > nlen)
-           width -= prec;
-       else
-           width -= nlen;
-
-       if(use_alternative(flags, num, base))
-           width -= 2;
-
-       if(signchar != '\0')
-           width--;
-
-       /* pad to width */
-       len += pad(state, width, ' ');
-    }
-    if(signchar != '\0') {
-       (*state->append_char)(state, signchar);
-       ++len;
-    }
-    if(use_alternative(flags, num, base)) {
-       (*state->append_char)(state, '0');
-       (*state->append_char)(state, rep[10] + 23); /* XXX */
-       len += 2;
-    }
-    if(flags & zero_flag) {
-       /* pad to width with zeros */
-       if(prec - nlen > width - len - nlen)
-           len += pad(state, prec - nlen, '0');
-       else
-           len += pad(state, width - len - nlen, '0');
-    } else
-       /* pad to prec with zeros */
-       len += pad(state, prec - nlen, '0');
-
-    while(nstr[nstart] != '\0') {
-       (*state->append_char)(state, nstr[nstart++]);
-       ++len;
-    }
-
-    if(flags & minus_flag)
-       len += pad(state, width - len, ' ');
-
-    return len;
-}
-
-/*
- * return length
- */
-
-static int
-append_string (struct snprintf_state *state,
-              const unsigned char *arg,
-              int width,
-              int prec,
-              int flags)
-{
-    int len = 0;
-
-    if(arg == NULL)
-       arg = (const unsigned char*)"(null)";
-
-    if(prec != -1)
-       width -= prec;
-    else
-       width -= (int)strlen((const char *)arg);
-    if(!(flags & minus_flag))
-       len += pad(state, width, ' ');
-
-    if (prec != -1) {
-       while (*arg && prec--) {
-           (*state->append_char) (state, *arg++);
-           ++len;
-       }
-    } else {
-       while (*arg) {
-           (*state->append_char) (state, *arg++);
-           ++len;
-       }
-    }
-    if(flags & minus_flag)
-       len += pad(state, width, ' ');
-    return len;
-}
-
-static int
-append_char(struct snprintf_state *state,
-           unsigned char arg,
-           int width,
-           int flags)
-{
-    int len = 0;
-
-    while(!(flags & minus_flag) && --width > 0) {
-       (*state->append_char) (state, ' ')    ;
-       ++len;
-    }
-    (*state->append_char) (state, arg);
-    ++len;
-    while((flags & minus_flag) && --width > 0) {
-       (*state->append_char) (state, ' ');
-       ++len;
-    }
-    return 0;
-}
-
-#define MAXPREC 100
-static int
-append_float(struct snprintf_state *state,
-             char type,
-             double arg,
-             int width,
-             int prec,
-             int flags)
-{
-    int len = 0;
-    char fbuf[20], xbuf[MAXPREC + 21];
-
-    sprintf(fbuf, "%%%s%s.*L%c",
-            (flags & plus_flag) ? "+" : ((flags & space_flag) ? " " : ((flags & minus_flag) ? "-" : "")),
-            (flags & alternate_flag) ? "#" : "", type);
-    if (prec == -1)
-        prec = 6;
-    if (prec > MAXPREC)
-       prec = MAXPREC;
-    sprintf(xbuf, fbuf, prec, arg);
-
-    len = append_string(state, (unsigned char *)xbuf, width, -1, 0);
-    return len;
-}
-
-static int
-append_address(struct snprintf_state *state,
-               afs_uint32 arg,
-               int width,
-               int prec,
-               int flags)
-{
-    int len = 0;
-    struct hostent * he;
-    struct in_addr ia;
-    char * x, *y;
-
-    /* IP address:
-     * value is provided as a network-order unsigned long integer
-     * precision specifies max hostname length, as for %s
-     * if precision is explicitly 0, no hostname lookup is done
-     * if 0fill specified, IPaddr fields are 0-filled to 3 digits
-     * if spsign specified, IPaddr fields are space-filled to 3 digits
-     */
-    ia.s_addr = arg;
-    if (prec == 0)
-        he = 0;
-    else
-        he = gethostbyaddr((char *)&ia, 4, AF_INET);
-    if (he) {
-        x = he->h_name;
-        len = (int)strlen(x);
-        if (prec != -1 && prec < len)
-            width = prec;
-        else
-            width = len;
-        if (flags & alternate_flag) {
-            for (y = x; *y; y++)
-                if (isupper(*y))
-                    *y = tolower(*y);
-        } else if (flags & plus_flag) {
-            for (y = x; *y; y++)
-                if (islower(*y))
-                    *y = toupper(*y);
-        }
-        len = append_string(state, (unsigned char *)x, width, prec, 0);
-    } else {
-        char xbuf[16];
-        arg = ntohl(arg);
-        if (flags & zero_flag) {
-            x = "%03u.%03u.%03u.%03u";
-        } else if (flags & space_flag) {
-            x = "%3u.%3u.%3u.%3u";
-        } else {
-            x = "%u.%u.%u.%u";
-        }
-        /* typecast to whatever '%u' is! */
-        sprintf(xbuf, x, (unsigned int)((arg & 0xff000000) >> 24),
-                         (unsigned int)((arg & 0x00ff0000) >> 16),
-                         (unsigned int)((arg & 0x0000ff00) >> 8),
-                         (unsigned int)(arg & 0x000000ff));
-        len = append_string(state, (unsigned char *)xbuf, 0, -1, 0);
-    }
-
-    return len;
-}
-
-/*
- * This can't be made into a function...
- */
-
-#if defined(AFS_NT40_ENV)
-
-#define PARSE_INT_FORMAT(res, arg, unsig) \
-if (long_long_flag) \
-     res = (unsig __int64)va_arg(arg, unsig __int64); \
-else if (long_flag || addr_flag) \
-     res = (unsig long)va_arg(arg, unsig long); \
-else if (size_t_flag) \
-     res = (size_t)va_arg(arg, size_t); \
-else if (short_flag) \
-     res = (unsig short)va_arg(arg, unsig int); \
-else \
-     res = (unsig int)va_arg(arg, unsig int)
-
-#else /* AFS_NT40_ENV */
-
-#define PARSE_INT_FORMAT(res, arg, unsig) \
-if (long_long_flag) \
-     res = (unsig long long)va_arg(arg, unsig long long); \
-else if (long_flag || addr_flag) \
-     res = (unsig long)va_arg(arg, unsig long); \
-else if (size_t_flag) \
-     res = (size_t)va_arg(arg, size_t); \
-else if (short_flag) \
-     res = (unsig short)va_arg(arg, unsig int); \
-else \
-     res = (unsig int)va_arg(arg, unsig int)
-#endif
-
-
-/*
- * zyxprintf - return length, as snprintf
- */
-
-static int
-xyzprintf (struct snprintf_state *state, const char *char_format, va_list ap)
-{
-    const unsigned char *format = (const unsigned char *)char_format;
-    unsigned char c;
-    int len = 0;
-
-    while((c = *format++)) {
-       if (c == '%') {
-           int flags          = 0;
-           int width          = 0;
-           int prec           = -1;
-           int size_t_flag    = 0;
-           int long_long_flag = 0;
-           int long_flag      = 0;
-           int short_flag     = 0;
-            int addr_flag      = 0;
-
-           /* flags */
-           while((c = *format++)){
-               if(c == '-')
-                   flags |= minus_flag;
-               else if(c == '+')
-                   flags |= plus_flag;
-               else if(c == ' ')
-                   flags |= space_flag;
-               else if(c == '#')
-                   flags |= alternate_flag;
-               else if(c == '0')
-                   flags |= zero_flag;
-               else if(c == '\'')
-                   ; /* just ignore */
-               else
-                   break;
-           }
-
-           if((flags & space_flag) && (flags & plus_flag))
-               flags ^= space_flag;
-
-           if((flags & minus_flag) && (flags & zero_flag))
-               flags ^= zero_flag;
-
-           /* width */
-           if (isdigit(c))
-               do {
-                   width = width * 10 + c - '0';
-                   c = *format++;
-               } while(isdigit(c));
-           else if(c == '*') {
-               width = va_arg(ap, int);
-               c = *format++;
-           }
-
-           /* precision */
-           if (c == '.') {
-               prec = 0;
-               c = *format++;
-               if (isdigit(c))
-                   do {
-                       prec = prec * 10 + c - '0';
-                       c = *format++;
-                   } while(isdigit(c));
-               else if (c == '*') {
-                   prec = va_arg(ap, int);
-                   c = *format++;
-               }
-           }
-
-           /* size */
-
-           if (c == 'h') {
-               short_flag = 1;
-               c = *format++;
-           } else if (c == 'z') {
-               size_t_flag = 1;
-               c = *format++;
-           } else if (c == 'l') {
-               long_flag = 1;
-               c = *format++;
-               if (c == 'l') {
-                   long_long_flag = 1;
-                   c = *format++;
-               }
-           } else if (c == 'I') {
-                /* This could be either Microsoft I{32,64} notation */
-                c = *format++;
-                if (c == '3') {
-                    long_flag = 1;
-                    c = *format++;
-                    if (c == '2') {
-                        c = *format++;
-                    }
-                } else if (c == '6') {
-                    long_flag = 1;
-                    c = *format++;
-                    if (c == '4') {
-                        long_long_flag = 1;
-                        c = *format++;
-                    }
-                } else {
-                    /* Or the OpenAFS special %I meaning network address */
-                    addr_flag = 1;
-                    --format;
-                    c = 'I';
-                }
-            } else if (c == 'p') {
-                flags |= zero_flag;
-                if (prec == -1)
-                    prec = 2 * sizeof(void *);
-                if (sizeof(void *) == sizeof(afs_uint64))
-                    long_long_flag = 1;
-                else if (sizeof(void *) == sizeof(afs_uint32))
-                    long_flag = 1;
-                else
-                    long_flag = 1;
-            }
-
-           if(c != 'd' && c != 'i' && c != 'I')
-               flags &= ~(plus_flag | space_flag);
-
-           switch (c) {
-           case 'c' :
-               append_char(state, va_arg(ap, int), width, flags);
-               ++len;
-               break;
-           case 's' :
-               len += append_string(state,
-                                    va_arg(ap, unsigned char*),
-                                    width,
-                                    prec,
-                                    flags);
-               break;
-           case 'd' :
-           case 'i' : {
-               afs_int64 arg;
-               afs_uint64 num;
-               int minusp = 0;
-
-               PARSE_INT_FORMAT(arg, ap, signed);
-
-               if (arg < 0) {
-                   minusp = 1;
-                   num = -arg;
-               } else
-                   num = arg;
-
-               len += append_number (state, num, 10, "0123456789",
-                                     width, prec, flags, minusp);
-               break;
-           }
-           case 'u' : {
-               afs_uint64 arg;
-
-               PARSE_INT_FORMAT(arg, ap, unsigned);
-
-               len += append_number (state, arg, 10, "0123456789",
-                                     width, prec, flags, 0);
-               break;
-           }
-           case 'o' : {
-               afs_uint64 arg;
-
-               PARSE_INT_FORMAT(arg, ap, unsigned);
-
-               len += append_number (state, arg, 010, "01234567",
-                                     width, prec, flags, 0);
-               break;
-           }
-           case 'x' : {
-               afs_uint64 arg;
-
-               PARSE_INT_FORMAT(arg, ap, unsigned);
-
-               len += append_number (state, arg, 0x10, "0123456789abcdef",
-                                     width, prec, flags, 0);
-               break;
-           }
-           case 'X' :{
-               afs_uint64 arg;
-
-               PARSE_INT_FORMAT(arg, ap, unsigned);
-
-               len += append_number (state, arg, 0x10, "0123456789ABCDEF",
-                                     width, prec, flags, 0);
-               break;
-           }
-           case 'p' : {
-               afs_uint64 arg = (intptr_t)va_arg(ap, void*);
-               len += append_number (state, arg, 0x10, "0123456789ABCDEF",
-                                     width, prec, flags, 0);
-               break;
-           }
-           case 'n' : {
-               int *arg = va_arg(ap, int*);
-               *arg = (int)(state->s - state->str);
-               break;
-           }
-            case 'I' : {
-                afs_uint64 arg;
-
-                PARSE_INT_FORMAT(arg, ap, unsigned);
-
-                len += append_address (state, (unsigned long)arg, width, prec, flags);
-                break;
-            }
-            case 'e':
-            case 'E':
-            case 'f':
-            case 'g':
-            case 'G': {
-                double arg = (double)va_arg(ap, double);
-
-                len += append_float (state, c, arg, width, prec, flags);
-                break;
-            }
-           case '\0' :
-               --format;
-               /* FALLTHROUGH */
-           case '%' :
-               (*state->append_char)(state, c);
-               ++len;
-               break;
-           default :
-               (*state->append_char)(state, '%');
-               (*state->append_char)(state, c);
-               len += 2;
-               break;
-           }
-       } else {
-           (*state->append_char) (state, c);
-           ++len;
-       }
-    }
-    return len;
-}
-
-
-int
-afs_vsnprintf (char *str, size_t sz, const char *format, va_list args)
-{
-    struct snprintf_state state;
-    int ret;
-    unsigned char *ustr = (unsigned char *)str;
-
-    state.max_sz = 0;
-    state.sz     = sz;
-    state.str    = ustr;
-    state.s      = ustr;
-    state.theend = ustr + sz - (sz > 0);
-    state.append_char = afs_sn_append_char;
-
-    ret = xyzprintf (&state, format, args);
-    if (state.s != NULL && sz != 0)
-       *state.s = '\0';
-    return ret;
-}
-
-int
-afs_snprintf (char *str, size_t sz, const char *format, ...)
-{
-    va_list args;
-    int ret;
-
-    va_start(args, format);
-    ret = afs_vsnprintf (str, sz, format, args);
-    va_end(args);
-
-#ifdef PARANOIA
-    {
-       int ret2;
-       unsigned char *tmp;
-
-       tmp = (unsigned char *)malloc (sz);
-       if (tmp == NULL)
-           abort ();
-
-       va_start(args, format);
-       ret2 = afs_vsprintf (tmp, format, args);
-       va_end(args);
-       if (ret != ret2 || strcmp(str, tmp))
-           abort ();
-       free (tmp);
-    }
-#endif
-
-    return ret;
-}
-
-int
-afs_vasnprintf (char **ret, size_t max_sz, const char *format, va_list args)
-{
-    int st;
-    struct snprintf_state state;
-
-    state.max_sz = max_sz;
-    state.sz     = 1;
-    state.str    = (unsigned char *)malloc(state.sz);
-    if (state.str == NULL) {
-       *ret = NULL;
-       return -1;
-    }
-    state.s = state.str;
-    state.theend = state.s + state.sz - 1;
-    state.append_char = as_append_char;
-
-    st = xyzprintf (&state, format, args);
-    if (st > state.sz) {
-       free (state.str);
-       *ret = NULL;
-       return -1;
-    } else {
-       char *tmp;
-
-       *state.s = '\0';
-       tmp = (char *)realloc (state.str, st+1);
-       if (tmp == NULL) {
-           free (state.str);
-           *ret = NULL;
-           return -1;
-       }
-       *ret = tmp;
-       return st;
-    }
-}
-
-int
-afs_vasprintf (char **ret, const char *format, va_list args)
-{
-    return afs_vasnprintf (ret, 0, format, args);
-}
-
-int
-afs_asprintf (char **ret, const char *format, ...)
-{
-    va_list args;
-    int val;
-
-    va_start(args, format);
-    val = afs_vasprintf (ret, format, args);
-    va_end(args);
-
-#ifdef PARANOIA
-    {
-       int ret2;
-       unsigned char *tmp;
-       tmp = (unsigned char *)malloc (val + 1);
-       if (tmp == NULL)
-           abort ();
-
-       va_start(args, format);
-       ret2 = afs_vsprintf (tmp, format, args);
-       va_end(args);
-       if (val != ret2 || strcmp(*ret, tmp))
-           abort ();
-       free (tmp);
-    }
-#endif
-
-    return val;
-}
-
-int
-afs_asnprintf (char **ret, size_t max_sz, const char *format, ...)
-{
-    va_list args;
-    int val;
-
-    va_start(args, format);
-    val = afs_vasnprintf (ret, max_sz, format, args);
-
-#ifdef PARANOIA
-    {
-       int ret2;
-       unsigned char *tmp;
-       tmp = (unsigned char *)malloc (val + 1);
-       if (tmp == NULL)
-           abort ();
-
-       ret2 = afs_vsprintf (tmp, format, args);
-       if (val != ret2 || strcmp(*ret, tmp))
-           abort ();
-       free (tmp);
-    }
-#endif
-
-    va_end(args);
-    return val;
-}
-
-
-#ifndef AFS_NT40_ENV
-#ifndef HAVE_VSYSLOG
-void
-vsyslog(int priority, const char *format, va_list args)
-{
-  char buf[1024];
-  afs_vsnprintf(buf, sizeof(buf), format, args);
-  syslog(priority, "%s", buf);
-}
-#endif
-#endif