From: Lukas Krickl Date: Sun, 19 Nov 2023 11:47:17 +0000 (+0100) Subject: Added expression buffer X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=7b0711d716d6fa29519c1a20aefbc3b0c9fa7c02;p=ulas%2F.git Added expression buffer --- diff --git a/include/ulas.h b/include/ulas.h index 85bf25e..6cbb8f4 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -120,6 +120,13 @@ struct ulas_tokbuf { long maxlen; }; +// the expression buffer hold expression buffers +struct ulas_exprbuf { + struct ulas_expr *buf; + unsigned long len; + unsigned long maxlen; +}; + /** * Assembly context */ @@ -133,6 +140,7 @@ struct ulas { // current token stream struct ulas_tokbuf toks; + struct ulas_exprbuf exprs; unsigned int address; @@ -253,12 +261,6 @@ struct ulas_expr { long next; }; -struct ulas_exprbuf { - struct ulas_expr *exprs; - unsigned long len; - unsigned long maxlen; -}; - /** * asm */ @@ -373,6 +375,11 @@ void ulas_tokbufpush(struct ulas_tokbuf *tb, struct ulas_tok tok); void ulas_tokbufclear(struct ulas_tokbuf *tb); void ulas_tokbuffree(struct ulas_tokbuf *tb); +struct ulas_exprbuf ulas_exprbuf(void); +void ulas_exprbufpush(struct ulas_exprbuf *eb, struct ulas_expr expr); +void ulas_exprbufclear(struct ulas_exprbuf *eb); +void ulas_exprbuffree(struct ulas_exprbuf *eb); + /** * Assembly step */ diff --git a/src/test.c b/src/test.c index b8aefcd..ab6326b 100644 --- a/src/test.c +++ b/src/test.c @@ -230,9 +230,20 @@ void test_totok(void) { TESTEND("totok"); } +#define ASSERT_INTEXPR(expected_val, expected_rc, expr) \ + { \ + int rc = 0; \ + const char *oexpr = expr; \ + int val = ulas_intexpr(&oexpr, strlen((expr)), &rc); \ + assert(rc == (expected_rc)); \ + assert(val == (expected_val)); \ + } + void test_intexpr(void) { TESTBEGIN("intexpr"); + ASSERT_INTEXPR(1, 0, "1 == 1"); + TESTEND("intexpr"); } diff --git a/src/ulas.c b/src/ulas.c index 0279fa3..bcb9236 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -300,7 +300,7 @@ struct ulas_tok ulas_totok(char *buf, unsigned long n, int *rc) { while (*buf && *buf != '\"') { if (*buf == '\\') { buf++; - tok.val.strv[i] = ulas_unescape(*buf, rc); + tok.val.strv[i] = (char)ulas_unescape(*buf, rc); } else { tok.val.strv[i] = *buf; } @@ -952,6 +952,34 @@ void ulas_tokbuffree(struct ulas_tokbuf *tb) { free(tb->buf); } +struct ulas_exprbuf ulas_exprbuf(void) { + struct ulas_exprbuf eb; + memset(&eb, 0, sizeof(eb)); + + eb.maxlen = 10; + eb.buf = malloc(sizeof(struct ulas_expr) * eb.maxlen); + + return eb; +} + +void ulas_exprbufpush(struct ulas_exprbuf *eb, struct ulas_expr expr) { + if (eb->len >= eb->maxlen) { + eb->maxlen *= 2; + void *newbuf = realloc(eb->buf, eb->maxlen * sizeof(struct ulas_expr)); + if (!newbuf) { + ULASPANIC("%s\n", strerror(errno)); + } + eb->buf = newbuf; + } + + eb->buf[eb->len] = expr; + eb->len++; +} + +void ulas_exprbufclear(struct ulas_exprbuf *eb) { eb->len = 0; } + +void ulas_exprbuffree(struct ulas_exprbuf *eb) { free(eb->buf); } + /** * Assembly step */ @@ -986,6 +1014,8 @@ end: // parses tokens to expression tree int ulas_parseexpr(struct ulas_tokbuf *toks) { + ulas_exprbufclear(&ulas.exprs); + int rc = 0; for (long i = 0; i < toks->len; i++) { }