summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-20 23:57:13 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-20 23:57:13 +0000
commit1ddd7de5b15f52c13a5c084445253655a94bd970 (patch)
tree4d0f3b8ad18f2c4ceaa175022c42d7f0de093184 /quadnames.c
parent230aac3c644df9d80c8eba507e6bc7c710b26b52 (diff)
Implement a very basic ⎕RUN command which runs the code from a file
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/quadnames.c b/quadnames.c
index bb191c5..e7ebbdd 100644
--- a/quadnames.c
+++ b/quadnames.c
@@ -11,10 +11,13 @@ int setio(Datum);
Datum *getpp(void);
int setpp(Datum);
+Array *runfile(Array *);
+
QuadnameDef quadnames[] = {
{L"⎕", NameTag, getquad, setquad, nil, nil},
{L"⎕IO", NameTag, getio, setio, nil, nil},
{L"⎕PP", NameTag, getpp, setpp, nil, nil},
+ {L"⎕RUN", FunctionTag, nil, nil, runfile, nil},
{nil, 0, nil, nil, nil, nil} /* MUST BE LAST */
};
@@ -31,6 +34,11 @@ quadnamedatum(QuadnameDef q)
d.symbol->undefined = 0;
break;
case FunctionTag:
+ d.func.type = FunctypeQuad;
+ d.func.quad = malloc(sizeof(QuadnameDef));
+ *d.func.quad = q;
+ d.func.left = nil;
+ break;
case MonadicOpTag:
case DyadicOpTag:
default:
@@ -99,4 +107,27 @@ setpp(Datum new)
printprecision = new.array->intdata[0];
return 1;
}
+}
+
+/* ⎕RUN */
+Array *
+runfile(Array *a)
+{
+ print("Loading file %S\n", pparray(a));
+ if(a->type != AtypeRune || a->rank > 1){
+ return mkscalarint(0);
+ }
+
+ char *filename = smprint("%S", pparray(a));
+ Biobuf *bio = Bopen(filename, OREAD);
+ if(bio == nil)
+ return mkscalarint(0);
+
+ char *charcode = Brdstr(bio, Beof, 1);
+ Rune *code = runesmprint("%s", charcode);
+ evalline(code, 1);
+ free(charcode);
+ free(code);
+ Bterm(bio);
+ return mkscalarint(1);
} \ No newline at end of file