package midend.llvm.constant; import midend.llvm.type.IrArrayType; import midend.llvm.type.IrPointerType; import midend.llvm.type.IrInterType; public class IrConstantStr extends IrConstant { private String value; public IrConstantStr(String value, String name) { super(new IrPointerType( new IrArrayType(IrInterType.INT8, getLen(value) + 1)), name); this.value = value; } public String getValue() { return value; } public static int getLen(String value) { int len = 0; for (int i = 0; i < value.length(); i++) { if (value.charAt(i) == '\\') { i++; } else if (value.charAt(i) == '"') { continue; } len++; } return len; } public static String getRealStr(String str) { boolean start = str.charAt(0) == '"'; boolean end = str.charAt(str.length() - 1) == '"'; if (start && end) { return str.substring(1, str.length() - 1); } else if (start) { return str.substring(1); } else if (end) { return str.substring(0, str.length() - 1); } return str; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getName() + " = constant " + ((IrPointerType) getType()).getPointeeType()); sb.append(" c\"" + getRealStr(value).replace("\\n", "\\0A")); sb.append("\\00\""); return sb.toString(); } }