CFunc.java revision bd393b7f39a71a13893aea8b64474b0b07ebe0dd
1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/* 2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project 3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License. 6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at 7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * http://www.apache.org/licenses/LICENSE-2.0 9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software 11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and 14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License. 15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */ 16412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.util.*; 18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class CFunc { 20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String original; 22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType ftype; 24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname; 25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich List<String> argNames = new ArrayList<String>(); 27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich List<CType> argTypes = new ArrayList<CType>(); 28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich boolean hasPointerArg = false; 30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich boolean hasTypedPointerArg = false; 31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CFunc(String original) { 33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.original = original; 34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getOriginal() { 37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return original; 38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setName(String fname) { 41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.fname = fname; 42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getName() { 45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return fname; 46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setType(CType ftype) { 49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.ftype = ftype; 50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getType() { 53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return ftype; 54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void addArgument(String argName, CType argType) { 57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argNames.add(argName); 58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypes.add(argType); 59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isPointer()) { 61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasPointerArg = true; 62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isTypedPointer()) { 64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasTypedPointerArg = true; 65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getNumArgs() { 69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.size(); 70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getArgIndex(String name) { 73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int len = argNames.size(); 74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < len; i++) { 75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (name.equals(argNames.get(i))) { 76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return i; 77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return -1; 80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getArgName(int index) { 83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.get(index); 84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getArgType(int index) { 87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argTypes.get(index); 88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasPointerArg() { 91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasPointerArg; 92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasTypedPointerArg() { 95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasTypedPointerArg; 96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich @Override 99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String toString() { 100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String s = "Function " + fname + " returns " + ftype + ": "; 101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < argNames.size(); i++) { 102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (i > 0) { 103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += ", "; 104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += argTypes.get(i) + " " + argNames.get(i); 106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return s; 108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public static CFunc parseCFunc(String s) { 111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CFunc cfunc = new CFunc(s); 112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String[] tokens = s.split("\\s"); 113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int i = 0; 115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType ftype = new CType(); 116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String ftypeName = tokens[i++]; 117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (ftypeName.equals("const")) { 118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsConst(true); 119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftypeName = tokens[i++]; 120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setBaseType(ftypeName); 122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname = tokens[i++]; 124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (fname.equals("*")) { 125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsPointer(true); 126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich fname = tokens[i++]; 127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setName(fname); 130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setType(ftype); 131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while (i < tokens.length) { 133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String tok = tokens[i++]; 134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals("(")) { 136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich continue; 137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals(")")) { 139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType argType = new CType(); 143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argTypeName = tok; 145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argName = ""; 146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argTypeName.equals("const")) { 148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsConst(true); 149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypeName = tokens[i++]; 150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setBaseType(argTypeName); 152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argTypeName.equals("void")) { 154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = tokens[i++]; 158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.startsWith("*")) { 159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsPointer(true); 160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(1, argName.length()); 161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.endsWith(",")) { 163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(0, argName.length() - 1); 164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.addArgument(argName, argType); 167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return cfunc; 170412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 171412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich} 172