211 lines
5.7 KiB
C++
211 lines
5.7 KiB
C++
|
// 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);
|
||
|
}
|
||
|
}
|