Added literal expressions
authorLukas Krickl <lukas@krickl.dev>
Mon, 20 Nov 2023 06:03:04 +0000 (07:03 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 20 Nov 2023 06:03:04 +0000 (07:03 +0100)
include/ulas.h
src/ulas.c

index fa212c210e54f8e2b352b0a5db0efec4229f1188..f9305c84104150eeed223ff89603bf0e91e92769 100644 (file)
@@ -366,9 +366,9 @@ char *ulas_preprocexpand(struct ulas_preproc *pp, const char *raw_line,
  */
 
 // 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);
 
index 5eef8b67fe0e7df3aae4f59768eca52ff3f486d6..77a1e0b254b32fe447417e67be2da49380091bfb 100644 (file)
@@ -895,8 +895,9 @@ fail:
  * 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;
   }
@@ -904,8 +905,9 @@ int ulas_litint(struct ulas_tok *lit, int *rc) {
   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;
   }
@@ -1049,10 +1051,10 @@ int ulas_parseprim(int *i) {
     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);
 }
 
@@ -1108,16 +1110,27 @@ int ulas_parseexpr(void) {
   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;
 }
 
@@ -1134,7 +1147,7 @@ int ulas_intexpr(const char **line, unsigned long n, int *rc) {
 
   // 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) {