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

179 lines
5.3 KiB
C++

#pragma warning ( disable : 4514 )
#include <stdio.h>
#include <malloc.h>
#include <excpt.h>
#include <process.h>
#include <string.h>
#include "cmdline.h"
#include "errdb.h"
#ifdef MIDL_INTERNAL
#define MIDL_FREE_BUILD 0
#define MIDL_INTERNAL_PRINTF(x) printf(x)
#else
#define MIDL_FREE_BUILD 1
#define MIDL_INTERNAL_PRINTF(x)
#endif
const char *pSignon1 = "Microsoft (R) 32b/64b MIDL Compiler Version %s \n";
const char *pSignon2 = "Copyright (c) Microsoft Corp 1991-2000. All rights reserved.\n";
STATUS_T Execute( char* szCmd, char* szCmdLine );
void RpcError( char* pFile, short Line, STATUS_T status, char* pSuffix );
void ReportError( STATUS_T status, char* szMsg );
void WriteCommandAnaFile(char *pszFilename, CommandLine *pCmdLine);
extern "C" long __stdcall GetTempPathA( long, char * );
extern "C" long __stdcall GetTempFileNameA( const char*, const char*, unsigned int, char * );
CMD_ARG* pCommand;
bool fCommandLineErrors = false;
inline bool BadIntermediateFileError( STATUS_T status )
{
return ( BAD_CMD_FILE == status )
|| ( UNABLE_TO_OPEN_CMD_FILE == status );
}
int
main(
int argc,
char** argv
)
{
STATUS_T status = STATUS_OK;
char szTempCmdFile[_MAX_PATH];
_try
{
CommandLine* pCmdLine = new CommandLine;
pCommand = pCmdLine;
// /nologo is specially detected by RegisterArgs
pCmdLine->RegisterArgs( argv+1, short(argc -1) );
char* szVersion = pCmdLine->GetCompilerVersion();
pCmdLine->GetCompileTime();
if ( pCmdLine->ShowLogo() )
{
// the signon
fprintf( stderr, pSignon1, szVersion );
fprintf( stderr, pSignon2 );
fflush( stderr );
}
status = pCmdLine->ProcessArgs();
if( status == STATUS_OK && ! fCommandLineErrors )
{
if( pCmdLine->IsSwitchDefined( SWITCH_CONFIRM ) )
{
pCmdLine->Confirm();
}
else if( pCmdLine->IsSwitchDefined( SWITCH_HELP ) )
{
pCmdLine->Help();
}
else
{
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
// Create the core intermediate file
GetTempPathA( _MAX_PATH, path_buffer );
if ( !GetTempFileNameA(path_buffer, "MIDLC", 0, szTempCmdFile) )
{
status = INTERMEDIATE_FILE_CREATE;
RpcError( NULL, 0, status, path_buffer);
return status;
}
WriteCommandAnaFile( szTempCmdFile, pCmdLine );
// The path to midlc.exe should be the same as the path to
// midl.exe
_splitpath( argv[0], drive, dir, fname, ext );
_makepath( path_buffer, drive, dir, "midlc", "exe" );
// if -debugline is present, spit out the midlcore command
// line and quit; the command ana file is preserved.
if ( pCmdLine->IsSwitchDefined( SWITCH_DEBUGLINE ) )
{
printf( "\ndebugline: %s %s\n", path_buffer, szTempCmdFile );
return 0;
}
// spawn 32b MIDL run
status = ( STATUS_T ) Execute( path_buffer, szTempCmdFile );
if ( ! BadIntermediateFileError( status ) )
_unlink( szTempCmdFile );
if ( !pCmdLine->IsSwitchDefined( SWITCH_ENV ) && status == STATUS_OK )
{
// spawn 64b MIDL run
pCmdLine->SetEnv( ENV_WIN64 );
pCmdLine->SetHasAppend64( TRUE );
pCmdLine->SwitchDefined( SWITCH_APPEND64 );
pCmdLine->SetPostDefaults64();
if ( status == STATUS_OK && ! fCommandLineErrors )
{
WriteCommandAnaFile( szTempCmdFile, pCmdLine );
status = ( STATUS_T ) Execute( path_buffer, szTempCmdFile );
if ( ! BadIntermediateFileError( status ) )
_unlink( szTempCmdFile );
}
}
}
}
if ( status == SPAWN_ERROR )
{
RpcError( 0, 0, status, 0 );
}
}
__except( MIDL_FREE_BUILD && ! pCommand->IsSwitchDefined( SWITCH_DEBUGEXC ) )
{
// Catch exceptions only for free builds run without -debugexc switch.
status = (STATUS_T) GetExceptionCode();
printf( "\nmidl : error MIDL%d : internal compiler problem -",
I_ERR_UNEXPECTED_INTERNAL_PROBLEM );
printf( " See documentation for suggestions on how to find a workaround.\n" );
}
return status;
}
void WriteCommandAnaFile(
char *pszFilename,
CommandLine *pCmdLine
)
{
STREAM stream( pszFilename );
stream.SetStreamMode( STREAM_BINARY );
pCmdLine->StreamOut( &stream );
fflush( NULL );
}
void
IncrementErrorCount()
{
fCommandLineErrors = true;
}