aboutsummaryrefslogtreecommitdiff
path: root/sys/libc/cxwhen.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/libc/cxwhen.c')
-rw-r--r--sys/libc/cxwhen.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/sys/libc/cxwhen.c b/sys/libc/cxwhen.c
new file mode 100644
index 00000000..b3523dfe
--- /dev/null
+++ b/sys/libc/cxwhen.c
@@ -0,0 +1,63 @@
+/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+*/
+
+#define import_spp
+#define import_xnames
+#define import_knames
+#define import_libc
+#include <iraf.h>
+
+
+/* CXWHEN -- Post an exception handler. The exception handler procedure
+** is called when an exception occurs, unless the exception has been
+** disabled. If a user exception handler has not been posted and an
+** exception has not been disabled, a system default exception handler is
+** called when the exception occurs.
+**
+** Currently only four exceptions are recognized (import_xwhen):
+**
+** X_INT interrupt
+** X_ARITH arithmetic exception (e.g. divide by zero)
+** X_ACV access violation (e.g. illegal memory reference)
+** X_IPC write to IPC with no reader
+**
+** When an exception occurs the user supplied exception handler is called
+** with the following argument list:
+**
+** handler (&exception, &next_handler)
+**
+** The first argument is the code for the virtual exception calling the user
+** handler (the same handler may be posted for more than one exception).
+** The second argument is set by the user handler before exiting, and
+** must be either the ZLOCPR entry point address of the next exception
+** handler to be called or NULL, indicating that normal execution is to
+** resume.
+**
+** For portability reasons, only the virtual exceptions should be used to
+** post exception handlers. For good diagnostic messages when an exception
+** occurs it is desirable, however, to have a more precise description of
+** the actual host system exception which occurred. This may be obtained
+** by a call to C_XGMES.
+*/
+
+#define SZ_ERRMSG 64
+typedef int (*PFI)(); /* pointer to function returning int */
+
+
+/* C_XWHEN -- Post an exception handler for an exception, or disable the
+** exception (not all exceptions can be disabled).
+*/
+void
+c_xwhen (
+ int exception, /* code for virtual exception */
+ PFI new_handler, /* new exception handler */
+ PFI *old_handler /* old exception handler (output) */
+)
+{
+ XINT excode = exception;
+ XINT epa_new_handler = (XINT)new_handler;
+ XINT epa_old_handler;
+
+ XWHEN (&excode, &epa_new_handler, &epa_old_handler);
+ *old_handler = (PFI)epa_old_handler;
+}