From 1ddd7de5b15f52c13a5c084445253655a94bd970 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 20 Jan 2022 23:57:13 +0000 Subject: =?UTF-8?q?Implement=20a=20very=20basic=20=E2=8E=95RUN=20command?= =?UTF-8?q?=20which=20runs=20the=20code=20from=20a=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quadnames.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'quadnames.c') 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 -- cgit v1.2.3