--- /dev/null
+/*******************************************************************************
+ * Simplified Wrapper and Interface Generator (SWIG)
+ *
+ * Author : David Beazley
+ *
+ * Department of Computer Science
+ * University of Chicago
+ * 1100 E 58th Street
+ * Chicago, IL 60637
+ * beazley@cs.uchicago.edu
+ *
+ * Please read the file LICENSE for the copyright and terms by which SWIG
+ * can be used and distributed.
+ *******************************************************************************/
+
+#include "internal.h"
+
+/*******************************************************************************
+ * $Header$
+ *
+ * File : symbol.cxx
+ *
+ * Symbol table management.
+ *
+ *******************************************************************************/
+
+// -----------------------------------------------------------------------------
+// Symbol object
+// -----------------------------------------------------------------------------
+
+struct Symbol {
+ ~Symbol() {
+ if (name) delete name;
+ if (type) delete type;
+ if (value) delete value;
+ }
+ char *name;
+ DataType *type; // Optional datatype
+ char *value; // Optional value (for constant expressions)
+};
+
+static Hash SymHash; // SWIG Symbol table
+
+// -----------------------------------------------------------------------------
+// int add_symbol(char *name, DataType *type, char *value)
+//
+// Adds a symbol to the symbol table. Returns -1 if symbol is already in the
+// table.
+//
+// Inputs :
+// name = Symbol name
+// type = Datatype (for constants). Optional.
+// value = Value string. Optional.
+//
+// Output : 0 on success, -1 if symbol already exists.
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+int add_symbol(char *name, DataType *type, char *value) {
+
+ Symbol *s;
+ int ret;
+
+ s = new Symbol;
+ s->name = copy_string(name);
+ if (type)
+ s->type = new DataType(type);
+ else s->type = (DataType *) 0;
+ if (value)
+ s->value = copy_string(value);
+ else s->value = (char *) 0;
+
+ // Add this to the symbol table
+
+ ret = SymHash.add(s->name, s);
+ if (ret == -1) {
+ delete s;
+ }
+ return ret;
+}
+
+// -----------------------------------------------------------------------------
+// int lookup_symbol(char *name)
+//
+// Checks to see if a symbol is in the symbol table.
+//
+// Inputs : name = Symbol name
+//
+// Output : 0 if not found, 1 if found.
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+int lookup_symbol(char *name) {
+ Symbol *s;
+
+ s = (Symbol *) SymHash.lookup(name);
+ if (s) return 1;
+ else return 0;
+}
+
+// -----------------------------------------------------------------------------
+// DataType *lookup_symtype(char *name)
+//
+// Returns the datatype of a symbol or NULL if not found.
+//
+// Inputs : name = Symbol name
+//
+// Output : Datatype of symbol, NULL if not found.
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+DataType *lookup_symtype(char *name) {
+
+ Symbol *s;
+
+ s = (Symbol *) SymHash.lookup(name);
+ if (s) return s->type;
+ else return (DataType *) 0;
+}
+
+// -----------------------------------------------------------------------------
+// char *lookup_symvalue(char *name)
+//
+// Returns the value associate with a symbol.
+//
+// Inputs : name = Symbol name
+//
+// Output : Symbol value (or NULL if not present).
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+char *lookup_symvalue(char *name) {
+
+ Symbol *s;
+
+ s = (Symbol *) SymHash.lookup(name);
+ if (s) return s->value;
+ else return (char *) 0;
+}
+
+// -----------------------------------------------------------------------------
+// int update_symbol(char *name, DataType *type, char *value)
+//
+// Updates a symbol (or create it) in the hash table.
+//
+// Inputs :
+// name = Name of symbol
+// type = Datatype of symbol (optional)
+// value = Symbol value (optional)
+//
+// Output : 0
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+int update_symbol(char *name, DataType *type, char *value) {
+
+ Symbol *s;
+
+ s = (Symbol *) SymHash.lookup(name);
+ if (s) {
+ if (s->type) delete s->type;
+ if (s->value) delete s->value;
+ if (type)
+ s->type = new DataType(type);
+ else
+ s->type = (DataType *) 0;
+ if (value)
+ s->value = copy_string(value);
+ else
+ s->value = (char *) 0;
+ return 0;
+ } else {
+ return add_symbol(name, type, value);
+ }
+}
+
+// -----------------------------------------------------------------------------
+// void remove_symbol(char *name)
+//
+// Removes a symbol from the symbol table.
+//
+// Inputs : name = Symbol name.
+//
+// Output : None
+//
+// Side Effects : None
+// -----------------------------------------------------------------------------
+
+void remove_symbol(char *name) {
+ SymHash.remove(name);
+}