Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

263 lines
6.5 KiB

/*****************************************************************************
* RPC compiler: error handler
*
* Author : Vibhas Chandorkar
* Created : 22nd Aug 1990
*
****************************************************************************/
/****************************************************************************
* include files
***************************************************************************/
#include "nulldefs.h"
extern "C"
{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
}
#include "common.hxx"
#include "errors.hxx"
#include "midlnode.hxx"
#include "cmdana.hxx"
#include "control.hxx"
#include "ctxt.hxx"
#define ERROR_PREFIX "MIDL"
/****************************************************************************
* local definitions and macros
***************************************************************************/
// define the error data base
typedef struct errdb
{
#ifdef RPCDEBUG
unsigned short TestValue;
#endif // RPCDEBUG
E_MASK ErrMask;
char * pError;
} ERRDB;
#include "errdb.h"
ERRDB UnknownError =
{
CHECK_ERR(I_ERR_UNKNOWN_ERROR)
// (CPE + MSE + OSE + CPWL( NOWARN ) + MSWL( NOWARN ) + OSWL ( NOWARN ) )
MAKE_E_MASK(ZZZ, C_MSG, CLASS_ERROR, NOWARN )
,"unknown internal error"
};
extern CCONTROL * pCompiler;
extern CTXTMGR * pGlobalContext;
extern CMD_ARG * pCommand;
/****************************************************************************
* local data
***************************************************************************/
#define INDEX_D_ERROR() (0)
#define INDEX_C_ERROR() (D_ERR_MAX - D_ERR_START)
#define INDEX_H_ERROR() (C_ERR_MAX - C_ERR_START) + (D_ERR_MAX - D_ERR_START)
#define INDEX_I_ERROR() (H_ERR_MAX - H_ERR_START) + (C_ERR_MAX - C_ERR_START) + (D_ERR_MAX - D_ERR_START);
/****************************************************************************
* local procedure prototypes
***************************************************************************/
/****************************************************************************
* external data
***************************************************************************/
/****************************************************************************
* external procedures/prototypes/etc
***************************************************************************/
extern BOOL IsTempName( char * );
/*** 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
{
char * pErrorContextMsg = (char *)NULL;
char * pError = (char *)NULL,
* pSeverity;
ERRDB * pErrDB;
unsigned short CurWL,
ErrorClass,
ErrorWL;
char ErrorRangeChar;
unsigned short ModeSwitchConfigI;
pErrDB = ErrorDataBase;
if( ErrVal < D_ERR_MAX )
{
pErrDB += ( ErrVal - D_ERR_START ) + INDEX_D_ERROR();
ErrorRangeChar = 'D';
}
else if( ErrVal < C_ERR_MAX )
{
pErrDB += ( ErrVal - C_ERR_START ) + INDEX_C_ERROR();
ErrorRangeChar = 'C';
}
else if( (ErrVal < H_ERR_MAX ) && pCommand->IsSwitchDefined( SWITCH_HPP ))
{
pErrDB += ( ErrVal - H_ERR_START ) + INDEX_H_ERROR();
ErrorRangeChar = 'H';
}
else
{
fprintf( stdout
, "%s %c%.4d\n"
, "internal error"
, 'I'
, ErrVal
);
}
// get the current operating mode and the warning level, and the
// error interpretation and warning level
ModeSwitchConfigI = (1 << pCommand->GetModeSwitchConfigIndex());
CurWL = pCommand->GetWarningLevel();
ErrorClass = GET_ECLASS( pErrDB->ErrMask );
ErrorWL = GET_WL( pErrDB->ErrMask );
pSeverity = "error";
switch( ErrorClass )
{
case CLASS_WARN:
// does this qualify to be a warning in this mode ? If not return.
if( CurWL < ErrorWL ) return;
if( GET_SC(pErrDB->ErrMask) & ModeSwitchConfigI )
return;
// 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_ERROR:
// if it is not an error in this mode return. This will be true
// if the bit corresponding to the switch configurations is set
// to 1.
if( GET_SC(pErrDB->ErrMask) & ModeSwitchConfigI )
return;
pSeverity = "error";
break;
}
#if 0
if( GET_MT(pErrDB->ErrMask) == D_MSG )
ErrorRangeChar = 'D';
else if( GET_MT(pErrDB->ErrMask) == C_MSG )
ErrorRangeChar = 'C';
else
ErrorRangeChar = 'H';
#endif // 0
// now report the error
if( ErrorRangeChar == 'D' )
{
if( pFile )
{
fprintf( stdout
, "%s(%d) : command line %s %s%.4d : %s %s\n"
, pFile
, Line
, pSeverity
, ERROR_PREFIX
, ErrVal
, pErrDB->pError
, pSuffix ? pSuffix : "" );
}
else
{
fprintf( stdout
, "command line %s %s%.4d : %s %s\n"
, pSeverity
, ERROR_PREFIX
, ErrVal
, pErrDB->pError
, pSuffix ? pSuffix : "" );
}
}
else
{
// if it a warning , dont increment error count
if( ErrorClass != CLASS_WARN )
pCompiler->IncrementErrorCount();
pErrorContextMsg = pGlobalContext->PrintContext();
if( pFile )
{
fprintf( stdout
, "%s(%d) : %s %s%.4d : %s %s %s\n"
, pFile ? pFile : ""
, Line
, pSeverity
, ERROR_PREFIX
, ErrVal
, pErrorContextMsg ? pErrorContextMsg : ""
, pErrDB->pError
, pSuffix ? pSuffix : "" );
}
else
{
fprintf( stdout
, "%s %s%.4d : %s %s %s\n"
, pSeverity
, ERROR_PREFIX
, ErrVal
, pErrorContextMsg ? pErrorContextMsg : ""
, pErrDB->pError
, pSuffix ? pSuffix : "" );
}
}
}