diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index c3f4d68..98360a4 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -3174,6 +3174,10 @@ class BuiltinFunction { return p.program.get(); } + static void PRGSET(PetitComputer p, wstring x) + { + p.program.set(x.dup); + } //alias void function(PetitComputer, Value[], Value[]) BuiltinFunc; static BuiltinFunctions[wstring] builtinFunctions; static wstring getBasicName(BFD)(const wstring def) diff --git a/SMILEBASIC/program.d b/SMILEBASIC/program.d index b7e55a2..c14b578 100644 --- a/SMILEBASIC/program.d +++ b/SMILEBASIC/program.d @@ -1,14 +1,20 @@ module otya.smilebasic.program; import std.range; import std.container; +import std.algorithm; struct Slot { DList!wstring program; DList!wstring.Range range; + this(T)(T) + { + program = make!(DList!wstring); + range = program[]; + } + void load(wstring data) { - import std.algorithm; program.clear(); foreach(l; splitter(data, "\n")) { @@ -78,6 +84,29 @@ struct Slot range.popFront(); return a; } + void set(wstring v) + { + int i; + foreach(l; splitter(v, "\n")) + { + if (!range.empty && i == 0) + { + range.put(l ~ "\n"); + } + else + { + if (range.empty) + { + program.insertAfter(range, l ~ "\n"); + } + else + { + program.insertBefore(range, l ~ "\n"); + } + } + i++; + } + } } class Program @@ -88,6 +117,10 @@ class Program this() { slot = new Slot[5]; + foreach(ref s; slot) + { + s = Slot(slot); + } } void edit(int slot, int line) { @@ -98,4 +131,8 @@ class Program { return this.slot[currentSlot].get; } + void set(wstring v) + { + this.slot[currentSlot].set = v; + } }