windows-nt/Source/XPSP1/NT/sdktools/nmake/error.cpp
2020-09-26 16:20:57 +08:00

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);
}
}