blob: 0794f417427bc89264646ac404fd3a0f107d8180 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001
2import java.util.*;
3
4public class CFunc {
5
6 String original;
7
8 CType ftype;
9 String fname;
10
11 List<String> argNames = new ArrayList<String>();
12 List<CType> argTypes = new ArrayList<CType>();
13
14 boolean hasPointerArg = false;
15 boolean hasTypedPointerArg = false;
16
17 public CFunc(String original) {
18 this.original = original;
19 }
20
21 public String getOriginal() {
22 return original;
23 }
24
25 public void setName(String fname) {
26 this.fname = fname;
27 }
28
29 public String getName() {
30 return fname;
31 }
32
33 public void setType(CType ftype) {
34 this.ftype = ftype;
35 }
36
37 public CType getType() {
38 return ftype;
39 }
40
41 public void addArgument(String argName, CType argType) {
42 argNames.add(argName);
43 argTypes.add(argType);
44
45 if (argType.isPointer()) {
46 hasPointerArg = true;
47 }
48 if (argType.isTypedPointer()) {
49 hasTypedPointerArg = true;
50 }
51 }
52
53 public int getNumArgs() {
54 return argNames.size();
55 }
56
57 public int getArgIndex(String name) {
58 int len = argNames.size();
59 for (int i = 0; i < len; i++) {
60 if (name.equals(argNames.get(i))) {
61 return i;
62 }
63 }
64 return -1;
65 }
66
67 public String getArgName(int index) {
68 return argNames.get(index);
69 }
70
71 public CType getArgType(int index) {
72 return argTypes.get(index);
73 }
74
75 public boolean hasPointerArg() {
76 return hasPointerArg;
77 }
78
79 public boolean hasTypedPointerArg() {
80 return hasTypedPointerArg;
81 }
82
83 public String toString() {
84 String s = "Function " + fname + " returns " + ftype + ": ";
85 for (int i = 0; i < argNames.size(); i++) {
86 if (i > 0) {
87 s += ", ";
88 }
89 s += argTypes.get(i) + " " + argNames.get(i);
90 }
91 return s;
92 }
93
94 public static CFunc parseCFunc(String s) {
95 CFunc cfunc = new CFunc(s);
96 String[] tokens = s.split("\\s");
97
98 int i = 0;
99 CType ftype = new CType();
100 String ftypeName = tokens[i++];
101 if (ftypeName.equals("const")) {
102 ftype.setIsConst(true);
103 ftypeName = tokens[i++];
104 }
105 ftype.setBaseType(ftypeName);
106
107 String fname = tokens[i++];
108 if (fname.equals("*")) {
109 ftype.setIsPointer(true);
110 fname = tokens[i++];
111 }
112
113 cfunc.setName(fname);
114 cfunc.setType(ftype);
115
116 while (i < tokens.length) {
117 String tok = tokens[i++];
118
119 if (tok.equals("(")) {
120 continue;
121 }
122 if (tok.equals(")")) {
123 break;
124 }
125
126 CType argType = new CType();
127
128 String argTypeName = tok;
129 String argName = "";
130
131 if (argTypeName.equals("const")) {
132 argType.setIsConst(true);
133 argTypeName = tokens[i++];
134 }
135 argType.setBaseType(argTypeName);
136
137 if (argTypeName.equals("void")) {
138 break;
139 }
140
141 argName = tokens[i++];
142 if (argName.startsWith("*")) {
143 argType.setIsPointer(true);
144 argName = argName.substring(1, argName.length());
145 }
146 if (argName.endsWith(",")) {
147 argName = argName.substring(0, argName.length() - 1);
148 }
149
150 cfunc.addArgument(argName, argType);
151 }
152
153 return cfunc;
154 }
155}