/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.*; public class CFunc { String original; CType ftype; String fname; List argNames = new ArrayList(); List argTypes = new ArrayList(); boolean hasPointerArg = false; boolean hasTypedPointerArg = false; boolean hasEGLHandleArg = 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; } if (argType.isEGLHandle()) { hasEGLHandleArg = 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 boolean hasEGLHandleArg() { return hasEGLHandleArg; } @Override 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; } }