diff options
| author | 2023-03-23 14:32:16 -0400 | |
|---|---|---|
| committer | 2023-03-23 14:32:16 -0400 | |
| commit | afbe6b2eb51b6cf7ebcf21d1390e515c406ad68d (patch) | |
| tree | f5850136d783a54da1d3da62eb2f8fea162a4bde | |
| parent | janet: rewrite jurl.janet (diff) | |
native: add escape/unescape
| -rw-r--r-- | jurl.c | 41 | ||||
| -rw-r--r-- | jurl.h | 2 | ||||
| -rw-r--r-- | main.c | 10 |
3 files changed, 51 insertions, 2 deletions
@@ -1,7 +1,7 @@ // jurl.c - a curl_easy minimal wrapper for janet #include "jurl.h" -int jurl_gc(void *p, size_t s) { +static int jurl_gc(void *p, size_t s) { (void) s; jurl_handle *jurl = (jurl_handle*)p; if (jurl->handle) curl_easy_cleanup(jurl->handle); @@ -37,7 +37,7 @@ static int jurl_get(void *p, Janet key, Janet *out) { return janet_getmethod(janet_unwrap_keyword(key), jurl_methods, out); } -const JanetAbstractType jurl_type = { +static const JanetAbstractType jurl_type = { "jurl", // name jurl_gc, // gc NULL, // gcmark @@ -70,6 +70,43 @@ JANET_CFUN(jurl_wrap_error) { return janet_wrap_tuple(janet_tuple_n(argv, 2)); } +JANET_CFUN(jurl_escape) { + janet_fixarity(argc, 1); + JanetByteView b = janet_getbytes(argv, 0); + CURL* curl; +#if !CURL_AT_LEAST_VERSION(7,82,0) + curl = curl_easy_init(); +#endif + + char *s = curl_easy_escape(curl, (const char*)b.bytes, b.len); + Janet out = janet_cstringv(s); + + curl_free(s); +#if !CURL_AT_LEAST_VERSION(7,82,0) + curl_easy_cleanup(curl); +#endif + return out; +} + +JANET_CFUN(jurl_unescape) { + janet_fixarity(argc, 1); + JanetByteView b = janet_getbytes(argv, 0); + CURL *curl; +#if !CURL_AT_LEAST_VERSION(7,82,0) + curl = curl_easy_init(); +#endif + + int len; + char *s = curl_easy_unescape(curl, (const char*)b.bytes, b.len, &len); + Janet out = janet_stringv((const uint8_t*)s, len); + + curl_free(s); +#if !CURL_AT_LEAST_VERSION(7,82,0) + curl_easy_cleanup(curl); +#endif + return out; +} + JANET_CFUN(jurl_new) { janet_fixarity(argc, 0); jurl_handle *jurl = (jurl_handle*)janet_abstract(&jurl_type, sizeof(jurl)); @@ -22,6 +22,8 @@ typedef struct jurl_handle jurl_handle; // jurl.c struct jurl_cleanup *register_cleanup(jurl_handle *jurl, enum jurl_cleanup_type type); +JANET_CFUN(jurl_escape); +JANET_CFUN(jurl_unescape); JANET_CFUN(jurl_new); JANET_CFUN(jurl_reset); JANET_CFUN(jurl_dup); @@ -7,6 +7,14 @@ #define JANET_FN JANET_FN_D // jurl.c +JANET_FN(jurl_escape, + "(jurl-native/escape string)", + "Returns URL-encoded version of string"); + +JANET_FN(jurl_unescape, + "(jurl-native/unescape string)", + "Return URL-decoded version of string"); + JANET_FN(jurl_new, "(jurl-native/new)", "Create new jurl handle"); @@ -62,6 +70,8 @@ JANET_FN(jurl_setopt, static const JanetRegExt cfuns[] = { // jurl.c + JANET_REG("escape", jurl_escape), + JANET_REG("unescape", jurl_unescape), JANET_REG("new", jurl_new), JANET_REG("reset", jurl_reset), JANET_REG("dup", jurl_dup), |
