From f8bb6246fd3e6dcfee4a8c28a1df7065ff72f3d2 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 26 Apr 2012 09:22:19 +0200 Subject: [PATCH] lib/tt: encode data for RAW and EXPORT format * all tt based utils will properly encode blank chars for raw output format and quotes for export output format Signed-off-by: Karel Zak --- lib/tt.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/tt.c b/lib/tt.c index 8d5f7ab64f..2d5b16b526 100644 --- a/lib/tt.c +++ b/lib/tt.c @@ -15,6 +15,7 @@ #include #include #include +#include #ifdef HAVE_SYS_IOCTL_H #include #endif @@ -552,6 +553,32 @@ static void recount_widths(struct tt *tb, char *buf, size_t bufsz) return; } +static void fputs_quoted(const char *data, FILE *out) +{ + const char *p; + + fputc('"', out); + for (p = data; p && *p; p++) { + if ((unsigned char) *p == 0x22) + fputs("\\x22", out); + else + fputc(*p, out); + } + fputc('"', out); +} + +static void fputs_nonblank(const char *data, FILE *out) +{ + const char *p; + + for (p = data; p && *p; p++) { + if (isblank((unsigned char) *p)) + fprintf(out, "\\x%02x", *p); + else + fputc(*p, out); + } +} + /* note that this function modifies @data */ static void print_data(struct tt *tb, struct tt_column *cl, char *data) @@ -563,7 +590,7 @@ static void print_data(struct tt *tb, struct tt_column *cl, char *data) /* raw mode */ if (tb->flags & TT_FL_RAW) { - fputs(data, stdout); + fputs_nonblank(data, stdout); if (!is_last_column(tb, cl)) fputc(' ', stdout); return; @@ -571,7 +598,8 @@ static void print_data(struct tt *tb, struct tt_column *cl, char *data) /* NAME=value mode */ if (tb->flags & TT_FL_EXPORT) { - fprintf(stdout, "%s=\"%s\"", cl->name, data); + fprintf(stdout, "%s=", cl->name); + fputs_quoted(data, stdout); if (!is_last_column(tb, cl)) fputc(' ', stdout); return; -- 2.47.3