summaryrefslogtreecommitdiffstats
path: root/lib/vsprintf.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-04-11 16:52:10 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2016-04-15 12:21:45 +0200
commit947fb5adf8af450507c978abf1c7ec9f051e5842 (patch)
treeaf790669292308b56baf188611ac430012037cba /lib/vsprintf.c
parent48b205e32342fc8a2648b2bd3f1f6d9a7d74e6cb (diff)
downloadbarebox-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.c48
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);