* extfs/rpm: Don't show cpio contents in main rpm view.
[midnight-commander.git] / slang / slerr.c
blob896392a569ec98c3e34be25fc2369947a1bfc827
1 /* error handling common to all routines. */
2 /* Copyright (c) 1992, 1999, 2001, 2002 John E. Davis
3 * This file is part of the S-Lang library.
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Perl Artistic License.
7 */
9 #include "slinclud.h"
11 #include "slang.h"
12 #include "_slang.h"
14 void (*SLang_VMessage_Hook) (char *, va_list);
15 void (*SLang_Error_Hook)(char *);
16 void (*SLang_Exit_Error_Hook)(char *, va_list);
17 volatile int SLang_Error = 0;
18 char *SLang_Error_Message;
19 volatile int SLKeyBoard_Quit = 0;
21 static char *get_error_string (void)
23 char *str;
25 if (!SLang_Error) SLang_Error = SL_UNKNOWN_ERROR;
26 if (SLang_Error_Message != NULL) str = SLang_Error_Message;
27 else switch(SLang_Error)
29 case SL_NOT_IMPLEMENTED: str = "Not Implemented"; break;
30 case SL_APPLICATION_ERROR: str = "Application Error"; break;
31 case SL_VARIABLE_UNINITIALIZED: str = "Variable Uninitialized"; break;
32 case SL_MALLOC_ERROR : str = "Malloc Error"; break;
33 case SL_INTERNAL_ERROR: str = "Internal Error"; break;
34 case SL_STACK_OVERFLOW: str = "Stack Overflow"; break;
35 case SL_STACK_UNDERFLOW: str = "Stack Underflow"; break;
36 case SL_INTRINSIC_ERROR: str = "Intrinsic Error"; break;
37 case SL_USER_BREAK: str = "User Break"; break;
38 case SL_UNDEFINED_NAME: str = "Undefined Name"; break;
39 case SL_SYNTAX_ERROR: str = "Syntax Error"; break;
40 case SL_DUPLICATE_DEFINITION: str = "Duplicate Definition"; break;
41 case SL_TYPE_MISMATCH: str = "Type Mismatch"; break;
42 case SL_READONLY_ERROR: str = "Variable is read-only"; break;
43 case SL_DIVIDE_ERROR: str = "Divide by zero"; break;
44 case SL_OBJ_NOPEN: str = "Object not opened"; break;
45 case SL_OBJ_UNKNOWN: str = "Object unknown"; break;
46 case SL_INVALID_PARM: str = "Invalid Parameter"; break;
47 case SL_TYPE_UNDEFINED_OP_ERROR:
48 str = "Operation not defined for datatype"; break;
49 case SL_USER_ERROR:
50 str = "User Error"; break;
51 case SL_USAGE_ERROR:
52 str = "Illegal usage of function";
53 break;
54 case SL_FLOATING_EXCEPTION:
55 str = "Floating Point Exception";
56 break;
57 case SL_UNKNOWN_ERROR:
58 default: str = "Unknown Error Code";
61 SLang_Error_Message = NULL;
62 return str;
65 void SLang_doerror (char *error)
67 char *str = NULL;
68 char *err;
69 char *malloced_err_buf;
70 char err_buf [1024];
72 malloced_err_buf = NULL;
74 if (((SLang_Error == SL_USER_ERROR)
75 || (SLang_Error == SL_USAGE_ERROR))
76 && (error != NULL) && (*error != 0))
77 err = error;
78 else
80 char *sle = "S-Lang Error: ";
81 unsigned int len = 0;
82 char *fmt = "%s%s%s";
84 str = get_error_string ();
86 if ((error == NULL) || (*error == 0))
87 error = "";
88 else if (SLang_Error == SL_UNKNOWN_ERROR)
89 /* Do not display an unknown error message if error is non-NULL */
90 str = "";
91 else {
92 fmt = "%s%s: %s";
93 len = 2; /* ": " */
96 len += strlen (sle) + strlen (str) + strlen(error) + 1 /* trailing 0 */;
98 err = err_buf;
99 if (len > sizeof (err_buf))
101 if (NULL == (malloced_err_buf = SLmalloc (len)))
102 err = NULL;
103 else
104 err = malloced_err_buf;
107 if (err != NULL) sprintf (err, fmt, sle, str, error);
108 else err = "Out of memory";
111 if (SLang_Error_Hook == NULL)
113 fputs (err, stderr);
114 fputs("\r\n", stderr);
115 fflush (stderr);
117 else
118 (*SLang_Error_Hook)(err);
120 SLfree (malloced_err_buf);
123 void SLang_verror (int err_code, char *fmt, ...)
125 va_list ap;
126 char err [1024];
128 if (err_code == 0) err_code = SL_INTRINSIC_ERROR;
129 if (SLang_Error == 0) SLang_Error = err_code;
131 if (fmt != NULL)
133 va_start(ap, fmt);
134 (void) _SLvsnprintf (err, sizeof (err), fmt, ap);
135 fmt = err;
136 va_end(ap);
139 SLang_doerror (fmt);
142 void SLang_exit_error (char *fmt, ...)
144 va_list ap;
146 va_start (ap, fmt);
147 if (SLang_Exit_Error_Hook != NULL)
149 (*SLang_Exit_Error_Hook) (fmt, ap);
150 exit (1);
153 if (fmt != NULL)
155 vfprintf (stderr, fmt, ap);
156 fputs ("\r\n", stderr);
157 fflush (stderr);
159 va_end (ap);
161 exit (1);
164 void SLang_vmessage (char *fmt, ...)
166 va_list ap;
168 if (fmt == NULL)
169 return;
171 va_start (ap, fmt);
173 if (SLang_VMessage_Hook != NULL)
174 (*SLang_VMessage_Hook) (fmt, ap);
175 else
177 vfprintf (stdout, fmt, ap);
178 fputs ("\r\n", stdout);
181 va_end (ap);