diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2005-06-26 22:18:37 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2005-06-26 22:18:37 +0000 |
commit | 5817f82ba852fd72466dea176548c5cedfad677a (patch) | |
tree | b179d23f26146e8bdfee86c16561285fd684c2df /utils | |
parent | 3286c99dd514b7aa20b23477e17f9b63a4d65bf9 (diff) | |
download | netsurf-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.c | 49 | ||||
-rw-r--r-- | utils/url.h | 1 |
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 |