From 7d350d3f615eb0bf3cb086cbc561dd1958d46aef Mon Sep 17 00:00:00 2001 From: cuz Date: Mon, 17 Mar 2003 10:14:43 +0000 Subject: [PATCH] Fixed a bug: .ENDPROC without .PROC would crash the assembler git-svn-id: svn://svn.cc65.org/cc65/trunk@2027 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/error.c | 11 ++++++----- src/ca65/error.h | 9 +++++---- src/ca65/pseudo.c | 9 +++++++-- src/ca65/symtab.c | 10 +++++++++- src/ca65/symtab.h | 5 ++++- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/ca65/error.c b/src/ca65/error.c index f8f0eabfa..f480fe961 100644 --- a/src/ca65/error.c +++ b/src/ca65/error.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2002 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 1998-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -183,6 +183,7 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap) "Duplicate `.ELSE'", "Conditional assembly branch was never closed", "Lexical level was not terminated correctly", + "No open lexical level", "Segment attribute mismatch", "Segment stack overflow", "Segment stack is empty", @@ -190,7 +191,7 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap) "CPU not supported", "Counter underflow", "Undefined label", - "Open `%s´", + "Open `%s'", "File name `%s' not found in file table", }; diff --git a/src/ca65/error.h b/src/ca65/error.h index c6c9a772d..c13cd6875 100644 --- a/src/ca65/error.h +++ b/src/ca65/error.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2002 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 1998-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -124,6 +124,7 @@ enum Errors { ERR_DUPLICATE_ELSE, ERR_OPEN_IF, ERR_OPEN_PROC, + ERR_NO_OPEN_PROC, ERR_SEG_ATTR_MISMATCH, ERR_SEGSTACK_OVERFLOW, ERR_SEGSTACK_EMPTY, diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c index 01bd9a100..0c168a1d9 100644 --- a/src/ca65/pseudo.c +++ b/src/ca65/pseudo.c @@ -605,8 +605,13 @@ static void DoEnd (void) static void DoEndProc (void) /* Leave a lexical level */ -{ - SymLeaveLevel (); +{ + if (!SymIsLocalLevel ()) { + /* No local symbol table level open */ + ErrorSkip (ERR_NO_OPEN_PROC); + } else { + SymLeaveLevel (); + } } diff --git a/src/ca65/symtab.c b/src/ca65/symtab.c index c4c37135f..d5087ebf9 100644 --- a/src/ca65/symtab.c +++ b/src/ca65/symtab.c @@ -379,12 +379,20 @@ void SymEnterLevel (void) void SymLeaveLevel (void) /* Leave the current lexical level */ -{ +{ SymTab = SymTab->BackLink; } +int SymIsLocalLevel (void) +/* Return true if we ae on a local symbol table level. */ +{ + return (SymTab != RootTab); +} + + + void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label) /* Define a new symbol */ { diff --git a/src/ca65/symtab.h b/src/ca65/symtab.h index 54ee06203..4492889b5 100644 --- a/src/ca65/symtab.h +++ b/src/ca65/symtab.h @@ -73,6 +73,9 @@ void SymEnterLevel (void); void SymLeaveLevel (void); /* Leave the current lexical level */ +int SymIsLocalLevel (void); +/* Return true if we ae on a local symbol table level. */ + void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label); /* Define a new symbol */ @@ -104,7 +107,7 @@ void SymGlobal (const char* Name); /* Mark the given symbol as a global symbol, that is, as a symbol that is * either imported or exported. */ - + void SymGlobalZP (const char* Name); /* Mark the given symbol as a global zeropage symbol, that is, as a symbol * that is either imported or exported. -- 2.39.5