Fixed scope tests
authorLukas Krickl <lukas@krickl.dev>
Sun, 3 Dec 2023 12:07:35 +0000 (13:07 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 3 Dec 2023 12:07:35 +0000 (13:07 +0100)
include/ulas.h
src/test.c
src/ulas.c

index fe14628487dbeaab91db787603803cbce14a56dd..c942e13f4def9f2df4cdda473c3520f40fd2ebe8 100644 (file)
@@ -8,6 +8,7 @@
 // if this is used as a path use stdin or stdout instead
 #define ULAS_STDFILEPATH "-"
 
+#define ULAS_SYMNAMEMAX 256
 #define ULAS_PATHMAX 4096
 #define ULAS_LINEMAX 4096
 #define ULAS_OUTBUFMAX 64
index df50573345b9fa9c18a1a5171d227039372eac1b..e1c97c09316b7888b66298aab2846890978f065f 100644 (file)
@@ -3,7 +3,7 @@
 #include <assert.h>
 
 #define ULAS_TOKMAX 64
-
+#define ULAS_SYMNAMEMAX 256
 #define TESTBEGIN(name) printf("[test %s]\n", (name));
 #define TESTEND(name) printf("[%s ok]\n", (name));
 
@@ -312,8 +312,8 @@ void test_asminstr(void) {
 void test_symscope(void) {
   TESTBEGIN("symscope");
 
-  ASSERT_SYMSCOPE(0, "t1", -1, 1);
-  ASSERT_SYMSCOPE(-1, "t1", -1, 1);
+  ASSERT_SYMSCOPE(0, "t1:", -1, 1);
+  ASSERT_SYMSCOPE(-1, "t1:", -1, 1);
 
   TESTEND("symscope");
 }
index 6654413c7fb670e4b867554492abd5c5ed00fe1e..6466d6441dfe10771df1ad3d60eeeb6262766445 100644 (file)
@@ -211,12 +211,19 @@ int ulas_islabelname(const char *tok, unsigned long n) {
   return tok[n - 1] == ':' && ulas_isname(tok, n - 1);
 }
 
-struct ulas_sym *ulas_symbolresolve(const char *name, int *rc) {
+struct ulas_sym *ulas_symbolresolve(const char *cname, int *rc) {
+  char name[ULAS_SYMNAMEMAX];
+  long len = strlen(cname);
+  assert(len < ULAS_SYMNAMEMAX);
+  strncpy(name, cname, len);
+  if (name[len - 1] == ':') {
+    name[len - 1] = '\0';
+  }
+
   for (int i = 0; i < ulas.syms.len; i++) {
     struct ulas_sym *sym = &ulas.syms.buf[i];
     // when scope is the same as the current one, or scope 0 (global)
     if ((sym->scope & ulas.scope) == 0 && strcmp(name, sym->name) == 0) {
-      puts("scope");
       return sym;
     }
   }
@@ -248,7 +255,11 @@ int ulas_symbolset(const char *name, int scope, struct ulas_tok tok,
     // def new symbol
     struct ulas_sym new_sym = {strdup(name), tok, scope, ulas.pass, constant};
     // last char of name has to be : so we trim it away
-    new_sym.name[strlen(new_sym.name) - 1] = '\0';
+    long len = strlen(new_sym.name);
+    assert(len < ULAS_SYMNAMEMAX);
+    if (new_sym.name[len - 1] == ':') {
+      new_sym.name[len - 1] = '\0';
+    }
     ulas_symbufpush(&ulas.syms, new_sym);
   } else if (exisitng->lastdefin != ulas.pass) {
     // redefine if not defined this pass