CFunc.java revision e09fd9e819c23dc90bca68375645e15544861330
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    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}
156