windows-nt/Source/XPSP1/NT/com/rpc/midl/common/errhndl.cxx
2020-09-26 16:20:57 +08:00

244 lines
6.8 KiB
C++

/*****************************************************************************
* Copyright (c) 1993-1999 Microsoft Corporation
*
* RPC compiler: error handler
*
* Author : Vibhas Chandorkar
* Created : 22nd Aug 1990
*
****************************************************************************/
#pragma warning ( disable : 4514 ) // Unreferenced inline function
/****************************************************************************
* include files
***************************************************************************/
#include "nulldefs.h"
extern "C"
{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
}
#include "common.hxx"
#include "errors.hxx"
#include "cmdana.hxx"
#include "control.hxx"
#include "pragma.hxx"
extern CMessageNumberList GlobalMainMessageNumberList;
#define ERROR_PREFIX "MIDL"
/****************************************************************************
* local definitions and macros
***************************************************************************/
#include "errdb.h"
const ERRDB UnknownError =
{
0, CHECK_ERR(I_ERR_UNKNOWN_ERROR)
MAKE_E_MASK(ERR_ALWAYS, C_MSG, CLASS_ERROR, NOWARN )
,"unknown internal error"
};
extern CMD_ARG * pCommand;
/*** IsErrorRelevant ******************************************************
* Purpose : To decide whether the error is going to be ignored anyhow, and
* : cut out further processing
* Input : error value
* Output : nothing
* Notes : The error number itself is an indicator of the location of
* : the error, (user/compile-time,run-time) , and severity.
****************************************************************************/
ErrorInfo::ErrorInfo( STATUS_T ErrValue )
{
ErrVal = ErrValue;
// cast away the constness
pErrorRecord = (ERRDB *) ErrorDataBase;
if( ErrVal < D_ERR_MAX )
{
pErrorRecord += ( ErrVal - D_ERR_START ) + INDEX_D_ERROR();
}
else if( ErrVal < C_ERR_MAX )
{
pErrorRecord += ( ErrVal - C_ERR_START ) + INDEX_C_ERROR();
}
else if( ErrVal < A_ERR_MAX )
{
pErrorRecord += ( ErrVal - A_ERR_START ) + INDEX_A_ERROR();
}
else
{
pErrorRecord = NULL;
}
}
int
ErrorInfo::IsRelevant()
{
unsigned short ErrorClass = GET_ECLASS( pErrorRecord->ErrMask );
unsigned short ErrorWL = GET_WL( pErrorRecord->ErrMask );
unsigned short ModeSwitchConfigI = pCommand->GetModeSwitchConfigMask();
unsigned short CurWL = pCommand->GetWarningLevel();
if ( pCommand->GetEnv() & pErrorRecord->inApplicableEnviron )
{
return FALSE;
}
// if this is not relevant to this mode, return FALSE
if( GET_SC(pErrorRecord->ErrMask) & ModeSwitchConfigI )
return FALSE;
// does this qualify to be a warning in this mode ? If not return.
if ( ErrorClass == CLASS_WARN )
{
if( CurWL < ErrorWL )
return FALSE;
if ( !GlobalMainMessageNumberList.GetMessageFlag( ErrVal ) )
return FALSE;
}
return TRUE;
}
/*** RpcError ***************************************************************
* Purpose : To report an error in a formatted fashion
* Input : filename where the error occured, line number, error value
* : error mesage suffix string if any
* : input filename ptr could be NULL if no filename
* : suffix string ptr could be null if no suffix string
* Output : nothing
* Notes : The error number itself is an indicator of the location of
* : the error, (user/compile-time,run-time) , and severity.
* : Filename and line number depend upon where the error occurs. If
* : the error is a user-error(command line), file and line number
* : does not make sense. The input can be a NULL for filename, and
* : 0 for line number in case of the command line errors
****************************************************************************/
void
RpcError(
char * pFile, // filename where error occured
short Line, // line number
STATUS_T ErrVal, // error value
char * pSuffix) // error message suffix string
{
ErrorInfo ErrDescription( ErrVal );
// does this qualify to be an error in this mode ? If not return.
if ( !ErrDescription.IsRelevant() )
return;
// report the error
ErrDescription.ReportError( pFile, Line, pSuffix );
}
/*** RpcReportError ***************************************************************
* Purpose : To report an error in a formatted fashion
* Input : filename where the error occured, line number, error value
* : error mesage suffix string if any
* : input filename ptr could be NULL if no filename
* : suffix string ptr could be null if no suffix string
* Output : nothing
* Notes : The error number itself is an indicator of the location of
* : the error, (user/compile-time,run-time) , and severity.
* : Filename and line number depend upon where the error occurs. If
* : the error is a user-error(command line), file and line number
* : does not make sense. The input can be a NULL for filename, and
* : 0 for line number in case of the command line errors
****************************************************************************/
void
ErrorInfo::ReportError(
char * pFile, // filename where error occured
short Line, // line number
char * pSuffix) // error message suffix string
{
char * pSeverity = "error";
char * pPrefix;
unsigned short ErrorClass = GET_ECLASS( pErrorRecord->ErrMask );
if (!pErrorRecord)
{
fprintf( stdout
, "%s %c%.4d\n"
, "internal error"
, 'I'
, ErrVal
);
return;
}
switch( ErrorClass )
{
case CLASS_WARN:
// check if all warnings emitted are to be treated as error
if( !pCommand->IsSwitchDefined( SWITCH_WX ) )
{
pSeverity = "warning";
}
else
{
// treat as error.
ErrorClass = CLASS_ERROR;
}
break;
case CLASS_ADVICE:
// we report these as warnings, because we want tools like VC++ to understand
// our error messages for "jump to line" actions.
pSeverity = "warning";
break;
case CLASS_ERROR:
default:
break;
}
// now report the error
if ( !pSuffix )
pSuffix = "";
// mark command line errors specially
if( GET_MT(pErrorRecord->ErrMask) == 'D' )
pPrefix = "command line ";
else
pPrefix = "";
// if it a warning , dont increment error count
if( ErrorClass == CLASS_ERROR )
IncrementErrorCount();
// Print the file and line number ...
// If no file, print something anyway - this is required for automatic
// build tools to be able to parse and log error lines correctly.
if( pFile )
{
if ( Line )
fprintf( stdout, "%s(%d) : ", pFile, Line );
else
fprintf( stdout, "%s : ", pFile );
}
else
fprintf( stdout, "midl : " );
// print the error message
fprintf( stdout
, "%s%s " ERROR_PREFIX "%.4d : %s %s\n"
, pPrefix
, pSeverity
, ErrVal
, pErrorRecord->pError
, pSuffix );
}