preproc: reverse the order of the tokens in %deftok
authorH. Peter Anvin <hpa@zytor.com>
Wed, 15 Sep 2010 15:57:21 +0000 (08:57 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 15 Sep 2010 15:57:21 +0000 (08:57 -0700)
Smacros are apparently stored with the token stream reversed, so make
sure %deftok matches that sense of relatity.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
preproc.c

index 70e550d0c1f51f927dce3c90fb777c4d1ff46857..f7f0114a59ab2f6b3565a3a0180d060eb7f8f942 100644 (file)
--- a/preproc.c
+++ b/preproc.c
@@ -487,6 +487,24 @@ static size_t nasm_unquote_cstr(char *qstr, enum preproc_token directive)
     return clen;
 }
 
+/*
+ * In-place reverse a list of tokens.
+ */
+static Token *reverse_tokens(Token *t)
+{
+    Token *prev = NULL;
+    Token *next;
+
+    while (t) {
+       next = t->next;
+       t->next = prev;
+       prev = t;
+       t = next;
+    }
+
+    return prev;
+}
+
 /*
  * Handle TASM specific directives, which do not contain a % in
  * front of them. We do it here because I could not find any other
@@ -3186,8 +3204,13 @@ issue_error:
             return DIRECTIVE_FOUND;
         }
 
+       /*
+        * Convert the string to a token stream.  Note that smacros
+        * are stored with the token stream reversed, so we have to
+        * reverse the output of tokenize().
+        */
         nasm_unquote_cstr(t->text, i);
-        macro_start = tokenize(t->text);
+        macro_start = reverse_tokens(tokenize(t->text));
 
         /*
          * We now have a macro name, an implicit parameter count of