59 lines
1.7 KiB
Java
Executable File
59 lines
1.7 KiB
Java
Executable File
package midend.llvm.constant;
|
|
|
|
import backend.mips.instr.data.MipsAsciiz;
|
|
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();
|
|
}
|
|
|
|
public void toMips(String label) {
|
|
new MipsAsciiz(label, getRealStr(value));
|
|
}
|
|
}
|