Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 1 | /* |
"Vladimir N. Oleynik" | 39a841c | 2005-09-29 16:18:57 +0000 | [diff] [blame] | 2 | Copyright (C) 2002,2005 Vladimir Oleynik <dzo@simtreas.ru> |
Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 3 | */ |
| 4 | |
| 5 | #include <stdlib.h> |
| 6 | #include <stdio.h> |
| 7 | #include <stdarg.h> |
Manuel Novoa III | 4d0884a | 2002-09-12 14:52:26 +0000 | [diff] [blame] | 8 | #include "libbb.h" |
Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 9 | |
"Vladimir N. Oleynik" | 39a841c | 2005-09-29 16:18:57 +0000 | [diff] [blame] | 10 | char *bb_xasprintf(const char *format, ...) |
Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 11 | { |
Manuel Novoa III | cad5364 | 2003-03-19 09:13:01 +0000 | [diff] [blame] | 12 | va_list p; |
| 13 | int r; |
"Vladimir N. Oleynik" | 39a841c | 2005-09-29 16:18:57 +0000 | [diff] [blame] | 14 | char *string_ptr; |
Eric Andersen | c7bda1c | 2004-03-15 08:29:22 +0000 | [diff] [blame] | 15 | |
Rob Landley | 1f305dc | 2006-03-09 22:21:20 +0000 | [diff] [blame] | 16 | #ifdef HAVE_GNU_EXTENSIONS |
Manuel Novoa III | cad5364 | 2003-03-19 09:13:01 +0000 | [diff] [blame] | 17 | va_start(p, format); |
"Vladimir N. Oleynik" | 39a841c | 2005-09-29 16:18:57 +0000 | [diff] [blame] | 18 | r = vasprintf(&string_ptr, format, p); |
Manuel Novoa III | cad5364 | 2003-03-19 09:13:01 +0000 | [diff] [blame] | 19 | va_end(p); |
Rob Landley | 1f305dc | 2006-03-09 22:21:20 +0000 | [diff] [blame] | 20 | #else |
| 21 | va_start(p, format); |
| 22 | r = vsnprintf(NULL, 0, format, p); |
| 23 | va_end(p); |
| 24 | string_ptr = xmalloc(r+1); |
| 25 | va_start(p, format); |
| 26 | r = vsnprintf(string_ptr, r+1, format, p); |
| 27 | va_end(p); |
| 28 | #endif |
Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 29 | |
Manuel Novoa III | cad5364 | 2003-03-19 09:13:01 +0000 | [diff] [blame] | 30 | if (r < 0) { |
| 31 | bb_perror_msg_and_die("bb_xasprintf"); |
| 32 | } |
"Vladimir N. Oleynik" | 39a841c | 2005-09-29 16:18:57 +0000 | [diff] [blame] | 33 | return string_ptr; |
Robert Griebl | efd4983 | 2002-07-19 20:27:11 +0000 | [diff] [blame] | 34 | } |