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