]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wxSWIG/SWIG/symbol.cxx
Since I have made several changes to SWIG over the years to accomodate
[wxWidgets.git] / wxPython / wxSWIG / SWIG / symbol.cxx
diff --git a/wxPython/wxSWIG/SWIG/symbol.cxx b/wxPython/wxSWIG/SWIG/symbol.cxx
new file mode 100644 (file)
index 0000000..afc5784
--- /dev/null
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * 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);
+}