aboutsummaryrefslogtreecommitdiff
path: root/lib/tar/urldecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tar/urldecode.c')
-rw-r--r--lib/tar/urldecode.c31
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';
+}