aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-08 23:31:18 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-15 06:43:30 +0200
commita697a21927bddb091ba1a6d88c4db01ef2f58092 (patch)
treeda55b583dba1b28e1c8c2ddc11b799ce6c3324d8
parent4ca1ddef1c928da98f6e7a59afda231cda75a036 (diff)
downloadsparse-dev-a697a21927bddb091ba1a6d88c4db01ef2f58092.tar.gz
utils: add xasprintf() & xvasprintf()
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--utils.c30
-rw-r--r--utils.h18
2 files changed, 48 insertions, 0 deletions
diff --git a/utils.c b/utils.c
index 4945e1ca..094df3f9 100644
--- a/utils.c
+++ b/utils.c
@@ -4,6 +4,8 @@
#include "utils.h"
#include "allocate.h"
#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
void *xmemdup(const void *src, size_t len)
@@ -15,3 +17,31 @@ char *xstrdup(const char *src)
{
return xmemdup(src, strlen(src) + 1);
}
+
+char *xvasprintf(const char *fmt, va_list ap)
+{
+ va_list ap2;
+ char *str;
+ int n;
+
+ va_copy(ap2, ap);
+ n = vsnprintf(NULL, 0, fmt, ap2) + 1;
+ va_end(ap2);
+
+ str = __alloc_bytes(n);
+ vsnprintf(str, n, fmt, ap);
+
+ return str;
+}
+
+char *xasprintf(const char *fmt, ...)
+{
+ va_list ap;
+ char *str;
+
+ va_start(ap, fmt);
+ str = xvasprintf(fmt, ap);
+ va_end(ap);
+
+ return str;
+}
diff --git a/utils.h b/utils.h
index 38749be2..7bd14f46 100644
--- a/utils.h
+++ b/utils.h
@@ -6,6 +6,7 @@
// -----------------------
#include <stddef.h>
+#include <stdarg.h>
///
// duplicate a memory buffer in a newly allocated buffer.
@@ -22,4 +23,21 @@ void *xmemdup(const void *src, size_t len);
// :func:`__alloc_bytes()`.
char *xstrdup(const char *src);
+///
+// printf to allocated string
+// @fmt: the format followed by its arguments.
+// @return: the allocated & formatted string.
+// This function is similar to asprintf() but the resulting string
+// is allocated with __alloc_bytes().
+char *xasprintf(const char *fmt, ...);
+
+///
+// vprintf to allocated string
+// @fmt: the format
+// @ap: the variadic arguments
+// @return: the allocated & formatted string.
+// This function is similar to asprintf() but the resulting string
+// is allocated with __alloc_bytes().
+char *xvasprintf(const char *fmt, va_list ap);
+
#endif