*/
// 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);
* 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;
}
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;
}
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);
}
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;
}
// 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) {