From 5ef1f65c9bd9f83ecbb8c66c6d8f8da0dec85e47 Mon Sep 17 00:00:00 2001 From: cuz Date: Mon, 17 Nov 2003 18:49:50 +0000 Subject: [PATCH] Allow conditional directives within .STRUCT7:UNION and .ENUM git-svn-id: svn://svn.cc65.org/cc65/trunk@2672 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/condasm.c | 37 +++++++++++++++++++++++++++++++++++-- src/ca65/condasm.h | 14 ++++++++++---- src/ca65/enum.c | 13 +++++++++++-- src/ca65/struct.c | 7 +++++-- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/ca65/condasm.c b/src/ca65/condasm.c index 88d7716f7..5b2bf8ef0 100644 --- a/src/ca65/condasm.c +++ b/src/ca65/condasm.c @@ -321,7 +321,7 @@ void DoConditionals (void) SetIfCond (D, 1); SkipUntilSep (); } - } + } IfCond = GetCurrentIfCond (); break; @@ -367,7 +367,7 @@ void DoConditionals (void) case TOK_IFP816: D = AllocIf (".IFP816", 1); - NextTok (); + NextTok (); if (IfCond) { SetIfCond (D, GetCPU() == CPU_65816); } @@ -413,6 +413,39 @@ void DoConditionals (void) +int CheckConditionals (void) +/* Check if the current token is one that starts a conditional directive, and + * call DoConditionals if so. Return true if a conditional directive was found, + * return false otherwise. + */ +{ + switch (Tok) { + case TOK_ELSE: + case TOK_ELSEIF: + case TOK_ENDIF: + case TOK_IF: + case TOK_IFBLANK: + case TOK_IFCONST: + case TOK_IFDEF: + case TOK_IFNBLANK: + case TOK_IFNCONST: + case TOK_IFNDEF: + case TOK_IFNREF: + case TOK_IFP02: + case TOK_IFP816: + case TOK_IFPC02: + case TOK_IFPSC02: + case TOK_IFREF: + DoConditionals (); + return 1; + + default: + return 0; + } +} + + + void CheckOpenIfs (void) /* Called from the scanner before closing an input file. Will check for any * open .ifs in this file. diff --git a/src/ca65/condasm.h b/src/ca65/condasm.h index 84a2ac026..6718c268f 100644 --- a/src/ca65/condasm.h +++ b/src/ca65/condasm.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2000-2003 Ullrich von Bassewitz */ +/* Römerstraße 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -47,6 +47,12 @@ void DoConditionals (void); /* Catch all for conditional directives */ +int CheckConditionals (void); +/* Check if the current token is one that starts a conditional directive, and + * call DoConditionals if so. Return true if a conditional directive was found, + * return false otherwise. + */ + void CheckOpenIfs (void); /* Called from the scanner before closing an input file. Will check for any * open .ifs in this file. diff --git a/src/ca65/enum.c b/src/ca65/enum.c index 8d9da86f6..f226e4433 100644 --- a/src/ca65/enum.c +++ b/src/ca65/enum.c @@ -37,6 +37,7 @@ #include "addrsize.h" /* ca65 */ +#include "condasm.h" #include "enum.h" #include "error.h" #include "expr.h" @@ -75,11 +76,19 @@ void DoEnum (void) SymEntry* Sym; ExprNode* EnumExpr; - + + /* Skip empty lines */ + if (Tok == TOK_SEP) { + NextTok (); + continue; + } /* The format is "identifier [ = value ]" */ if (Tok != TOK_IDENT) { - ErrorSkip ("Identifier expected"); + /* Maybe it's a conditional? */ + if (!CheckConditionals ()) { + ErrorSkip ("Identifier expected"); + } continue; } diff --git a/src/ca65/struct.c b/src/ca65/struct.c index a737e3614..0ee0752fb 100644 --- a/src/ca65/struct.c +++ b/src/ca65/struct.c @@ -37,6 +37,7 @@ #include "addrsize.h" /* ca65 */ +#include "condasm.h" #include "error.h" #include "expr.h" #include "nexttok.h" @@ -187,8 +188,10 @@ static long DoStructInternal (long Offs, unsigned Type) break; default: - Error ("Invalid storage allocator in struct/union"); - SkipUntilSep (); + if (!CheckConditionals ()) { + /* Not a conditional directive */ + ErrorSkip ("Invalid storage allocator in struct/union"); + } } /* Next member */