From 1447b104db74b70c487c64cd51f2394959631ef5 Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 21 Mar 2004 11:03:08 +0000 Subject: [PATCH] Fixed a problem with conditional assembly. The assembler did not check if end 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 | 17 +++++++++++++++-- src/ca65/nexttok.c | 29 +++++++++++++++++++---------- src/ca65/nexttok.h | 7 ++++++- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/ca65/condasm.c b/src/ca65/condasm.c index b092b7972..b92db812d 100644 --- a/src/ca65/condasm.c +++ b/src/ca65/condasm.c @@ -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; diff --git a/src/ca65/nexttok.c b/src/ca65/nexttok.c index 1867ee097..4d6e89683 100644 --- a/src/ca65/nexttok.c +++ b/src/ca65/nexttok.c @@ -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 diff --git a/src/ca65/nexttok.h b/src/ca65/nexttok.h index aa0e3cdb0..17ea9a32e 100644 --- a/src/ca65/nexttok.h +++ b/src/ca65/nexttok.h @@ -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 -- 2.39.5