blob: 99c62b5684035732896e5f9e5c79403845092be4 [file] [log] [blame]
/*
* 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<String> argNames = new ArrayList<String>();
List<CType> argTypes = new ArrayList<CType>();
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("(")) {
tok = tokens[i++];
if (tok.equals("void")) {
break;
}
}
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);
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;
}
}