Implement SAVE
This commit is contained in:
@@ -2285,6 +2285,31 @@ class BuiltinFunction
|
|||||||
flag.setDefaultValue(0);
|
flag.setDefaultValue(0);
|
||||||
throw new IllegalFunctionCall("NOTIMPL:LOAD");
|
throw new IllegalFunctionCall("NOTIMPL:LOAD");
|
||||||
}
|
}
|
||||||
|
static void SAVE(PetitComputer p, wstring name, Value data)
|
||||||
|
{
|
||||||
|
auto file = Projects.parseFileName(name);
|
||||||
|
if (file.resource != Resource.data && file.resource != Resource.text)
|
||||||
|
{
|
||||||
|
throw new IllegalFunctionCall("SAVE"/*, 1*/);
|
||||||
|
}
|
||||||
|
if (file.resource == Resource.text && data.isString)
|
||||||
|
{
|
||||||
|
p.project.saveTextFile(file, data.castDString);
|
||||||
|
}
|
||||||
|
else if (file.resource == Resource.data && data.isNumberArray)
|
||||||
|
{
|
||||||
|
if (data.type == ValueType.IntegerArray)
|
||||||
|
p.project.saveDataFile(file, data.integerArray);
|
||||||
|
else if (data.type == ValueType.DoubleArray)
|
||||||
|
p.project.saveDataFile(file, data.doubleArray);
|
||||||
|
else
|
||||||
|
throw new TypeMismatch("SAVE", 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new TypeMismatch("SAVE", 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
static void PROJECT(PetitComputer p, wstring name)
|
static void PROJECT(PetitComputer p, wstring name)
|
||||||
{
|
{
|
||||||
//DirectMode only
|
//DirectMode only
|
||||||
|
|||||||
@@ -9,11 +9,8 @@ enum DataType : byte
|
|||||||
|
|
||||||
align(1) struct DataHeader
|
align(1) struct DataHeader
|
||||||
{
|
{
|
||||||
char[8] magic;//PCBN0001
|
char[8] magic = "PCBN0001";//PCBN0001
|
||||||
DataType type;
|
DataType type;
|
||||||
byte dimension;
|
byte dimension;
|
||||||
int dim1;
|
int[4] dim;
|
||||||
int dim2;
|
|
||||||
int dim3;
|
|
||||||
int dim4;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
module otya.smilebasic.project;
|
module otya.smilebasic.project;
|
||||||
import otya.smilebasic.error;
|
import otya.smilebasic.error;
|
||||||
|
import otya.smilebasic.data;
|
||||||
|
import otya.smilebasic.type;
|
||||||
import std.path;
|
import std.path;
|
||||||
import std.file;
|
import std.file;
|
||||||
import std.string;
|
import std.string;
|
||||||
@@ -22,6 +24,13 @@ class Projects
|
|||||||
wstring projectPath;
|
wstring projectPath;
|
||||||
string projectPathU8;
|
string projectPathU8;
|
||||||
DialogResult result = DialogResult.FAILURE;//Default value
|
DialogResult result = DialogResult.FAILURE;//Default value
|
||||||
|
wstring saveConfirm =
|
||||||
|
r"ファイルを書き込みます。
|
||||||
|
|
||||||
|
名前: %s
|
||||||
|
|
||||||
|
よろしいですか?
|
||||||
|
";
|
||||||
this(wstring root)
|
this(wstring root)
|
||||||
{
|
{
|
||||||
rootPath = root;
|
rootPath = root;
|
||||||
@@ -169,6 +178,60 @@ class Projects
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void saveTextFile(FileName file, wstring content)
|
||||||
|
{
|
||||||
|
wstring project;
|
||||||
|
result = DialogResult.FAILURE;
|
||||||
|
if (file.project.empty)
|
||||||
|
project = convertProjectName(currentProject);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
project = file.project;
|
||||||
|
if (!isValidProjectName(project))
|
||||||
|
throw new IllegalFunctionCall("SAVE");
|
||||||
|
}
|
||||||
|
if (!isValidFilename(file.name))
|
||||||
|
throw new IllegalFunctionCall("SAVE");
|
||||||
|
auto path = buildPath(projectPath, project, "TXT"w, file.name).to!string;
|
||||||
|
write(path, content);
|
||||||
|
result = DialogResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void saveDataFile(T)(FileName file, Array!T content)
|
||||||
|
if (is(T == int) || is(T == double))
|
||||||
|
{
|
||||||
|
wstring project;
|
||||||
|
result = DialogResult.FAILURE;
|
||||||
|
if (file.project.empty)
|
||||||
|
project = convertProjectName(currentProject);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
project = file.project;
|
||||||
|
if (!isValidProjectName(project))
|
||||||
|
throw new IllegalFunctionCall("SAVE");
|
||||||
|
}
|
||||||
|
if (!isValidFilename(file.name))
|
||||||
|
throw new IllegalFunctionCall("SAVE");
|
||||||
|
auto path = buildPath(projectPath, project, "DAT"w, file.name).to!string;
|
||||||
|
DataHeader[1] harray;
|
||||||
|
DataHeader* head = harray.ptr;
|
||||||
|
static if (is(T == int))
|
||||||
|
{
|
||||||
|
head.type = DataType.int_;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
head.type = DataType.double_;
|
||||||
|
}
|
||||||
|
head.dim[] = content.dim[];
|
||||||
|
head.dimension = cast(byte)content.dimCount;
|
||||||
|
import std.stdio;
|
||||||
|
File f = File(path, "wb");
|
||||||
|
f.rawWrite(harray);
|
||||||
|
f.rawWrite(content.array);
|
||||||
|
result = DialogResult.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
wstring convertProjectName(wstring proj)
|
wstring convertProjectName(wstring proj)
|
||||||
{
|
{
|
||||||
if (proj.empty)
|
if (proj.empty)
|
||||||
|
|||||||
Reference in New Issue
Block a user