diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-08-24 12:37:54 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-08-25 20:38:10 +0200 |
commit | d86c9ab4c1c7b25cd942c4656626e2feca318857 (patch) | |
tree | 280f238450de50e58fe40675b88754f9b2f71eab /main.c | |
parent | 765b2f9298d8030b459f53f21d03d00b87ef7310 (diff) |
main.c, lib.c: move error formatting logic to lib.c
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 158 |
1 files changed, 13 insertions, 145 deletions
@@ -30,6 +30,7 @@ #include "lexer.h" #include "parser.h" #include "eval.h" +#include "lib.h" static void @@ -45,148 +46,6 @@ print_usage(char *app) app); } -static void -print_error_context(const char *expr, size_t off) -{ - int eoff, eline, padlen; - const char *p, *nl; - int i; - - /* skip lines until error line */ - for (p = nl = expr, eline = 0; *p && p < expr + off; p++) { - if (*p == '\n') { - nl = p + 1; - eline++; - } - } - - eoff = p - nl; - - fprintf(stderr, "In line %u, byte %d:\n\n `", eline + 1, eoff); - - for (p = nl, padlen = 0; *p != '\n' && *p != '\0'; p++) { - switch (*p) { - case '\t': - fprintf(stderr, " "); - if (p < nl + eoff) - padlen += 4; - break; - - case '\r': - case '\v': - fprintf(stderr, " "); - if (p < nl + eoff) - padlen++; - break; - - default: - fprintf(stderr, "%c", *p); - if (p < nl + eoff) - padlen++; - } - } - - fprintf(stderr, "`\n "); - - if (padlen < strlen("Near here ^")) { - for (i = 0; i < padlen; i++) - fprintf(stderr, " "); - - fprintf(stderr, "^-- Near here\n"); - } - else { - fprintf(stderr, "Near here "); - - for (i = strlen("Near here "); i < padlen; i++) - fprintf(stderr, "-"); - - fprintf(stderr, "^\n"); - } - - fprintf(stderr, "\n"); -} - -static void -print_error(struct ut_state *state, const char *expr) -{ - size_t off = state ? state->off : 0; - struct ut_opcode *tag; - bool first = true; - int i, max_i; - - switch (state ? state->error.code : UT_ERROR_OUT_OF_MEMORY) { - case UT_ERROR_NO_ERROR: - return; - - case UT_ERROR_OUT_OF_MEMORY: - fprintf(stderr, "Runtime error: Out of memory\n"); - break; - - case UT_ERROR_UNTERMINATED_COMMENT: - fprintf(stderr, "Syntax error: Unterminated comment\n"); - break; - - case UT_ERROR_UNTERMINATED_STRING: - fprintf(stderr, "Syntax error: Unterminated string\n"); - break; - - case UT_ERROR_UNTERMINATED_BLOCK: - fprintf(stderr, "Syntax error: Unterminated template block\n"); - break; - - case UT_ERROR_UNEXPECTED_CHAR: - fprintf(stderr, "Syntax error: Unexpected character\n"); - break; - - case UT_ERROR_OVERLONG_STRING: - fprintf(stderr, "Syntax error: String or label literal too long\n"); - break; - - case UT_ERROR_INVALID_ESCAPE: - fprintf(stderr, "Syntax error: Invalid escape sequence\n"); - break; - - case UT_ERROR_NESTED_BLOCKS: - fprintf(stderr, "Syntax error: Template blocks may not be nested\n"); - break; - - case UT_ERROR_UNEXPECTED_TOKEN: - fprintf(stderr, "Syntax error: Unexpected token\n"); - - for (i = 0, max_i = 0; i < sizeof(state->error.info.tokens) * 8; i++) - if ((state->error.info.tokens[i / 64] & ((unsigned)1 << (i % 64))) && tokennames[i]) - max_i = i; - - for (i = 0; i < sizeof(state->error.info.tokens) * 8; i++) { - if ((state->error.info.tokens[i / 64] & ((unsigned)1 << (i % 64))) && tokennames[i]) { - if (first) { - fprintf(stderr, "Expecting %s", tokennames[i]); - first = false; - } - else if (i < max_i) { - fprintf(stderr, ", %s", tokennames[i]); - } - else { - fprintf(stderr, " or %s", tokennames[i]); - } - } - } - - fprintf(stderr, "\n"); - break; - - case UT_ERROR_EXCEPTION: - tag = json_object_get_userdata(state->error.info.exception); - off = (tag && tag->operand[0]) ? tag->operand[0]->off : 0; - - fprintf(stderr, "%s\n", json_object_get_string(state->error.info.exception)); - break; - } - - if (off) - print_error_context(expr, off); -} - #ifndef NDEBUG static void dump(struct ut_opcode *op, int level); @@ -272,6 +131,7 @@ parse(const char *source, bool dumponly) { struct ut_state *state = calloc(1, sizeof(*state)); enum ut_error_type err; + char *msg; err = ut_parse(state, source); @@ -289,8 +149,12 @@ parse(const char *source, bool dumponly) } } - if (err) - print_error(state, source); + if (err) { + msg = ut_format_error(state, source); + + fprintf(stderr, "%s\n", msg); + free(msg); + } ut_free(state); @@ -351,7 +215,11 @@ main(int argc, char **argv) tmp = realloc(source, tlen + rlen + 1); if (!tmp) { - print_error(NULL, ""); + tmp = ut_format_error(NULL, ""); + + fprintf(stderr, "%s\n", tmp); + free(tmp); + rv = UT_ERROR_OUT_OF_MEMORY; goto out; } |