diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 16:53:29 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 16:53:29 +0000 |
commit | 9c93bc20cc68e50461bb086f24f335de9dcc5135 (patch) | |
tree | ff860c161b890feaa16846ce00fe6c55c2929db5 /quadnames.c | |
parent | 071bef0ccfca9137eb3c814cbc9552f02e6f1b4d (diff) |
Implement ⎕DIV for allowing division by zero to result in 0 if needed
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 53 |
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 */ |