summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2005-06-26 22:18:37 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2005-06-26 22:18:37 +0000
commit5817f82ba852fd72466dea176548c5cedfad677a (patch)
treeb179d23f26146e8bdfee86c16561285fd684c2df /utils
parent3286c99dd514b7aa20b23477e17f9b63a4d65bf9 (diff)
downloadnetsurf-5817f82ba852fd72466dea176548c5cedfad677a.tar.gz
netsurf-5817f82ba852fd72466dea176548c5cedfad677a.tar.bz2
[project @ 2005-06-26 22:18:37 by jmb]
Improve clarity of use of utf8_to_enc. Remove use of curl_escape - url_escape does similar things, just better. svn path=/import/netsurf/; revision=1766
Diffstat (limited to 'utils')
-rw-r--r--utils/url.c49
-rw-r--r--utils/url.h1
2 files changed, 50 insertions, 0 deletions
diff --git a/utils/url.c b/utils/url.c
index fa3d0dd8d..d94c5fad3 100644
--- a/utils/url.c
+++ b/utils/url.c
@@ -595,7 +595,56 @@ url_func_result url_nice(const char *url, char **result)
return URL_FUNC_OK;
}
+/**
+ * Escape a string suitable for inclusion in an URI
+ *
+ * \param unescaped The unescaped string
+ * \param result Pointer to location to store escaped string
+ * \return URL_FUNC_OK on success
+ */
+url_func_result url_escape(const char *unescaped, char **result)
+{
+ int len;
+ char *escaped, *d;
+ const char *c;
+
+ if (!unescaped || !result)
+ return URL_FUNC_FAILED;
+
+ *result = NULL;
+
+ len = strlen(unescaped);
+
+ escaped = malloc(len * 3 + 1);
+ if (!escaped)
+ return URL_FUNC_NOMEM;
+ for (c = unescaped, d = escaped; *c; c++) {
+ if (!isascii(*c) ||
+ strchr(";/?:@&=+$," "<>#%\"{}|\\^[]`", *c) ||
+ *c <= 0x20 || *c == 0x7f) {
+ *d++ = '%';
+ *d++ = "0123456789ABCDEF"[((*c >> 4) & 0xf)];
+ *d++ = "0123456789ABCDEF"[(*c & 0xf)];
+ }
+ else {
+ /* unreserved characters: [a-zA-Z0-9-_.!~*'()] */
+ *d++ = *c;
+ }
+ }
+
+ (*result) = malloc(++d - escaped + 1);
+ if (!(*result)) {
+ free(escaped);
+ return URL_FUNC_NOMEM;
+ }
+ snprintf((*result), d - escaped, "%s", escaped);
+ (*result)[d - escaped] = '\0';
+
+ free(escaped);
+
+ return URL_FUNC_OK;
+}
#ifdef TEST
diff --git a/utils/url.h b/utils/url.h
index 8ebc1e3f2..d803eafeb 100644
--- a/utils/url.h
+++ b/utils/url.h
@@ -25,5 +25,6 @@ url_func_result url_join(const char *rel, const char *base, char **result);
url_func_result url_host(const char *url, char **result);
url_func_result url_scheme(const char *url, char **result);
url_func_result url_nice(const char *url, char **result);
+url_func_result url_escape(const char *unescaped, char **result);
#endif