auto import from //depot/cupcake/@135843
diff --git a/opengl/tools/glgen/src/CFunc.java b/opengl/tools/glgen/src/CFunc.java
new file mode 100644
index 0000000..0794f41
--- /dev/null
+++ b/opengl/tools/glgen/src/CFunc.java
@@ -0,0 +1,155 @@
+

+import java.util.*;

+

+public class CFunc {

+

+    String original;

+

+    CType ftype;

+    String fname;

+

+    List<String> argNames = new ArrayList<String>();

+    List<CType> argTypes = new ArrayList<CType>();

+

+    boolean hasPointerArg = false;

+    boolean hasTypedPointerArg = false;

+

+    public CFunc(String original) {

+        this.original = original;

+    }

+

+    public String getOriginal() {

+        return original;

+    }

+

+    public void setName(String fname) {

+        this.fname = fname;

+    }

+

+    public String getName() {

+        return fname;

+    }

+

+    public void setType(CType ftype) {

+        this.ftype = ftype;

+    }

+

+    public CType getType() {

+        return ftype;

+    }

+

+    public void addArgument(String argName, CType argType) {

+        argNames.add(argName);

+        argTypes.add(argType);

+

+        if (argType.isPointer()) {

+            hasPointerArg = true;

+        }

+        if (argType.isTypedPointer()) {

+            hasTypedPointerArg = true;

+        }

+    }

+

+    public int getNumArgs() {

+        return argNames.size();

+    }

+

+    public int getArgIndex(String name) {

+        int len = argNames.size();

+        for (int i = 0; i < len; i++) {

+            if (name.equals(argNames.get(i))) {

+                return i;

+            }

+        }

+        return -1;

+    }

+

+    public String getArgName(int index) {

+        return argNames.get(index);

+    }

+

+    public CType getArgType(int index) {

+        return argTypes.get(index);

+    }

+

+    public boolean hasPointerArg() {

+        return hasPointerArg;

+    }

+

+    public boolean hasTypedPointerArg() {

+        return hasTypedPointerArg;

+    }

+

+    public String toString() {

+        String s =  "Function " + fname + " returns " + ftype + ": ";

+        for (int i = 0; i < argNames.size(); i++) {

+            if (i > 0) {

+                s += ", ";

+            }

+            s += argTypes.get(i) + " " + argNames.get(i);

+        }

+        return s;

+    }

+

+    public static CFunc parseCFunc(String s) {

+        CFunc cfunc = new CFunc(s);

+        String[] tokens = s.split("\\s");

+

+        int i = 0;

+        CType ftype = new CType();

+        String ftypeName = tokens[i++];

+        if (ftypeName.equals("const")) {

+            ftype.setIsConst(true);

+            ftypeName = tokens[i++];

+        }

+        ftype.setBaseType(ftypeName);

+

+        String fname = tokens[i++];

+        if (fname.equals("*")) {

+            ftype.setIsPointer(true);

+            fname = tokens[i++];

+        }

+	

+        cfunc.setName(fname);

+        cfunc.setType(ftype);

+	

+        while (i < tokens.length) {

+            String tok = tokens[i++];

+	    

+            if (tok.equals("(")) {

+                continue;

+            }

+            if (tok.equals(")")) {

+                break;

+            }

+

+            CType argType = new CType();

+	    

+            String argTypeName = tok;

+            String argName = "";

+	    

+            if (argTypeName.equals("const")) {

+                argType.setIsConst(true);

+                argTypeName = tokens[i++];

+            }

+            argType.setBaseType(argTypeName);

+

+            if (argTypeName.equals("void")) {

+                break;

+            }

+	    

+            argName = tokens[i++];

+            if (argName.startsWith("*")) {

+                argType.setIsPointer(true);

+                argName = argName.substring(1, argName.length());

+            }

+            if (argName.endsWith(",")) {

+                argName = argName.substring(0, argName.length() - 1);

+            }

+	    

+            cfunc.addArgument(argName, argType);

+        }

+

+        return cfunc;

+    }

+}