blob: a192c0039efa5644e444446b6f441bf731d311b6 [file] [log] [blame]
Kenny Rootbd393b72010-03-11 18:20:12 -08001/*
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 */
Jack Palevich412f38f22009-04-13 16:22:25 -070016
17import java.util.*;
18
19public 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;
Thomas Tafertshofer66a42db2012-06-15 16:22:43 -070031 boolean hasEGLHandleArg = false;
Jack Palevich412f38f22009-04-13 16:22:25 -070032
33 public CFunc(String original) {
34 this.original = original;
35 }
36
37 public String getOriginal() {
38 return original;
39 }
40
41 public void setName(String fname) {
42 this.fname = fname;
43 }
44
45 public String getName() {
46 return fname;
47 }
48
49 public void setType(CType ftype) {
50 this.ftype = ftype;
51 }
52
53 public CType getType() {
54 return ftype;
55 }
56
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 }
Thomas Tafertshofer66a42db2012-06-15 16:22:43 -070067 if (argType.isEGLHandle()) {
68 hasEGLHandleArg = true;
69 }
Jack Palevich412f38f22009-04-13 16:22:25 -070070 }
71
72 public int getNumArgs() {
73 return argNames.size();
74 }
75
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
86 public String getArgName(int index) {
87 return argNames.get(index);
88 }
89
90 public CType getArgType(int index) {
91 return argTypes.get(index);
92 }
93
94 public boolean hasPointerArg() {
95 return hasPointerArg;
96 }
97
98 public boolean hasTypedPointerArg() {
99 return hasTypedPointerArg;
100 }
101
Thomas Tafertshofer66a42db2012-06-15 16:22:43 -0700102 public boolean hasEGLHandleArg() {
103 return hasEGLHandleArg;
104 }
105
Jack Palevich412f38f22009-04-13 16:22:25 -0700106 @Override
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
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 continue;
145 }
146 if (tok.equals(")")) {
147 break;
148 }
149
150 CType argType = new CType();
151
152 String argTypeName = tok;
153 String argName = "";
154
155 if (argTypeName.equals("const")) {
156 argType.setIsConst(true);
157 argTypeName = tokens[i++];
158 }
159 argType.setBaseType(argTypeName);
160
161 if (argTypeName.equals("void")) {
162 break;
163 }
164
165 argName = tokens[i++];
166 if (argName.startsWith("*")) {
167 argType.setIsPointer(true);
168 argName = argName.substring(1, argName.length());
169 }
170 if (argName.endsWith(",")) {
171 argName = argName.substring(0, argName.length() - 1);
172 }
173
174 cfunc.addArgument(argName, argType);
175 }
176
177 return cfunc;
178 }
179}