From 95387b669658402cad6bce9bb18cecd8b11af092 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 26 Apr 2012 09:17:44 +0200 Subject: lib/mangle: cleanup, add unhexmangle * use strchr() rather than for() * small refactoring in mangle code * add un-hex-mangle Signed-off-by: Karel Zak --- lib/mangle.c | 57 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/lib/mangle.c b/lib/mangle.c index fd0ee993e..e1b48149f 100644 --- a/lib/mangle.c +++ b/lib/mangle.c @@ -13,41 +13,40 @@ #include "mangle.h" #include "c.h" -#define isoctal(a) (((a) & ~7) == '0') +#define isoctal(a) (((a) & ~7) == '0') + +#define from_hex(c) (isdigit(c) ? c - '0' : tolower(c) - 'a' + 10) + +#define is_unwanted_char(x) (strchr(" \t\n\\", (unsigned int) x) != NULL) -static unsigned char need_escaping[] = { ' ', '\t', '\n', '\\' }; char *mangle(const char *s) { char *ss, *sp; - size_t n; if (!s) return NULL; - n = strlen(s); - ss = sp = malloc(4*n+1); + ss = sp = malloc(4 * strlen(s) + 1); if (!sp) return NULL; while(1) { - for (n = 0; n < sizeof(need_escaping); n++) { - if (*s == need_escaping[n]) { - *sp++ = '\\'; - *sp++ = '0' + ((*s & 0300) >> 6); - *sp++ = '0' + ((*s & 070) >> 3); - *sp++ = '0' + (*s & 07); - goto next; - } + if (is_unwanted_char(*s)) { + *sp++ = '\\'; + *sp++ = '0' + ((*s & 0300) >> 6); + *sp++ = '0' + ((*s & 070) >> 3); + *sp++ = '0' + (*s & 07); + } else { + *sp++ = *s; + if (!*s) + break; } - *sp++ = *s; - if (*s == 0) - break; - next: s++; } return ss; } + void unmangle_to_buffer(const char *s, char *buf, size_t len) { size_t sz = 0; @@ -70,6 +69,28 @@ void unmangle_to_buffer(const char *s, char *buf, size_t len) *buf = '\0'; } +void unhexmangle_to_buffer(const char *s, char *buf, size_t len) +{ + size_t sz = 0; + + if (!s) + return; + + while(*s && sz < len - 1) { + if (*s == '\\' && sz + 4 < len - 1 && s[1] == 'x' && + isxdigit(s[2]) && isxdigit(s[3])) { + + *buf++ = from_hex(s[2]) << 4 | from_hex(s[3]); + s += 4; + sz += 4; + } else { + *buf++ = *s++; + sz++; + } + } + *buf = '\0'; +} + static inline char *skip_nonspaces(const char *s) { while (*s && !(*s == ' ' || *s == '\t')) @@ -110,7 +131,7 @@ char *unmangle(const char *s, char **end) int main(int argc, char *argv[]) { if (argc < 3) { - fprintf(stderr, "usage: %s --mangle | --unmangle \n", + fprintf(stderr, "usage: %s --mangle|unmangle \n", program_invocation_short_name); return EXIT_FAILURE; } -- cgit v1.2.3-55-g7522