diff options
Diffstat (limited to 'ell.c')
-rwxr-xr-x | ell.c | 56 |
1 files changed, 22 insertions, 34 deletions
@@ -172,14 +172,13 @@ new_clone (const struct item *item) { static struct item * new_clone_list (const struct item *item) { - struct item *head = NULL, *clone; + struct item *head = NULL; for (struct item **out = &head; item; item = item->next) { - if (!(clone = *out = new_clone (item))) { + if (!(*out = new_clone (item))) { item_free_list (head); return NULL; } - clone->next = NULL; - out = &clone->next; + out = &(*out)->next; } return head; } @@ -218,26 +217,18 @@ new_list (struct item *head) { enum token { T_ABORT, T_LPAREN, T_RPAREN, T_LBRACKET, T_RBRACKET, T_LBRACE, T_RBRACE, T_STRING, T_NEWLINE, T_AT }; -static const char * -token_name (enum token token) { - switch (token) { - case T_ABORT: return "end of input"; - - case T_LPAREN: return "left parenthesis"; - case T_RPAREN: return "right parenthesis"; - case T_LBRACKET: return "left bracket"; - case T_RBRACKET: return "right bracket"; - case T_LBRACE: return "left brace"; - case T_RBRACE: return "right brace"; - case T_STRING: return "string"; - case T_NEWLINE: return "newline"; - case T_AT: return "at symbol"; - - default: - abort (); - return NULL; - } -} +static const char *token_names[] = { + [T_ABORT] = "end of input", + [T_LPAREN] = "left parenthesis", + [T_RPAREN] = "right parenthesis", + [T_LBRACKET] = "left bracket", + [T_RBRACKET] = "right bracket", + [T_LBRACE] = "left brace", + [T_RBRACE] = "right brace", + [T_STRING] = "string", + [T_NEWLINE] = "newline", + [T_AT] = "at symbol", +}; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -449,8 +440,7 @@ print_tree (struct item *tree, int level) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct parser -{ +struct parser { struct lexer lexer; ///< Tokenizer char *error; ///< Tokenizer error enum token token; ///< Current token in the lexer @@ -505,7 +495,7 @@ parser_expect (struct parser *self, enum token token, jmp_buf out) { self->memory_failure = !(self->error = lexer_errorf (&self->lexer, "unexpected `%s', expected `%s'", - token_name (self->token), token_name (token))); + token_names[self->token], token_names[token])); longjmp (out, 1); } @@ -586,7 +576,7 @@ parse_item (struct parser *self, jmp_buf out) { } self->memory_failure = !(self->error = lexer_errorf (&self->lexer, - "unexpected `%s', expected a value", token_name (self->token))); + "unexpected `%s', expected a value", token_names[self->token])); longjmp (out, 1); } @@ -820,7 +810,8 @@ execute_args (struct context *ctx, struct item *next) { size_t i = 0; for (struct item *arg = args; arg; arg = arg->next) { (void) snprintf (buf, sizeof buf, "%zu", i++); - set (ctx, buf, arg); + if (!set (ctx, buf, arg)) + return false; } item_free_list (args); return true; @@ -848,7 +839,7 @@ execute_statement name = body->value; // TODO: these could be just regular handlers, only top priority if (!strcmp (name, "quote")) { - if ((*result = new_clone_list (following))) + if (!following || (*result = new_clone_list (following))) return true; ctx->memory_failure = true; return false; @@ -881,7 +872,6 @@ execute_statement // This creates some form of a stack trace char *tmp = ctx->error; - ctx->error = NULL; set_error (ctx, "%s -> %s", name, tmp); free (tmp); return false; @@ -1042,11 +1032,9 @@ main (int argc, char *argv[]) { item_free_list (result); item_free_list (program); - const char *failure = NULL; + const char *failure = ctx.error; if (ctx.memory_failure) failure = "memory allocation failure"; - else if (ctx.error) - failure = ctx.error; if (failure) printf ("%s: %s\n", "runtime error", failure); context_free (&ctx); |