special cases and other things in wxPython, and since I plan on making several more, I've decided to put the SWIG sources in wxPython's CVS instead of relying on maintaining patches. This effectivly becomes a fork of an obsolete version of SWIG, :-( but since SWIG 1.3 still doesn't have some things I rely on in 1.1, not to mention that my custom patches would all have to be redone, I felt that this is the easier road to take. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15307 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			197 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*******************************************************************************
 | |
|  * 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);
 | |
| }
 |