From: Robert Pengelly Date: Thu, 12 Mar 2026 05:37:06 +0000 (+0000) Subject: Macro fixes X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;p=sasm.git Macro fixes --- diff --git a/macro.c b/macro.c index 9225b83..ee6ab49 100644 --- 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++; + } } diff --git a/process.c b/process.c index 56d5c5e..118f178 100644 --- 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; }