/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
+/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* common */
#include "exprdefs.h"
+#include "inline.h"
/* ca65 */
#include "symentry.h"
-/* Scope identifiers */
-#define SCOPE_ANY 0
-#define SCOPE_GLOBAL 1
-#define SCOPE_LOCAL 2
+/* Symbol table flags */
+#define ST_NONE 0x00 /* No flags */
+#define ST_DEFINED 0x01 /* Scope has been defined */
+
+/* Symbol table types */
+#define ST_GLOBAL 0x00 /* Root level */
+#define ST_PROC 0x01 /* .PROC */
+#define ST_SCOPE 0x02 /* .SCOPE */
+#define ST_STRUCT 0x03 /* .STRUCT/.UNION */
+#define ST_ENUM 0x04 /* .ENUM */
+#define ST_UNDEF 0xFF
+
+/* A symbol table */
+typedef struct SymTable SymTable;
+struct SymTable {
+ SymTable* Left; /* Pointer to smaller entry */
+ SymTable* Right; /* Pointer to greater entry */
+ SymTable* Parent; /* Link to enclosing scope if any */
+ SymTable* Childs; /* Pointer to child scopes */
+ unsigned short Flags; /* Symbol table flags */
+ unsigned char AddrSize; /* Address size */
+ unsigned char Type; /* Type of the scope */
+ unsigned Level; /* Lexical level */
+ unsigned TableSlots; /* Number of hash table slots */
+ unsigned TableEntries; /* Number of entries in the table */
+ unsigned Name; /* Name of the scope */
+ SymEntry* Table[1]; /* Dynamic allocation */
+};
+
+/* Symbol tables */
+SymTable* CurrentScope; /* Pointer to current symbol table */
+SymTable* RootScope; /* Root symbol table */
-void SymEnterLevel (void);
+void SymEnterLevel (const char* ScopeName, unsigned char Type, unsigned char AddrSize);
/* Enter a new lexical level */
void SymLeaveLevel (void);
/* Leave the current lexical level */
-int SymIsLocalLevel (void);
-/* Return true if we are on a local symbol table level. */
-
-void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
-/* Define a new symbol */
-
-SymEntry* SymRef (const char* Name, int Scope);
-/* Search for the symbol and return it */
-
-int SymIsDef (const char* Name, int Scope);
-/* Return true if the given symbol is already defined */
-
-int SymIsRef (const char* Name, int Scope);
-/* Return true if the given symbol has been referenced */
-
-void SymImport (const char* Name);
-/* Mark the given symbol as an imported symbol */
-
-void SymImportZP (const char* Name);
-/* Mark the given symbol as a imported zeropage symbol */
-
-void SymImportForced (const char* Name);
-/* Mark the given symbol as a forced imported symbol */
-
-void SymExport (const char* Name);
-/* Mark the given symbol as an exported symbol */
-
-void SymExportZP (const char* Name);
-/* Mark the given symbol as an exported zeropage symbol */
+SymTable* SymFindScope (SymTable* Parent, const char* Name, int AllocNew);
+/* Find a scope in the given enclosing scope */
-void SymGlobal (const char* Name);
-/* Mark the given symbol as a global symbol, that is, as a symbol that is
- * either imported or exported.
+SymTable* SymFindAnyScope (SymTable* Parent, const char* Name);
+/* Find a scope in the given or any of its parent scopes. The function will
+ * never create a new symbol, since this can only be done in one specific
+ * scope.
*/
-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.
+SymEntry* SymFind (SymTable* Scope, const char* Name, int AllocNew);
+/* Find a new symbol table entry in the given table. If AllocNew is given and
+ * the entry is not found, create a new one. Return the entry found, or the
+ * new entry created, or - in case AllocNew is zero - return 0.
*/
-void SymConDes (const char* Name, unsigned Type, unsigned Prio);
-/* Mark the given symbol as a module constructor/destructor. This will also
- * mark the symbol as an export. Initializers may never be zero page symbols.
- */
-
-int SymIsConst (SymEntry* Sym);
-/* Return true if the given symbol has a constant value */
-
int SymIsZP (SymEntry* Sym);
/* Return true if the symbol is explicitly marked as zeropage symbol */
-int SymIsImport (SymEntry* Sym);
-/* Return true if the given symbol is marked as import */
-
-int SymHasExpr (SymEntry* Sym);
-/* Return true if the given symbol has an associated expression */
-
-void SymMarkUser (SymEntry* Sym);
-/* Set a user mark on the specified symbol */
-
-void SymUnmarkUser (SymEntry* Sym);
-/* Remove a user mark from the specified symbol */
-
-int SymHasUserMark (SymEntry* Sym);
-/* Return the state of the user mark for the specified symbol */
-
-long GetSymVal (SymEntry* Sym);
-/* Return the symbol value */
-
-ExprNode* GetSymExpr (SymEntry* Sym);
-/* Get the expression for a non-const symbol */
-
-const char* GetSymName (SymEntry* Sym);
-/* Return the name of the symbol */
-
-unsigned GetSymIndex (SymEntry* Sym);
-/* Return the symbol index for the given symbol */
+#if defined(HAVE_INLINE)
+INLINE unsigned char GetSymTabType (const SymTable* S)
+/* Return the type of the given symbol table */
+{
+ return S->Type;
+}
+#else
+# define GetSymTabType(S) ((S)->Type)
+#endif
-const FilePos* GetSymPos (SymEntry* Sym);
-/* Return the position of first occurence in the source for the given symbol */
+unsigned char GetCurrentSymTabType ();
+/* Return the type of the current symbol table */
void SymCheck (void);
/* Run through all symbols and check for anomalies and errors */