package php.runtime.memory; import php.runtime.Memory; import php.runtime.common.StringUtils; import php.runtime.memory.helper.BinaryCharArrayMemory; import php.runtime.memory.helper.CharArrayMemory; public class CharMemory extends StringMemory { public final ReferenceMemory origin; public final int index; public CharMemory(String value, ReferenceMemory origin, int index) { super(value); this.index = index; this.origin = origin; } public static Memory valueOf(ReferenceMemory origin, StringMemory memory, int index){ if (index < 0 || index >= memory.value.length()){ return new CharMemory("", origin, index); } else { return new CharMemory(String.valueOf(memory.value.charAt(index)), origin, index); } } private void makeString(String ch){ Memory v = origin.toValue(); if (v instanceof CharArrayMemory) { CharArrayMemory charArray = (CharArrayMemory)v; charArray.put(index, ch); } else { String value = v.toString(); int len = ch.length(); if (len == 0){ ch = "\0"; } else if (len > 1) { ch = String.valueOf(ch.charAt(0)); } int len2 = value.length(); StringBuilder builder = new StringBuilder( index > len2 - 1 ? value : value.substring(0, index) ); if (index > len2 - 1){ builder.append(StringUtils.repeat('\32', index - len2)); } builder.append(ch); if (index < len2) builder.append( value.substring(index + 1) ); if (v instanceof BinaryMemory) origin.assign(new BinaryCharArrayMemory(builder.toString())); else origin.assign(new CharArrayMemory(builder.toString())); } } @Override public Memory assign(Memory memory) { makeString(memory.toString()); return memory; } @Override public Memory assign(long value) { makeString(String.valueOf(value)); return LongMemory.valueOf(value); } @Override public Memory assign(double value) { makeString(String.valueOf(value)); return new DoubleMemory(value); } @Override public Memory assign(boolean value) { makeString(Memory.boolToString(value)); return value ? TRUE : FALSE; } @Override public Memory assign(String value) { makeString(value); return new StringMemory(value); } }