summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 16:53:29 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 16:53:29 +0000
commit9c93bc20cc68e50461bb086f24f335de9dcc5135 (patch)
treeff860c161b890feaa16846ce00fe6c55c2929db5 /quadnames.c
parent071bef0ccfca9137eb3c814cbc9552f02e6f1b4d (diff)
Implement ⎕DIV for allowing division by zero to result in 0 if needed
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/quadnames.c b/quadnames.c
index 3368b70..df98193 100644
--- a/quadnames.c
+++ b/quadnames.c
@@ -5,11 +5,13 @@
#include "apl9.h"
Datum *getquad(void);
-int setquad(Datum);
+void setquad(Datum);
Datum *getio(void);
-int setio(Datum);
+void setio(Datum);
Datum *getpp(void);
-int setpp(Datum);
+void setpp(Datum);
+Datum *getdiv(void);
+void setdiv(Datum);
Array *runfile(Array *);
Array *quadthrow1(Array *);
@@ -19,6 +21,7 @@ QuadnameDef quadnames[] = {
{L"⎕", NameTag, getquad, setquad, nil, nil},
{L"⎕IO", NameTag, getio, setio, nil, nil},
{L"⎕PP", NameTag, getpp, setpp, nil, nil},
+ {L"⎕DIV", NameTag, getdiv, setdiv, 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 */
@@ -61,11 +64,10 @@ getquad(void)
return result;
}
-int
+void
setquad(Datum new)
{
print("%S\n", ppdatum(new));
- return 1;
}
/* ⎕IO */
@@ -78,16 +80,13 @@ getio(void)
return d;
}
-int
+void
setio(Datum new)
{
- if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1)){
- print("⎕IO: domain error\n");
- return 0;
- }else{
+ if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1))
+ throwerror(nil, EDomain);
+ else
currentsymtab->io = new.array->intdata[0];
- return 1;
- }
}
/* ⎕PP */
@@ -100,16 +99,32 @@ getpp(void)
return d;
}
-int
+void
setpp(Datum new)
{
- if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || new.array->intdata[0] < 0){
- print("⎕PP: domain error\n");
- return 0;
- }else{
+ if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || new.array->intdata[0] < 0)
+ throwerror(nil, EDomain);
+ else
printprecision = new.array->intdata[0];
- return 1;
- }
+}
+
+/* ⎕DIV */
+Datum *
+getdiv(void)
+{
+ Datum *d = mallocz(sizeof(Datum), 1);
+ d->tag = ArrayTag;
+ d->array = mkscalarint(currentsymtab->div);
+ return d;
+}
+
+void
+setdiv(Datum new)
+{
+ if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1))
+ throwerror(nil, EDomain);
+ else
+ currentsymtab->div = new.array->intdata[0];
}
/* ⎕RUN */