1 /*
2 * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved.
3
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10
11 * The above copyright notice and this permission notice shall be included in all
12 * copies or substantial portions of the Software.
13
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 * SOFTWARE.
21 */
22
23 #include "../../lv_conf_internal.h"
24 #if LV_USE_THORVG_INTERNAL
25
26 #include <cstring>
27 #include "tvgSvgUtil.h"
28
29 /************************************************************************/
30 /* Internal Class Implementation */
31 /************************************************************************/
32
_hexCharToDec(const char c)33 static uint8_t _hexCharToDec(const char c)
34 {
35 if (c >= 'a') return c - 'a' + 10;
36 else if (c >= 'A') return c - 'A' + 10;
37 else return c - '0';
38 }
39
40
41 /************************************************************************/
42 /* External Class Implementation */
43 /************************************************************************/
44
svgUtilURLDecode(const char * src,char ** dst)45 size_t svgUtilURLDecode(const char *src, char** dst)
46 {
47 if (!src) return 0;
48
49 auto length = strlen(src);
50 if (length == 0) return 0;
51
52 char* decoded = (char*)malloc(sizeof(char) * length + 1);
53
54 char a, b;
55 int idx =0;
56 while (*src) {
57 if (*src == '%' &&
58 ((a = src[1]) && (b = src[2])) &&
59 (isxdigit(a) && isxdigit(b))) {
60 decoded[idx++] = (_hexCharToDec(a) << 4) + _hexCharToDec(b);
61 src+=3;
62 } else if (*src == '+') {
63 decoded[idx++] = ' ';
64 src++;
65 } else {
66 decoded[idx++] = *src++;
67 }
68 }
69 decoded[idx] = '\0';
70
71 *dst = decoded;
72 return idx + 1;
73 }
74
75
76 #endif /* LV_USE_THORVG_INTERNAL */
77
78