summaryrefslogtreecommitdiffhomepage
path: root/main.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-10-13 19:01:02 +0200
committerJo-Philipp Wich <jo@mein.io>2020-10-14 12:23:08 +0200
commit07c147a1803270aba871c9024e021fd913cb8e2a (patch)
treed05fcecf8afc6e82b6c659b272d23029a6cc9249 /main.c
parent05cc0ee7a7c7dc442e22dfdc22c0574ac6b3e71b (diff)
treewide: unify error handling
Get rid of the distinction between lexer/parser errors and runtime exceptions, use exceptions everywhere instead. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'main.c')
-rw-r--r--main.c73
1 files changed, 36 insertions, 37 deletions
diff --git a/main.c b/main.c
index b19e622..2abe485 100644
--- a/main.c
+++ b/main.c
@@ -141,59 +141,56 @@ static void dump(struct ut_state *s, uint32_t off, int level) {
}
#endif /* NDEBUG */
-static enum ut_error_type
-parse(struct ut_state *state, FILE *fp, bool dumponly,
- struct json_object *env, struct json_object *modules)
+static int
+parse(struct ut_state *state, struct ut_source *src, bool dumponly,
+ bool skip_shebang, struct json_object *env, struct json_object *modules)
{
- enum ut_error_type err;
+ struct json_object *rv;
char c, c2, *msg;
+ int rc = 0;
- if (state->skip_shebang) {
- c = fgetc(fp);
- c2 = fgetc(fp);
+ if (skip_shebang) {
+ c = fgetc(src->fp);
+ c2 = fgetc(src->fp);
if (c == '#' && c2 == '!') {
- while ((c = fgetc(fp)) != EOF) {
- state->source->off++;
+ while ((c = fgetc(src->fp)) != EOF) {
+ src->off++;
if (c == '\n')
break;
}
}
else {
- ungetc(c, fp);
- ungetc(c2, fp);
+ ungetc(c, src->fp);
+ ungetc(c2, src->fp);
}
-
- state->skip_shebang = false;
}
- err = ut_parse(state, fp);
-
- if (!err) {
- if (dumponly) {
+ if (dumponly) {
#ifdef NDEBUG
- fprintf(stderr, "Debug support not compiled in\n");
- err = UT_ERROR_EXCEPTION;
+ rv = ut_new_exception(state, 0, "Debug support not compiled in");
#else /* NDEBUG */
+ rv = ut_parse(state, src->fp);
+
+ if (!ut_is_type(rv, T_EXCEPTION))
dump(state, state->main, 0);
#endif /* NDEBUG */
- }
- else {
- err = ut_run(state, env, modules);
- }
+ }
+ else {
+ rv = ut_run(state, env, modules);
}
- if (err) {
- msg = ut_format_error(state, fp);
-
+ if (ut_is_type(rv, T_EXCEPTION)) {
+ msg = ut_format_error(state, src->fp);
fprintf(stderr, "%s\n\n", msg);
free(msg);
+ rc = 1;
}
- ut_free(state);
+ json_object_put(rv);
- return err;
+ return rc;
}
static FILE *
@@ -261,9 +258,10 @@ int
main(int argc, char **argv)
{
struct json_object *env = NULL, *modules = NULL, *o;
+ struct ut_state *state = NULL;
struct ut_source source = {};
- struct ut_state *state;
bool dumponly = false;
+ bool shebang = false;
FILE *envfile = NULL;
char *stdin = NULL;
int opt, rv = 0;
@@ -300,7 +298,7 @@ main(int argc, char **argv)
if (!source.fp) {
fprintf(stderr, "Failed to open %s: %s\n", optarg, strerror(errno));
- rv = UT_ERROR_EXCEPTION;
+ rv = 1;
goto out;
}
@@ -343,7 +341,7 @@ main(int argc, char **argv)
if (!envfile) {
fprintf(stderr, "Failed to open %s: %s\n", optarg, strerror(errno));
- rv = UT_ERROR_EXCEPTION;
+ rv = 1;
goto out;
}
}
@@ -354,8 +352,7 @@ main(int argc, char **argv)
if (!o) {
fprintf(stderr, "Option -%c must point to a valid JSON object\n", opt);
-
- rv = UT_ERROR_EXCEPTION;
+ rv = 1;
goto out;
}
@@ -380,18 +377,19 @@ main(int argc, char **argv)
if (!source.fp && argv[optind] != NULL) {
source.fp = fopen(argv[optind], "rb");
source.filename = xstrdup(argv[optind]);
- state->skip_shebang = 1;
if (!source.fp) {
fprintf(stderr, "Failed to open %s: %s\n", argv[optind], strerror(errno));
- rv = UT_ERROR_EXCEPTION;
+ rv = 1;
goto out;
}
+
+ shebang = true;
}
if (!source.fp) {
fprintf(stderr, "One of -i or -s is required\n");
- rv = UT_ERROR_EXCEPTION;
+ rv = 1;
goto out;
}
@@ -399,12 +397,13 @@ main(int argc, char **argv)
state->sources = state->source;
*state->source = source;
- rv = parse(state, source.fp, dumponly, env, modules);
+ rv = parse(state, state->source, dumponly, shebang, env, modules);
out:
json_object_put(modules);
json_object_put(env);
+ ut_free(state);
free(stdin);
return rv;