blob: a89e1c59e4a5d8ce0d40e68d59125977506e341d [file] [log] [blame]
Jack Palevich412f38f22009-04-13 16:22:25 -07001
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 @Override
84 public String toString() {
85 String s = "Function " + fname + " returns " + ftype + ": ";
86 for (int i = 0; i < argNames.size(); i++) {
87 if (i > 0) {
88 s += ", ";
89 }
90 s += argTypes.get(i) + " " + argNames.get(i);
91 }
92 return s;
93 }
94
95 public static CFunc parseCFunc(String s) {
96 CFunc cfunc = new CFunc(s);
97 String[] tokens = s.split("\\s");
98
99 int i = 0;
100 CType ftype = new CType();
101 String ftypeName = tokens[i++];
102 if (ftypeName.equals("const")) {
103 ftype.setIsConst(true);
104 ftypeName = tokens[i++];
105 }
106 ftype.setBaseType(ftypeName);
107
108 String fname = tokens[i++];
109 if (fname.equals("*")) {
110 ftype.setIsPointer(true);
111 fname = tokens[i++];
112 }
113
114 cfunc.setName(fname);
115 cfunc.setType(ftype);
116
117 while (i < tokens.length) {
118 String tok = tokens[i++];
119
120 if (tok.equals("(")) {
121 continue;
122 }
123 if (tok.equals(")")) {
124 break;
125 }
126
127 CType argType = new CType();
128
129 String argTypeName = tok;
130 String argName = "";
131
132 if (argTypeName.equals("const")) {
133 argType.setIsConst(true);
134 argTypeName = tokens[i++];
135 }
136 argType.setBaseType(argTypeName);
137
138 if (argTypeName.equals("void")) {
139 break;
140 }
141
142 argName = tokens[i++];
143 if (argName.startsWith("*")) {
144 argType.setIsPointer(true);
145 argName = argName.substring(1, argName.length());
146 }
147 if (argName.endsWith(",")) {
148 argName = argName.substring(0, argName.length() - 1);
149 }
150
151 cfunc.addArgument(argName, argType);
152 }
153
154 return cfunc;
155 }
156}