WIP: symbol resolver
authorLukas Krickl <lukas@krickl.dev>
Mon, 27 Nov 2023 17:46:20 +0000 (18:46 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 27 Nov 2023 17:46:20 +0000 (18:46 +0100)
include/ulas.h
src/ulas.c

index 570320175ff7079f4b08c0b4804cb5a2c9c067ed..fc9756eb083838a8d8f70d81079b1359b05700b1 100644 (file)
@@ -227,9 +227,14 @@ struct ulas_preproc {
  * Symbols
  */
 
+enum ulas_syms { ULAS_SYM_FORWARD, ULAS_SYM_DECL };
+
+enum ulas_symres { ULAS_EGLOBALUNRESOLVE = 1, ULAS_ELOCALUNRESOLVE = 2 };
+
 struct ulas_sym {
   char *name;
   struct ulas_tok tok;
+  enum ulas_syms type;
 };
 
 /**
@@ -368,9 +373,11 @@ char *ulas_strndup(const char *src, unsigned long n);
 
 // resolve a symbol until an actual literal token (str, int) is found
 // returns NULL if the symbol cannot be resolved
-// and sets rc to -1 if eunresolve is 1
-// if eunresolve is 0 rc will be set to 1 if the symbol is not resolved
-struct ulas_tok *ulas_symbolresolve(const char *name, int eunresolve, int *rc);
+// returns -1 if any flagged symbol was not found
+// if flagged symbols remain unresolved (e.g. global or locals) rc is set to the
+// respective flag value
+struct ulas_tok *ulas_symbolresolve(const char *name, enum ulas_symres flags,
+                                    int *rc);
 
 // tokenisze according to pre-defined rules
 // returns the amount of bytes of line that were
@@ -448,9 +455,9 @@ char *ulas_preprocexpand(struct ulas_preproc *pp, const char *raw_line,
 
 // convert literal to its int value
 // retunrs -1 on error, 0 on success and 1 if there is an unresolved symbol
-int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc);
+int ulas_valint(struct ulas_tok *lit, enum ulas_symres flags, int *rc);
 // convert literal to its char value
-char *ulas_valstr(struct ulas_tok *lit, int eunresolve, int *rc);
+char *ulas_valstr(struct ulas_tok *lit, enum ulas_symres flags, int *rc);
 
 struct ulas_tokbuf ulas_tokbuf(void);
 
index 7cc5d0f438052859bea687248a7ee490df920f16..aa6f78b5455b424848f529890c0b01b6e714db5c 100644 (file)
@@ -161,7 +161,8 @@ int ulas_isname(const char *tok, unsigned long n) {
   return 1;
 }
 
-struct ulas_tok *ulas_symbolresolve(const char *name, int eunresolve, int *rc) {
+struct ulas_tok *ulas_symbolresolve(const char *name, enum ulas_symres flags,
+                                    int *rc) {
   // TODO: implement
   return NULL;
 }
@@ -931,10 +932,14 @@ fail:
  * Literals, tokens and expressions
  */
 
-int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc) {
+int ulas_valint(struct ulas_tok *lit, enum ulas_symres flags, int *rc) {
   if (lit->type == ULAS_SYMBOL) {
-    struct ulas_tok *stok = ulas_symbolresolve(lit->val.strv, eunresolve, rc);
-    return ulas_valint(stok, eunresolve, rc);
+    struct ulas_tok *stok = ulas_symbolresolve(lit->val.strv, flags, rc);
+    // bail if symbol is not resolvable
+    if (*rc == 1) {
+      return 0;
+    }
+    return ulas_valint(stok, flags, rc);
   }
 
   if (!lit || lit->type != ULAS_INT) {
@@ -946,7 +951,7 @@ int ulas_valint(struct ulas_tok *lit, int eunresolve, int *rc) {
   return lit->val.intv;
 }
 
-char *ulas_valstr(struct ulas_tok *lit, int eunresolve, int *rc) {
+char *ulas_valstr(struct ulas_tok *lit, enum ulas_symres flags, int *rc) {
   if (!lit || lit->type != ULAS_STR) {
     ULASERR("Expected str\n");
     *rc = -1;