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