1
2
3
4
5
6
7#include "libbb.h"
8
9static unsigned hex_to_bin(unsigned char c)
10{
11 unsigned v;
12
13 v = c - '0';
14 if (v <= 9)
15 return v;
16
17
18 v = (unsigned)(c | 0x20) - 'a';
19 if (v <= 5)
20 return v + 10;
21 return ~0;
22
23
24
25
26
27}
28
29char* FAST_FUNC percent_decode_in_place(char *str, int strict)
30{
31
32 char *src = str;
33 char *dst = str;
34 char c;
35
36 while ((c = *src++) != '\0') {
37 unsigned v;
38
39 if (!strict && c == '+') {
40 *dst++ = ' ';
41 continue;
42 }
43 if (c != '%') {
44 *dst++ = c;
45 continue;
46 }
47 v = hex_to_bin(src[0]);
48 if (v > 15) {
49 bad_hex:
50 if (strict)
51 return NULL;
52 *dst++ = '%';
53 continue;
54 }
55 v = (v * 16) | hex_to_bin(src[1]);
56 if (v > 255)
57 goto bad_hex;
58 if (strict && (v == '/' || v == '\0')) {
59
60
61 return str + 1;
62 }
63 *dst++ = v;
64 src += 2;
65 }
66 *dst = '\0';
67 return str;
68}
69