Using functions is safer than macros, and printing is not performance critical.
Signed-off-by: Stephen Hemminger <step...@networkplumber.org> --- devlink/devlink.c | 62 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index 559f624e3666..4e277f7b0bc3 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -11,6 +11,7 @@ #include <stdio.h> #include <stdlib.h> +#include <stdarg.h> #include <string.h> #include <stdbool.h> #include <unistd.h> @@ -48,32 +49,53 @@ #define HEALTH_REPORTER_TIMESTAMP_FMT_LEN 80 static int g_new_line_count; - -#define pr_err(args...) fprintf(stderr, ##args) -#define pr_out(args...) \ - do { \ - if (g_indent_newline) { \ - fprintf(stdout, "%s", g_indent_str); \ - g_indent_newline = false; \ - } \ - fprintf(stdout, ##args); \ - g_new_line_count = 0; \ - } while (0) - -#define pr_out_sp(num, args...) \ - do { \ - int ret = fprintf(stdout, ##args); \ - if (ret < num) \ - fprintf(stdout, "%*s", num - ret, ""); \ - g_new_line_count = 0; \ - } while (0) - static int g_indent_level; static bool g_indent_newline; + #define INDENT_STR_STEP 2 #define INDENT_STR_MAXLEN 32 static char g_indent_str[INDENT_STR_MAXLEN + 1] = ""; +static void __attribute__((format(printf, 1, 2))) +pr_err(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); +} + +static void __attribute__((format(printf, 1, 2))) +pr_out(const char *fmt, ...) +{ + va_list ap; + + if (g_indent_newline) { + printf("%s", g_indent_str); + g_indent_newline = false; + } + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + g_new_line_count = 0; +} + +static void __attribute__((format(printf, 2, 3))) +pr_out_sp(unsigned int num, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = vprintf(fmt, ap); + va_end(ap); + + if (ret < num) + printf("%*s", num - ret, ""); + g_new_line_count = 0; \ +} + static void __pr_out_indent_inc(void) { if (g_indent_level + INDENT_STR_STEP > INDENT_STR_MAXLEN) -- 2.20.1