aboutsummaryrefslogtreecommitdiff
path: root/src/util.c
blob: f9a7b1c334e3dd81c31dd8ee0385b15617186844 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// util.c: implements wrappers around libcurl functions that don't fit anywhere else
#include "jurl.h"

int janet_getslist(struct curl_slist **slist, Janet *argv, int32_t n) {
	JanetView args = janet_getindexed(argv, n);
	for (int32_t i = 0; i< args.len; i++) {
		const char *s = janet_getcstring(args.items, i);
		struct curl_slist *newlist = curl_slist_append(*slist, s);
		if (!newlist) {
			return 0;
		}
		*slist = newlist;
	}
	return 1;
}

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;
}

// this function plays fast and loose and I hope the gc doesn't kill me for it
// anyway, it goes like so:
// (wrap-error :ok  something) -> [:ok something]
// (wrap-error :err something) -> [:err "explanation of :err"]
JANET_CFUN(jurl_wrap_error) {
	janet_fixarity(argc, 2);
	CURLcode code;
	if (janet_checktype(argv[0], JANET_NUMBER)) {
		argv[0] = jurl_geterror(janet_getinteger(argv, 0));
	}
	if (!janet_checktype(argv[0], JANET_KEYWORD)) {
		janet_panicf("jurl_wrap_error: expected number or keyword, got %T", janet_type(argv[0]));
	}
	if (!janet_keyeq(argv[0], "ok")) {
		// will this break one day?
		// find out next time!
		argv[1] = jurl_strerror(1, argv);
	}
	return janet_wrap_tuple(janet_tuple_n(argv, 2));
}