Add function hex_decode_inplace() to decode the input string onto itself. Signed-off-by: Jani Nikula <jani@nikula.org> --- This could be folded to "hex-escape: (en|de)code strings to/from restricted character set". --- util/hex-escape.c | 62 ++++++++++++++++++++++++++++++---------------------- util/hex-escape.h | 6 +++++ 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/util/hex-escape.c b/util/hex-escape.c index 9de79df..e794f98 100644 --- a/util/hex-escape.c +++ b/util/hex-escape.c @@ -98,38 +98,15 @@ hex_encode (void *ctx, const char *in, char **out, size_t *out_size) return HEX_SUCCESS; } -hex_status_t -hex_decode (void *ctx, const char *in, char **out, size_t * out_size) +/* Note: This must succeed for p == q to support hex_decode_inplace(). */ +static hex_status_t +hex_decode_internal (const char *p, unsigned char *q) { - char buf[3]; - - const char *p; - unsigned char *q; - - size_t escape_count = 0; - size_t needed = 0; - - assert (ctx); assert (in); assert (out); assert (out_size); - - size_t len = strlen (in); - - for (p = in; *p; p++) - escape_count += (*p == escape_char); - - needed = len - escape_count * 2 + 1; - - if (!maybe_realloc (ctx, needed, out, out_size)) - return HEX_OUT_OF_MEMORY; - - p = in; - q = (unsigned char *) *out; buf[2] = 0; while (*p) { - if (*p == escape_char) { - char *endp; if (!isxdigit ((unsigned char) p[1]) || @@ -155,3 +132,36 @@ hex_decode (void *ctx, const char *in, char **out, size_t * out_size) return HEX_SUCCESS; } + +hex_status_t +hex_decode_inplace (char *p) +{ + return hex_decode_internal (p, (unsigned char *) p); +} + +hex_status_t +hex_decode (void *ctx, const char *in, char **out, size_t * out_size) +{ + const char *p; + unsigned char *q; + + size_t escape_count = 0; + size_t needed = 0; + + assert (ctx); assert (in); assert (out); assert (out_size); + + size_t len = strlen (in); + + for (p = in; *p; p++) + escape_count += (*p == escape_char); + + needed = len - escape_count * 2 + 1; + + if (!maybe_realloc (ctx, needed, out, out_size)) + return HEX_OUT_OF_MEMORY; + + p = in; + q = (unsigned char *) *out; + + return hex_decode_internal (p, q); +} diff --git a/util/hex-escape.h b/util/hex-escape.h index e409626..be70ad2 100644 --- a/util/hex-escape.h +++ b/util/hex-escape.h @@ -29,4 +29,10 @@ hex_encode (void *talloc_ctx, const char *in, char **out, hex_status_t hex_decode (void *talloc_ctx, const char *in, char **out, size_t *out_size); + +/* + * Decode 'in' onto itself. + */ +hex_status_t +hex_decode_inplace (char *in); #endif -- 1.7.5.4