CFunc.java revision 15a4d2ffd04dc6c70f2cd17dae12ac6bc14c69ab
115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2006 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.util.*; 181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichpublic class CFunc { 201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String original; 221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CType ftype; 241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String fname; 251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich List<String> argNames = new ArrayList<String>(); 271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich List<CType> argTypes = new ArrayList<CType>(); 281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich boolean hasPointerArg = false; 301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich boolean hasTypedPointerArg = false; 311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public CFunc(String original) { 331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.original = original; 341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getOriginal() { 371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return original; 381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void setName(String fname) { 411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.fname = fname; 421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getName() { 451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return fname; 461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void setType(CType ftype) { 491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich this.ftype = ftype; 501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public CType getType() { 531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return ftype; 541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public void addArgument(String argName, CType argType) { 571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argNames.add(argName); 581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argTypes.add(argType); 591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argType.isPointer()) { 611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich hasPointerArg = true; 621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argType.isTypedPointer()) { 641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich hasTypedPointerArg = true; 651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public int getNumArgs() { 691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argNames.size(); 701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public int getArgIndex(String name) { 731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int len = argNames.size(); 741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < len; i++) { 751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (name.equals(argNames.get(i))) { 761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return i; 771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return -1; 801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String getArgName(int index) { 831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argNames.get(index); 841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public CType getArgType(int index) { 871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return argTypes.get(index); 881c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 891c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public boolean hasPointerArg() { 911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return hasPointerArg; 921c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public boolean hasTypedPointerArg() { 951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return hasTypedPointerArg; 961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich @Override 991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public String toString() { 1001c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String s = "Function " + fname + " returns " + ftype + ": "; 1011c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for (int i = 0; i < argNames.size(); i++) { 1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (i > 0) { 1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich s += ", "; 1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich s += argTypes.get(i) + " " + argNames.get(i); 1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return s; 1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public static CFunc parseCFunc(String s) { 1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CFunc cfunc = new CFunc(s); 1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String[] tokens = s.split("\\s"); 1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int i = 0; 1151c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CType ftype = new CType(); 1161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String ftypeName = tokens[i++]; 1171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (ftypeName.equals("const")) { 1181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ftype.setIsConst(true); 1191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ftypeName = tokens[i++]; 1201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ftype.setBaseType(ftypeName); 1221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String fname = tokens[i++]; 1241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (fname.equals("*")) { 1251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ftype.setIsPointer(true); 1261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich fname = tokens[i++]; 1271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich cfunc.setName(fname); 1301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich cfunc.setType(ftype); 1311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich while (i < tokens.length) { 1331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String tok = tokens[i++]; 1341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (tok.equals("(")) { 1361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich continue; 1371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (tok.equals(")")) { 1391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich break; 1401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CType argType = new CType(); 1431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String argTypeName = tok; 1451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String argName = ""; 1461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argTypeName.equals("const")) { 1481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argType.setIsConst(true); 1491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argTypeName = tokens[i++]; 1501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argType.setBaseType(argTypeName); 1521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argTypeName.equals("void")) { 1541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich break; 1551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argName = tokens[i++]; 1581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argName.startsWith("*")) { 1591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argType.setIsPointer(true); 1601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argName = argName.substring(1, argName.length()); 1611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (argName.endsWith(",")) { 1631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich argName = argName.substring(0, argName.length() - 1); 1641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich cfunc.addArgument(argName, argType); 1671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 1691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich return cfunc; 1701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich} 172