179 lines
5.3 KiB
C++
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;
|
||
|
}
|
||
|
|