From 2d2d545966d5b5058a6a2dba434cc86679e06765 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Sat, 22 May 2021 21:04:54 +0000 Subject: add sub-module 'url' to decode URL encoding --- url.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ url.h | 7 +++++++ 2 files changed, 69 insertions(+) create mode 100644 url.c create mode 100644 url.h diff --git a/url.c b/url.c new file mode 100644 index 0000000..23c0e45 --- /dev/null +++ b/url.c @@ -0,0 +1,62 @@ +#include +#include + +#include "xstring.h" +#include "url.h" + +static int url_decode_hex_char(const char *query) +{ + int out = 0, ch, i; + for(i = 0; i < 2; i++) { + ch = *query; + out <<= 4; + if(isdigit(ch)) + out += ch - '0'; + else if(isalpha(ch)) + out += tolower(ch) - 'a' + 10; + else + return -1; + query++; + } + return out; +} + +static string *url_decode(const char **query, char delimiter) +{ + int ch; + const char *str = *query; + string *dest = string_alloc(NULL, NULL); + + while((ch = *str)) { + str++; + + if(ch == delimiter) + break; + + if(ch == '%') { + ch = url_decode_hex_char(str); + if(ch) { + string_addch(dest, ch); + str += 2; + } + continue; + } + + if(ch == '+') + string_addch(dest, ' '); + else + string_addch(dest, ch); + } + *query = str; + return dest; +} + +string *url_get_param_name(const char **query) +{ + return url_decode(query, '='); +} + +string *url_get_param_value(const char **query) +{ + return url_decode(query, '&'); +} \ No newline at end of file diff --git a/url.h b/url.h new file mode 100644 index 0000000..8654094 --- /dev/null +++ b/url.h @@ -0,0 +1,7 @@ +#ifndef CTIMELINE_URL_H +#define CTIMELINE_URL_H + +string *url_get_param_name(const char **query); +string *url_get_param_value(const char **query); + +#endif /* CTIMELINE_UI_COMMON_H */ -- cgit v1.2.3-18-g5258