]> git.sur5r.net Git - cc65/commitdiff
When collecting tokens to be repeated inside of a .REPEAT section, do this in
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 4 Jan 2011 19:17:20 +0000 (19:17 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 4 Jan 2011 19:17:20 +0000 (19:17 +0000)
raw token mode, otherwise stuff is already partially evaluated.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4897 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/repeat.c

index 8e767daa64a53d90e33eebd8136595d5b83e6b5c..02c30eb83f7d5a588c9488c5c031828a074c0602 100644 (file)
@@ -72,15 +72,6 @@ static TokList* CollectRepeatTokens (void)
            return 0;
        }
 
-       /* If we find a token that is equal to the repeat counter name,
-        * replace it by a REPCOUNTER token. This way we have to do strcmps
-        * only once for each identifier, and not for each expansion.
-        * Note: This will fail for nested repeats using the same repeat
-        * counter name, but
-        */
-
-
-
                /* Collect all tokens in the list */
        AddCurTok (List);
 
@@ -110,9 +101,9 @@ static void RepeatTokenCheck (TokList* L)
  */
 {
     if (Tok == TOK_IDENT && L->Data != 0 && SB_CompareStr (&SVal, L->Data) == 0) {
-       /* Must replace by the repeat counter */
-       Tok  = TOK_INTCON;
-       IVal = L->RepCount;
+       /* Must replace by the repeat counter */
+       Tok  = TOK_INTCON;
+       IVal = L->RepCount;
     }
 }
 
@@ -127,8 +118,8 @@ void ParseRepeat (void)
     /* Repeat count follows */
     long RepCount = ConstExpression ();
     if (RepCount < 0) {
-       Error ("Range error");
-       RepCount = 0;
+       Error ("Range error");
+       RepCount = 0;
     }
 
     /* Optional there is a comma and a counter variable */
@@ -149,7 +140,8 @@ void ParseRepeat (void)
                }
     }
 
-    /* Separator */
+    /* Switch to raw token mode, then skip the separator */
+    EnterRawTokenMode ();
     ConsumeSep ();
 
     /* Read the token list */
@@ -157,8 +149,8 @@ void ParseRepeat (void)
 
     /* If we had an error, bail out */
     if (List == 0) {
-       xfree (Name);
-               return;
+       xfree (Name);
+               goto Done;
     }
 
     /* Update the token list for replay */
@@ -171,11 +163,15 @@ void ParseRepeat (void)
      */
     if (List->Count == 0 || RepCount == 0) {
        FreeTokList (List);
-       return;
+       goto Done;
     }
 
     /* Read input from the repeat descriptor */
     PushTokList (List, ".REPEAT");
+
+Done:
+    /* Switch out of raw token mode */
+    LeaveRawTokenMode ();
 }