--- rpl/src/asprintf.c 2010/01/29 16:49:23 1.2 +++ rpl/src/asprintf.c 2013/06/21 14:15:51 1.45 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.15 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -21,61 +21,65 @@ #include "rpl.h" -#include int valsprintf(unsigned char **strp, const char *fmt, va_list ap) { - size_t bs; - size_t s; - unsigned char *b = NULL; - - for(bs = 1024;; bs *= 2) - { - if (b != NULL) - { - free(b); - } + size_t bs; + size_t s; - if ((b = malloc(sizeof(*b) * bs)) == NULL) + unsigned char *b = NULL; + + va_list cap; + + for(bs = 1024;; bs *= 2) { - return -1; + va_copy(cap, ap); + + if (b != NULL) + { + free(b); + } + + if ((b = malloc(sizeof(*b) * bs)) == NULL) + { + return -1; + } + + if (((int) (s = (size_t) vsnprintf(b, bs, fmt, cap))) < 0) + { + free(b); + return -1; + } + + if (s < bs) + { + break; + } } - if (((int) (s = vsnprintf(b, bs, fmt, ap))) < 0) + if (((*strp) = realloc(b, ((s = strlen(b)) + 1) * sizeof(*b))) == NULL) { free(b); return -1; } - if (s < bs) - { - break; - } - } - - if (((*strp) = realloc(b, ((s = strlen(b)) + 1) * sizeof(*b))) == NULL) - { - free(b); - return -1; - } - - return s; + return((int) s); } int alsprintf(unsigned char **strp, const char *fmt, ...) { - int done; - va_list arg; + int done; + va_list arg; - va_start(arg, fmt); - done = valsprintf(strp, fmt, arg); - va_end(arg); + va_start(arg, fmt); + done = valsprintf(strp, fmt, arg); + va_end(arg); - return(done); + return(done); } // vim: ts=4