long maxlen;
};
+// the expression buffer hold expression buffers
+struct ulas_exprbuf {
+ struct ulas_expr *buf;
+ unsigned long len;
+ unsigned long maxlen;
+};
+
/**
* Assembly context
*/
// current token stream
struct ulas_tokbuf toks;
+ struct ulas_exprbuf exprs;
unsigned int address;
long next;
};
-struct ulas_exprbuf {
- struct ulas_expr *exprs;
- unsigned long len;
- unsigned long maxlen;
-};
-
/**
* asm
*/
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
*/
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");
}
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;
}
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
*/
// 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++) {
}