CFunc.java revision 412f38f270b71bbc3214362eb58687cbf26d6df2
1412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 2412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.util.*; 3412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 4412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class CFunc { 5412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 6412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String original; 7412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 8412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType ftype; 9412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname; 10412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 11412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich List<String> argNames = new ArrayList<String>(); 12412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich List<CType> argTypes = new ArrayList<CType>(); 13412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 14412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich boolean hasPointerArg = false; 15412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich boolean hasTypedPointerArg = false; 16412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CFunc(String original) { 18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.original = original; 19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getOriginal() { 22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return original; 23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setName(String fname) { 26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.fname = fname; 27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getName() { 30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return fname; 31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void setType(CType ftype) { 34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich this.ftype = ftype; 35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getType() { 38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return ftype; 39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public void addArgument(String argName, CType argType) { 42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argNames.add(argName); 43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypes.add(argType); 44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isPointer()) { 46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasPointerArg = true; 47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argType.isTypedPointer()) { 49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich hasTypedPointerArg = true; 50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getNumArgs() { 54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.size(); 55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public int getArgIndex(String name) { 58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int len = argNames.size(); 59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < len; i++) { 60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (name.equals(argNames.get(i))) { 61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return i; 62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return -1; 65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String getArgName(int index) { 68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argNames.get(index); 69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public CType getArgType(int index) { 72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return argTypes.get(index); 73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasPointerArg() { 76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasPointerArg; 77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public boolean hasTypedPointerArg() { 80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return hasTypedPointerArg; 81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich @Override 84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public String toString() { 85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String s = "Function " + fname + " returns " + ftype + ": "; 86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich for (int i = 0; i < argNames.size(); i++) { 87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (i > 0) { 88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += ", "; 89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich s += argTypes.get(i) + " " + argNames.get(i); 91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return s; 93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public static CFunc parseCFunc(String s) { 96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CFunc cfunc = new CFunc(s); 97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String[] tokens = s.split("\\s"); 98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int i = 0; 100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType ftype = new CType(); 101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String ftypeName = tokens[i++]; 102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (ftypeName.equals("const")) { 103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsConst(true); 104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftypeName = tokens[i++]; 105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setBaseType(ftypeName); 107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname = tokens[i++]; 109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (fname.equals("*")) { 110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ftype.setIsPointer(true); 111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich fname = tokens[i++]; 112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setName(fname); 115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.setType(ftype); 116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while (i < tokens.length) { 118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String tok = tokens[i++]; 119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals("(")) { 121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich continue; 122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (tok.equals(")")) { 124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CType argType = new CType(); 128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argTypeName = tok; 130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String argName = ""; 131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argTypeName.equals("const")) { 133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsConst(true); 134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argTypeName = tokens[i++]; 135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setBaseType(argTypeName); 137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argTypeName.equals("void")) { 139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = tokens[i++]; 143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.startsWith("*")) { 144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argType.setIsPointer(true); 145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(1, argName.length()); 146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (argName.endsWith(",")) { 148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich argName = argName.substring(0, argName.length() - 1); 149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cfunc.addArgument(argName, argType); 152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich return cfunc; 155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich} 157