]> git.sur5r.net Git - cc65/commitdiff
Fixed a problem with conditional assembly. The assembler did not check if end
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 Mar 2004 11:03:08 +0000 (11:03 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 Mar 2004 11:03:08 +0000 (11:03 +0000)
of lined was reached after a .IF/.ELSE/... This could lead to invalid input
accepted without an error message.

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

src/ca65/condasm.c
src/ca65/nexttok.c
src/ca65/nexttok.h

index b092b79720fdfbb604aa648fb361bfc42cfdd4b9..b92db812d783387bddfbbbc2eab932549ae96d26 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2003 Ullrich von Bassewitz                                       */
+/* (C) 2000-2004 Ullrich von Bassewitz                                       */
 /*               Römerstraße 52                                              */
 /*               D-70794 Filderstadt                                         */
 /* EMail:        uz@cc65.org                                                 */
@@ -210,7 +210,7 @@ void DoConditionals (void)
            case TOK_ELSE:
                        D = GetCurrentIf ();
                if (D == 0) {
-                   Error ("Unexpected .ELSE");
+                           Error ("Unexpected .ELSE");
                        } else if (GetElse(D)) {
                    /* We already had a .ELSE ! */
                    Error ("Duplicate .ELSE");
@@ -223,6 +223,7 @@ void DoConditionals (void)
                    IfCond = GetCurrentIfCond ();
                }
                NextTok ();
+               ExpectSep ();
                        break;
 
                    case TOK_ELSEIF:
@@ -247,6 +248,7 @@ void DoConditionals (void)
                     */
                    if (IfCond == 0) {
                        SetIfCond (D, ConstExpression ());
+                       ExpectSep ();
                    }
 
                    /* Get the new overall condition */
@@ -262,6 +264,7 @@ void DoConditionals (void)
                 * has been cleanup up, since we may be at end of file.
                 */
                NextTok ();
+               ExpectSep ();
 
                /* Get the new overall condition */
                IfCond = GetCurrentIfCond ();
@@ -272,6 +275,7 @@ void DoConditionals (void)
                NextTok ();
                if (IfCond) {
                    SetIfCond (D, ConstExpression ());
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
@@ -297,6 +301,7 @@ void DoConditionals (void)
                    ExprNode* Expr = Expression();
                    SetIfCond (D, IsConstExpr (Expr, 0));
                    FreeExpr (Expr);
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
@@ -332,6 +337,7 @@ void DoConditionals (void)
                    ExprNode* Expr = Expression();
                    SetIfCond (D, !IsConstExpr (Expr, 0));
                    FreeExpr (Expr);
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
@@ -342,6 +348,7 @@ void DoConditionals (void)
                if (IfCond) {
                    SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
                    SetIfCond (D, Sym == 0 || !SymIsDef (Sym));
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
@@ -352,6 +359,7 @@ void DoConditionals (void)
                if (IfCond) {
                    SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
                    SetIfCond (D, Sym == 0 || !SymIsRef (Sym));
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
@@ -363,6 +371,7 @@ void DoConditionals (void)
                    SetIfCond (D, GetCPU() == CPU_6502);
                }
                IfCond = GetCurrentIfCond ();
+               ExpectSep ();
                break;
 
            case TOK_IFP816:
@@ -372,6 +381,7 @@ void DoConditionals (void)
                            SetIfCond (D, GetCPU() == CPU_65816);
                }
                IfCond = GetCurrentIfCond ();
+               ExpectSep ();
                break;
 
            case TOK_IFPC02:
@@ -381,6 +391,7 @@ void DoConditionals (void)
                            SetIfCond (D, GetCPU() == CPU_65C02);
                }
                IfCond = GetCurrentIfCond ();
+               ExpectSep ();
                break;
 
            case TOK_IFPSC02:
@@ -390,6 +401,7 @@ void DoConditionals (void)
                            SetIfCond (D, GetCPU() == CPU_65SC02);
                }
                IfCond = GetCurrentIfCond ();
+               ExpectSep ();
                break;
 
            case TOK_IFREF:
@@ -398,6 +410,7 @@ void DoConditionals (void)
                if (IfCond) {
                    SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
                    SetIfCond (D, Sym != 0 && SymIsRef (Sym));
+                   ExpectSep ();
                }
                IfCond = GetCurrentIfCond ();
                break;
index 1867ee097c88876c1eb7656151c9e3038fae3f69..4d6e8968300399ddc1258697702191a0f4d9a5a5 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2003 Ullrich von Bassewitz                                       */
+/* (C) 2000-2004 Ullrich von Bassewitz                                       */
 /*               Römerstraße 52                                              */
 /*               D-70794 Filderstadt                                         */
 /* EMail:        uz@cc65.org                                                 */
@@ -419,15 +419,12 @@ void Consume (enum Token Expected, const char* ErrMsg)
 void ConsumeSep (void)
 /* Consume a separator token */
 {
-    /* Accept an EOF as separator */
-    if (Tok != TOK_EOF) {
-       if (Tok != TOK_SEP) {
-                   Error ("Unexpected trailing garbage characters");
-           SkipUntilSep ();
-       }
-       if (Tok == TOK_SEP) {
-           NextTok ();
-       }
+    /* We expect a separator token */
+    ExpectSep ();
+
+    /* If we have one, skip it */
+    if (Tok == TOK_SEP) {
+       NextTok ();
     }
 }
 
@@ -467,6 +464,18 @@ void SkipUntilSep (void)
 
 
 
+void ExpectSep (void)
+/* Check if we've reached a line separator, and output an error if not. Do
+ * not skip the line separator.
+ */
+{
+    if (!TokIsSep (Tok)) {
+               ErrorSkip ("Unexpected trailing garbage characters");
+    }
+}
+
+
+
 void EnterRawTokenMode (void)
 /* Enter raw token mode. In raw mode, token handling functions are not
  * executed, but the function tokens are passed untouched to the upper
index aa0e3cdb0419a4d446d81d7f6de7d9ce84dda8e5..17ea9a32ee6ecb6d3a4ddfaab84862a569abcc0e 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000-2003 Ullrich von Bassewitz                                       */
+/* (C) 2000-2004 Ullrich von Bassewitz                                       */
 /*               Römerstraße 52                                              */
 /*               D-70794 Filderstadt                                         */
 /* EMail:        uz@cc65.org                                                 */
@@ -69,6 +69,11 @@ void ConsumeComma (void);
 void SkipUntilSep (void);
 /* Skip tokens until we reach a line separator or end of file */
 
+void ExpectSep (void);
+/* Check if we've reached a line separator, and output an error if not. Do
+ * not skip the line separator.
+ */
+
 void EnterRawTokenMode (void);
 /* Enter raw token mode. In raw mode, token handling functions are not
  * executed, but the function tokens are passed untouched to the upper