Implement COPY..?
This commit is contained in:
@@ -1920,21 +1920,45 @@ class BuiltinFunction
|
|||||||
{
|
{
|
||||||
auto args = retro(rawargs);
|
auto args = retro(rawargs);
|
||||||
//文字列はリテラル渡すとType mismatch
|
//文字列はリテラル渡すとType mismatch
|
||||||
if(args.length > 5 || args.length < 2 || !args[0].isArray)
|
if(args.length > 5 || args.length < 2)
|
||||||
{
|
{
|
||||||
throw new IllegalFunctionCall("COPY");
|
throw new IllegalFunctionCall("COPY");
|
||||||
}
|
}
|
||||||
|
if (!args[0].isArray)
|
||||||
|
{
|
||||||
|
throw new TypeMismatch("COPY", 1);
|
||||||
|
}
|
||||||
//COPY string, string->文字列COPY
|
//COPY string, string->文字列COPY
|
||||||
//COPY array, string->DATA COPY
|
//COPY array, string->DATA COPY
|
||||||
Value dst = args[0];
|
Value dst = args[0];
|
||||||
int dstoffset = 0;
|
int dstoffset = 0;
|
||||||
int srcoffset = 0;
|
int sourceArrayIndex = 1;
|
||||||
int len = dst.length;//省略時はコピー元の末尾まで
|
if (!args[1].isArray)
|
||||||
if(args[1].isString && !args[0].isString)
|
|
||||||
{
|
{
|
||||||
|
if (!args[1].isNumber)
|
||||||
|
throw new TypeMismatch("COPY", 2);
|
||||||
|
dstoffset = args[1].castInteger;
|
||||||
|
sourceArrayIndex = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srcoffset = 0;
|
||||||
|
int len = dst.length - dstoffset;//省略時はコピー元の末尾まで
|
||||||
|
if(args[sourceArrayIndex].isString && !args[0].isString)
|
||||||
|
{
|
||||||
|
if (args.length > sourceArrayIndex + 2)
|
||||||
|
{
|
||||||
|
throw new SyntaxError();//syntax error?why???
|
||||||
|
}
|
||||||
|
if (args.length == sourceArrayIndex + 2)
|
||||||
|
{
|
||||||
|
if (!args[sourceArrayIndex + 1].isNumber)
|
||||||
|
throw new TypeMismatch("COPY", sourceArrayIndex + 2);
|
||||||
|
len = args[sourceArrayIndex + 1].castInteger;
|
||||||
|
}
|
||||||
|
|
||||||
//DATAから
|
//DATAから
|
||||||
VM vm = p.vm;
|
VM vm = p.vm;
|
||||||
vm.restoreData(args[1].castString);
|
vm.restoreData(args[sourceArrayIndex].castString);
|
||||||
for(int i = 0; i < len; i++)
|
for(int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
Value data = vm.readData();
|
Value data = vm.readData();
|
||||||
@@ -1942,7 +1966,42 @@ class BuiltinFunction
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
throw new IllegalFunctionCall("COPY (Not implemented error)");
|
if (!args[sourceArrayIndex].isArray)
|
||||||
|
{
|
||||||
|
throw new TypeMismatch("COPY", sourceArrayIndex + 1);
|
||||||
|
}
|
||||||
|
Value src = args[sourceArrayIndex];
|
||||||
|
if (args.length > sourceArrayIndex + 3)
|
||||||
|
{
|
||||||
|
throw new SyntaxError();//syntax error?why???
|
||||||
|
}
|
||||||
|
if (args.length == sourceArrayIndex + 3)
|
||||||
|
{
|
||||||
|
if (!args[sourceArrayIndex + 1].isNumber)
|
||||||
|
throw new TypeMismatch("COPY", sourceArrayIndex + 2);
|
||||||
|
srcoffset = args[sourceArrayIndex + 1].castInteger;
|
||||||
|
if (!args[sourceArrayIndex + 2].isNumber)
|
||||||
|
throw new TypeMismatch("COPY", sourceArrayIndex + 3);
|
||||||
|
len = args[sourceArrayIndex + 2].castInteger;
|
||||||
|
}
|
||||||
|
else if (args.length == sourceArrayIndex + 2)
|
||||||
|
{
|
||||||
|
if (!args[sourceArrayIndex + 1].isNumber)
|
||||||
|
throw new TypeMismatch("COPY", sourceArrayIndex + 2);
|
||||||
|
len = args[sourceArrayIndex + 1].castInteger;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
dst[i + dstoffset] = src[i + srcoffset];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
dst[i + dstoffset] = src[i + srcoffset];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@BasicName("LOAD")
|
@BasicName("LOAD")
|
||||||
static Value LOAD1(PetitComputer p, wstring name, DefaultValue!(int, false) flag)
|
static Value LOAD1(PetitComputer p, wstring name, DefaultValue!(int, false) flag)
|
||||||
|
|||||||
Reference in New Issue
Block a user