diff options
Diffstat (limited to 'generic/tclPanic.c')
| -rw-r--r-- | generic/tclPanic.c | 113 | 
1 files changed, 70 insertions, 43 deletions
| diff --git a/generic/tclPanic.c b/generic/tclPanic.c index 356d3b2..2a453b9 100644 --- a/generic/tclPanic.c +++ b/generic/tclPanic.c @@ -1,45 +1,40 @@ -/*  +/*   * 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. - * - * RCS: @(#) $Id: tclPanic.c,v 1.4.12.2 2006/03/09 23:11:23 dgp Exp $ + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES.   */  #include "tclInt.h" -#include "tclPort.h" +#if defined(_WIN32) || defined(__CYGWIN__) +    MODULE_SCOPE void tclWinDebugPanic(const char *format, ...); +#endif  /* - * 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; - -/* - * 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; - +#endif  /*   *----------------------------------------------------------------------   *   * Tcl_SetPanicProc --   * - *	Replace the default panic behavior with the specified functiion. + *	Replace the default panic behavior with the specified function.   *   * Results:   *	None. @@ -51,9 +46,17 @@ static Tcl_PanicProc * CONST platformPanicProc = TclpPanic;   */  void -Tcl_SetPanicProc(proc) -    Tcl_PanicProc *proc; +Tcl_SetPanicProc( +    Tcl_PanicProc *proc)  { +#if defined(_WIN32) +    /* tclWinDebugPanic only installs if there is no panicProc yet. */ +    if ((proc != tclWinDebugPanic) || (panicProc == NULL)) +#elif defined(__CYGWIN__) +    if (proc == NULL) +	panicProc = tclWinDebugPanic; +    else +#endif      panicProc = proc;  } @@ -74,14 +77,14 @@ Tcl_SetPanicProc(proc)   */  void -Tcl_PanicVA (format, argList) -    CONST char *format;		/* Format string, suitable for passing to +Tcl_PanicVA( +    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, *arg4;	/* Additional arguments (variable in -					 * number) to pass to fprintf. */ -    char *arg5, *arg6, *arg7, *arg8; +    char *arg1, *arg2, *arg3;	/* Additional arguments (variable in number) +				 * to pass to fprintf. */ +    char *arg4, *arg5, *arg6, *arg7, *arg8;      arg1 = va_arg(argList, char *);      arg2 = va_arg(argList, char *); @@ -91,19 +94,34 @@ Tcl_PanicVA (format, argList)      arg6 = va_arg(argList, char *);      arg7 = va_arg(argList, char *);      arg8 = va_arg(argList, char *); -     +      if (panicProc != NULL) { -	(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); +	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      } else { -	(void) fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, -		arg7, arg8); -	(void) fprintf(stderr, "\n"); -	(void) fflush(stderr); +	fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, +		arg8); +	fprintf(stderr, "\n"); +	fflush(stderr); +#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      }  } @@ -123,14 +141,23 @@ Tcl_PanicVA (format, argList)   *----------------------------------------------------------------------   */ -	/* VARARGS ARGSUSED */ +	/* ARGSUSED */  void -Tcl_Panic TCL_VARARGS_DEF(CONST char *,arg1) +Tcl_Panic( +    const char *format, +    ...)  {      va_list argList; -    CONST char *format; -    format = TCL_VARARGS_START(CONST char *,arg1,argList); +    va_start(argList, format);      Tcl_PanicVA(format, argList);      va_end (argList);  } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ | 
