Added expression buffer
authorLukas Krickl <lukas@krickl.dev>
Sun, 19 Nov 2023 11:47:17 +0000 (12:47 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 19 Nov 2023 11:47:17 +0000 (12:47 +0100)
include/ulas.h
src/test.c
src/ulas.c

index 85bf25eb417f3354dc662e01794c39f61c07bc7d..6cbb8f41dde623c5cad6489aab44727fc943df86 100644 (file)
@@ -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
  */
index b8aefcd56db66b374a48170b88bc101aa22f2918..ab6326baebe8a6c7389c199956e8182a8b20678c 100644 (file)
@@ -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");
 }
 
index 0279fa386ca5c4dc14fdaa3771cb7aea523604ad..bcb923675e547712d9e9e7da0ed72444ce64f2de 100644 (file)
@@ -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++) {
   }