diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/util.c | 20 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index af975956db..946b7d53f9 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -1562,19 +1562,25 @@ char *cescape(const char *s) { return r; } -char *cunescape_length(const char *s, size_t length) { +char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix) { char *r, *t; const char *f; + size_t pl; assert(s); - /* Undoes C style string escaping */ + /* Undoes C style string escaping, and optionally prefixes it. */ + + pl = prefix ? strlen(prefix) : 0; - r = new(char, length+1); + r = new(char, pl+length+1); if (!r) return r; - for (f = s, t = r; f < s + length; f++) { + if (prefix) + memcpy(r, prefix, pl); + + for (f = s, t = r + pl; f < s + length; f++) { if (*f != '\\') { *(t++) = *f; @@ -1685,7 +1691,13 @@ finish: return r; } +char *cunescape_length(const char *s, size_t length) { + return cunescape_length_with_prefix(s, length, NULL); +} + char *cunescape(const char *s) { + assert(s); + return cunescape_length(s, strlen(s)); } diff --git a/src/shared/util.h b/src/shared/util.h index b315593bba..d5a48eb00f 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -256,6 +256,7 @@ int undecchar(char c); char *cescape(const char *s); char *cunescape(const char *s); char *cunescape_length(const char *s, size_t length); +char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix); char *xescape(const char *s, const char *bad); |