aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-23 14:32:16 -0400
committerChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-23 14:32:16 -0400
commitafbe6b2eb51b6cf7ebcf21d1390e515c406ad68d (patch)
treef5850136d783a54da1d3da62eb2f8fea162a4bde
parentjanet: rewrite jurl.janet (diff)
native: add escape/unescape
-rw-r--r--jurl.c41
-rw-r--r--jurl.h2
-rw-r--r--main.c10
3 files changed, 51 insertions, 2 deletions
diff --git a/jurl.c b/jurl.c
index d549441..562ce2f 100644
--- a/jurl.c
+++ b/jurl.c
@@ -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));
diff --git a/jurl.h b/jurl.h
index 5cb5c4f..6a23a81 100644
--- a/jurl.h
+++ b/jurl.h
@@ -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);
diff --git a/main.c b/main.c
index 7259193..c5c94ee 100644
--- a/main.c
+++ b/main.c
@@ -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),