summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libudev/util.c80
-rw-r--r--src/libudev/util.h2
2 files changed, 82 insertions, 0 deletions
diff --git a/src/libudev/util.c b/src/libudev/util.c
index d2adf042ce..dfe46bcb8c 100644
--- a/src/libudev/util.c
+++ b/src/libudev/util.c
@@ -551,6 +551,86 @@ char hexchar(int x) {
return table[x & 15];
}
+char octchar(int x) {
+ return '0' + (x & 7);
+}
+
+char *cescape(const char *s) {
+ char *r, *t;
+ const char *f;
+
+ assert(s);
+
+ /* Does C style string escaping. */
+
+ r = new(char, strlen(s)*4 + 1);
+ if (!r)
+ return NULL;
+
+ for (f = s, t = r; *f; f++)
+
+ switch (*f) {
+
+ case '\a':
+ *(t++) = '\\';
+ *(t++) = 'a';
+ break;
+ case '\b':
+ *(t++) = '\\';
+ *(t++) = 'b';
+ break;
+ case '\f':
+ *(t++) = '\\';
+ *(t++) = 'f';
+ break;
+ case '\n':
+ *(t++) = '\\';
+ *(t++) = 'n';
+ break;
+ case '\r':
+ *(t++) = '\\';
+ *(t++) = 'r';
+ break;
+ case '\t':
+ *(t++) = '\\';
+ *(t++) = 't';
+ break;
+ case '\v':
+ *(t++) = '\\';
+ *(t++) = 'v';
+ break;
+ case '\\':
+ *(t++) = '\\';
+ *(t++) = '\\';
+ break;
+ case '"':
+ *(t++) = '\\';
+ *(t++) = '"';
+ break;
+ case '\'':
+ *(t++) = '\\';
+ *(t++) = '\'';
+ break;
+
+ default:
+ /* For special chars we prefer octal over
+ * hexadecimal encoding, simply because glib's
+ * g_strescape() does the same */
+ if ((*f < ' ') || (*f >= 127)) {
+ *(t++) = '\\';
+ *(t++) = octchar((unsigned char) *f >> 6);
+ *(t++) = octchar((unsigned char) *f >> 3);
+ *(t++) = octchar((unsigned char) *f);
+ } else
+ *(t++) = *f;
+ break;
+ }
+
+ *t = 0;
+
+ return r;
+}
+
char *xescape(const char *s, const char *bad) {
char *r, *t;
const char *f;
diff --git a/src/libudev/util.h b/src/libudev/util.h
index 7b6571ab10..18109938e0 100644
--- a/src/libudev/util.h
+++ b/src/libudev/util.h
@@ -131,8 +131,10 @@ char *strnappend(const char *s, const char *suffix, size_t length);
char *truncate_nl(char *s);
+char octchar(int x) _const_;
char hexchar(int x) _const_;
+char *cescape(const char *s);
char *xescape(const char *s, const char *bad);
bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;