28void GHOST_URL_decode(
char *buf_dst,
int buf_dst_size,
const char *buf_src,
const int buf_src_len)
30 GHOST_ASSERT(strnlen(buf_src, buf_src_len) == buf_src_len,
"Incorrect length");
35 memset(buf_dst, 0, buf_dst_size);
37 for (
uint i = 0; i < buf_src_len; i++) {
40 if (buf_src[i] !=
'%') {
41 strncat(buf_dst, &buf_src[i], 1);
42 assert(
int(strlen(buf_dst)) < buf_dst_size);
47 state = STATE_CONVERTING;
50 case STATE_CONVERTING: {
59 bool both_digits =
true;
60 for (
int j = 0; j < 2; j++) {
62 const char hex_char = buf_src[i + j];
63 if (!isxdigit(hex_char)) {
67 temp_num_buf[j] = hex_char;
73 temp_num_buf[2] =
'\0';
74 sscanf(temp_num_buf,
"%x", &ascii_character);
77 assert(
int(strlen(buf_dst)) < buf_dst_size);
80 strncat(buf_dst, (
char *)&ascii_character, 1);
93 const size_t decoded_size_max = 4 * buf_src_len + 1;
94 char *buf_dst = (
char *)malloc(decoded_size_max);
96 const size_t decoded_size = strlen(buf_dst) + 1;
97 if (decoded_size != decoded_size_max) {
98 char *buf_dst_trim = (
char *)malloc(decoded_size);
99 memcpy(buf_dst_trim, buf_dst, decoded_size);
101 buf_dst = buf_dst_trim;