|
|
1.1 root 1: /*
2: * Error-handling for an application.
3: */
4:
5: /*
6: *-IMPORTS:
7: * <sys/compat.h>
8: * CONST
9: * USE_PROTO
10: * ARGS ()
11: * <setjmp.h>
12: * longjmp ()
13: * <stdarg.h>
14: * va_list
15: * va_start ()
16: * va_end ()
17: * <stdio.h>
18: * stderr
19: * fprintf ()
20: * putc ()
21: * vfprintf ()
22: * <stdlib.h>
23: * EXIT_FAILURE
24: * exit ()
25: */
26:
27: #include <sys/compat.h>
28: #include <setjmp.h>
29: #include <stdarg.h>
30: #include <stdio.h>
31: #include <stdlib.h>
32:
33: #include "ehand.h"
34:
35:
36: /*
37: * Some ancient systems do not define EXIT_SUCCESS or EXIT_FAILURE.
38: */
39:
40: #ifndef EXIT_FAILURE
41: #define EXIT_FAILURE 1
42: #endif
43:
44:
45: ehand_t * estack_base;
46:
47:
48: /*
49: * Throw an error - write out an error report and throw to the last installed
50: * handler (or call exit () if there is no installed handler).
51: */
52:
53:
54: #ifdef USE_PROTO
55: void (throw_error) (CONST char * fmt, ...)
56: #else
57: void
58: throw_error ARGS ((fmt))
59: CONST char * fmt;
60: #endif
61: {
62: #if 0
63: /*
64: * There is no vfprintf () under any version of Coherent up to 4.0.1,
65: * so we must simulate the effect using the obsolete extension that
66: * Coherent *does* support, namely the %r (recursive) format.
67: */
68: (void) fprintf (stderr, "ERROR : %r", & fmt);
69: #else
70: va_list args;
71:
72: va_start (args, fmt);
73: (void) fprintf (stderr, "ERROR : ");
74: (void) vfprintf (stderr, fmt, args);
75: va_end (args);
76: #endif
77:
78: putc ('\n', stderr);
79:
80: if (estack_base == NULL)
81: exit (EXIT_FAILURE);
82:
83: longjmp (estack_base->eh_buf, -1);
84: }
85:
86:
87: /*
88: * This function can be called when the code to pop the current exception
89: * handler detects that the stack base is not where it should be (implying
90: * that an inner function did not pop its handler).
91: */
92:
93: #ifdef USE_PROTO
94: void (error_error) (CONST char * file, int line)
95: #else
96: void
97: error_error ARGS ((file, line))
98: CONST char * file;
99: int line;
100: #endif
101: {
102: fprintf (stderr, "FATAL ERROR : Exception handler nesting error ");
103: fprintf (stderr, "detected in file\n '%s' at line %d\n", file, line);
104:
105: exit (EXIT_FAILURE);
106: }
107:
108:
109: /*
110: * Chain to the next error-handler in the stack of error handlers after the
111: * handler passed to us.
112: */
113:
114: #ifdef USE_PROTO
115: void (chain_error) (ehand_t * err)
116: #else
117: void
118: chain_error ARGS ((err))
119: ehand_t * err;
120: #endif
121: {
122: if (err != estack_base)
123: error_error ("chain_error, " __FILE__, __LINE__);
124:
125: if ((estack_base = err->eh_next) == NULL)
126: exit (EXIT_FAILURE);
127:
128: longjmp (estack_base->eh_buf, -1);
129: }
130:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.