Mercurial > hg > CbC > CbC_gcc
diff libiberty/vasprintf.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
line wrap: on
line diff
--- a/libiberty/vasprintf.c Sun Aug 21 07:07:55 2011 +0900 +++ b/libiberty/vasprintf.c Fri Oct 27 22:46:09 2017 +0900 @@ -1,6 +1,6 @@ /* Like vsprintf but provides a pointer to malloc'd storage, which must be freed by the caller. - Copyright (C) 1994, 2003, 2011 Free Software Foundation, Inc. + Copyright (C) 1994-2017 Free Software Foundation, Inc. This file is part of the libiberty library. Libiberty is free software; you can redistribute it and/or @@ -14,9 +14,9 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, -Boston, MA 02110-1301, USA. */ +License along with libiberty; see the file COPYING.LIB. If not, write +to the Free Software Foundation, Inc., 51 Franklin Street - Fifth +Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -33,10 +33,10 @@ #ifdef HAVE_STDLIB_H #include <stdlib.h> #else -extern unsigned long strtoul (); extern PTR malloc (); #endif #include "libiberty.h" +#include "vprintf-support.h" #ifdef TEST int global_total_width; @@ -64,81 +64,7 @@ static int int_vasprintf (char **result, const char *format, va_list args) { - const char *p = format; - /* Add one to make sure that it is never zero, which might cause malloc - to return NULL. */ - int total_width = strlen (format) + 1; - va_list ap; - -#ifdef va_copy - va_copy (ap, args); -#else - memcpy ((PTR) &ap, (PTR) &args, sizeof (va_list)); -#endif - - while (*p != '\0') - { - if (*p++ == '%') - { - while (strchr ("-+ #0", *p)) - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, (char **) &p, 10); - if (*p == '.') - { - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, (char **) &p, 10); - } - while (strchr ("hlL", *p)) - ++p; - /* Should be big enough for any format specifier except %s and floats. */ - total_width += 30; - switch (*p) - { - case 'd': - case 'i': - case 'o': - case 'u': - case 'x': - case 'X': - case 'c': - (void) va_arg (ap, int); - break; - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - (void) va_arg (ap, double); - /* Since an ieee double can have an exponent of 307, we'll - make the buffer wide enough to cover the gross case. */ - total_width += 307; - break; - case 's': - total_width += strlen (va_arg (ap, char *)); - break; - case 'p': - case 'n': - (void) va_arg (ap, char *); - break; - } - p++; - } - } -#ifdef va_copy - va_end (ap); -#endif + int total_width = libiberty_vprintf_buffer_size (format, args); #ifdef TEST global_total_width = total_width; #endif @@ -165,10 +91,10 @@ checkit (const char *format, ...) { char *result; - VA_OPEN (args, format); - VA_FIXEDARG (args, const char *, format); + va_list args; + va_start (args, format); vasprintf (&result, format, args); - VA_CLOSE (args); + va_end (args); if (strlen (result) < (size_t) global_total_width) printf ("PASS: ");