summaryrefslogtreecommitdiffstats
path: root/generic/tclPanic.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclPanic.c')
-rw-r--r--generic/tclPanic.c110
1 files changed, 42 insertions, 68 deletions
diff --git a/generic/tclPanic.c b/generic/tclPanic.c
index 84a9136..4614edc 100644
--- a/generic/tclPanic.c
+++ b/generic/tclPanic.c
@@ -1,40 +1,43 @@
-/*
+/*
* tclPanic.c --
*
- * Source code for the "Tcl_Panic" library procedure for Tcl; individual
- * applications will probably call Tcl_SetPanicProc() to set an
- * application-specific panic procedure.
+ * Source code for the "Tcl_Panic" library procedure for Tcl;
+ * individual applications will probably call Tcl_SetPanicProc()
+ * to set an application-specific panic procedure.
*
* Copyright (c) 1988-1993 The Regents of the University of California.
* Copyright (c) 1994 Sun Microsystems, Inc.
* Copyright (c) 1998-1999 by Scriptics Corporation.
*
- * See the file "license.terms" for information on usage and redistribution of
- * this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*/
#include "tclInt.h"
-#if defined(_WIN32) || defined(__CYGWIN__)
- MODULE_SCOPE void tclWinDebugPanic(const char *format, ...);
-#endif
+#include "tclPort.h"
/*
- * The panicProc variable contains a pointer to an application specific panic
- * procedure.
+ * The panicProc variable contains a pointer to an application
+ * specific panic procedure.
*/
-#if defined(__CYGWIN__)
-static Tcl_PanicProc *panicProc = tclWinDebugPanic;
-#else
static Tcl_PanicProc *panicProc = NULL;
-#endif
+
+/*
+ * The platformPanicProc variable contains a pointer to a platform
+ * specific panic procedure, if any. ( TclpPanic may be NULL via
+ * a macro. )
+ */
+
+static Tcl_PanicProc * CONST platformPanicProc = TclpPanic;
+
/*
*----------------------------------------------------------------------
*
* Tcl_SetPanicProc --
*
- * Replace the default panic behavior with the specified function.
+ * Replace the default panic behavior with the specified functiion.
*
* Results:
* None.
@@ -46,13 +49,9 @@ static Tcl_PanicProc *panicProc = NULL;
*/
void
-Tcl_SetPanicProc(
- Tcl_PanicProc *proc)
+Tcl_SetPanicProc(proc)
+ Tcl_PanicProc *proc;
{
-#if defined(_WIN32)
- /* tclWinDebugPanic only installs if there is no panicProc yet. */
- if ((proc != tclWinDebugPanic) || (panicProc == NULL))
-#endif
panicProc = proc;
}
@@ -73,14 +72,14 @@ Tcl_SetPanicProc(
*/
void
-Tcl_PanicVA(
- const char *format, /* Format string, suitable for passing to
+Tcl_PanicVA (format, argList)
+ CONST char *format; /* Format string, suitable for passing to
* fprintf. */
- va_list argList) /* Variable argument list. */
+ va_list argList; /* Variable argument list. */
{
- char *arg1, *arg2, *arg3; /* Additional arguments (variable in number)
- * to pass to fprintf. */
- char *arg4, *arg5, *arg6, *arg7, *arg8;
+ char *arg1, *arg2, *arg3, *arg4; /* Additional arguments (variable in
+ * number) to pass to fprintf. */
+ char *arg5, *arg6, *arg7, *arg8;
arg1 = va_arg(argList, char *);
arg2 = va_arg(argList, char *);
@@ -90,36 +89,20 @@ Tcl_PanicVA(
arg6 = va_arg(argList, char *);
arg7 = va_arg(argList, char *);
arg8 = va_arg(argList, char *);
-
+
if (panicProc != NULL) {
- panicProc(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-#ifdef _WIN32
- } else if (IsDebuggerPresent()) {
- tclWinDebugPanic(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
-#endif
+ (void) (*panicProc)(format, arg1, arg2, arg3, arg4,
+ arg5, arg6, arg7, arg8);
+ } else if (platformPanicProc != NULL) {
+ (void) (*platformPanicProc)(format, arg1, arg2, arg3, arg4,
+ arg5, arg6, arg7, arg8);
} else {
- fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7,
- arg8);
- fprintf(stderr, "\n");
- fflush(stderr);
+ (void) fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6,
+ arg7, arg8);
+ (void) fprintf(stderr, "\n");
+ (void) fflush(stderr);
+ abort();
}
- /* In case the users panic proc does not abort, we do it here */
-#if defined(_WIN32) || defined(__CYGWIN__)
-# if defined(__GNUC__)
- __builtin_trap();
-# elif defined(_WIN64)
- __debugbreak();
-# elif defined(_MSC_VER)
- _asm {int 3}
-# else
- DebugBreak();
-# endif
-#endif
-#if defined(_WIN32)
- ExitProcess(1);
-#else
- abort();
-#endif
}
/*
@@ -138,23 +121,14 @@ Tcl_PanicVA(
*----------------------------------------------------------------------
*/
- /* ARGSUSED */
+ /* VARARGS ARGSUSED */
void
-Tcl_Panic(
- const char *format,
- ...)
+Tcl_Panic TCL_VARARGS_DEF(CONST char *,arg1)
{
va_list argList;
+ CONST char *format;
- va_start(argList, format);
+ format = TCL_VARARGS_START(CONST char *,arg1,argList);
Tcl_PanicVA(format, argList);
va_end (argList);
}
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 4
- * fill-column: 78
- * End:
- */