]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - include/carefulputc.h
include/carefulputc: cleanup and add fputs_{quoted,nonblank}()
[thirdparty/util-linux.git] / include / carefulputc.h
index d4d0ee4ea5096fed492db98d5dd67e4d9cfb2cfd..2273028d1368d507b35c491e08b9424fecf85e37 100644 (file)
@@ -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  */