|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|