summaryrefslogtreecommitdiffstats
path: root/src/java/com/sun/gluegen/cgram/CSymbolTable.java
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2006-01-15 03:24:40 +0000
committerKenneth Russel <[email protected]>2006-01-15 03:24:40 +0000
commitdf0f5636884b212bcc7a2d9b1b61c195bba79621 (patch)
treebe2eabb3b9238ae09150c91fc2596ffe465e69b8 /src/java/com/sun/gluegen/cgram/CSymbolTable.java
parent25c85cda60fb1ae1d135e3549338d8c0f331b60f (diff)
Moved GlueGen out of the JOGL workspace and into its own project.
Restructured JOGL and JOAL build processes to separately invoke GlueGen's main build.xml before using it to generate their code. Refactored OS/CPU detection code into gluegen-cpptasks.xml build file in GlueGen workspace, which is now imported by both the JOGL and JOAL build processes. Unfortunately it seems to be somewhat difficult to completely factor out the C compiler configuration into the GlueGen workspace so this has been left for a later date. Added missed ALProcAddressLookup file to JOAL workspace. Updated JOGL and JOAL build documentation. More documentation for the GlueGen workspace is forthcoming. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@3 a78bb65f-1512-4460-ba86-f6dc96a7bf27
Diffstat (limited to 'src/java/com/sun/gluegen/cgram/CSymbolTable.java')
-rw-r--r--src/java/com/sun/gluegen/cgram/CSymbolTable.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/java/com/sun/gluegen/cgram/CSymbolTable.java b/src/java/com/sun/gluegen/cgram/CSymbolTable.java
new file mode 100644
index 0000000..51edf44
--- /dev/null
+++ b/src/java/com/sun/gluegen/cgram/CSymbolTable.java
@@ -0,0 +1,132 @@
+package com.sun.gluegen.cgram;
+
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+
+
+public class CSymbolTable {
+
+ /** holds list of scopes */
+ private Vector scopeStack;
+
+ /** table where all defined names are mapped to TNode tree nodes */
+ private Hashtable symTable;
+
+ public CSymbolTable() {
+ scopeStack = new Vector(10);
+ symTable = new Hashtable(533);
+ }
+
+
+ /** push a new scope onto the scope stack.
+ */
+ public void pushScope(String s) {
+ //System.out.println("push scope:" + s);
+ scopeStack.addElement(s);
+ }
+
+ /** pop the last scope off the scope stack.
+ */
+ public void popScope() {
+ //System.out.println("pop scope");
+ int size = scopeStack.size();
+ if(size > 0)
+ scopeStack.removeElementAt(size - 1);
+ }
+
+ /** return the current scope as a string
+ */
+ public String currentScopeAsString() {
+ StringBuffer buf = new StringBuffer(100);
+ boolean first = true;
+ Enumeration e = scopeStack.elements();
+ while(e.hasMoreElements()) {
+ if(first)
+ first = false;
+ else
+ buf.append("::");
+ buf.append(e.nextElement().toString());
+ }
+ return buf.toString();
+ }
+
+ /** given a name for a type, append it with the
+ current scope.
+ */
+ public String addCurrentScopeToName(String name) {
+ String currScope = currentScopeAsString();
+ return addScopeToName(currScope, name);
+ }
+
+ /** given a name for a type, append it with the
+ given scope. MBZ
+ */
+ public String addScopeToName(String scope, String name) {
+ if(scope == null || scope.length() > 0)
+ return scope + "::" + name;
+ else
+ return name;
+ }
+
+ /** remove one level of scope from name MBZ*/
+ public String removeOneLevelScope(String scopeName) {
+ int index = scopeName.lastIndexOf("::");
+ if (index > 0) {
+ return scopeName.substring(0,index);
+ }
+ if (scopeName.length() > 0) {
+ return "";
+ }
+ return null;
+ }
+
+ /** add a node to the table with it's key as
+ the current scope and the name */
+ public TNode add(String name, TNode node) {
+ return (TNode)symTable.put(addCurrentScopeToName(name),node);
+ }
+
+
+ /** lookup a fully scoped name in the symbol table */
+ public TNode lookupScopedName(String scopedName) {
+ return (TNode)symTable.get(scopedName);
+ }
+
+ /** lookup an unscoped name in the table by prepending
+ the current scope.
+ MBZ -- if not found, pop scopes and look again
+ */
+ public TNode lookupNameInCurrentScope(String name) {
+ String scope = currentScopeAsString();
+ String scopedName;
+ TNode tnode = null;
+
+ //System.out.println( "\n"+ this.toString() );
+
+ while (tnode == null && scope != null) {
+ scopedName = addScopeToName(scope, name);
+ //System.out.println("lookup trying " + scopedName);
+ tnode = (TNode)symTable.get(scopedName);
+ scope = removeOneLevelScope(scope);
+ }
+ return tnode;
+ }
+
+ /** convert this table to a string */
+ public String toString() {
+ StringBuffer buff = new StringBuffer(300);
+ buff.append("CSymbolTable { \nCurrentScope: " + currentScopeAsString() +
+ "\nDefinedSymbols:\n");
+ Enumeration ke = symTable.keys();
+ Enumeration ve = symTable.elements();
+ while(ke.hasMoreElements()) {
+ buff.append(ke.nextElement().toString() + " (" +
+ TNode.getNameForType(((TNode)ve.nextElement()).getType()) + ")\n");
+ }
+ buff.append("}\n");
+ return buff.toString();
+ }
+
+};