• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 import java.util.*;
3 
4 public 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 
CFunc(String original)17     public CFunc(String original) {
18         this.original = original;
19     }
20 
getOriginal()21     public String getOriginal() {
22         return original;
23     }
24 
setName(String fname)25     public void setName(String fname) {
26         this.fname = fname;
27     }
28 
getName()29     public String getName() {
30         return fname;
31     }
32 
setType(CType ftype)33     public void setType(CType ftype) {
34         this.ftype = ftype;
35     }
36 
getType()37     public CType getType() {
38         return ftype;
39     }
40 
addArgument(String argName, CType argType)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 
getNumArgs()53     public int getNumArgs() {
54         return argNames.size();
55     }
56 
getArgIndex(String name)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 
getArgName(int index)67     public String getArgName(int index) {
68         return argNames.get(index);
69     }
70 
getArgType(int index)71     public CType getArgType(int index) {
72         return argTypes.get(index);
73     }
74 
hasPointerArg()75     public boolean hasPointerArg() {
76         return hasPointerArg;
77     }
78 
hasTypedPointerArg()79     public boolean hasTypedPointerArg() {
80         return hasTypedPointerArg;
81     }
82 
83     @Override
toString()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 
parseCFunc(String s)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