From 991b6bcea7ee5d79478ee2ff9008fe6c3a2fc707 Mon Sep 17 00:00:00 2001 From: thurston Date: Wed, 24 Oct 2007 17:37:17 +0000 Subject: [PATCH] Now spawning child processes on windows. git-svn-id: http://svn.complang.org/ragel/trunk@324 052ea7fc-9027-0410-9066-f65837a77df0 --- ragel/main.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/ragel/main.cpp b/ragel/main.cpp index 1edcfe9..c6e9059 100644 --- a/ragel/main.cpp +++ b/ragel/main.cpp @@ -488,7 +488,7 @@ char **makePathChecksUnix( const char *argv0, const char *progName ) } -int forkAndExec( char *progName, char **pathChecks, +void forkAndExec( char *progName, char **pathChecks, ArgsVector &args, char *intermed ) { pid_t pid = fork(); @@ -519,8 +519,6 @@ int forkAndExec( char *progName, char **pathChecks, if ( WEXITSTATUS(status) != 0 ) cleanExit( intermed, WEXITSTATUS(status) ); - - return status; } #else @@ -562,6 +560,27 @@ char **makePathChecksWin( const char *progName ) return result; } +void spawn( char *progName, char **pathChecks, + ArgsVector &args, char *intermed ) +{ + int result = 0; + while ( *pathChecks != 0 ) { + cerr << "trying to execute " << *pathChecks << endl; + result = _spawnv( _P_WAIT, *pathChecks, args.data ); + if ( result >= 0 || errno != ENOENT ) + break; + pathChecks += 1; + } + + if ( result < 0 ) { + error() << "failed to spawn " << progName << endl; + cleanExit( intermed, 1 ); + } + + if ( result > 0 ) + cleanExit( intermed, 1 ); +} + #endif void execFrontend( const char *argv0, char *inputFileName, char *intermed ) @@ -581,8 +600,7 @@ void execFrontend( const char *argv0, char *inputFileName, char *intermed ) forkAndExec( progName, pathChecks, frontendArgs, intermed ); #else char **pathChecks = makePathChecksWin( progName ); - while ( *pathChecks != 0 ) - cerr << *pathChecks++ << endl; + spawn( progName, pathChecks, frontendArgs, intermed ); #endif } @@ -616,8 +634,7 @@ void execBackend( const char *argv0, char *intermed, char *outputFileName ) forkAndExec( progName, pathChecks, backendArgs, intermed ); #else char **pathChecks = makePathChecksWin( progName ); - while ( *pathChecks != 0 ) - cerr << *pathChecks++ << endl; + spawn( progName, pathChecks, backendArgs, intermed ); #endif } -- 2.7.4