/*
This file is part of jpcsp.
Jpcsp is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jpcsp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
*/
package jpcsp.format.rco.vsmx.interpreter;
public class VSMXString extends VSMXBaseObject {
private String value;
public VSMXString(VSMXInterpreter interpreter, String value) {
super(interpreter);
this.value = value;
}
@Override
public float getFloatValue() {
return Float.valueOf(value).floatValue();
}
@Override
public void setFloatValue(float value) {
this.value = Float.toString(value);
}
@Override
public String getStringValue() {
return value;
}
@Override
public VSMXBaseObject getPropertyValue(String name) {
if (lengthName.equals(name)) {
return new VSMXNumber(interpreter, value.length());
}
return super.getPropertyValue(name);
}
@Override
public boolean equals(VSMXBaseObject value) {
return getStringValue().equals(value.getStringValue());
}
@Override
public boolean identity(VSMXBaseObject value) {
if (value instanceof VSMXString) {
return getStringValue().equals(value.getStringValue());
}
return super.identity(value);
}
@Override
public String typeOf() {
return "string";
}
@Override
public String getClassName() {
return "String";
}
public VSMXBaseObject toUpperCase(VSMXBaseObject object) {
return new VSMXString(getInterpreter(), getStringValue().toUpperCase());
}
public VSMXBaseObject toLowerCase(VSMXBaseObject object) {
return new VSMXString(getInterpreter(), getStringValue().toLowerCase());
}
public VSMXBaseObject substring(VSMXBaseObject object, VSMXBaseObject start) {
String s = getStringValue();
int beginIndex = start.getIntValue();
beginIndex = Math.max(beginIndex, 0);
beginIndex = Math.min(beginIndex, s.length());
return new VSMXString(getInterpreter(), s.substring(beginIndex));
}
public VSMXBaseObject substring(VSMXBaseObject object, VSMXBaseObject start, VSMXBaseObject end) {
String s = getStringValue();
int beginIndex = start.getIntValue();
beginIndex = Math.max(beginIndex, 0);
beginIndex = Math.min(beginIndex, s.length());
int endIndex = end.getIntValue();
endIndex = Math.max(endIndex, 0);
endIndex = Math.min(endIndex, s.length());
// The substring method uses the lower value of start and end as the beginning point of the substring.
if (beginIndex > endIndex) {
int tmp = beginIndex;
beginIndex = endIndex;
endIndex = tmp;
}
return new VSMXString(getInterpreter(), s.substring(beginIndex, endIndex));
}
public VSMXBaseObject lastIndexOf(VSMXBaseObject object, VSMXBaseObject substring) {
return lastIndexOf(object, substring, new VSMXNumber(interpreter, object.getStringValue().length()));
}
public VSMXBaseObject lastIndexOf(VSMXBaseObject object, VSMXBaseObject substring, VSMXBaseObject startIndex) {
int startIndexInt = startIndex.getIntValue();
String substringString = substring.getStringValue();
String s = getStringValue();
if (startIndexInt < 0) {
startIndexInt = 0;
} else if (startIndexInt > s.length()) {
startIndexInt = s.length();
}
int lastIndexOfInt = s.lastIndexOf(substringString, startIndexInt);
return new VSMXNumber(interpreter, lastIndexOfInt);
}
public VSMXBaseObject charAt(VSMXBaseObject object, VSMXBaseObject index) {
String s = getStringValue();
int i = index.getIntValue();
if (i < 0 || i >= s.length()) {
return new VSMXString(interpreter, "");
}
char c = s.charAt(i);
return new VSMXString(interpreter, "" + c);
}
@Override
public String toString() {
return String.format("\"%s\"", value);
}
}