From 9a4c5a2c46b124415096d923e2a1a5a414fd432a Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Mon, 6 Nov 2023 18:03:41 +0100 Subject: [PATCH] WIP: Added test for tokline --- include/ulas.h | 48 ++++++++++++++++++++++++++++++++++++++---------- src/test.c | 18 ++++++++++++++---- src/ulas.c | 7 ++++--- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/include/ulas.h b/include/ulas.h index ef7148b..10cf87a 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -42,6 +42,21 @@ extern FILE *ulasin; extern FILE *ulasout; extern FILE *ulaserr; +// NULL for int based lookup +#define INULL (-1) + +// expression index in the expression list +typedef int iexpr; + +// token index in the token list +typedef int itok; + +// string index in the string list +typedef int istr; + +struct ulas_expr; +struct ulas_tok; + struct ulas_config { // argv represents file names char **argv; @@ -52,6 +67,15 @@ struct ulas_config { bool verbose; }; +/** + * Assembly context + */ + +struct ulas { + char **strs; + size_t strslen; +}; + /** * Tokens */ @@ -65,7 +89,7 @@ enum ulas_toks { }; struct ulas_tokliteral { - const char *literal; + istr literal; }; union ulas_tokdat { @@ -82,30 +106,34 @@ struct ulas_tok { */ struct ulas_sym { - const char *name; + istr name; }; /** * Expressions + * + * Expressions use an index based lookup instead of + * actual pointers to allow easy dumping of the structure to a file + * as well as realloc calls. As an index the integer based iexpr and itok + * denote which data type is supposed to be looked up. An iexpr or itok value of + * -1 denotes a NULL value */ -struct ulas_expr; - enum ulas_exprs { ULAS_EXPUNARY, ULAS_EXPBINARY, ULAS_EXPLITERAL }; struct ulas_expunary { - struct ulas_expr *left; - struct ulas_tok *op; + iexpr left; + itok op; }; struct ulas_expbinary { - struct ulas_expr *left; - struct ulas_expr *right; - struct ulas_tok *op; + iexpr left; + iexpr right; + itok op; }; struct ulas_expliteral { - struct ulas_tok *tok; + itok tok; }; union ulas_expdat { diff --git a/src/test.c b/src/test.c index 280dd44..aae3cad 100644 --- a/src/test.c +++ b/src/test.c @@ -14,8 +14,18 @@ assert(strcmp(buf, expected_tok) == 0); \ } -#define assert_tokline(expected_toks, expected_n, line, rule) \ - {} +#define assert_tokline(expected_n, line, rule, ...) \ + { \ + char *expect[] = __VA_ARGS__; \ + size_t n = 0; \ + char **toks = ulas_tokline(line, &n, rule); \ + assert(toks); \ + assert(n == expected_n); \ + for (size_t i = 0; i < n; i++) { \ + assert(strcmp(toks[i], expect[i]) == 0); \ + } \ + ulas_toklinefree(toks, n); \ + } void test_tok(void) { TESTBEGIN("tok"); @@ -26,8 +36,8 @@ void test_tok(void) { assert_tok("", 0, "", ulas_tokrulespace); assert_tok("", -1, NULL, ulas_tokrulespace); - assert_tokline(({"test", "tokens", "with", "line"}), 4, - " test tokens with line", ulas_tokrulespace); + assert_tokline(4, " test tokens with line", ulas_tokrulespace, + {"test", "tokens", "with", "line"}); TESTEND("tok"); } diff --git a/src/ulas.c b/src/ulas.c index a80853c..aa5b0a5 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -83,7 +83,7 @@ int ulas_tok(char *dst, const char *line, size_t n, ulas_tokrule rule) { } #undef weld_tokcond - dst[write + 1] = '\0'; + dst[write] = '\0'; return i; } @@ -108,12 +108,13 @@ char **ulas_tokline(const char *line, size_t *n, ulas_tokrule rule) { } dst = newdst; - dst[*n - 1] = strndup(buf, ULAS_TOKMAX); + dst[(*n) - 1] = strndup(buf, ULAS_TOKMAX); } return dst; fail: ulas_toklinefree(dst, *n); + *n = 0; return NULL; } @@ -122,7 +123,7 @@ void ulas_toklinefree(char **data, size_t n) { return; } for (size_t i = 0; i < n; i++) { - free(data[n]); + free(data[i]); } free(data); -- 2.30.2