aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/stringop.c33
-rw-r--r--include/stringop.h9
2 files changed, 42 insertions, 0 deletions
diff --git a/common/stringop.c b/common/stringop.c
index 7fb3fe12..c503143a 100644
--- a/common/stringop.c
+++ b/common/stringop.c
@@ -1,5 +1,6 @@
#define _POSIX_C_SOURCE 200809L
#include <ctype.h>
+#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
@@ -328,3 +329,35 @@ bool expand_path(char **path) {
wordfree(&p);
return true;
}
+
+char *vformat_str(const char *fmt, va_list args) {
+ char *str = NULL;
+ va_list args_copy;
+ va_copy(args_copy, args);
+
+ int len = vsnprintf(NULL, 0, fmt, args);
+ if (len < 0) {
+ sway_log_errno(SWAY_ERROR, "vsnprintf(\"%s\") failed", fmt);
+ goto out;
+ }
+
+ str = malloc(len + 1);
+ if (str == NULL) {
+ sway_log_errno(SWAY_ERROR, "malloc() failed");
+ goto out;
+ }
+
+ vsnprintf(str, len + 1, fmt, args_copy);
+
+out:
+ va_end(args_copy);
+ return str;
+}
+
+char *format_str(const char *fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ char *str = vformat_str(fmt, args);
+ va_end(args);
+ return str;
+}
diff --git a/include/stringop.h b/include/stringop.h
index b29f59b2..19a50f23 100644
--- a/include/stringop.h
+++ b/include/stringop.h
@@ -5,6 +5,12 @@
#include <stddef.h>
#include "list.h"
+#ifdef __GNUC__
+#define _SWAY_ATTRIB_PRINTF(start, end) __attribute__((format(printf, start, end)))
+#else
+#define _SWAY_ATTRIB_PRINTF(start, end)
+#endif
+
void strip_whitespace(char *str);
void strip_quotes(char *str);
@@ -31,4 +37,7 @@ char *argsep(char **stringp, const char *delim, char *matched_delim);
// Expand a path using shell replacements such as $HOME and ~
bool expand_path(char **path);
+char *vformat_str(const char *fmt, va_list args) _SWAY_ATTRIB_PRINTF(1, 0);
+char *format_str(const char *fmt, ...) _SWAY_ATTRIB_PRINTF(1, 2);
+
#endif