From 5bdb19f63cc8ea630cf666afa7399f0e86cb69bc Mon Sep 17 00:00:00 2001 From: cuz Date: Mon, 18 Mar 2002 06:05:04 +0000 Subject: [PATCH] Attribute work git-svn-id: svn://svn.cc65.org/cc65/trunk@1201 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/cc65/declattr.c | 107 +++++++++++++++++++++++++++++++------------- src/cc65/declattr.h | 10 +++-- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/cc65/declattr.c b/src/cc65/declattr.c index beeb8a76b..3ac3e1479 100644 --- a/src/cc65/declattr.c +++ b/src/cc65/declattr.c @@ -1,15 +1,15 @@ /*****************************************************************************/ /* */ -/* declattr.c */ +/* declattr.c */ /* */ /* Declaration attributes */ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2000-2002 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -50,9 +50,23 @@ -/* Attribute names */ -static const char* const AttrNames [atCount] = { - "alias", +/* Forwards for attribute handlers */ +static void AliasAttr (const Declaration* D, DeclAttr* A); +static void UnusedAttr (const Declaration* D, DeclAttr* A); +static void ZeroPageAttr (const Declaration* D, DeclAttr* A); + + + +/* Attribute table */ +typedef struct AttrDesc AttrDesc; +struct AttrDesc { + const char Name[12]; + void (*Handler) (const Declaration*, DeclAttr*); +}; +static const AttrDesc AttrTable [atCount] = { + { "alias", AliasAttr }, + { "unused", UnusedAttr }, + { "zeropage", ZeroPageAttr }, }; @@ -63,28 +77,28 @@ static const char* const AttrNames [atCount] = { -static attrib_t FindAttribute (const char* Attr) -/* Search the attribute and return the corresponding attribute constant. - * Return atNone if the attribute name is not known. +static const AttrDesc* FindAttribute (const char* Attr) +/* Search the attribute and return the corresponding attribute descriptor. + * Return NULL if the attribute name is not known. */ { - int A; + unsigned A; /* For now do a linear search */ for (A = 0; A < atCount; ++A) { - if (strcmp (Attr, AttrNames[A]) == 0) { + if (strcmp (Attr, AttrTable[A].Name) == 0) { /* Found */ - return (attrib_t) A; + return AttrTable + A; } } /* Not found */ - return atNone; + return 0; } -static void AliasAttrib (const Declaration* D, DeclAttr* A) +static void AliasAttr (const Declaration* D, DeclAttr* A) /* Handle the "alias" attribute */ { SymEntry* Sym; @@ -123,11 +137,29 @@ static void AliasAttrib (const Declaration* D, DeclAttr* A) +static void UnusedAttr (const Declaration* D attribute ((unused)), DeclAttr* A) +/* Handle the "unused" attribute */ +{ + /* No parameters */ + A->AttrType = atUnused; +} + + + +static void ZeroPageAttr (const Declaration* D attribute ((unused)), DeclAttr* A) +/* Handle the "zeropage" attribute */ +{ + /* No parameters */ + A->AttrType = atZeroPage; +} + + + void ParseAttribute (const Declaration* D, DeclAttr* A) /* Parse an additional __attribute__ modifier */ { - ident AttrName; - attrib_t AttrType; + ident AttrName; + const AttrDesc* Attr; /* Initialize the attribute description with "no attribute" */ A->AttrType = atNone; @@ -154,25 +186,36 @@ void ParseAttribute (const Declaration* D, DeclAttr* A) /* Map the attribute name to its id, then skip the identifier */ strcpy (AttrName, CurTok.Ident); - AttrType = FindAttribute (AttrName); + Attr = FindAttribute (AttrName); NextToken (); - /* Handle possible attributes */ - switch (AttrType) { + /* Did we find a valid attribute? */ + if (Attr) { - case atAlias: - AliasAttrib (D, A); - break; + /* Call the handler */ + Attr->Handler (D, A); - default: - /* Attribute not known, maybe typo */ - Error ("Illegal attribute: `%s'", AttrName); - break; + /* Read the two closing braces */ + ConsumeRParen (); + ConsumeRParen (); + + } else { + /* List of tokens to skip */ + static const token_t SkipList[] = { TOK_LPAREN, TOK_SEMI }; + + /* Attribute not known, maybe typo */ + Error ("Illegal attribute: `%s'", AttrName); + + /* Skip until closing brace or semicolon */ + SkipTokens (SkipList, sizeof (SkipList) / sizeof (SkipList[0])); + + /* If we have a closing brace, read it, otherwise bail out */ + if (CurTok.Tok == TOK_LPAREN) { + /* Read the two closing braces */ + ConsumeRParen (); + ConsumeRParen (); + } } - - /* Read the two closing braces */ - ConsumeRParen (); - ConsumeRParen (); } diff --git a/src/cc65/declattr.h b/src/cc65/declattr.h index 9975b40d1..cef08b30f 100644 --- a/src/cc65/declattr.h +++ b/src/cc65/declattr.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2000-2002 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -52,6 +52,8 @@ typedef enum { atNone = -1, /* No attribute */ atAlias, /* Alias declaration */ + atUnused, /* Variable is unused */ + atZeroPage, /* Zero page symbol */ atCount /* Number of attributes */ } attrib_t;