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);
|
||
|
}
|