From 40c021d964bc60d2b60dd78022e180c964ea1b67 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 21 Jan 2022 15:18:22 +0000 Subject: Implement better error handling, but still no error guards --- apl9.h | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'apl9.h') diff --git a/apl9.h b/apl9.h index bf74bf4..d51bde1 100644 --- a/apl9.h +++ b/apl9.h @@ -39,6 +39,20 @@ typedef enum FunctypeQuad, } functionType; +typedef enum +{ + ESyntax = 1, + EParse, + EValue, + EDomain, + ERank, + EType, + ELength, + EIndex, + EShape, + ENotImplemented, +} errorCodes; + /* Data types */ typedef struct Array Array; typedef struct Statement Statement; @@ -48,6 +62,8 @@ typedef struct Datum Datum; typedef struct Symbol Symbol; typedef struct Symtab Symtab; typedef struct QuadnameDef QuadnameDef; +typedef struct ErrorHandler ErrorHandler; + struct Array { arrayDataType type; @@ -143,6 +159,12 @@ struct QuadnameDef opdyad dyadop; }; +struct ErrorHandler +{ + Rune *msg; + jmp_buf jmp; +}; + /* Function prototypes for the different source files */ /* main.c */ Datum *evalline(Rune *, int); @@ -196,6 +218,16 @@ Array *rundfn(Rune *, Array *, Array *); /* quadnames.c */ Datum quadnamedatum(QuadnameDef); +/* error.c */ +void throwerror(Rune *, int); +#define SETUPERROR(e) {\ + jmp_buf old;\ + memcpy(old, globalerror.jmp, sizeof(jmp_buf));\ + e = setjmp(globalerror.jmp);\ + if(e != 0)\ + memcpy(globalerror.jmp, old, sizeof(jmp_buf));\ +} + /* Monadic functions from function.c */ Array *fnSame(Array *); Array *fnTally(Array *); @@ -238,7 +270,6 @@ Array *opOver(Datum *, Datum *, Array *, Array *); /* Global variables */ extern int traceeval; /* eval.c */ extern int debugmem; /* memory.c */ -extern Rune *errormsg; /* eval.c */ extern int datasizes[]; /* array.c */ extern Rune primfuncnames[]; /* functions.c */ extern Rune primmonopnames[]; /* operators.c */ @@ -252,4 +283,6 @@ extern Symtab *globalsymtab; /* symbol.c */ extern Symtab *currentsymtab; /* symbol.c */ extern int alloccounts; /* memory.c */ extern QuadnameDef quadnames[]; /* quadnames.c */ -extern int printprecision; /* print.c */ \ No newline at end of file +extern int printprecision; /* print.c */ +extern ErrorHandler globalerror; /* error.c */ +extern Rune *errorstrs[]; /* error.c */ \ No newline at end of file -- cgit v1.2.3