shared: add str_printf() 26/28026/1
authorMarius Vlad <marius.vlad@collabora.com>
Mon, 19 Sep 2022 19:56:43 +0000 (22:56 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Thu, 22 Sep 2022 11:28:47 +0000 (14:28 +0300)
asprintf() has the problem that it leaves *strp undefined when it
fails. Here is a simple wrapper that ensures NULL if asprintf() fails,
which is much more convenient to use.

This will be useful in future patches, where one needs to return error
messages from maybe failing functions, and more.

Bug-AGL: SPEC-4510

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I2e689551797da525d110a51b02fd608c9e07c567

shared/string-helpers.h

index c8ce449..3c2f07f 100644 (file)
@@ -27,6 +27,7 @@
 #define WESTON_STRING_HELPERS_H
 
 #include <stdbool.h>
+#include <stdarg.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <errno.h>
@@ -68,4 +69,29 @@ safe_strtoint(const char *str, int32_t *value)
        return true;
 }
 
+/**
+ * Exactly like asprintf(), but sets *str_out to NULL if it fails.
+ *
+ * If str_out is NULL, does nothing.
+ */
+static inline void __attribute__ ((format (printf, 2, 3)))
+str_printf(char **str_out, const char *fmt, ...)
+{
+       char *msg;
+       va_list ap;
+       int ret;
+
+       if (!str_out)
+               return;
+
+       va_start(ap, fmt);
+       ret = vasprintf(&msg, fmt, ap);
+       va_end(ap);
+
+       if (ret >= 0)
+               *str_out = msg;
+       else
+               *str_out = NULL;
+}
+
 #endif /* WESTON_STRING_HELPERS_H */