/* */
/* */
/* */
-/* (C) 2003 Ullrich von Bassewitz */
-/* Römerstraße 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2003-2011, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* common */
#include "addrsize.h"
+#include "scopedefs.h"
/* ca65 */
+#include "condasm.h"
#include "enum.h"
#include "error.h"
#include "expr.h"
+#include "macro.h"
#include "nexttok.h"
#include "scanner.h"
#include "symbol.h"
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
/* Handle the .ENUM command */
{
/* Start at zero */
- ExprNode* NextExpr = GenLiteralExpr (0);
+ long Offs = 0;
+ ExprNode* BaseExpr = GenLiteral0 ();
/* Check for a name */
- int Anon = (Tok != TOK_IDENT);
+ int Anon = (CurTok.Tok != TOK_IDENT);
if (!Anon) {
/* Enter a new scope, then skip the name */
- SymEnterLevel (SVal, ST_ENUM, ADDR_SIZE_ABS);
+ SymEnterLevel (&CurTok.SVal, SCOPE_ENUM, ADDR_SIZE_ABS, 0);
NextTok ();
}
ConsumeSep ();
/* Read until end of struct */
- while (Tok != TOK_ENDENUM && Tok != TOK_EOF) {
+ while (CurTok.Tok != TOK_ENDENUM && CurTok.Tok != TOK_EOF) {
+ Macro* M;
SymEntry* Sym;
ExprNode* EnumExpr;
-
+
+ /* Skip empty lines */
+ if (CurTok.Tok == TOK_SEP) {
+ NextTok ();
+ continue;
+ }
/* The format is "identifier [ = value ]" */
- if (Tok != TOK_IDENT) {
- ErrorSkip ("Identifier expected");
+ if (CurTok.Tok != TOK_IDENT) {
+ /* Maybe it's a conditional? */
+ if (!CheckConditionals ()) {
+ ErrorSkip ("Identifier expected");
+ }
+ continue;
+ }
+
+ /* We have an identifier. Is it a macro? */
+ if ((M = FindMacro (&CurTok.SVal)) != 0) {
+ MacExpandStart (M);
continue;
}
/* We have an identifier, generate a symbol */
- Sym = SymFind (CurrentScope, SVal, SYM_ALLOC_NEW);
+ Sym = SymFind (CurrentScope, &CurTok.SVal, SYM_ALLOC_NEW);
/* Skip the member name */
NextTok ();
/* Check for an assignment */
- if (Tok == TOK_EQ) {
+ if (CurTok.Tok == TOK_EQ) {
/* Skip the equal sign */
NextTok ();
- /* Delete the old next expression */
- FreeExpr (NextExpr);
-
- /* Read the new one */
+ /* Read the new expression */
EnumExpr = Expression ();
+ /* Reset the base expression and the offset */
+ FreeExpr (BaseExpr);
+ BaseExpr = CloneExpr (EnumExpr);
+ Offs = 0;
+
} else {
- EnumExpr = NextExpr;
+ /* No assignment, use last value + 1 */
+ EnumExpr = GenAddExpr (CloneExpr (BaseExpr), GenLiteralExpr (Offs));
}
- /* Generate the next expression from the current one */
- NextExpr = GenAddExpr (CloneExpr (EnumExpr), GenLiteralExpr (1));
- NextExpr = SimplifyExpr (NextExpr);
-
/* Assign the value to the enum member */
SymDef (Sym, EnumExpr, ADDR_SIZE_DEFAULT, SF_NONE);
+ /* Increment the offset for the next member */
+ ++Offs;
+
/* Expect end of line */
ConsumeSep ();
}
/* End of enum definition */
Consume (TOK_ENDENUM, "`.ENDENUM' expected");
- /* Free the last (unused) enum expression */
- FreeExpr (NextExpr);
+ /* Free the base expression */
+ FreeExpr (BaseExpr);
}
-
-
-