From ae3a005601834a831fc9efe8e758497973d60665 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 17 Dec 2016 12:31:53 +0900 Subject: [PATCH] wstring => Array!wchar --- SMILEBASIC/VM.d | 40 ++++++++++----------- SMILEBASIC/builtinfunctions.d | 65 +++++++++++++++++++++++------------ SMILEBASIC/type.d | 65 +++++++++++++++++++++++++++++++---- 3 files changed, 121 insertions(+), 49 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 09eca21..96fcb27 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -325,7 +325,7 @@ class PrintCode : Code case ValueType.String: //write(arg.stringValue); if(vm.petitcomputer) - vm.petitcomputer.console.printString(arg.stringValue); + vm.petitcomputer.console.printString(arg.castDString); break; default: //type mismatch @@ -556,10 +556,10 @@ class Operate : Code } if(l.type == ValueType.String) { - wstring ls = l.stringValue; + wchar[] ls = l.stringValue.array; if(r.type == ValueType.String) { - wstring rs = r.stringValue; + wchar[] rs = r.stringValue.array; switch(operator) { case TokenType.Plus: @@ -866,11 +866,11 @@ class GotoExpr : Code int pc; if (sc && sc.func) { - pc = sc.func.label.get(label.castString, int.min); + pc = sc.func.label.get(label.castDString, int.min); } else { - pc = vm.currentSlot.globalLabel.get(label.castString, int.min); + pc = vm.currentSlot.globalLabel.get(label.castDString, int.min); } if (pc == int.min) { @@ -931,16 +931,16 @@ class GosubExpr : Code vm.pop(label); if(label.isString) { - vm.pushBackTrace(label.castString); + vm.pushBackTrace(label.castDString); vm.pushpc; int pc; if (sc && sc.func) { - pc = sc.func.label.get(label.castString, int.min); + pc = sc.func.label.get(label.castDString, int.min); } else { - pc = vm.currentSlot.globalLabel.get(label.castString, int.min); + pc = vm.currentSlot.globalLabel.get(label.castDString, int.min); } if (pc == int.min) { @@ -1040,7 +1040,7 @@ class NewArray : Code break; case ValueType.String: array.type = ValueType.StringArray; - array.stringArray = new Array!wstring(dim); + array.stringArray = new Array!(Array!wchar)(dim); break; default: throw new TypeMismatch(); @@ -1434,7 +1434,7 @@ class CallFunctionS : Code { throw new TypeMismatch(); } - auto name = vname.castString.toUpper; + auto name = vname.castDString.toUpper; Function func = vm.currentSlot.functions.get(name, null); if(!func) { @@ -1748,13 +1748,13 @@ class RestoreExprCode : Code vm.pop(label); if(!label.isString) throw new TypeMismatch(); - if (label.stringValue in datatable.label) + if (label.castDString in datatable.label) { - datatable.dataIndex = datatable.label[label.stringValue]; + datatable.dataIndex = datatable.label[label.castDString]; } - else if (label.stringValue in vm.currentSlot.globalDataTable.label) + else if (label.castDString in vm.currentSlot.globalDataTable.label) { - datatable.dataIndex = vm.currentSlot.globalDataTable.label[label.stringValue]; + datatable.dataIndex = vm.currentSlot.globalDataTable.label[label.castDString]; } else { @@ -1875,7 +1875,7 @@ class IncRef : Code } if (refv.reference.isString && v.isString) { - refv.reference.stringValue~= v.stringValue; + refv.reference.stringValue.append(v.stringValue); return; } } @@ -1905,7 +1905,7 @@ class IncRef : Code class SwapCode : Code { - void getPointer(ref Value v, out int* ip, out double* dp, out wstring* sp) + void getPointer(ref Value v, out int* ip, out double* dp, out Array!(wchar)* sp) { ip = null; dp = null; @@ -1952,7 +1952,7 @@ class SwapCode : Code vm.pop(refitem1); double* dp1, dp2; int* ip1, ip2; - wstring* sp1, sp2; + Array!(wchar)* sp1, sp2; getPointer(refitem1, ip1, dp1, sp1); getPointer(refitem2, ip2, dp2, sp2); if ((sp1 && (dp2 || ip2)) || (sp2 && (dp1 || ip1))) @@ -1999,7 +1999,7 @@ class PushVarRefExpression : Code { Value valv; vm.pop(valv); - auto name = valv.castString; + auto name = valv.castDString; VMVariable vmv = VMVariable(int.min); if (sc.func) @@ -2031,7 +2031,7 @@ class PushVarExpression : Code { Value valv; vm.pop(valv); - auto name = valv.castString; + auto name = valv.castDString; VMVariable vmv = VMVariable(int.min); if (sc.func) @@ -2065,7 +2065,7 @@ class PopVarExpression : Code vm.pop(valv); Value expr; vm.pop(expr); - auto name = valv.castString; + auto name = valv.castDString; VMVariable vmv = VMVariable(int.min); if (sc.func) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index fd4504c..1df09c4 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -527,7 +527,7 @@ class BuiltinFunction } else if (str.isString) { - p.graphic.gputchr(p.graphic.useGRP, x, y, str.castString, scalex, scaley, color); + p.graphic.gputchr(p.graphic.useGRP, x, y, str.castDString, scalex, scaley, color); } else { @@ -1181,11 +1181,11 @@ class BuiltinFunction if(alen.isNumber) { len = alen.castInteger; - replace = areplace.castString; + replace = areplace.castDString; } else { - replace = alen.castString; + replace = alen.castDString; //省略されたらi以降の全文字を置換 return str[0..i] ~ replace; } @@ -1203,13 +1203,13 @@ class BuiltinFunction if(!vstr2.isDefault) { start = vstart.castInteger; - str1 = vstr1.castString; + str1 = vstr1.castDString; str2 = cast(wstring)vstr2; } else { - str1 = vstart.castString; - str2 = vstr1.castString; + str1 = vstart.castDString; + str2 = vstr1.castDString; } return cast(int)(str1[start..$].indexOf(str2, CaseSensitive.no)); } @@ -1383,9 +1383,9 @@ class BuiltinFunction { VM vm = p.vm; vm.pushDataIndex(); - vm.restoreData(args[2].castString); + vm.restoreData(args[2].castDString); int keyframe = vm.readData.castInteger; - auto target = p.sprite.getSpriteAnimTarget(args[1].castString); + auto target = p.sprite.getSpriteAnimTarget(args[1].castDString); int item = 2; if((target & 7) == SpriteAnimTarget.XY || (target & 7) == SpriteAnimTarget.UV) item++; animdata = new double[item * keyframe + 1]; @@ -1412,7 +1412,7 @@ class BuiltinFunction } } if(args[1].isString) - p.sprite.spanim(no, args[1].castString, animdata); + p.sprite.spanim(no, args[1].castDString, animdata); if(args[1].isNumber) p.sprite.spanim(no, cast(SpriteAnimTarget)(args[1].castInteger), animdata); } @@ -1440,7 +1440,7 @@ class BuiltinFunction { VM vm = p.vm; vm.pushDataIndex(); - vm.restoreData(va_args[0].castString); + vm.restoreData(va_args[0].castDString); auto count = vm.readData().castInteger;//読み込むスプライト数 int defno = 0;//? for(int i = 0; i < count; i++) @@ -1614,7 +1614,7 @@ class BuiltinFunction { alias retro!(Value[]) VaArgs; auto args = retro(va_args); - auto format = args[0].castString; + auto format = args[0].castDString; import std.array : appender; import std.format; FixedBuffer!(wchar, 1024) buffer;//String too long @@ -1962,7 +1962,7 @@ class BuiltinFunction //DATAから VM vm = p.vm; - vm.restoreData(args[sourceArrayIndex].castString); + vm.restoreData(args[sourceArrayIndex].castDString); for(int i = 0; i < len; i++) { Value data = vm.readData(); @@ -2103,9 +2103,9 @@ class BuiltinFunction } throw new CantUseInProgram("PROJECT"); } - static void PROJECT(PetitComputer p, out wstring name) + static void PROJECT(PetitComputer p, out Array!wchar name) { - name = p.currentProject; + name = new Array!wchar(cast(wchar[])p.currentProject.dup); } //FILES TYPE$ //((TXT|DAT):)?\w+/? @@ -2215,7 +2215,7 @@ class BuiltinFunction { int[] integerArray; double[] doubleArray; - wstring[] stringArray; + Array!wchar[] stringArray; } this(ref Value v) { @@ -2455,7 +2455,7 @@ class BuiltinFunction int[] iarray; double[] darray; - wstring[] sarray; + Array!wchar[] sarray; if (args[0].type == ValueType.IntegerArray) { iarray = args[0].integerArray.array[start..start + count]; @@ -2466,7 +2466,7 @@ class BuiltinFunction } if (args[0].type == ValueType.StringArray) { - sarray = args[0].stringArray.array[start..start + count]; + sarray = args[0].stringArray.array[start..start + count].array; } if (args.length > 1) { @@ -2510,7 +2510,7 @@ class BuiltinFunction int[] iarray; double[] darray; - wstring[] sarray; + Array!wchar[] sarray; if (args[0].type == ValueType.IntegerArray) { iarray = args[0].integerArray.array[start..start + count]; @@ -2521,7 +2521,7 @@ class BuiltinFunction } if (args[0].type == ValueType.StringArray) { - sarray = args[0].stringArray.array[start..start + count]; + sarray = args[0].stringArray.array[start..start + count].array; } if (args.length > 1) { @@ -2737,7 +2737,7 @@ class BuiltinFunction alias BFD = BuiltinFunctionData!(BuiltinFunction, name, i); wstring name2 = getBasicName!BFD(name ~ suffix); auto func = builtinFunctions.get(name2, null); - pragma(msg, AddFunc!BFD); + //pragma(msg, AddFunc!BFD); auto f = new BuiltinFunction( GetFunctionParamType!(BFD), GetFunctionReturnType!(BFD), @@ -2842,6 +2842,10 @@ template GetBuiltinFunctionArgment(P...) { const string arg = "ValueType.String, false"; } + else static if(is(P[0] == Array!wchar)) + { + const string arg = "ValueType.String, false"; + } else static if(is(P[0] == DefaultValue!int)) { const string arg = "ValueType.Integer, true"; @@ -3030,14 +3034,14 @@ DefaultValue!(double, false) fromDoubleToSkip(Value v) DefaultValue!wstring fromStringToDefault(Value v) { if(v.type == ValueType.String) - return DefaultValue!wstring(v.castString()); + return DefaultValue!wstring(v.castDString()); else return DefaultValue!wstring(true); } DefaultValue!(wstring, false) fromStringToSkip(Value v) { if(v.type == ValueType.String) - return DefaultValue!(wstring, false)(v.castString()); + return DefaultValue!(wstring, false)(v.castDString()); else return DefaultValue!(wstring, false)(true); } @@ -3195,6 +3199,19 @@ template AddFuncArg(int L, int N, int M, int O, BFD, P...) } } else static if(is(P[0] == wstring)) + { + static if(storage & ParameterStorageClass.out_) + { + static assert(false, "Invalid argument out wstring"); + } + else + { + enum add = 1; + enum outadd = 0; + const string arg = "arg[" ~ I.to!string ~ "].castDString"; + } + } + else static if(is(P[0] == Array!wchar)) { static if(storage & ParameterStorageClass.out_) { @@ -3332,6 +3349,10 @@ template OutArgsInit(BFD, int I = 0, int J = 0) { enum ret2 = "ValueType.String;"; } + else static if(is(param[I] == Array!wchar)) + { + enum ret2 = "ValueType.String;"; + } else { static assert(false, "invalid type " ~ param[I].stringof); diff --git a/SMILEBASIC/type.d b/SMILEBASIC/type.d index 92d4cab..67080b3 100644 --- a/SMILEBASIC/type.d +++ b/SMILEBASIC/type.d @@ -30,15 +30,15 @@ struct Value int integerValue; double doubleValue; //TODO:Array!wchar stringValue;にしたい - wstring stringValue; + Array!wchar stringValue; Array!int integerArray; Array!double doubleArray; - Array!wstring stringArray; + Array!(Array!wchar) stringArray; VMAddress internalAddress; Value* reference; int* integerReference; double* doubleReference; - wstring* stringReference; + Array!(wchar)* stringReference; } this(int value) { @@ -51,6 +51,16 @@ struct Value doubleValue = value; } this(wstring value) + { + this.type = ValueType.String; + stringValue = new Array!wchar(cast(wchar[])value.dup); + } + this(wchar[] value) + { + this.type = ValueType.String; + stringValue = new Array!wchar(value); + } + this(Array!wchar value) { this.type = ValueType.String; stringValue = value; @@ -60,7 +70,7 @@ struct Value this.type = type; if(type == ValueType.String) { - stringValue = ""; + stringValue = new Array!wchar(0); } } this(Value* r) @@ -78,7 +88,7 @@ struct Value this.type = ValueType.DoubleReference; doubleReference = r; } - this(wstring* r) + this(Array!(wchar)* r) { this.type = ValueType.StringReference; stringReference = r; @@ -158,12 +168,18 @@ struct Value } throw new TypeMismatch(); } - wstring castString() + Array!wchar castString() { if (this.type == ValueType.String) return this.stringValue; throw new TypeMismatch(); } + wstring castDString() + { + if (this.type == ValueType.String) + return cast(immutable)this.stringValue.array; + throw new TypeMismatch(); + } string toString() { import std.conv; @@ -202,7 +218,7 @@ struct Value //とりあえず破壊的に書き換えた //どのみちこれだと文字数を増やすことができないのでArray!wcharで管理させたい case ValueType.String: - (cast(wchar[])stringValue)[i] = v.castString[0]; + stringValue[i] = v.castString; break; case ValueType.IntegerArray: integerArray.array[i] = v.castInteger; @@ -278,6 +294,18 @@ class Array(T) } dimCount = 1; } + static if (!is(T == int)) + { + this(T[] array) + { + dim[0] = array.length; + dim[1] = 0; + dim[2] = 0; + dim[3] = 0; + this.array = array; + dimCount = 1; + } + } @property size_t length() { return array.length; @@ -408,5 +436,28 @@ class Array(T) array.length = size; dim[0] = size; } + void append(Array!T input) + { + if (dimCount != 1 || input.dimCount != 1) + { + throw new TypeMismatch(); + } + array ~= input.array; + dim[0] = array.length; + } + void opIndexAssign(Array!T v, int i1) + { + if(dimCount != 1 || v.dimCount != 1 ) throw new SyntaxError(); + if(i1 >= dim[0]) throw new SubscriptOutOfRange(); + array = array[0..i1] ~ v.array ~ array[i1..$]; + dim[0] = array.length; + } + Array!T opOpAssign(string op = "~")(Array!T v) + { + if(dimCount != 1 || v.dimCount != 1 ) throw new SyntaxError(); + array ~= v.array; + dim[0] = array.length; + return this; + } }