From: Karel Zak Date: Thu, 26 Apr 2012 07:22:19 +0000 (+0200) Subject: lib/tt: encode data for RAW and EXPORT format X-Git-Tag: v2.22-rc1~479 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f8bb6246fd3e6dcfee4a8c28a1df7065ff72f3d2;p=thirdparty%2Futil-linux.git 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 --- 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;