AcePerl
view release on metacpan or search on metacpan
acelib/messubs.c view on Meta::CPAN
* - This is for easier checking og the log.wrm with scripts etc.
* - Messquery added for > 50 minor errors to ask if user wants to crash.
* - Made user,pid and host static in messdump.
* * Dec 3 15:52 1997 (rd)
* - messout(): defined(_WINDOW) =>!defined(NON_GRAPHIC)
* * Dec 16 17:26 1996 (srk)
* * Aug 15 13:29 1996 (srk)
* - WIN32 and MACINTOSH: seteuid() etc. are stub functions
* * Jun 6 10:50 1996 (rbrusk): compile error fixes
* * Jun 4 23:31 1996 (rd)
* Created: Mon Jun 29 14:15:56 1992 (rd)
*-------------------------------------------------------------------
*/
/* $Id: messubs.c,v 1.1 2002/11/14 20:00:06 lstein Exp $ */
#include <assert.h>
#include <errno.h>
#include "regular.h"
#include "freeout.h" /* messbeep uses freeOutF */
/* This is horrible...a hack for sunos which is not standard C compliant. */
/* to allow accessing system library error messages, will disappear.... */
#ifdef SUN
extern const char *sys_errlist[] ;
#endif
/* Mac has its own routine for crashing, see messcrash for usage. */
#if !defined(MACINTOSH)
extern void crashOut (char* text) ;
#endif
/* This buffer is used only by the routines that OUTPUT a message. Routines */
/* that format messages into buffers (e.g. messprintf, messSysErrorText) */
/* have their own buffers. Note that there is a problem here in that this */
/* buffer can be overflowed, unfortunately because we use vsprintf to do */
/* our formatting, this can only be detected after the event. */
/* */
/* Constraints on message buffer size - applicable to ALL routines that */
/* format externally supplied strings. */
/* */
/* BUFSIZE: size of message buffers (messbuf, a global buffer for general */
/* message stuff and a private ones in messdump & messprintf). */
/* PREFIX: length of message prefix (used to report details such as the */
/* file/line info. for where the error occurred. */
/* MAINTEXT: space left in buffer is the rest after the prefix and string */
/* terminator (NULL) are subtracted. */
/* Is there an argument for putting this buffer size in regular.h ?? */
/* */
enum {BUFSIZE = 32768, PREFIXSIZE = 1024, MAINTEXTSIZE = BUFSIZE - PREFIXSIZE - 1} ;
static char messbuf[BUFSIZE] ;
/* Macro to format strings using va_xx calls, it calls uMessFormat whose */
/* prototype is given below. */
/* */
/* Arguments to the macro must have the following types: */
/* */
/* FORMAT_ARGS: va_list used to get the variable argument list. */
/* FORMAT: char * to a string containing the printf format string. */
/* TARGET_PTR: char * the formatted string will be returned in this */
/* string pointer, N.B. do not put &TARGET_PTR */
/* PREFIX: char * to a string to be used as a prefix to the rest */
/* of the string, or NULL. */
/* BUFFER: char * the buffer where the formatting will take place, */
/* if NULL then the global messbuf buffer will be */
/* used. */
/* BUFLEN: unsigned */
/* int the length of the buffer given by BUFFER (ignored*/
/* if BUFFER is NULL. */
/* */
#define ACEFORMATSTRING(FORMAT_ARGS, FORMAT, TARGET_PTR, PREFIX, BUFFER, BUFLEN) \
va_start(FORMAT_ARGS, FORMAT) ; \
TARGET_PTR = uMessFormat(FORMAT_ARGS, FORMAT, PREFIX, BUFFER, BUFLEN) ; \
va_end(FORMAT_ARGS) ;
static char *uMessFormat(va_list args, char *format, char *prefix,
char *buffer, unsigned int buflen) ;
/* Some standard defines for titles/text for messages: */
/* */
#define ERROR_PREFIX "ERROR: "
#define EXIT_PREFIX "EXIT: "
#define CRASH_PREFIX_FORMAT "FATAL ERROR reported by %s at line %d: "
#define FULL_CRASH_PREFIX_FORMAT "FATAL ERROR reported by program %s, in file %s, at line %d: "
#if defined(MACINTOSH)
#define SYSERR_FORMAT "system error %d"
#else
#define SYSERR_FORMAT "system error %d - %s"
#endif
#define PROGNAME "The program"
/* messcrash now reports the file/line no. where the messcrash was issued */
/* as an aid to debugging. We do this using a static structure which holds */
/* the information and a macro version of messcrash (see regular.h), the */
/* structure elements are retrieved using access functions. */
typedef struct _MessErrorInfo
{
char *progname ; /* Name of executable reporting error. */
char *filename ; /* Filename where error reported */
int line_num ; /* Line number of file where error
reported. */
} MessErrorInfo ;
static MessErrorInfo messageG = {NULL, NULL, 0} ;
static int messGetErrorLine() ;
static char *messGetErrorFile() ;
/* Keeps a running total of errors so far (incremented whenever messerror is */
/* called). */
static int errorCount_G = 0 ;
( run in 2.380 seconds using v1.01-cache-2.11-cpan-98e64b0badf )