summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-10-02 17:37:19 +0200
committerJo-Philipp Wich <jo@mein.io>2020-10-02 19:19:30 +0200
commit96aafdf30e6557e5fdf3e80c7dee4e1dab73e898 (patch)
tree167e1b4c2cea9eceb1f383412fea65594874f729
parent74a73e2c41ed9661e32a26fe1460a1b8a68961e7 (diff)
main: track current template filename during execution
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--ast.c1
-rw-r--r--ast.h1
-rw-r--r--lib.c18
-rw-r--r--main.c4
-rwxr-xr-xrun_tests.sh2
5 files changed, 21 insertions, 5 deletions
diff --git a/ast.c b/ast.c
index 8efc370..19ff534 100644
--- a/ast.c
+++ b/ast.c
@@ -397,6 +397,7 @@ ut_free(struct ut_state *s)
json_object_put(ut_ext_types[--ut_ext_types_count].proto);
free(ut_ext_types);
+ free(s->filename);
free(s);
}
diff --git a/ast.h b/ast.h
index 92e021e..20f74a4 100644
--- a/ast.h
+++ b/ast.h
@@ -107,6 +107,7 @@ struct ut_state {
uint8_t off;
} stack;
struct json_object *ctx;
+ char *filename;
};
struct ut_extended_type {
diff --git a/lib.c b/lib.c
index a5e6001..4633224 100644
--- a/lib.c
+++ b/lib.c
@@ -70,7 +70,7 @@ snprintf_append(char **dptr, size_t *dlen, const char *fmt, ssize_t sz, ...)
snprintf_append(dptr, dlen, fmt, -1, ##__VA_ARGS__)
static void
-format_error_context(char **msg, size_t *msglen, const char *expr, size_t off)
+format_error_context(char **msg, size_t *msglen, const char *path, const char *expr, size_t off)
{
int eoff, eline, padlen;
const char *p, *nl;
@@ -86,7 +86,12 @@ format_error_context(char **msg, size_t *msglen, const char *expr, size_t off)
eoff = p - nl;
- sprintf_append(msg, msglen, "In line %u, byte %d:\n\n `", eline + 1, eoff);
+ if (path)
+ sprintf_append(msg, msglen, "In %s, ", path);
+ else
+ sprintf_append(msg, msglen, "In ");
+
+ sprintf_append(msg, msglen, "line %u, byte %d:\n\n `", eline + 1, eoff);
for (p = nl, padlen = 0; *p != '\n' && *p != '\0'; p++) {
switch (*p) {
@@ -217,7 +222,7 @@ ut_format_error(struct ut_state *state, const char *expr)
}
if (off)
- format_error_context(&msg, &msglen, expr, off);
+ format_error_context(&msg, &msglen, state->filename, expr, off);
return msg;
}
@@ -1635,8 +1640,8 @@ static struct json_object *
ut_require_path(struct ut_state *s, uint32_t off, const char *path_template, const char *name)
{
struct json_object *rv = NULL;
+ char *path = NULL, *filename;
const char *p, *q, *last;
- char *path = NULL;
size_t plen = 0;
p = strchr(path_template, '*');
@@ -1661,11 +1666,16 @@ ut_require_path(struct ut_state *s, uint32_t off, const char *path_template, con
}
}
+ filename = s->filename;
+ s->filename = path;
+
if (!strcmp(p, ".so"))
rv = ut_require_so(s, off, path);
else if (!strcmp(p, ".utpl"))
rv = ut_require_utpl(s, off, path);
+ s->filename = filename;
+
invalid:
free(path);
diff --git a/main.c b/main.c
index a23a39d..8cb2232 100644
--- a/main.c
+++ b/main.c
@@ -280,6 +280,9 @@ main(int argc, char **argv)
goto out;
}
+ if (strcmp(optarg, "-"))
+ state->filename = strdup(optarg);
+
break;
case 'd':
@@ -349,6 +352,7 @@ main(int argc, char **argv)
if (!srcstr && !srcfile && argv[optind] != NULL) {
srcfile = read_file(argv[optind]);
state->skip_shebang = 1;
+ state->filename = strdup(argv[optind]);
if (!srcfile) {
rv = UT_ERROR_EXCEPTION;
diff --git a/run_tests.sh b/run_tests.sh
index 58465d4..78b93c1 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -47,7 +47,7 @@ run_testcase() {
local code=$6
local fail=0
- ./utpl -i "$in" >"$dir/res.out" 2>"$dir/res.err"
+ ./utpl -i - <"$in" >"$dir/res.out" 2>"$dir/res.err"
printf "%d\n" $? > "$dir/res.code"