diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-10-02 17:37:19 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-10-02 19:19:30 +0200 |
commit | 96aafdf30e6557e5fdf3e80c7dee4e1dab73e898 (patch) | |
tree | 167e1b4c2cea9eceb1f383412fea65594874f729 | |
parent | 74a73e2c41ed9661e32a26fe1460a1b8a68961e7 (diff) |
main: track current template filename during execution
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | ast.c | 1 | ||||
-rw-r--r-- | ast.h | 1 | ||||
-rw-r--r-- | lib.c | 18 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rwxr-xr-x | run_tests.sh | 2 |
5 files changed, 21 insertions, 5 deletions
@@ -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); } @@ -107,6 +107,7 @@ struct ut_state { uint8_t off; } stack; struct json_object *ctx; + char *filename; }; struct ut_extended_type { @@ -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); @@ -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" |