From: Lukas Krickl Date: Mon, 20 Nov 2023 06:03:04 +0000 (+0100) Subject: Added literal expressions X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=c128c050c14de55dbc150e2ed9d4bf13ddf4adbb;p=ulas%2F.git Added literal expressions --- diff --git a/include/ulas.h b/include/ulas.h index fa212c2..f9305c8 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -366,9 +366,9 @@ char *ulas_preprocexpand(struct ulas_preproc *pp, const char *raw_line, */ // convert literal to its int value -int ulas_litint(struct ulas_tok *lit, int *rc); +int ulas_valint(struct ulas_tok *lit, int *rc); // convert literal to its char value -char *ulas_litchar(struct ulas_tok *lit, int *rc); +char *ulas_valstr(struct ulas_tok *lit, int *rc); struct ulas_tokbuf ulas_tokbuf(void); diff --git a/src/ulas.c b/src/ulas.c index 5eef8b6..77a1e0b 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -895,8 +895,9 @@ fail: * Literals, tokens and expressions */ -int ulas_litint(struct ulas_tok *lit, int *rc) { - if (lit->type != ULAS_INT) { +int ulas_valint(struct ulas_tok *lit, int *rc) { + if (!lit || lit->type != ULAS_INT) { + ULASERR("Expected int\n"); *rc = -1; return 0; } @@ -904,8 +905,9 @@ int ulas_litint(struct ulas_tok *lit, int *rc) { return lit->val.intv; } -char *ulas_litchar(struct ulas_tok *lit, int *rc) { - if (lit->type != ULAS_STR) { +char *ulas_valstr(struct ulas_tok *lit, int *rc) { + if (!lit || lit->type != ULAS_STR) { + ULASERR("Expected str\n"); *rc = -1; return NULL; } @@ -1049,10 +1051,10 @@ int ulas_parseprim(int *i) { return -1; } - *i += 1; struct ulas_expprim prim = {*i}; union ulas_expval val = {.prim = prim}; struct ulas_expr e = {ULAS_EXPPRIM, val, -1}; + *i += 1; return ulas_exprbufpush(&ulas.exprs, e); } @@ -1108,16 +1110,27 @@ int ulas_parseexpr(void) { return rc; } -int ulas_intexpreval(int *rc, int i) { +int ulas_intexpreval(int i, int *rc) { struct ulas_expr *e = ulas_exprbufget(&ulas.exprs, i); if (!e) { ULASERR("unable to evaluate expression\n"); *rc = -1; return 0; } - + int result = 0; + switch (e->type) { + case ULAS_EXPBIN: + case ULAS_EXPUN: + case ULAS_EXPGRP: + break; + case ULAS_EXPPRIM: { + struct ulas_tok *t = ulas_tokbufget(&ulas.toks, e->val.prim.tok); + return ulas_valint(t, rc); + } + } + return result; } @@ -1134,7 +1147,7 @@ int ulas_intexpr(const char **line, unsigned long n, int *rc) { // execute the tree of expressions - return ulas_intexpreval(rc, 0); + return ulas_intexpreval(0, rc); } int ulas_asmline(FILE *dst, FILE *src, const char *line, unsigned long n) {