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