diff options
author | Karel Zak | 2014-03-19 13:25:45 +0100 |
---|---|---|
committer | Karel Zak | 2014-04-03 12:29:16 +0200 |
commit | 78a3b0af301b219c501f2c45d4bdcd65aed7f7a6 (patch) | |
tree | 88288eaf5e86c369aa2513b32d79d7d2b2622b02 /include/carefulputc.h | |
parent | libsmartcols: add lines (diff) | |
download | kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.tar.gz kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.tar.xz kernel-qcow2-util-linux-78a3b0af301b219c501f2c45d4bdcd65aed7f7a6.zip |
include/carefulputc: cleanup and add fputs_{quoted,nonblank}()
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'include/carefulputc.h')
-rw-r--r-- | include/carefulputc.h | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/include/carefulputc.h b/include/carefulputc.h index d4d0ee4ea..2273028d1 100644 --- a/include/carefulputc.h +++ b/include/carefulputc.h @@ -1,16 +1,18 @@ -#ifndef _CAREFUULPUTC_H -#define _CAREFUULPUTC_H +#ifndef UTIL_LINUX_CAREFUULPUTC_H +#define UTIL_LINUX_CAREFUULPUTC_H /* putc() for use in write and wall (that sometimes are sgid tty) */ /* Avoid control characters in our locale, and also ASCII control characters. Note that the locale of the recipient is unknown. */ #include <stdio.h> #include <ctype.h> +#include <string.h> +#include <ctype.h> #define iso8859x_iscntrl(c) \ (((c) & 0x7f) < 0x20 || (c) == 0x7f) -static inline int carefulputc(int c, FILE *fp, const char fail) { +static inline int fputc_careful(int c, FILE *fp, const char fail) { int ret; if (c == '\007' || c == '\t' || c == '\r' || c == '\n' || @@ -26,4 +28,41 @@ static inline int carefulputc(int c, FILE *fp, const char fail) { return (ret < 0) ? EOF : 0; } + +static inline void fputs_quoted(const char *data, FILE *out) +{ + const char *p; + + fputc('"', out); + for (p = data; p && *p; p++) { + if ((unsigned char) *p == 0x22 || /* " */ + (unsigned char) *p == 0x5c || /* \ */ + !isprint((unsigned char) *p) || + iscntrl((unsigned char) *p)) { + + fprintf(out, "\\x%02x", (unsigned char) *p); + } else + fputc(*p, out); + } + fputc('"', out); +} + +static inline void fputs_nonblank(const char *data, FILE *out) +{ + const char *p; + + for (p = data; p && *p; p++) { + if (isblank((unsigned char) *p) || + (unsigned char) *p == 0x5c || /* \ */ + !isprint((unsigned char) *p) || + iscntrl((unsigned char) *p)) { + + fprintf(out, "\\x%02x", (unsigned char) *p); + + } else + fputc(*p, out); + } +} + + #endif /* _CAREFUULPUTC_H */ |