tom@tnosoes.UUCP (Tom Vijlbrief) (06/29/89)
Sun 3: ====================== g++ -c bug.c -finline-functions -v g++ version 1.35.0 /usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 bug.c /tmp/cca08505.cpp GNU CPP version 1.35 /usr/local/lib/gcc-cc1plus /tmp/cca08505.cpp -quiet -dumpbase bug.c -finline-functions -noreg -version -o /tmp/cca08505.s GNU C++ version 1.35.0 (68k, MIT syntax) compiled by GNU C version 1.35. In function void DefaultErrorHandler (int, enum bool, char *, char *): bug.c:62: warning: implicit declaration of function `Abort' In function void Error (char *, char *, ...): bug.c:92: Segmentation violation ========Bug.c:============================ #include <stream.h> #include <stdarg.h> #ifndef Error_First #define Error_First static const int cWarning = 0, cError = 1000, cSysError = 2000, cFatal = 3000; typedef void (*ErrorHandlerFunc)(int level, bool abort, char *location, char *msg); extern void ErrorHandler(int level, char *location, va_list va); extern void Error(char *location, char *msgfmt, ...); extern void SysError(char *location, char *msgfmt, ...); extern void Warning(char *location, char *msgfmt, ...); extern void Fatal(char *location, char *msgfmt, ...); extern void AbstractMethod(char*); extern void DefaultErrorHandler(int level, bool abort, char *location, char *msg); ErrorHandlerFunc SetErrorHandler(ErrorHandlerFunc newhandler); ErrorHandlerFunc GetErrorHandler(); int SetAbortLevel(int newlevel); int GetAbortLevel(); int SetIgnoreLevel(int newlevel); int GetIgnoreLevel(); extern void _exit(int code); #endif Error_First int gDebug= 0; void AbstractMethod(char *s) { Warning(s, "abstract method called"); } static int abortlevel= cSysError; static int ignorelevel= cError; void DefaultErrorHandler(int level, bool abort, char *location, char *msg) { char *type= "Warning"; if (level < ignorelevel) return; if (level >= cFatal) type= "Fatal"; else if (level >= cSysError) type= "SysError"; else if (level >= cError) type= "Error"; fprintf(stderr, "%s in <%s>: %s\n", type, location, msg); fflush(stderr); if (abort) { fprintf(stderr, "aborting\n"); fflush(stderr); Abort(); } } static ErrorHandlerFunc errorhandler= DefaultErrorHandler; void ErrorHandler(int level, char *location, va_list ap) { char buf[1024], *syserror= 0, buf3[1024], *bp; char *fmt= va_arg(ap, char*); vsprintf(buf, fmt, ap); if (level >= cSysError && level < cFatal) { if (errno < 0 || errno >= sys_nerr) syserror= form("errno out of range %d", errno); else syserror= sys_errlist[errno]; } if (syserror) { sprintf(buf3, "%s (%s)", buf, syserror); bp= buf3; } else bp= buf; errorhandler(level, level >= abortlevel, location, bp); } void Error(char *location, char*, ...) { va_list ap; va_start(ap, location); ErrorHandler(cError, location, ap); va_end(ap); } void SysError(char *location, char*, ...) { va_list ap; va_start(ap, location); ErrorHandler(cSysError, location, ap); va_end(ap); } void Warning(char *location, char*, ...) { va_list ap; va_start(ap, location); ErrorHandler(cWarning, location, ap); va_end(ap); } void Fatal(char *location, char*, ...) { va_list ap; va_start(ap, location); ErrorHandler(cFatal, location, ap); va_end(ap); } ErrorHandlerFunc SetErrorHandler(ErrorHandlerFunc newhandler) { ErrorHandlerFunc oldhandler= errorhandler; errorhandler= newhandler; return oldhandler; } ErrorHandlerFunc GetErrorHandler() { return errorhandler; } int SetAbortLevel(int newlevel) { int oldlevel= abortlevel; abortlevel= newlevel; return oldlevel; } int GetAbortLevel() { return abortlevel; } int SetIgnoreLevel(int newlevel) { int oldlevel= abortlevel; ignorelevel= newlevel; return oldlevel; } int GetIgnoreLevel() { return ignorelevel; } ======================== =============================================================================== Tom Vijlbrief TNO Institute for Perception P.O. Box 23 Phone: +31 34 63 562 11 3769 ZG Soesterberg E-mail: tnosoes!tom@mcvax.cwi.nl The Netherlands or: uunet!mcvax!tnosoes!tom ===============================================================================