244 lines
6.8 KiB
C++
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 );
|
|
|
|
}
|