diff --git a/v2/engine/execnt.c b/v2/engine/execnt.c index f34b37854..4062bc25e 100644 --- a/v2/engine/execnt.c +++ b/v2/engine/execnt.c @@ -33,7 +33,7 @@ /* * execnt.c - execute a shell command on Windows NT * - * If $(JAMSHELL) is defined, uses that to formulate execvp()/spawnvp(). + * If $(JAMSHELL) is defined, uses that to formulate the actual command. * The default is: * * /bin/sh -c % [ on UNIX/AmigaOS ] @@ -41,12 +41,11 @@ * * Each word must be an individual element in a jam variable value. * - * In $(JAMSHELL), % expands to the command string and ! expands to - * the slot number (starting at 1) for multiprocess (-j) invocations. - * If $(JAMSHELL) doesn't include a %, it is tacked on as the last - * argument. + * In $(JAMSHELL), % expands to the command string and ! expands to the slot + * number (starting at 1) for multiprocess (-j) invocations. If $(JAMSHELL) does + * not include a %, it is tacked on as the last argument. * - * Don't just set JAMSHELL to /bin/sh or cmd.exe - it won't work! + * Do not just set JAMSHELL to /bin/sh or cmd.exe - it will not work! * * External routines: * exec_cmd() - launch an async command execution. @@ -61,46 +60,45 @@ * 06/02/97 (gsar) - full async multiprocess support for Win32 */ -/* get the maximum command line length according to the OS */ +/* get the maximum shell command line length according to the OS */ int maxline(); /* delete and argv list */ -static void free_argv(const char * *); -/* Convert a command string into arguments for spawnvp. */ -static const char** string_to_args(const char*); +static void free_argv( char const * * ); +/* convert a command string into arguments */ +static const char** string_to_args( char const * ); /* bump intr to note command interruption */ -static void onintr(int); -/* If the command is suitable for execution via spawnvp */ -long can_spawn(const char*); -/* Add two 64-bit unsigned numbers, h1l1 and h2l2 */ +static void onintr( int ); +/* is the command suitable for direct execution via CreateProcess() */ +long can_spawn( char const * ); +/* add two 64-bit unsigned numbers, h1l1 and h2l2 */ static FILETIME add_64( unsigned long h1, unsigned long l1, - unsigned long h2, unsigned long l2); -static FILETIME add_FILETIME(FILETIME t1, FILETIME t2); -static FILETIME negate_FILETIME(FILETIME t); -/* Convert a FILETIME to a number of seconds */ -static double filetime_seconds(FILETIME t); + unsigned long h2, unsigned long l2 ); +static FILETIME add_FILETIME( FILETIME t1, FILETIME t2 ); +static FILETIME negate_FILETIME( FILETIME t ); +/* convert a FILETIME to a number of seconds */ +static double filetime_seconds( FILETIME t ); /* record the timing info for the process */ -static void record_times(HANDLE, timing_info*); +static void record_times( HANDLE, timing_info * ); /* calc the current running time of an *active* process */ -static double running_time(HANDLE); +static double running_time( HANDLE ); /* */ -DWORD get_process_id(HANDLE); -/* terminate the given process, after terminating all its children */ -static void kill_process_tree(DWORD, HANDLE); -/* waits for a command to complete or for the given timeout, whichever is first */ -static int try_wait(int timeoutMillis); +DWORD get_process_id( HANDLE ); +/* terminate the given process, after terminating all its children first */ +static void kill_process_tree( DWORD, HANDLE ); +/* waits for a command to complete or time out */ +static int try_wait( int timeoutMillis ); /* reads any pending output for running commands */ static void read_output(); /* checks if a command ran out of time, and kills it */ static int try_kill_one(); /* */ -static double creation_time(HANDLE); -/* Recursive check if first process is parent (directly or indirectly) of -the second one. */ -static int is_parent_child(DWORD, DWORD); +static double creation_time( HANDLE ); +/* is the first process a parent (direct or indirect) to second one */ +static int is_parent_child( DWORD, DWORD ); /* */ -static void close_alert(HANDLE); +static void close_alert( HANDLE ); /* close any alerts hanging around */ static void close_alerts(); @@ -181,8 +179,8 @@ void execnt_unit_test() } { - /* Work around vc6 bug; it doesn't like escaped string - * literals inside assert + /* Work around vc6 bug; it does not like escaped string literals inside + * assert. */ const char * * argv = string_to_args(" \"g++\" -c -I\"Foobar\"" ); char const expected[] = "-c -I\"Foobar\""; @@ -209,24 +207,26 @@ void exec_cmd const char * target ) { - int slot; - int raw_cmd = 0 ; - const char * argv_static[ MAXARGC + 1 ]; /* +1 for NULL */ + int slot; + int raw_cmd = 0 ; + const char * argv_static[ MAXARGC + 1 ]; /* +1 for NULL */ const char * * argv = argv_static; - char * p; + char * p; const char * command_orig = command; /* Check to see if we need to hack around the line-length limitation. Look * for a JAMSHELL setting of "%", indicating that the command should be * invoked directly. */ - if ( !list_empty( shell ) && !strcmp( object_str( list_front( shell ) ), "%" ) && list_next( list_begin( shell ) ) == list_end( shell ) ) + if ( !list_empty( shell ) && + !strcmp( object_str( list_front( shell ) ), "%" ) && + list_next( list_begin( shell ) ) == list_end( shell ) ) { raw_cmd = 1; shell = 0; } - /* Find a slot in the running commands table for this one. */ + /* Find a free slot in the running commands table. */ for ( slot = 0; slot < MAXJOBS; ++slot ) if ( !cmdtab[ slot ].pi.hProcess ) break; @@ -259,7 +259,7 @@ void exec_cmd if ( raw_cmd && ( can_spawn( command ) >= MAXLINE ) ) { if ( DEBUG_EXECCMD ) - printf("Executing raw command directly\n"); + printf( "Executing raw command directly\n" ); } else { @@ -268,7 +268,7 @@ void exec_cmd raw_cmd = 0; /* Write command to bat file. For some reason this open can fail - * intermitently. But doing some retries works. Most likely this is due + * intermittently. But doing some retries works. Most likely this is due * to a previously existing file of the same name that happens to be * opened by an active virus scanner. Pointed out and fixed by Bronek * Kozicki. @@ -305,11 +305,13 @@ void exec_cmd int i; char jobno[ 4 ]; int gotpercent = 0; - LISTITER shell_iter = list_begin( shell ), shell_end = list_end( shell ); + LISTITER shell_iter = list_begin( shell ); + LISTITER shell_end = list_end( shell ); sprintf( jobno, "%d", slot + 1 ); - for ( i = 0; shell_iter != shell_end && ( i < MAXARGC ); ++i, shell_iter = list_next( shell_iter ) ) + for ( i = 0; shell_iter != shell_end && ( i < MAXARGC ); + ++i, shell_iter = list_next( shell_iter ) ) { switch ( object_str( list_item( shell_iter ) )[ 0 ] ) { @@ -344,11 +346,10 @@ void exec_cmd /* Start the command. */ { - SECURITY_ATTRIBUTES sa - = { sizeof( SECURITY_ATTRIBUTES ), 0, 0 }; + SECURITY_ATTRIBUTES sa = { sizeof( SECURITY_ATTRIBUTES ), 0, 0 }; SECURITY_DESCRIPTOR sd; - STARTUPINFO si - = { sizeof( STARTUPINFO ), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + STARTUPINFO si = { sizeof( STARTUPINFO ), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; string cmd; /* Init the security data. */ @@ -376,10 +377,13 @@ void exec_cmd } } - /* Set handle inheritance off for the pipe ends the parent reads from. */ - SetHandleInformation( cmdtab[ slot ].pipe_out[ 0 ], HANDLE_FLAG_INHERIT, 0 ); + /* Set handle inheritance off for the pipe ends the parent reads from. + */ + SetHandleInformation( cmdtab[ slot ].pipe_out[ 0 ], HANDLE_FLAG_INHERIT, + 0 ); if ( globs.pipe_action == 2 ) - SetHandleInformation( cmdtab[ slot ].pipe_err[ 0 ], HANDLE_FLAG_INHERIT, 0 ); + SetHandleInformation( cmdtab[ slot ].pipe_err[ 0 ], + HANDLE_FLAG_INHERIT, 0 ); /* Hide the child window, if any. */ si.dwFlags |= STARTF_USESHOWWINDOW; @@ -404,15 +408,19 @@ void exec_cmd si.hStdError = cmdtab[ slot ].pipe_out[ 1 ]; } - /* Let the child inherit stdin, as some commands assume it's available. */ - si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + /* Let the child inherit stdin, as some commands assume it is + * available. + */ + si.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); /* Save the operation for exec_wait() to find. */ cmdtab[ slot ].func = func; cmdtab[ slot ].closure = closure; if ( action && target ) { + string_free( &cmdtab[ slot ].action ); string_copy( &cmdtab[ slot ].action, action ); + string_free( &cmdtab[ slot ].target ); string_copy( &cmdtab[ slot ].target, target ); } else @@ -499,7 +507,7 @@ int exec_wait() do { /* Check for a complete command, briefly. */ - i = try_wait(500); + i = try_wait( 500 ); /* Read in the output of all running commands. */ read_output(); /* Close out pending debug style dialogs. */ @@ -546,7 +554,7 @@ int exec_wait() cmdtab[ i ].buffer_err.size > 0 ? cmdtab[ i ].buffer_err.value : 0, cmdtab[ i ].exit_reason ); - /* Call the callback, may call back to jam rule land. Assume -p0 in + /* Call the callback, may call back to jam rule land. Assume -p0 is in * effect so only pass buffer containing merged output. */ (*cmdtab[ i ].func)( @@ -597,19 +605,19 @@ int maxline() os_info.dwOSVersionInfoSize = sizeof( os_info ); GetVersionEx( &os_info ); - if ( os_info.dwMajorVersion >= 5 ) return 8191; /* XP > */ + if ( os_info.dwMajorVersion >= 5 ) return 8191; /* XP */ if ( os_info.dwMajorVersion == 4 ) return 2047; /* NT 4.x */ return 996; /* NT 3.5.1 */ } /* - * Convert a command string into arguments for spawnvp(). The original code, - * inherited from ftjam, tried to break up every argument on the command-line, - * dealing with quotes, but that is really a waste of time on Win32, at least. - * It turns out that all you need to do is get the raw path to the executable in - * the first argument to spawnvp(), and you can pass all the rest of the - * command-line arguments to spawnvp() in one, un-processed string. + * Convert a command string into arguments as used by Unix spawnvp() API. The + * original code, inherited from ftjam, tried to break up every argument on the + * command-line, dealing with quotes, but that is really a waste of time on + * Win32, at least. It turns out that all you need to do is get the raw path to + * the executable in the first argument to spawnvp(), and you can pass all the + * rest of the command-line arguments to spawnvp() in one, un-processed string. * * New strategy: break the string in at most one place. */ @@ -641,7 +649,7 @@ static const char * * string_to_args( char const * string ) * element 1: stores the command-line arguments to the executable * element 2: NULL terminator */ - argv = (const char * *)BJAM_MALLOC( 3 * sizeof( const char * ) ); + argv = (char const * *)BJAM_MALLOC( 3 * sizeof( char const * ) ); if ( !argv ) { BJAM_FREE( line ); @@ -693,9 +701,9 @@ static void onintr( int disp ) /* - * can_spawn() - If the command is suitable for execution via spawnvp(), return - * a number >= the number of characters it would occupy on the command-line. - * Otherwise, return zero. + * can_spawn() - If the command is suitable for execution via CreateProcessA(), + * return a number >= the number of characters it would occupy on the + * command-line. Otherwise, return zero. */ long can_spawn( const char * command ) @@ -708,11 +716,10 @@ long can_spawn( const char * command ) p = command; - /* Look for newlines and unquoted i/o redirection. */ + /* Look for newlines and unquoted I/O redirection. */ do { - p += strcspn( p, "'\n\"<>|" ); - + p += strcspn( p, "\n\"'<>|" ); switch ( *p ) { case '\n': @@ -732,7 +739,7 @@ long can_spawn( const char * command ) { if ( inquote == *p ) inquote = 0; - else if ( inquote == 0 ) + else if ( !inquote ) inquote = *p; } ++p; @@ -1049,22 +1056,23 @@ typedef LONG (__stdcall * NtQueryInformationProcess__)( PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); -static NtQueryInformationProcess__ NtQueryInformationProcess_ = NULL; -static HMODULE NTDLL_ = NULL; +static NtQueryInformationProcess__ NtQueryInformationProcess_; +static HMODULE NTDLL_; DWORD get_process_id( HANDLE process ) { PROCESS_BASIC_INFORMATION_ pinfo; if ( !NtQueryInformationProcess_ ) { - if ( ! NTDLL_ ) + if ( !NTDLL_ ) NTDLL_ = GetModuleHandleA( "ntdll" ); if ( NTDLL_ ) - NtQueryInformationProcess_ - = (NtQueryInformationProcess__)GetProcAddress( NTDLL_, "NtQueryInformationProcess" ); + NtQueryInformationProcess_ = + (NtQueryInformationProcess__)GetProcAddress( NTDLL_, + "NtQueryInformationProcess" ); } if ( NtQueryInformationProcess_ ) { - LONG r = (*NtQueryInformationProcess_)( process, + (*NtQueryInformationProcess_)( process, /* ProcessBasicInformation == */ 0, &pinfo, sizeof( PROCESS_BASIC_INFORMATION_ ), NULL ); return pinfo.UniqueProcessId; diff --git a/v2/engine/lists.h b/v2/engine/lists.h index bc97261e5..a1dfbe2ac 100644 --- a/v2/engine/lists.h +++ b/v2/engine/lists.h @@ -43,7 +43,7 @@ */ #ifndef LISTS_DWA20011022_H -# define LISTS_DWA20011022_H +#define LISTS_DWA20011022_H #include "object.h" @@ -60,7 +60,7 @@ typedef struct _list LIST; struct _list { union { int size; - OBJECT *align; + OBJECT * align; } impl; }; @@ -76,49 +76,46 @@ typedef struct _lol LOL; struct _lol { int count; - LIST *list[ LOL_MAX ]; + LIST * list[ LOL_MAX ]; }; -LIST * list_new( OBJECT * value ); -LIST * list_append( LIST *l, LIST *nl ); -LIST * list_copy( LIST *l ); -LIST * list_copy_range( LIST *l, LISTITER first, LISTITER last ); -void list_free( LIST *head ); -LIST * list_push_back( LIST *head, OBJECT *string ); -void list_print( LIST *l ); -int list_length( LIST *l ); -LIST * list_sublist( LIST *l, int start, int count ); -LIST * list_pop_front( LIST *l ); -LIST * list_sort( LIST *l); -LIST * list_unique( LIST *sorted_list); -int list_in(LIST* l, OBJECT* value); -LIST * list_reverse( LIST * ); -int list_cmp( LIST * lhs, LIST * rhs ); -int list_is_sublist( LIST * sub, LIST * l ); -void list_done(); +LIST * list_new( OBJECT * value ); +LIST * list_append( LIST * l, LIST * nl ); +LIST * list_copy( LIST * l ); +LIST * list_copy_range( LIST * l, LISTITER first, LISTITER last ); +void list_free( LIST * head ); +LIST * list_push_back( LIST * head, OBJECT * string ); +void list_print( LIST * l ); +int list_length( LIST * l ); +LIST * list_sublist( LIST * l, int start, int count ); +LIST * list_pop_front( LIST * l ); +LIST * list_sort( LIST * l ); +LIST * list_unique( LIST * sorted_list); +int list_in( LIST * l, OBJECT * value ); +LIST * list_reverse( LIST * ); +int list_cmp( LIST * lhs, LIST * rhs ); +int list_is_sublist( LIST * sub, LIST * l ); +void list_done(); LISTITER list_begin( LIST * ); LISTITER list_end( LIST * ); # define list_next( it ) ((it) + 1) # define list_item( it ) (*(it)) -# define list_empty( l ) ( (l) == L0 ) +# define list_empty( l ) ((l) == L0) # define list_front( l ) list_item( list_begin( l ) ) # define L0 ((LIST *)0) -void lol_add( LOL *lol, LIST *l ); -void lol_init( LOL *lol ); -void lol_free( LOL *lol ); -LIST * lol_get( LOL *lol, int i ); -void lol_print( LOL *lol ); -void lol_build( LOL* lol, const char** elements ); +void lol_add( LOL * lol, LIST * l ); +void lol_init( LOL * lol ); +void lol_free( LOL * lol ); +LIST * lol_get( LOL * lol, int i ); +void lol_print( LOL * lol ); +void lol_build( LOL * lol, const char * * elements ); #ifdef HAVE_PYTHON - -PyObject *list_to_python(LIST *l); -LIST *list_from_python(PyObject *l); - +PyObject * list_to_python( LIST * l ); +LIST * list_from_python( PyObject * l ); #endif #endif - diff --git a/v2/engine/make1.c b/v2/engine/make1.c index 638a4e96a..07d213d07 100644 --- a/v2/engine/make1.c +++ b/v2/engine/make1.c @@ -399,11 +399,10 @@ static void make1b( state * pState ) /* Now ready to build target 't', if dependencies built OK. */ - /* Collect status from dependencies. If -n was passed then - * act as though all dependencies built correctly. The only - * way they can fail is if UPDATE_NOW was called. If - * the dependencies can't be found or we got an interrupt, - * we can't get here. + /* Collect status from dependencies. If -n was passed then act as though all + * dependencies built correctly. The only way they can fail is if UPDATE_NOW + * was called. If the dependencies can not be found or we got an interrupt, + * we can not get here. */ if ( !globs.noexec ) { @@ -434,10 +433,12 @@ static void make1b( state * pState ) if ( ( pState->t->flags & ( T_FLAG_RMOLD | T_FLAG_NOTFILE ) ) == T_FLAG_RMOLD ) { if ( !unlink( object_str( pState->t->boundname ) ) ) - printf( "...removing outdated %s\n", object_str( pState->t->boundname ) ); + printf( "...removing outdated %s\n", object_str( + pState->t->boundname ) ); } else - printf( "...skipped %s for lack of %s...\n", object_str( pState->t->name ), failed_name ); + printf( "...skipped %s for lack of %s...\n", object_str( + pState->t->name ), failed_name ); } if ( pState->t->status == EXEC_CMD_OK ) @@ -507,8 +508,8 @@ static void make1b( state * pState ) { ++pState->t->semaphore->asynccnt; if ( DEBUG_EXECCMD ) - printf( "SEM: %s now used by %s\n", object_str( pState->t->semaphore->name ), - object_str( pState->t->name ) ); + printf( "SEM: %s now used by %s\n", object_str( + pState->t->semaphore->name ), object_str( pState->t->name ) ); } #endif @@ -540,7 +541,8 @@ static void make1c( state * pState ) rule_name = object_str( cmd->rule->name ); target = object_str( list_front( lol_get( &cmd->args, 0 ) ) ); if ( globs.noexec ) - out_action( rule_name, target, cmd->buf->value, "", "", EXIT_OK ); + out_action( rule_name, target, cmd->buf->value, "", "", EXIT_OK + ); } if ( globs.noexec ) @@ -552,8 +554,8 @@ static void make1c( state * pState ) { /* Pop state first because exec_cmd() could push state. */ pop_state( &state_stack ); - exec_cmd( cmd->buf->value, make_closure, pState->t, cmd->shell, rule_name, - target ); + exec_cmd( cmd->buf->value, make_closure, pState->t, cmd->shell, + rule_name, target ); } } else @@ -885,7 +887,7 @@ static void make1d( state * pState ) /* If the command was interrupted or failed and the target is not * "precious", remove the targets. */ - if (status != EXEC_CMD_OK) + if ( status != EXEC_CMD_OK ) { LIST * targets = lol_get( &cmd->args, 0 ); LISTITER iter = list_begin( targets ), end = list_end( targets ); @@ -894,7 +896,7 @@ static void make1d( state * pState ) int need_unlink = 1; TARGET* t = bindtarget ( list_item( iter ) ); if (t->flags & T_FLAG_PRECIOUS) - { + { need_unlink = 0; } if (need_unlink && !unlink( object_str( list_item( iter ) ) ) ) @@ -1006,7 +1008,8 @@ static CMD * make1cmds( TARGET * t ) swap_settings( &settings_module, &settings_target, rule->module, t ); if ( list_empty( shell ) ) { - shell = var_get( rule->module, constant_JAMSHELL ); /* shell is per-target */ + /* shell is per-target */ + shell = var_get( rule->module, constant_JAMSHELL ); } /* If we had 'actions xxx bind vars' we bind the vars now. */ @@ -1056,10 +1059,10 @@ static CMD * make1cmds( TARGET * t ) else { /* Too long and not splittable. */ - printf( "%s actions too long (max %d):\n", object_str( rule->name ), MAXLINE - ); + printf( "%s action is too long (max %d):\n", object_str( + rule->name ), MAXLINE ); - /* Tell the user what didn't fit. */ + /* Tell the user what did not fit. */ cmd = cmd_new( rule, list_copy( nt ), list_sublist( ns, start, chunk ), list_new( object_copy( constant_percent ) ) ); diff --git a/v2/engine/strings.c b/v2/engine/strings.c index 895612377..20d56e198 100644 --- a/v2/engine/strings.c +++ b/v2/engine/strings.c @@ -29,7 +29,7 @@ static void assert_invariants( string* self ) assert( ( self->capacity <= sizeof(self->opt) ) == ( self->value == self->opt ) ); assert( strlen( self->value ) == self->size ); - for (i = 0; i < 4; ++i) + for ( i = 0; i < 4; ++i ) { assert( self->magic[i] == JAM_STRING_MAGIC ); assert( self->value[self->capacity + i] == JAM_STRING_MAGIC ); @@ -107,7 +107,7 @@ void string_append( string* self, char const* rhs ) char* end = self->value + self->capacity; assert_invariants( self ); - while ( *rhs && p != end) + while ( *rhs && p != end ) *p++ = *rhs++; if ( p != end ) @@ -195,7 +195,6 @@ void string_unit_test() } string_free(s); - } #endif diff --git a/v2/engine/strings.h b/v2/engine/strings.h index 33c77bd7f..2ad5828dc 100644 --- a/v2/engine/strings.h +++ b/v2/engine/strings.h @@ -18,17 +18,16 @@ typedef struct string #endif } string; -void string_new( string* ); -void string_copy( string*, char const* ); -void string_free( string* ); -void string_append( string*, char const* ); -void string_append_range( string*, char const*, char const* ); -void string_push_back( string* s, char x ); -void string_reserve( string*, size_t ); -void string_truncate( string*, size_t ); -void string_pop_back( string* ); -char string_back( string* ); +void string_new( string * ); +void string_copy( string *, char const * ); +void string_free( string * ); +void string_append( string *, char const * ); +void string_append_range( string *, char const *, char const * ); +void string_push_back( string * s, char x ); +void string_reserve( string *, size_t ); +void string_truncate( string *, size_t ); +void string_pop_back( string * ); +char string_back( string * ); void string_unit_test(); #endif -