Macro fixes master
authorRobert Pengelly <robertapengelly@hotmail.com>
Thu, 12 Mar 2026 05:37:06 +0000 (05:37 +0000)
committerRobert Pengelly <robertapengelly@hotmail.com>
Thu, 12 Mar 2026 05:37:06 +0000 (05:37 +0000)
macro.c
process.c

diff --git a/macro.c b/macro.c
index 9225b8341a1af84772f309ab0d10f8ded8d77667..ee6ab4964b3eef6b9b74dd5191fb495bf68b66f3 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -432,14 +432,17 @@ static char *process_value (struct macro *m, struct vector *args_list) {
     struct cstring str;
     cstr_new (&str);
     
+again:
+    
     while (!is_end_of_line[(int) *line]) {
-    again:
     
         if (line[0] == '#' && line[1] == '#') {
         
-            if (str.size && ((char *) str.data)[str.size - 1] == ' ') { str.size--; }
+            while (str.size && ((char *) str.data)[str.size - 1] == ' ') {
+                str.size--;
+            }
             
-            line += 2;
+            line = skip_whitespace (line + 2);
             continue;
         
         }
@@ -484,7 +487,10 @@ static char *process_value (struct macro *m, struct vector *args_list) {
             cstr_cat (&str, arg, strlen (arg));
         
         } else {
-            cstr_ccat (&str, *line++);
+        
+            cstr_ccat (&str, *line);
+            line++;
+        
         }
     
     }
index 56d5c5e4a52a5855e2984adac413986edc6d5f4e..118f178c531be833833019fd32dbb9610f61895a 100644 (file)
--- a/process.c
+++ b/process.c
@@ -24,6 +24,8 @@
 #include    "symbol.h"
 #include    "vector.h"
 
+static struct hashtab hashtab_seen_macros = { 0 };
+
 static char *preprocess_line (char *src, int in_macro) {
 
     struct cstring cstr;
@@ -100,45 +102,30 @@ static char *preprocess_line (char *src, int in_macro) {
         
             sname = symname (&caret);
             
-            if ((key = find_macro (sname))) {
+            if (!(key = hashtab_get_key (&hashtab_seen_macros, sname))) {
             
-                if ((m = get_macro (key))) {
+                if ((key = find_macro (sname))) {
                 
                     char *pm;
-                    int spaces = 0;
-                    
-                    if (*caret == ' ' || *caret == '\t') {
-                    
-                        cstr_ccat (&cstr, ' ');
-                        
-                        while (*caret == ' ' || *caret == '\t') {
-                        
-                            spaces++;
-                            caret++;
-                        
-                        }
                     
-                    }
+                    caret = skip_whitespace (caret);
+                    hashtab_put (&hashtab_seen_macros, key, sname);
                     
-                    if ((pm = process_macro (start, &caret, m))) {
+                    if ((m = get_macro (key))) {
                     
-                        char *temp = preprocess_line (pm, 1);
-                        cstr_cat (&cstr, temp, strlen (temp));
+                        if ((pm = process_macro (start, &caret, m))) {
                         
-                        if (!is_end_of_line[(int) *pm]) {
-                        
-                            while (spaces--) {
-                                cstr_ccat (&cstr, ' ');
-                            }
+                            char *temp = preprocess_line (pm, 1);
+                            cstr_cat (&cstr, temp, strlen (temp));
                         
                         }
                     
                     }
+                    
+                    hashtab_remove (&hashtab_seen_macros, key);
+                    continue;
                 
                 }
-                
-                free (sname);
-                continue;
             
             }
             
@@ -151,9 +138,9 @@ static char *preprocess_line (char *src, int in_macro) {
             
             }
             
-            cstr_cat (&cstr, start, caret - start);
-            
             free (sname);
+            
+            cstr_cat (&cstr, start, caret - start);
             continue;
         
         }