tclPanic.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclPanic.c --
  3.  *
  4.  * Source code for the "Tcl_Panic" library procedure for Tcl;
  5.  * individual applications will probably call Tcl_SetPanicProc()
  6.  * to set an application-specific panic procedure.
  7.  *
  8.  * Copyright (c) 1988-1993 The Regents of the University of California.
  9.  * Copyright (c) 1994 Sun Microsystems, Inc.
  10.  * Copyright (c) 1998-1999 by Scriptics Corporation.
  11.  *
  12.  * See the file "license.terms" for information on usage and redistribution
  13.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  14.  *
  15.  * RCS: @(#) $Id: tclPanic.c,v 1.4.12.2 2006/03/09 23:11:23 dgp Exp $
  16.  */
  17. #include "tclInt.h"
  18. #include "tclPort.h"
  19. /*
  20.  * The panicProc variable contains a pointer to an application
  21.  * specific panic procedure.
  22.  */
  23. static Tcl_PanicProc *panicProc = NULL;
  24. /*
  25.  * The platformPanicProc variable contains a pointer to a platform
  26.  * specific panic procedure, if any.  ( TclpPanic may be NULL via
  27.  * a macro. )
  28.  */
  29. static Tcl_PanicProc * CONST platformPanicProc = TclpPanic;
  30. /*
  31.  *----------------------------------------------------------------------
  32.  *
  33.  * Tcl_SetPanicProc --
  34.  *
  35.  * Replace the default panic behavior with the specified functiion.
  36.  *
  37.  * Results:
  38.  * None.
  39.  *
  40.  * Side effects:
  41.  * Sets the panicProc variable.
  42.  *
  43.  *----------------------------------------------------------------------
  44.  */
  45. void
  46. Tcl_SetPanicProc(proc)
  47.     Tcl_PanicProc *proc;
  48. {
  49.     panicProc = proc;
  50. }
  51. /*
  52.  *----------------------------------------------------------------------
  53.  *
  54.  * Tcl_PanicVA --
  55.  *
  56.  * Print an error message and kill the process.
  57.  *
  58.  * Results:
  59.  * None.
  60.  *
  61.  * Side effects:
  62.  * The process dies, entering the debugger if possible.
  63.  *
  64.  *----------------------------------------------------------------------
  65.  */
  66. void
  67. Tcl_PanicVA (format, argList)
  68.     CONST char *format; /* Format string, suitable for passing to
  69.  * fprintf. */
  70.     va_list argList; /* Variable argument list. */
  71. {
  72.     char *arg1, *arg2, *arg3, *arg4; /* Additional arguments (variable in
  73.  * number) to pass to fprintf. */
  74.     char *arg5, *arg6, *arg7, *arg8;
  75.     arg1 = va_arg(argList, char *);
  76.     arg2 = va_arg(argList, char *);
  77.     arg3 = va_arg(argList, char *);
  78.     arg4 = va_arg(argList, char *);
  79.     arg5 = va_arg(argList, char *);
  80.     arg6 = va_arg(argList, char *);
  81.     arg7 = va_arg(argList, char *);
  82.     arg8 = va_arg(argList, char *);
  83.     
  84.     if (panicProc != NULL) {
  85. (void) (*panicProc)(format, arg1, arg2, arg3, arg4,
  86. arg5, arg6, arg7, arg8);
  87.     } else if (platformPanicProc != NULL) {
  88. (void) (*platformPanicProc)(format, arg1, arg2, arg3, arg4,
  89. arg5, arg6, arg7, arg8);
  90.     } else {
  91. (void) fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6,
  92. arg7, arg8);
  93. (void) fprintf(stderr, "n");
  94. (void) fflush(stderr);
  95. abort();
  96.     }
  97. }
  98. /*
  99.  *----------------------------------------------------------------------
  100.  *
  101.  * Tcl_Panic --
  102.  *
  103.  * Print an error message and kill the process.
  104.  *
  105.  * Results:
  106.  * None.
  107.  *
  108.  * Side effects:
  109.  * The process dies, entering the debugger if possible.
  110.  *
  111.  *----------------------------------------------------------------------
  112.  */
  113. /* VARARGS ARGSUSED */
  114. void
  115. Tcl_Panic TCL_VARARGS_DEF(CONST char *,arg1)
  116. {
  117.     va_list argList;
  118.     CONST char *format;
  119.     format = TCL_VARARGS_START(CONST char *,arg1,argList);
  120.     Tcl_PanicVA(format, argList);
  121.     va_end (argList);
  122. }