From ff0d67ab1c8e5520e5c4689b3cd56904d787b855 Mon Sep 17 00:00:00 2001 From: Toomas Soome Date: Thu, 31 Jan 2019 17:06:59 +0000 Subject: [PATCH] MFC r343124: libsa: add asprintf() asprintf() is a nice tool for string processing. --- stand/libsa/printf.c | 28 ++++++++++++++++++++++++++++ stand/libsa/stand.h | 1 + 2 files changed, 29 insertions(+) diff --git a/stand/libsa/printf.c b/stand/libsa/printf.c index 34e92b1dfe0..a522c2c3e71 100644 --- a/stand/libsa/printf.c +++ b/stand/libsa/printf.c @@ -121,6 +121,34 @@ snprint_func(int ch, void *arg) pbuf->size--; } +int +asprintf(char **buf, const char *cfmt, ...) +{ + int retval; + struct print_buf arg; + va_list ap; + + *buf = NULL; + va_start(ap, cfmt); + retval = kvprintf(cfmt, NULL, NULL, 10, ap); + va_end(ap); + if (retval <= 0) + return (-1); + + arg.size = retval + 1; + arg.buf = *buf = malloc(arg.size); + if (*buf == NULL) + return (-1); + + va_start(ap, cfmt); + retval = kvprintf(cfmt, &snprint_func, &arg, 10, ap); + va_end(ap); + + if (arg.size >= 1) + *(arg.buf)++ = 0; + return (retval); +} + int snprintf(char *buf, size_t size, const char *cfmt, ...) { diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h index aba213c3b93..09512b6bddc 100644 --- a/stand/libsa/stand.h +++ b/stand/libsa/stand.h @@ -268,6 +268,7 @@ extern void *reallocf(void *ptr, size_t size); extern void mallocstats(void); extern int printf(const char *fmt, ...) __printflike(1, 2); +extern int asprintf(char **buf, const char *cfmt, ...) __printflike(2, 3); extern int sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3); extern int snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4); extern int vprintf(const char *fmt, __va_list); -- 2.45.0