diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-21 15:27:59 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-21 15:27:59 +0000 |
commit | e12450d52dce2d6271d12720bf18175d082a0003 (patch) | |
tree | ab760dfeba4689035a2e0a6d9ae2ae75c8664197 | |
parent | 40c021d964bc60d2b60dd78022e180c964ea1b67 (diff) |
Add ⎕THROW for throwing errors
-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 |