diff options
Diffstat (limited to 'lib/tar/urldecode.c')
-rw-r--r-- | lib/tar/urldecode.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/tar/urldecode.c b/lib/tar/urldecode.c new file mode 100644 index 0000000..ac03f10 --- /dev/null +++ b/lib/tar/urldecode.c @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +#include "internal.h" + +static int xdigit(int x) +{ + if (isupper(x)) + return x - 'A' + 0x0A; + if (islower(x)) + return x - 'a' + 0x0A; + return x - '0'; +} + +void urldecode(char *str) +{ + unsigned char *out = (unsigned char *)str; + char *in = str; + int x; + + while (*in != '\0') { + x = *(in++); + + if (x == '%' && isxdigit(in[0]) && isxdigit(in[1])) { + x = xdigit(*(in++)) << 4; + x |= xdigit(*(in++)); + } + + *(out++) = x; + } + + *out = '\0'; +} |