summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2022-02-22 21:25:36 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2022-02-22 21:25:36 +0000
commit40af1deff9db7b86532db6957ebdbc0aaff38db1 (patch)
treecb417113744f26a015d36ee6732746c4e808e700 /quadnames.c
parentae6471f1c94f51df540d95edc09c7749002f44e8 (diff)
Make errors more like dyalog:
* Use the same error numbers * Rename ⎕THROW to ⎕SIGNAL * Implement ⎕EN to inspect the last error code * Implement ⎕EM to get a message from an error code
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c62
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);