home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / UUPC11XS.ZIP / LIB / PRINTMSG.C < prev    next >
C/C++ Source or Header  |  1992-11-27  |  6KB  |  188 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    p r i n t m s g . c                                             */
  3. /*                                                                    */
  4. /*    Support routines for UUPC/extended                              */
  5. /*                                                                    */
  6. /*    Changes Copyright 1990, 1991 (c) Andrew H. Derbyshire           */
  7. /*                                                                    */
  8. /*    History:                                                        */
  9. /*       21Nov1991 Break out of lib.c                          ahd    */
  10. /*--------------------------------------------------------------------*/
  11.  
  12. /*
  13.  *    $Id: PRINTMSG.C 1.2 1992/11/20 12:39:37 ahd Exp $
  14.  *
  15.  *    $Log: PRINTMSG.C $
  16.  * Revision 1.2  1992/11/20  12:39:37  ahd
  17.  * Move heapcheck to check heap *EVERY* call
  18.  *
  19.  */
  20.  
  21. #include <stdarg.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <time.h>
  26.  
  27. #ifdef __CORE__
  28. #define __HEAPCHECK__
  29. #endif
  30.  
  31. #ifdef __HEAPCHECK__
  32. #include <alloc.h>
  33. #else
  34. #ifdef __CORELEFT__
  35. #include <alloc.h>
  36. #endif
  37. #endif
  38.  
  39. /*--------------------------------------------------------------------*/
  40. /*                    UUPC/extended include files                     */
  41. /*--------------------------------------------------------------------*/
  42.  
  43. #include "lib.h"
  44. #include "dater.h"
  45. #include "logger.h"
  46.  
  47. /*--------------------------------------------------------------------*/
  48. /*                          Global variables                          */
  49. /*--------------------------------------------------------------------*/
  50.  
  51. #ifdef __HEAPCHECK__
  52. currentfile();
  53. #endif
  54.  
  55. int debuglevel = 1;
  56. FILE *logfile = stdout;
  57.  
  58. #ifdef __CORE__
  59. long  *lowcore = NULL;
  60. char  *copyright = (char *) 4;
  61. char  *copywrong = NULL;
  62. #endif
  63.  
  64. /*--------------------------------------------------------------------*/
  65. /*    As this routine is called from everywhere, we turn on stack     */
  66. /*    checking here to handle the off-chance we screwed up and        */
  67. /*    blew the stack.  This may catch it late, but it will catch      */
  68. /*    it.                                                             */
  69. /*--------------------------------------------------------------------*/
  70.  
  71. #ifdef __TURBOC__
  72. #pragma -N
  73. #else
  74. #pragma check_stack( on )
  75. #endif
  76.  
  77. char *full_log_file_name = "UUPC log file";
  78.  
  79. /*--------------------------------------------------------------------*/
  80. /*   p r i n t m s g                                                  */
  81. /*                                                                    */
  82. /*   Print an error message if its severity level is high enough.     */
  83. /*   Print message on standard output if not in remote mode           */
  84. /*   (call-in).  Always log the error message into the log file.      */
  85. /*                                                                    */
  86. /*   Modified by ahd 10/01/89 to check for Turbo C NULL pointers      */
  87. /*   being de-referenced anywhere in program.  Fixed 12/14/89         */
  88. /*                                                                    */
  89. /*   Modified by ahd 04/18/91 to use true variable parameter list,    */
  90. /*   supplied by Harald Boegeholz                                     */
  91. /*--------------------------------------------------------------------*/
  92.  
  93. void printmsg(int level, char *fmt, ...)
  94. {
  95.    va_list arg_ptr;
  96.  
  97. #ifdef __CORELEFT__
  98.    static unsigned freecore = 63 * 1024;
  99.    unsigned nowfree;
  100. #endif
  101.  
  102. #ifdef __HEAPCHECK__
  103.       static boolean recurse = FALSE;
  104.       int heapstatus;
  105.  
  106.       heapstatus = heapcheck();
  107.       if (heapstatus == _HEAPCORRUPT)
  108.          printf("\a*** HEAP IS CORRUPTED ***\a\n");
  109.  
  110. #endif
  111.  
  112. #ifdef __CORE__
  113.    if (*lowcore != 0L)
  114.    {
  115.       putchar('\a');
  116.       debuglevel = level;  /* Force this last message to print ahd   */
  117.    }
  118. #endif
  119.  
  120.  
  121. #ifdef __CORELEFT__
  122.    nowfree = coreleft();
  123.    if (nowfree < freecore)
  124.    {
  125.       freecore = (nowfree / 10) * 9;
  126.       printmsg(0,"Free memory = %u bytes", nowfree);
  127.    }
  128. #endif
  129.  
  130.    if (level <= debuglevel)
  131.    {
  132.  
  133.       FILE *stream = (logfile == NULL) ? stdout : logfile;
  134.  
  135.       va_start(arg_ptr,fmt);
  136.  
  137.       if (stream != stdout)
  138.       {
  139.          vfprintf(stderr, fmt, arg_ptr);
  140.          fputc('\n',stderr);
  141.  
  142.          if ( debuglevel > 1 )
  143.             fprintf(stream, "(%d) ", level);
  144.          else
  145.             fprintf(stream, "%s ", dater( time( NULL ), NULL));
  146.  
  147.       } /* if (stream != stdout) */
  148.  
  149.       if (!ferror(stream))
  150.          vfprintf(stream, fmt, arg_ptr);
  151.  
  152.       if (!ferror(stream))
  153.          fputc('\n',stream);
  154.  
  155.       if (ferror(stream))
  156.       {
  157.          perror(full_log_file_name);
  158.          abort();
  159.       } /* if */
  160.  
  161. #ifdef __HEAPCHECK__
  162.       if ( !recurse )
  163.       {
  164.          recurse = TRUE;
  165. #ifdef __CORE__
  166.          if (*lowcore != 0L)
  167.             panic();
  168.     /*     if (!equal(copyright,copywrong))
  169.             panic();                         */
  170. #endif
  171.          if (heapstatus == _HEAPCORRUPT)
  172.             panic();
  173.          recurse = FALSE;
  174.       }
  175. #endif
  176.  
  177.  
  178. /*--------------------------------------------------------------------*/
  179. /*                        Massive debug mode?                         */
  180. /*--------------------------------------------------------------------*/
  181.  
  182.    if ((debuglevel > 10) &&  ((level+2) < debuglevel))
  183.       fflush( logfile );
  184.  
  185.    } /* if (level <= debuglevel) */
  186.  
  187. } /*printmsg*/
  188.