summaryrefslogtreecommitdiffstats
path: root/api/c/urlcode.c
diff options
context:
space:
mode:
authorsijanec <sijanecantonluka@gmail.com>2020-12-01 23:50:20 +0100
committersijanec <sijanecantonluka@gmail.com>2020-12-01 23:50:20 +0100
commit5fdb8d8f43e15b9581e8320153eb2e8c24cedac8 (patch)
tree05f9192f178fd698c0a62c9582b0c5d5592f6d67 /api/c/urlcode.c
parentdodal https predlog - hostname fix (diff)
downloadsijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar.gz
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar.bz2
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar.lz
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar.xz
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.tar.zst
sijanec.eu-5fdb8d8f43e15b9581e8320153eb2e8c24cedac8.zip
Diffstat (limited to 'api/c/urlcode.c')
-rw-r--r--api/c/urlcode.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/api/c/urlcode.c b/api/c/urlcode.c
new file mode 100644
index 0000000..ecf34e1
--- /dev/null
+++ b/api/c/urlcode.c
@@ -0,0 +1,48 @@
+/* Converts a hex character to its integer value */
+char from_hex(char ch) {
+ return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
+}
+
+/* Converts an integer value to its hex character*/
+char to_hex(char code) {
+ static char hex[] = "0123456789abcdef";
+ return hex[code & 15];
+}
+
+/* Returns a url-encoded version of str */
+/* IMPORTANT: be sure to free() the returned string after use */
+char *url_encode(char *str) {
+ char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
+ while (*pstr) {
+ if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~')
+ *pbuf++ = *pstr;
+ else if (*pstr == ' ')
+ *pbuf++ = '+';
+ else
+ *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
+ pstr++;
+ }
+ *pbuf = '\0';
+ return buf;
+}
+
+/* Returns a url-decoded version of str */
+/* IMPORTANT: be sure to free() the returned string after use */
+char *url_decode(char *str) {
+ char *pstr = str, *buf = malloc(strlen(str) + 1), *pbuf = buf;
+ while (*pstr) {
+ if (*pstr == '%') {
+ if (pstr[1] && pstr[2]) {
+ *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
+ pstr += 2;
+ }
+ } else if (*pstr == '+') {
+ *pbuf++ = ' ';
+ } else {
+ *pbuf++ = *pstr;
+ }
+ pstr++;
+ }
+ *pbuf = '\0';
+ return buf;
+}