diff options
author | Richard Earnshaw <Richard.Earnshaw@arm.com> | 2015-01-07 17:32:24 +0000 |
---|---|---|
committer | Richard Earnshaw <Richard.Earnshaw@arm.com> | 2015-01-07 17:34:29 +0000 |
commit | 7c89917ffa6813f40fbb9f345411d59716e90714 (patch) | |
tree | 6457a90f308cea40a799e74f72c9b3a122f0b17c /libiberty/vasprintf.c | |
parent | d7b24d2941fd7c99ba5843331989e6023075f0d0 (diff) | |
download | gdb-7c89917ffa6813f40fbb9f345411d59716e90714.zip gdb-7c89917ffa6813f40fbb9f345411d59716e90714.tar.gz gdb-7c89917ffa6813f40fbb9f345411d59716e90714.tar.bz2 |
Sync with gcc/libiberty.
Diffstat (limited to 'libiberty/vasprintf.c')
-rw-r--r-- | libiberty/vasprintf.c | 84 |
1 files changed, 5 insertions, 79 deletions
diff --git a/libiberty/vasprintf.c b/libiberty/vasprintf.c index 4925060..6ffe2dd 100644 --- a/libiberty/vasprintf.c +++ b/libiberty/vasprintf.c @@ -14,9 +14,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 @@ Boston, MA 02110-1301, USA. */ #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 **, const char *, va_list); 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 |