summaryrefslogtreecommitdiffhomepage
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c71
1 files changed, 36 insertions, 35 deletions
diff --git a/lib.c b/lib.c
index 1ca1c6d..d2222f4 100644
--- a/lib.c
+++ b/lib.c
@@ -134,10 +134,10 @@ char *
ut_format_error(struct ut_state *state, const char *expr)
{
size_t off = state ? state->off : 0;
- struct ut_op *tag;
- bool first = true;
+ char *msg = NULL, *p;
size_t msglen = 0;
- char *msg = NULL;
+ bool first = true;
+ struct ut_op *op;
int i, max_i;
switch (state ? state->error.code : UT_ERROR_OUT_OF_MEMORY) {
@@ -202,10 +202,11 @@ ut_format_error(struct ut_state *state, const char *expr)
break;
case UT_ERROR_EXCEPTION:
- tag = json_object_get_userdata(state->error.info.exception);
- off = (tag && tag->tree.operand[0]) ? ut_get_op(state, tag->tree.operand[0])->off : 0;
+ p = state->error.info.exception.message;
+ op = ut_get_op(state, state->error.info.exception.off);
+ off = op ? op->off : 0;
- sprintf_append(&msg, &msglen, "%s\n", json_object_get_string(state->error.info.exception));
+ sprintf_append(&msg, &msglen, "%s\n", p ? p : UT_ERRMSG_OOM);
break;
}
@@ -509,7 +510,7 @@ ut_chr(struct ut_state *s, uint32_t off, struct json_object *args)
str = calloc(1, len);
if (!str)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
for (idx = 0; idx < len; idx++) {
n = ut_cast_int64(json_object_array_get_idx(args, idx));
@@ -553,7 +554,7 @@ ut_die(struct ut_state *s, uint32_t off, struct json_object *args)
{
const char *msg = json_object_get_string(json_object_array_get_idx(args, 0));
- return ut_exception(s, off, "%s", msg ? msg : "Died");
+ ut_throw(s, off, "%s", msg ? msg : "Died");
}
static struct json_object *
@@ -603,7 +604,7 @@ ut_filter(struct ut_state *s, uint32_t off, struct json_object *args)
ut_putval(arr);
ut_putval(cmpargs);
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
}
json_object_array_put_idx(cmpargs, 2, json_object_get(obj));
@@ -679,7 +680,7 @@ ut_join(struct ut_state *s, uint32_t off, struct json_object *args)
p = res = calloc(1, len);
if (!res)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
for (arrlen = json_object_array_length(arr), arridx = 0; arridx < arrlen; arridx++) {
if (arridx > 0) {
@@ -725,7 +726,7 @@ ut_keys(struct ut_state *s, uint32_t off, struct json_object *args)
arr = json_object_new_array();
if (!arr)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
json_object_object_foreach(obj, key, val)
json_object_array_add(arr, json_object_new_string(key));
@@ -747,7 +748,7 @@ ut_lc(struct ut_state *s, uint32_t off, struct json_object *args)
res = p = calloc(1, len);
if (!res)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
while (*str)
if (*str >= 'A' && *str <= 'Z')
@@ -779,7 +780,7 @@ ut_map(struct ut_state *s, uint32_t off, struct json_object *args)
ut_putval(arr);
ut_putval(cmpargs);
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
}
json_object_array_put_idx(cmpargs, 2, json_object_get(obj));
@@ -865,7 +866,7 @@ ut_reverse(struct ut_state *s, uint32_t off, struct json_object *args)
rv = json_object_new_array();
if (!rv)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
for (arridx = json_object_array_length(obj); arridx > 0; arridx--)
json_object_array_add(rv, json_object_get(json_object_array_get_idx(obj, arridx - 1)));
@@ -876,7 +877,7 @@ ut_reverse(struct ut_state *s, uint32_t off, struct json_object *args)
p = dup = calloc(1, len + 1);
if (!dup)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
while (len > 0)
*p++ = str[--len];
@@ -935,7 +936,7 @@ ut_sort(struct ut_state *s, uint32_t off, struct json_object *args)
sort_ctx.args = json_object_new_array();
if (!sort_ctx.args)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
}
json_object_array_sort(arr, sort_fn);
@@ -1032,7 +1033,7 @@ ut_split(struct ut_state *s, uint32_t off, struct json_object *args)
arr = json_object_new_array();
if (!arr)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
sepstr = json_object_get_string(sep);
splitstr = json_object_get_string(str);
@@ -1139,7 +1140,7 @@ ut_uc(struct ut_state *s, uint32_t off, struct json_object *args)
res = p = calloc(1, len);
if (!res)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
while (*str)
if (*str >= 'a' && *str <= 'z')
@@ -1180,7 +1181,7 @@ ut_uchr(struct ut_state *s, uint32_t off, struct json_object *args)
str = calloc(1, ulen);
if (!str)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
for (idx = 0, p = str, rem = ulen; idx < len; idx++) {
n = ut_cast_int64(json_object_array_get_idx(args, idx));
@@ -1207,7 +1208,7 @@ ut_values(struct ut_state *s, uint32_t off, struct json_object *args)
arr = json_object_new_array();
if (!arr)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
json_object_object_foreach(obj, key, val) {
(void)key;
@@ -1470,7 +1471,7 @@ ut_sprintf(struct ut_state *s, uint32_t off, struct json_object *args)
len = ut_printf_common(s, off, args, &str);
if (!str)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
return json_object_new_string_len(str, len);
}
@@ -1484,7 +1485,7 @@ ut_printf(struct ut_state *s, uint32_t off, struct json_object *args)
len = ut_printf_common(s, off, args, &str);
if (!str)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
len = fwrite(str, 1, len, stdout);
@@ -1506,17 +1507,17 @@ ut_require_so(struct ut_state *s, uint32_t off, const char *path)
dlh = dlopen(path, RTLD_LAZY|RTLD_LOCAL);
if (!dlh)
- return ut_exception(s, off, "Unable to dlopen file %s: %s", path, dlerror());
+ ut_throw(s, off, "Unable to dlopen file %s: %s", path, dlerror());
init = dlsym(dlh, "ut_module_init");
if (!init)
- return ut_exception(s, off, "Module %s provides no 'ut_module_init' function", path);
+ ut_throw(s, off, "Module %s provides no 'ut_module_init' function", path);
scope = json_object_new_object();
if (!scope)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
init(&ut, s, scope);
@@ -1526,8 +1527,8 @@ ut_require_so(struct ut_state *s, uint32_t off, const char *path)
static struct json_object *
ut_require_utpl(struct ut_state *s, uint32_t off, const char *path)
{
- struct json_object *ex, *scope;
- char *source, *msg;
+ struct json_object *scope;
+ char *source, *msg, *p;
struct stat st;
FILE *sfile;
@@ -1537,14 +1538,14 @@ ut_require_utpl(struct ut_state *s, uint32_t off, const char *path)
sfile = fopen(path, "rb");
if (!sfile)
- return ut_exception(s, off, "Unable to open file %s: %s", path, strerror(errno));
+ ut_throw(s, off, "Unable to open file %s: %s", path, strerror(errno));
source = calloc(1, st.st_size + 1);
if (!source) {
fclose(sfile);
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
}
fread(source, 1, st.st_size, sfile);
@@ -1552,12 +1553,12 @@ ut_require_utpl(struct ut_state *s, uint32_t off, const char *path)
if (ut_parse(s, source)) {
msg = ut_format_error(s, source);
- ex = ut_exception(s, off, "Module loading failed: %s", msg);
-
+ p = alloca(strlen(msg));
+ strcpy(p, msg);
free(source);
free(msg);
- return ex;
+ ut_throw(s, off, "Module loading failed: %s", p);
}
free(source);
@@ -1565,7 +1566,7 @@ ut_require_utpl(struct ut_state *s, uint32_t off, const char *path)
scope = json_object_new_object();
if (!scope)
- return ut_exception(s, off, UT_ERRMSG_OOM);
+ ut_throw(s, off, UT_ERRMSG_OOM);
return ut_invoke(s, off, scope, ut_get_op(s, s->main)->val, NULL);
}
@@ -1626,7 +1627,7 @@ ut_require(struct ut_state *s, uint32_t off, struct json_object *args)
search = json_object_object_get(s->stack.scope[0], "REQUIRE_SEARCH_PATH");
if (!json_object_is_type(search, json_type_array))
- return ut_exception(s, off, "Global require search path not set");
+ ut_throw(s, off, "Global require search path not set");
for (arridx = 0, arrlen = json_object_array_length(search); arridx < arrlen; arridx++) {
se = json_object_array_get_idx(search, arridx);
@@ -1640,7 +1641,7 @@ ut_require(struct ut_state *s, uint32_t off, struct json_object *args)
return res;
}
- return ut_exception(s, off, "No module named '%s' could be found", name);
+ ut_throw(s, off, "No module named '%s' could be found", name);
}
static struct json_object *