1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import java.util.*;
18 
19 public class CFunc {
20 
21     String original;
22 
23     CType ftype;
24     String fname;
25 
26     List<String> argNames = new ArrayList<String>();
27     List<CType> argTypes = new ArrayList<CType>();
28 
29     boolean hasPointerArg = false;
30     boolean hasTypedPointerArg = false;
31     boolean hasEGLHandleArg = false;
32 
CFunc(String original)33     public CFunc(String original) {
34         this.original = original;
35     }
36 
getOriginal()37     public String getOriginal() {
38         return original;
39     }
40 
setName(String fname)41     public void setName(String fname) {
42         this.fname = fname;
43     }
44 
getName()45     public String getName() {
46         return fname;
47     }
48 
setType(CType ftype)49     public void setType(CType ftype) {
50         this.ftype = ftype;
51     }
52 
getType()53     public CType getType() {
54         return ftype;
55     }
56 
addArgument(String argName, CType argType)57     public void addArgument(String argName, CType argType) {
58         argNames.add(argName);
59         argTypes.add(argType);
60 
61         if (argType.isPointer()) {
62             hasPointerArg = true;
63         }
64         if (argType.isTypedPointer()) {
65             hasTypedPointerArg = true;
66         }
67         if (argType.isEGLHandle()) {
68             hasEGLHandleArg = true;
69         }
70     }
71 
getNumArgs()72     public int getNumArgs() {
73         return argNames.size();
74     }
75 
getArgIndex(String name)76     public int getArgIndex(String name) {
77         int len = argNames.size();
78         for (int i = 0; i < len; i++) {
79             if (name.equals(argNames.get(i))) {
80                 return i;
81             }
82         }
83         return -1;
84     }
85 
getArgName(int index)86     public String getArgName(int index) {
87         return argNames.get(index);
88     }
89 
getArgType(int index)90     public CType getArgType(int index) {
91         return argTypes.get(index);
92     }
93 
hasPointerArg()94     public boolean hasPointerArg() {
95         return hasPointerArg;
96     }
97 
hasTypedPointerArg()98     public boolean hasTypedPointerArg() {
99         return hasTypedPointerArg;
100     }
101 
hasEGLHandleArg()102     public boolean hasEGLHandleArg() {
103         return hasEGLHandleArg;
104     }
105 
106     @Override
toString()107     public String toString() {
108         String s =  "Function " + fname + " returns " + ftype + ": ";
109         for (int i = 0; i < argNames.size(); i++) {
110             if (i > 0) {
111                 s += ", ";
112             }
113             s += argTypes.get(i) + " " + argNames.get(i);
114         }
115         return s;
116     }
117 
parseCFunc(String s)118     public static CFunc parseCFunc(String s) {
119         CFunc cfunc = new CFunc(s);
120         String[] tokens = s.split("\\s");
121 
122         int i = 0;
123         CType ftype = new CType();
124         String ftypeName = tokens[i++];
125         if (ftypeName.equals("const")) {
126             ftype.setIsConst(true);
127             ftypeName = tokens[i++];
128         }
129         ftype.setBaseType(ftypeName);
130 
131         String fname = tokens[i++];
132         if (fname.equals("*")) {
133             ftype.setIsPointer(true);
134             fname = tokens[i++];
135         }
136 
137         cfunc.setName(fname);
138         cfunc.setType(ftype);
139 
140         while (i < tokens.length) {
141             String tok = tokens[i++];
142 
143             if (tok.equals("(")) {
144                 tok = tokens[i++];
145                 if (tok.equals("void")) {
146                     break;
147                 }
148             }
149             if (tok.equals(")")) {
150                 break;
151             }
152 
153             CType argType = new CType();
154 
155             String argTypeName = tok;
156             String argName = "";
157 
158             if (argTypeName.equals("const")) {
159                 argType.setIsConst(true);
160                 argTypeName = tokens[i++];
161             }
162             argType.setBaseType(argTypeName);
163 
164             argName = tokens[i++];
165             if (argName.startsWith("*")) {
166                 argType.setIsPointer(true);
167                 argName = argName.substring(1, argName.length());
168             }
169             if (argName.endsWith(",")) {
170                 argName = argName.substring(0, argName.length() - 1);
171             }
172 
173             cfunc.addArgument(argName, argType);
174         }
175 
176         return cfunc;
177     }
178 }
179