diff options
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/quadnames.c b/quadnames.c index a582abb..3368b70 100644 --- a/quadnames.c +++ b/quadnames.c @@ -12,12 +12,15 @@ Datum *getpp(void); int setpp(Datum); Array *runfile(Array *); +Array *quadthrow1(Array *); +Array *quadthrow2(Array *, 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}, + {L"⎕THROW", FunctionTag, nil, nil, quadthrow1, quadthrow2}, {nil, 0, nil, nil, nil, nil} /* MUST BE LAST */ }; @@ -130,4 +133,29 @@ runfile(Array *a) free(code); Bterm(bio); return mkscalarint(1); +} + +/* ⎕THROW */ +Array * +quadthrow1(Array *code) +{ + if(code->type != AtypeInt) + throwerror(nil, EType); + if(code->size != 1) + throwerror(nil, ELength); + throwerror(nil, code->intdata[0]); + return nil; +} + +Array * +quadthrow2(Array *msg, Array *code) +{ + if(code->type != AtypeInt || msg->type != AtypeRune) + throwerror(nil, EType); + if(code->size != 1) + throwerror(nil, ELength); + if(msg->rank > 1) + throwerror(nil, ERank); + throwerror(pparray(msg), code->intdata[0]); + return nil; }
\ No newline at end of file |