CFunc.java revision 6cbca50b6a438151a6c5f4dbdccc7057c19b73fa
1
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}
157