summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c28
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