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; 3166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean hasEGLHandleArg = false; 32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CFunc(String original) { 34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.original = original; 35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getOriginal() { 38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return original; 39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setName(String fname) { 42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.fname = fname; 43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getName() { 46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return fname; 47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setType(CType ftype) { 50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.ftype = ftype; 51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getType() { 54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return ftype; 55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void addArgument(String argName, CType argType) { 58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argNames.add(argName); 59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypes.add(argType); 60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isPointer()) { 62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasPointerArg = true; 63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isTypedPointer()) { 65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasTypedPointerArg = true; 66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 6766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (argType.isEGLHandle()) { 6866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer hasEGLHandleArg = true; 6966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getNumArgs() { 73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.size(); 74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getArgIndex(String name) { 77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int len = argNames.size(); 78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < len; i++) { 79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (name.equals(argNames.get(i))) { 80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return i; 81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return -1; 84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getArgName(int index) { 87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.get(index); 88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getArgType(int index) { 91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argTypes.get(index); 92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasPointerArg() { 95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasPointerArg; 96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasTypedPointerArg() { 99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasTypedPointerArg; 100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 10266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer public boolean hasEGLHandleArg() { 10366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return hasEGLHandleArg; 10466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 10566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich @Override 107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String toString() { 108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String s = "Function " + fname + " returns " + ftype + ": "; 109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < argNames.size(); i++) { 110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (i > 0) { 111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += ", "; 112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += argTypes.get(i) + " " + argNames.get(i); 114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return s; 116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public static CFunc parseCFunc(String s) { 119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CFunc cfunc = new CFunc(s); 120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String[] tokens = s.split("\\s"); 121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int i = 0; 123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType ftype = new CType(); 124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String ftypeName = tokens[i++]; 125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (ftypeName.equals("const")) { 126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsConst(true); 127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftypeName = tokens[i++]; 128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setBaseType(ftypeName); 130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname = tokens[i++]; 132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (fname.equals("*")) { 133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsPointer(true); 134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich fname = tokens[i++]; 135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setName(fname); 138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setType(ftype); 139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while (i < tokens.length) { 141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String tok = tokens[i++]; 142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals("(")) { 1448a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos tok = tokens[i++]; 1458a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos if (tok.equals("void")) { 1468a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos break; 1478a59ca73f2434f0e19321351e38229314c173e4fPablo Ceballos } 148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals(")")) { 150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType argType = new CType(); 154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argTypeName = tok; 156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argName = ""; 157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argTypeName.equals("const")) { 159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsConst(true); 160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypeName = tokens[i++]; 161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setBaseType(argTypeName); 163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = tokens[i++]; 165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.startsWith("*")) { 166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsPointer(true); 167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(1, argName.length()); 168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.endsWith(",")) { 170412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(0, argName.length() - 1); 171412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 172412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 173412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.addArgument(argName, argType); 174412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 175412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 176412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return cfunc; 177412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 178412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich} 179