summaryrefslogtreecommitdiff
path: root/apl9.h
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-21 15:18:22 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-21 15:18:22 +0000
commit40c021d964bc60d2b60dd78022e180c964ea1b67 (patch)
treeaee97fdfef0378c94871579b8bc12cbdca583553 /apl9.h
parent1ddd7de5b15f52c13a5c084445253655a94bd970 (diff)
Implement better error handling, but still no error guards
Diffstat (limited to 'apl9.h')
-rw-r--r--apl9.h37
1 files changed, 35 insertions, 2 deletions
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