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("(")) {
144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                continue;
145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (tok.equals(")")) {
147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                break;
148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            CType argType = new CType();
151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String argTypeName = tok;
153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String argName = "";
154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (argTypeName.equals("const")) {
156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                argType.setIsConst(true);
157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                argTypeName = tokens[i++];
158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            argType.setBaseType(argTypeName);
160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (argTypeName.equals("void")) {
162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                break;
163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            argName = tokens[i++];
166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (argName.startsWith("*")) {
167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                argType.setIsPointer(true);
168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                argName = argName.substring(1, argName.length());
169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
170412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (argName.endsWith(",")) {
171412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                argName = argName.substring(0, argName.length() - 1);
172412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
173412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
174412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            cfunc.addArgument(argName, argType);
175412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
176412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
177412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return cfunc;
178412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
179412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
180