|
|
// ERROR.C -- error handling functions
//
// Copyright (c) 1988-1990, Microsoft Corporation. All rights reserved.
//
// Revision History:
// 23-Feb-1994 HV Change Copyright years to 1988-94
// 01-Feb-1994 HV Move messages to external file.
// 29-Oct-1993 HV Change the version scheme.
// 15-Oct-1993 HV Use tchar.h instead of mbstring.h directly, change STR*() to _ftcs*()
// 18-May-1993 HV Change reference to messageTable[] to __MSGTAB. The new
// (and more standard) mkmsg.exe output __MSGTAB instead
// of messageTable. See message.h
// 10-May-1993 HV Add include file mbstring.h
// Change the str* functions to STR*
// 08-Jun-1992 SS add IDE feedback support
// 08-Jun-1992 SS Port to DOSX32
// 23-Feb-1990 SB Version No correctly displayed
// 31-Jan-1990 SB Debug version changes
// 05-Jan-1990 SB Rev no in std format; #ifdef LEADING_ZERO for old code
// 07-Dec-1989 SB Changed CopyRight Years to 1988-90; Add #ifdef DEBUG_HEAP
// 06-Nov-1989 SB Error messages now show NMAKE and not argv0
// 04-Sep-1989 SB heapdump() has two extra parameters
// 18-Aug-1989 SB For -z nothing done by makeMessage; Fix later
// 05-Jul-1989 SB localize rest of the messages in makeError()
// 14-Jun-1989 SB modified to localize all messages and auto update version no
// 05-Jun-1989 SB modified heapdump(), has a previous member in the list too
// 14-Apr-1989 SB modified heapdump() for better error messages when DEBUG
// 05-Apr-1989 SB made functions NEAR; all funcs to one code segment
// modified heapdump() to give better heap violations
// 22-Mar-1989 SB del call to unlinkTmpFiles() ;add call to delScriptFiles().
// 17-Mar-1989 SB heapdump() has an additional check built-in
// 10-Mar-1989 SB Changed makeMessage() for -z to get echo CMD's into PWB.SHL
// 16-Feb-1989 SB changed makeError() and makeMessage() to handle -help
// 09-Jan-1989 SB changes in makeError() to handle -help correctly
// 05-Dec-1988 SB Added CDECL for makeError(), makeMessage(); Pascal calling
// #ifdef'd heapdump prototype
// 20-Oct-1988 SB Changed some eoln comments to be in the same column
// 12-Oct-1988 SB Made GetFarMsg() to be Model independent & efficient
// 17-Aug-1988 RB Clean up.
// 24-Jun-1988 rj Added doError flag to unlinkTmpFiles call.
#include "precomp.h"
#pragma hdrstop
#include "verstamp.h"
#define FATAL 1 // error levels for
#define ERROR 2 // systems lanuguages
#define RESERVED 3 // products
#define WARNING 4
#define CopyRightYrs "1988-2000"
#define NmakeStr "NMAKE"
void __cdecl makeError ( unsigned lineNumber, unsigned msg, ...) { unsigned exitCode = 2; // general program err
unsigned level; va_list args; // More arguments
va_start(args, msg); // Point 'args' at first extra arg
if (ON(gFlags,F1_CRYPTIC_OUTPUT) && (msg / 1000) == WARNING) { return; }
displayBanner();
if (lineNumber) { fprintf(stderr, "%s(%u) : ", fName, lineNumber); } else { fprintf(stderr, "%s : ", NmakeStr); }
switch (level = msg / 1000) { case FATAL: makeMessage(FATAL_ERROR_MESSAGE); if (msg == OUT_OF_MEMORY) { exitCode = 4; } break;
case ERROR: makeMessage(ERROR_MESSAGE); break;
case WARNING: makeMessage(WARNING_MESSAGE); break; }
fprintf(stderr, " U%04d: ",msg); // U for utilities
vfprintf(stderr, get_err(msg), args); putc('\n', stderr); fflush(stderr);
if (level == FATAL) { fprintf(stderr, "Stop.\n"); delScriptFiles();
#if !defined(NDEBUG)
printStats(); #endif
exit(exitCode); } }
void __cdecl makeMessage( unsigned msg, ...) { va_list args; FILE *stream = stdout;
va_start(args, msg);
if (msg != USER_MESSAGE && ON(gFlags, F1_CRYPTIC_OUTPUT)) { return; }
displayBanner();
if (msg >= FATAL_ERROR_MESSAGE && msg <= COPYRIGHT_MESSAGE_2) { stream = stderr; }
if (msg == COPYRIGHT_MESSAGE_1) { putc('\n', stream); }
vfprintf(stream, get_err(msg), args);
if ((msg < COMMANDS_MESSAGE || msg > STOP_MESSAGE) && msg != MESG_LAST) { putc('\n', stream); }
fflush(stream); }
// displayBanner - display SignOn Banner
//
// Scope: Global
//
// Purpose: Displays SignOn Banner (Version & Copyright Message)
//
// Assumes: If rup is 0 then build version is to be suppressed
//
// Modifies Globals:
// bannerDisplayed -- Set to TRUE
//
// Notes:
// 1> Display Banner to stderr for compatibility with Microsoft C Compiler.
// 2> rmj, rmm, rup are set by SLM as #define's in VERSION.H
// 3> szCopyrightYrs is a macro set in this file
void displayBanner() { if (bannerDisplayed) { return; }
bannerDisplayed = TRUE;
makeMessage(COPYRIGHT_MESSAGE_1, VER_PRODUCTVERSION_STR); makeMessage(COPYRIGHT_MESSAGE_2, CopyRightYrs);
fflush(stderr); }
// usage - prints the usage message
//
// Scope: Extern
//
// Purpose: Prints a usage message
//
// Output: to screen
//
// Assumes: The usage messages are in order between MESG_FIRST and MESG_LAST in the
// messages file.
void usage(void) { unsigned mesg;
for (mesg = MESG_FIRST; mesg < MESG_A; ++mesg) { makeMessage(mesg, "NMAKE"); }
for (mesg = MESG_A; mesg <= MESG_LAST; mesg++) { if (mesg == MESG_M) { mesg++; }
if (mesg == MESG_V) { mesg++; } makeMessage(mesg); } }
|