diff options
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 31 |
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 |