diff options
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/quadnames.c b/quadnames.c index d711ebb..bd98b9d 100644 --- a/quadnames.c +++ b/quadnames.c @@ -17,11 +17,13 @@ Datum *getdiv(void); void setdiv(Datum *); Datum *geta(void); Datum *getd(void); +Datum *geten(void); Datum *getself(void); Array *runfile(Array *); -Array *quadthrow1(Array *); -Array *quadthrow2(Array *, Array *); +Array *quadem(Array *); +Array *quadsignal1(Array *); +Array *quadsignal2(Array *, Array *); Array *quadinfo(Array *); Array *quadproto(Array *); Array *quaducs(Array *); @@ -39,9 +41,11 @@ QuadnameDef quadnames[] = { {L"⎕DIV", NameTag, getdiv, setdiv, nil, nil}, {L"⎕A", NameTag, geta, nil, nil, nil}, {L"⎕D", NameTag, getd, nil, nil, nil}, + {L"⎕EN", NameTag, geten, nil, nil, nil}, {L"⎕SELF", NameTag, getself, nil, nil, nil}, {L"⎕RUN", FunctionTag, nil, nil, runfile, nil}, - {L"⎕THROW", FunctionTag, nil, nil, quadthrow1, quadthrow2}, + {L"⎕EM", FunctionTag, nil, nil, quadem, nil}, + {L"⎕SIGNAL", FunctionTag, nil, nil, quadsignal1, quadsignal2}, {L"⎕INFO", FunctionTag, nil, nil, quadinfo, nil}, {L"⎕PROTO", FunctionTag, nil, nil, quadproto, nil}, {L"⎕UCS", FunctionTag, nil, nil, quaducs, nil}, @@ -235,6 +239,16 @@ getd(void) return d; } +/* ⎕EN */ +Datum * +geten(void) +{ + Datum *d = allocdatum(ArrayTag, 0); + ThreadData *td = getthreaddata(); + d->array = mkscalarint(td->lasterror); + return d; +} + /* ⎕SELF */ Datum * getself(void) @@ -270,12 +284,38 @@ runfile(Array *a) return mkscalarint(1); } -/* ⎕THROW */ +/* ⎕EM */ +Array * +quadem(Array *codes) +{ + if(GetType(codes) != AtypeInt) + throwerror(nil, EDomain); + Array *res; + if(GetSize(codes) == 1){ + Rune *msg = errorstr(codes->intdata[0]); + if(runestrlen(msg) == 0){ + msg = runesmprint("ERROR NUMBER %lld", codes->intdata[0]); + res = mkrunearray(msg); + free(msg); + }else + res = mkrunearray(msg); + }else{ + res = duparrayshape(codes, AtypeArray); + for(int i = 0; i < GetSize(codes); i++){ + Array *code = arrayitem(codes, i); + res->arraydata[i] = quadem(code); + freearray(code); + } + } + return res; +} + +/* ⎕SIGNAL */ Array * -quadthrow1(Array *code) +quadsignal1(Array *code) { if(GetType(code) != AtypeInt) - throwerror(nil, EType); + throwerror(nil, EDomain); if(GetSize(code) != 1) throwerror(nil, ELength); throwerror(nil, code->intdata[0]); @@ -283,10 +323,10 @@ quadthrow1(Array *code) } Array * -quadthrow2(Array *msg, Array *code) +quadsignal2(Array *msg, Array *code) { if(GetType(code) != AtypeInt || GetType(msg) != AtypeRune) - throwerror(nil, EType); + throwerror(nil, EDomain); if(GetSize(code) != 1) throwerror(nil, ELength); if(GetRank(msg) > 1) @@ -300,7 +340,7 @@ Array * quadinfo(Array *a) { if(GetType(a) != AtypeRune) - throwerror(nil, EType); + throwerror(nil, EDomain); Rune *code = pparray(a); Datum *res = evalline(code, nil, 0); Rune *info; @@ -349,7 +389,7 @@ quaducs(Array *a) for(int i = 0; i < GetSize(res); i++) res->intdata[i] = a->runedata[i]; }else - throwerror(nil, EType); + throwerror(nil, EDomain); return res; } @@ -361,7 +401,7 @@ quaddl(Array *a) if(GetSize(a) != 1) throwerror(nil, ELength); if(GetType(a) != AtypeInt && GetType(a) != AtypeFloat) - throwerror(nil, EType); + throwerror(nil, EDomain); if(GetType(a) == AtypeInt && a->intdata[0] >= 0) sleep(a->intdata[0] * 1000); |