diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2016-04-11 16:52:10 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-04-15 12:21:45 +0200 |
commit | 947fb5adf8af450507c978abf1c7ec9f051e5842 (patch) | |
tree | af790669292308b56baf188611ac430012037cba /lib/vsprintf.c | |
parent | 48b205e32342fc8a2648b2bd3f1f6d9a7d74e6cb (diff) | |
download | barebox-947fb5adf8af450507c978abf1c7ec9f051e5842.tar.gz barebox-947fb5adf8af450507c978abf1c7ec9f051e5842.tar.xz |
string: Fix (v)asprintf prototypes
Our asprintf and vasprintf have different prototypes than the glibc
functions. This causes trouble when we want to share barebox code
with userspace code. Change the prototypes for (v)asprintf to match
the glibc prototypes. Since the current (v)asprintf are convenient
to use change the existing functions to b(v)asprintf.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 00b8863957..1122a4ad38 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -646,12 +646,11 @@ int scnprintf(char *buf, size_t size, const char *fmt, ...) } EXPORT_SYMBOL(scnprintf); -/* Simplified asprintf. */ -char *vasprintf(const char *fmt, va_list ap) +int vasprintf(char **strp, const char *fmt, va_list ap) { unsigned int len; - char *p; va_list aq; + char *p; va_copy(aq, ap); len = vsnprintf(NULL, 0, fmt, aq); @@ -659,23 +658,56 @@ char *vasprintf(const char *fmt, va_list ap) p = malloc(len + 1); if (!p) - return NULL; + return -1; vsnprintf(p, len + 1, fmt, ap); - return p; + *strp = p; + + return len; } EXPORT_SYMBOL(vasprintf); -char *asprintf(const char *fmt, ...) +char *bvasprintf(const char *fmt, va_list ap) +{ + char *p; + int len; + + len = vasprintf(&p, fmt, ap); + if (len < 0) + return NULL; + + return p; +} +EXPORT_SYMBOL(bvasprintf); + +int asprintf(char **strp, const char *fmt, ...) { va_list ap; char *p; + int len; va_start(ap, fmt); - p = vasprintf(fmt, ap); + len = vasprintf(&p, fmt, ap); va_end(ap); - return p; + return len; } EXPORT_SYMBOL(asprintf); + +char *basprintf(const char *fmt, ...) +{ + va_list ap; + char *p; + int len; + + va_start(ap, fmt); + len = vasprintf(&p, fmt, ap); + va_end(ap); + + if (len < 0) + return NULL; + + return p; +} +EXPORT_SYMBOL(basprintf); |