Updated Branches: refs/heads/chaz_redirection [created] 1901f4240
Regen charmonizer.c. Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/1901f424 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/1901f424 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/1901f424 Branch: refs/heads/chaz_redirection Commit: 1901f4240f6a9bc9af4832a54b0971d957cc007c Parents: faf2f61 Author: Marvin Humphrey <[email protected]> Authored: Wed Nov 28 17:19:17 2012 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Wed Nov 28 17:19:17 2012 -0800 ---------------------------------------------------------------------- clownfish/compiler/common/charmonizer.c | 113 +++++++-------------- clownfish/runtime/common/charmonizer.c | 140 +++++++++----------------- common/charmonizer.c | 140 +++++++++----------------- 3 files changed, 132 insertions(+), 261 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/1901f424/clownfish/compiler/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/clownfish/compiler/common/charmonizer.c b/clownfish/compiler/common/charmonizer.c index 1d005e0..8093898 100644 --- a/clownfish/compiler/common/charmonizer.c +++ b/clownfish/compiler/common/charmonizer.c @@ -315,12 +315,6 @@ chaz_HeadCheck_contains_member(const char *struct_name, const char *member, int chaz_OS_remove(const char *name); -/* Concatenate all arguments in a NULL-terminated list into a single command - * string, prepend the appropriate prefix, and invoke via system(). - */ -int -chaz_OS_run_local(const char *arg1, ...); - /* Invoke a command and attempt to suppress output from both stdout and stderr * (as if they had been sent to /dev/null). If it's not possible to run the * command quietly, run it anyway. @@ -328,6 +322,18 @@ chaz_OS_run_local(const char *arg1, ...); int chaz_OS_run_quietly(const char *command); +/* Capture both stdout and stderr for a command to the supplied filepath. + */ +int +chaz_OS_run_redirected(const char *command, const char *path); + +/* Run a command beginning with the name of an executable in the current + * working directory and capture both stdout and stderr to the supplied + * filepath. + */ +int +chaz_OS_run_local_redirected(const char *command, const char *path); + /* Attempt to create a directory. */ void @@ -867,9 +873,10 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { compile_succeeded = chaz_CC_compile_exe(CHAZ_CC_TRY_SOURCE_PATH, CHAZ_CC_TRY_BASENAME, source); if (compile_succeeded) { - chaz_OS_run_local(chaz_CC.try_exe_name, NULL); - captured_output - = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, output_len); + chaz_OS_run_local_redirected(chaz_CC.try_exe_name, + CHAZ_CC_TARGET_PATH); + captured_output = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, + output_len); } else { *output_len = 0; @@ -2106,54 +2113,41 @@ chaz_OS_remove(const char *name) { } int -chaz_OS_run_local(const char *arg1, ...) { - va_list args; - size_t len = strlen(chaz_OS.local_command_start) + strlen(arg1); - char *command = (char*)malloc(len + 1); - int retval; - char *arg; - - /* Append all supplied texts. */ - sprintf(command, "%s%s", chaz_OS.local_command_start, arg1); - va_start(args, arg1); - while (NULL != (arg = va_arg(args, char*))) { - len += strlen(arg); - command = (char*)realloc(command, len + 1); - strcat(command, arg); - } - va_end(args); - - /* Run the command. */ - retval = system(command); - free(command); +chaz_OS_run_local_redirected(const char *command, const char *path) { + size_t size = strlen(command) + strlen(chaz_OS.local_command_start) + 20; + char *local_command = (char*)malloc(size); + int retval; + sprintf(local_command, "%s%s", chaz_OS.local_command_start, command); + retval = chaz_OS_run_redirected(local_command, path); + free(local_command); return retval; } int chaz_OS_run_quietly(const char *command) { + return chaz_OS_run_redirected(command, chaz_OS.dev_null); +} + +int +chaz_OS_run_redirected(const char *command, const char *path) { int retval = 1; char *quiet_command = NULL; - if (chaz_OS.shell_type == CHAZ_OS_POSIX) { + if (chaz_OS.shell_type == CHAZ_OS_POSIX + || chaz_OS.shell_type == CHAZ_OS_CMD_EXE + ) { char pattern[] = "%s > %s 2>&1"; size_t size = sizeof(pattern) + strlen(command) - + strlen(chaz_OS.dev_null) + + strlen(path) + 10; quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command, chaz_OS.dev_null); - } - else if (chaz_OS.shell_type == CHAZ_OS_CMD_EXE) { - char pattern[] = "%s > NUL 2> NUL"; - size_t size = sizeof(pattern) + strlen(command) + 10; - quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command); + sprintf(quiet_command, pattern, command, path); } else { chaz_Util_die("Don't know the shell type"); } retval = system(quiet_command); free(quiet_command); - return retval; } @@ -2365,14 +2359,6 @@ chaz_Util_can_open_file(const char *file_path) { /* #include "Charmonizer/Core/Compiler.h" */ /* #include "Charmonizer/Core/OperatingSystem.h" */ -/* Write the "_charm.h" file used by every probe. - */ -static void -chaz_Probe_write_charm_h(void); - -static void -chaz_Probe_remove_charm_h(void); - void chaz_Probe_init(const char *cc_command, const char *cc_flags) { /* Proces CHARM_VERBOSITY environment variable. */ @@ -2386,7 +2372,6 @@ chaz_Probe_init(const char *cc_command, const char *cc_flags) { chaz_CC_init(cc_command, cc_flags); chaz_ConfWriter_init(); chaz_HeadCheck_init(); - chaz_Probe_write_charm_h(); if (chaz_Util_verbosity) { printf("Initialization complete.\n"); } } @@ -2396,29 +2381,12 @@ chaz_Probe_clean_up(void) { if (chaz_Util_verbosity) { printf("Cleaning up...\n"); } /* Dispatch various clean up routines. */ - chaz_Probe_remove_charm_h(); chaz_ConfWriter_clean_up(); chaz_CC_clean_up(); if (chaz_Util_verbosity) { printf("Cleanup complete.\n"); } } -static void -chaz_Probe_write_charm_h(void) { - static const char charm_h_code[] = - CHAZ_QUOTE( #ifndef CHARM_H ) - CHAZ_QUOTE( #define CHARM_H 1 ) - CHAZ_QUOTE( #include <stdio.h> ) - CHAZ_QUOTE( #define Charm_Setup freopen("_charmonizer_target", "w", stdout) ) - CHAZ_QUOTE( #endif ); - chaz_Util_write_file("_charm.h", charm_h_code); -} - -static void -chaz_Probe_remove_charm_h(void) { - chaz_Util_remove_and_verify("_charm.h"); -} - /***************************************************************************/ @@ -2438,9 +2406,8 @@ static int chaz_Integers_machine_is_big_endian(void); static const char chaz_Integers_sizes_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main () { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%d ", (int)sizeof(char)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(short)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(int)); ) @@ -2450,32 +2417,29 @@ static const char chaz_Integers_sizes_code[] = CHAZ_QUOTE( } ); static const char chaz_Integers_type64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_literal64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define big 9000000000000000000%s ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( int truncated = (int)big; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d\n", truncated); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_u64_to_double_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( unsigned __int64 int_num = 0; ) CHAZ_QUOTE( double float_num; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( float_num = (double)int_num; ) CHAZ_QUOTE( printf("%%f\n", float_num); ) CHAZ_QUOTE( return 0; ) @@ -2776,9 +2740,8 @@ chaz_Integers_run(void) { /* Buffer to hold the code, and its start and end. */ static const char format_64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%%su", 18446744073709551615%s); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); http://git-wip-us.apache.org/repos/asf/lucy/blob/1901f424/clownfish/runtime/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/clownfish/runtime/common/charmonizer.c b/clownfish/runtime/common/charmonizer.c index 5f6449b..82472ad 100644 --- a/clownfish/runtime/common/charmonizer.c +++ b/clownfish/runtime/common/charmonizer.c @@ -315,12 +315,6 @@ chaz_HeadCheck_contains_member(const char *struct_name, const char *member, int chaz_OS_remove(const char *name); -/* Concatenate all arguments in a NULL-terminated list into a single command - * string, prepend the appropriate prefix, and invoke via system(). - */ -int -chaz_OS_run_local(const char *arg1, ...); - /* Invoke a command and attempt to suppress output from both stdout and stderr * (as if they had been sent to /dev/null). If it's not possible to run the * command quietly, run it anyway. @@ -328,6 +322,18 @@ chaz_OS_run_local(const char *arg1, ...); int chaz_OS_run_quietly(const char *command); +/* Capture both stdout and stderr for a command to the supplied filepath. + */ +int +chaz_OS_run_redirected(const char *command, const char *path); + +/* Run a command beginning with the name of an executable in the current + * working directory and capture both stdout and stderr to the supplied + * filepath. + */ +int +chaz_OS_run_local_redirected(const char *command, const char *path); + /* Attempt to create a directory. */ void @@ -1276,9 +1282,10 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { compile_succeeded = chaz_CC_compile_exe(CHAZ_CC_TRY_SOURCE_PATH, CHAZ_CC_TRY_BASENAME, source); if (compile_succeeded) { - chaz_OS_run_local(chaz_CC.try_exe_name, NULL); - captured_output - = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, output_len); + chaz_OS_run_local_redirected(chaz_CC.try_exe_name, + CHAZ_CC_TARGET_PATH); + captured_output = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, + output_len); } else { *output_len = 0; @@ -2515,54 +2522,41 @@ chaz_OS_remove(const char *name) { } int -chaz_OS_run_local(const char *arg1, ...) { - va_list args; - size_t len = strlen(chaz_OS.local_command_start) + strlen(arg1); - char *command = (char*)malloc(len + 1); - int retval; - char *arg; - - /* Append all supplied texts. */ - sprintf(command, "%s%s", chaz_OS.local_command_start, arg1); - va_start(args, arg1); - while (NULL != (arg = va_arg(args, char*))) { - len += strlen(arg); - command = (char*)realloc(command, len + 1); - strcat(command, arg); - } - va_end(args); - - /* Run the command. */ - retval = system(command); - free(command); +chaz_OS_run_local_redirected(const char *command, const char *path) { + size_t size = strlen(command) + strlen(chaz_OS.local_command_start) + 20; + char *local_command = (char*)malloc(size); + int retval; + sprintf(local_command, "%s%s", chaz_OS.local_command_start, command); + retval = chaz_OS_run_redirected(local_command, path); + free(local_command); return retval; } int chaz_OS_run_quietly(const char *command) { + return chaz_OS_run_redirected(command, chaz_OS.dev_null); +} + +int +chaz_OS_run_redirected(const char *command, const char *path) { int retval = 1; char *quiet_command = NULL; - if (chaz_OS.shell_type == CHAZ_OS_POSIX) { + if (chaz_OS.shell_type == CHAZ_OS_POSIX + || chaz_OS.shell_type == CHAZ_OS_CMD_EXE + ) { char pattern[] = "%s > %s 2>&1"; size_t size = sizeof(pattern) + strlen(command) - + strlen(chaz_OS.dev_null) + + strlen(path) + 10; quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command, chaz_OS.dev_null); - } - else if (chaz_OS.shell_type == CHAZ_OS_CMD_EXE) { - char pattern[] = "%s > NUL 2> NUL"; - size_t size = sizeof(pattern) + strlen(command) + 10; - quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command); + sprintf(quiet_command, pattern, command, path); } else { chaz_Util_die("Don't know the shell type"); } retval = system(quiet_command); free(quiet_command); - return retval; } @@ -2774,14 +2768,6 @@ chaz_Util_can_open_file(const char *file_path) { /* #include "Charmonizer/Core/Compiler.h" */ /* #include "Charmonizer/Core/OperatingSystem.h" */ -/* Write the "_charm.h" file used by every probe. - */ -static void -chaz_Probe_write_charm_h(void); - -static void -chaz_Probe_remove_charm_h(void); - void chaz_Probe_init(const char *cc_command, const char *cc_flags) { /* Proces CHARM_VERBOSITY environment variable. */ @@ -2795,7 +2781,6 @@ chaz_Probe_init(const char *cc_command, const char *cc_flags) { chaz_CC_init(cc_command, cc_flags); chaz_ConfWriter_init(); chaz_HeadCheck_init(); - chaz_Probe_write_charm_h(); if (chaz_Util_verbosity) { printf("Initialization complete.\n"); } } @@ -2805,29 +2790,12 @@ chaz_Probe_clean_up(void) { if (chaz_Util_verbosity) { printf("Cleaning up...\n"); } /* Dispatch various clean up routines. */ - chaz_Probe_remove_charm_h(); chaz_ConfWriter_clean_up(); chaz_CC_clean_up(); if (chaz_Util_verbosity) { printf("Cleanup complete.\n"); } } -static void -chaz_Probe_write_charm_h(void) { - static const char charm_h_code[] = - CHAZ_QUOTE( #ifndef CHARM_H ) - CHAZ_QUOTE( #define CHARM_H 1 ) - CHAZ_QUOTE( #include <stdio.h> ) - CHAZ_QUOTE( #define Charm_Setup freopen("_charmonizer_target", "w", stdout) ) - CHAZ_QUOTE( #endif ); - chaz_Util_write_file("_charm.h", charm_h_code); -} - -static void -chaz_Probe_remove_charm_h(void) { - chaz_Util_remove_and_verify("_charm.h"); -} - /***************************************************************************/ @@ -3182,9 +3150,8 @@ chaz_Floats_run(void) { static int chaz_FuncMacro_probe_iso() { static const char iso_func_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%s", __func__); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3205,9 +3172,8 @@ static int chaz_FuncMacro_probe_gnu() { /* Code for verifying GNU func macro. */ static const char gnu_func_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%s", __FUNCTION__); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3228,10 +3194,9 @@ chaz_FuncMacro_probe_gnu() { static char* chaz_FuncMacro_try_inline(const char *keyword, size_t *output_len) { static const char inline_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( static %s int foo() { return 1; } ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", foo()); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3550,9 +3515,8 @@ static int chaz_Integers_machine_is_big_endian(void); static const char chaz_Integers_sizes_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main () { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%d ", (int)sizeof(char)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(short)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(int)); ) @@ -3562,32 +3526,29 @@ static const char chaz_Integers_sizes_code[] = CHAZ_QUOTE( } ); static const char chaz_Integers_type64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_literal64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define big 9000000000000000000%s ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( int truncated = (int)big; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d\n", truncated); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_u64_to_double_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( unsigned __int64 int_num = 0; ) CHAZ_QUOTE( double float_num; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( float_num = (double)int_num; ) CHAZ_QUOTE( printf("%%f\n", float_num); ) CHAZ_QUOTE( return 0; ) @@ -3888,9 +3849,8 @@ chaz_Integers_run(void) { /* Buffer to hold the code, and its start and end. */ static const char format_64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%%su", 18446744073709551615%s); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -4058,10 +4018,9 @@ static const int chaz_LargeFiles_probe_off64(void) { static const char off64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -4105,11 +4064,10 @@ static int chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { static const char stdio64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( %s pos; ) CHAZ_QUOTE( FILE *f; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( f = %s("_charm_stdio64", "w"); ) CHAZ_QUOTE( if (f == NULL) return -1; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) @@ -4174,10 +4132,9 @@ static int chaz_LargeFiles_probe_lseek(chaz_LargeFiles_unbuff_combo *combo) { static const char lseek_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( int fd; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( fd = open("_charm_lseek", O_WRONLY | O_CREAT, 0666); ) CHAZ_QUOTE( if (fd == -1) { return -1; } ) CHAZ_QUOTE( %s(fd, 0, SEEK_SET); ) @@ -4211,11 +4168,10 @@ chaz_LargeFiles_probe_pread64(chaz_LargeFiles_unbuff_combo *combo) { * fine as long as it compiles. */ static const char pread64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( int fd = 20; ) CHAZ_QUOTE( char buf[1]; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("1"); ) CHAZ_QUOTE( %s(fd, buf, 1, 1); ) CHAZ_QUOTE( return 0; ) @@ -4471,21 +4427,19 @@ chaz_UnusedVars_run(void) { /* Code for verifying ISO-style variadic macros. */ static const char chaz_VariadicMacros_iso_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define ISO_TEST(fmt, ...) \\ ) " printf(fmt, __VA_ARGS__) \n" CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( ISO_TEST("%d %d", 1, 1); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); /* Code for verifying GNU-style variadic macros. */ static const char chaz_VariadicMacros_gnuc_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define GNU_TEST(fmt, args...) printf(fmt, ##args) ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( GNU_TEST("%d %d", 1, 1); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); http://git-wip-us.apache.org/repos/asf/lucy/blob/1901f424/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/common/charmonizer.c b/common/charmonizer.c index 7b886fb..1aef31f 100644 --- a/common/charmonizer.c +++ b/common/charmonizer.c @@ -315,12 +315,6 @@ chaz_HeadCheck_contains_member(const char *struct_name, const char *member, int chaz_OS_remove(const char *name); -/* Concatenate all arguments in a NULL-terminated list into a single command - * string, prepend the appropriate prefix, and invoke via system(). - */ -int -chaz_OS_run_local(const char *arg1, ...); - /* Invoke a command and attempt to suppress output from both stdout and stderr * (as if they had been sent to /dev/null). If it's not possible to run the * command quietly, run it anyway. @@ -328,6 +322,18 @@ chaz_OS_run_local(const char *arg1, ...); int chaz_OS_run_quietly(const char *command); +/* Capture both stdout and stderr for a command to the supplied filepath. + */ +int +chaz_OS_run_redirected(const char *command, const char *path); + +/* Run a command beginning with the name of an executable in the current + * working directory and capture both stdout and stderr to the supplied + * filepath. + */ +int +chaz_OS_run_local_redirected(const char *command, const char *path); + /* Attempt to create a directory. */ void @@ -1276,9 +1282,10 @@ chaz_CC_capture_output(const char *source, size_t *output_len) { compile_succeeded = chaz_CC_compile_exe(CHAZ_CC_TRY_SOURCE_PATH, CHAZ_CC_TRY_BASENAME, source); if (compile_succeeded) { - chaz_OS_run_local(chaz_CC.try_exe_name, NULL); - captured_output - = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, output_len); + chaz_OS_run_local_redirected(chaz_CC.try_exe_name, + CHAZ_CC_TARGET_PATH); + captured_output = chaz_Util_slurp_file(CHAZ_CC_TARGET_PATH, + output_len); } else { *output_len = 0; @@ -2515,54 +2522,41 @@ chaz_OS_remove(const char *name) { } int -chaz_OS_run_local(const char *arg1, ...) { - va_list args; - size_t len = strlen(chaz_OS.local_command_start) + strlen(arg1); - char *command = (char*)malloc(len + 1); - int retval; - char *arg; - - /* Append all supplied texts. */ - sprintf(command, "%s%s", chaz_OS.local_command_start, arg1); - va_start(args, arg1); - while (NULL != (arg = va_arg(args, char*))) { - len += strlen(arg); - command = (char*)realloc(command, len + 1); - strcat(command, arg); - } - va_end(args); - - /* Run the command. */ - retval = system(command); - free(command); +chaz_OS_run_local_redirected(const char *command, const char *path) { + size_t size = strlen(command) + strlen(chaz_OS.local_command_start) + 20; + char *local_command = (char*)malloc(size); + int retval; + sprintf(local_command, "%s%s", chaz_OS.local_command_start, command); + retval = chaz_OS_run_redirected(local_command, path); + free(local_command); return retval; } int chaz_OS_run_quietly(const char *command) { + return chaz_OS_run_redirected(command, chaz_OS.dev_null); +} + +int +chaz_OS_run_redirected(const char *command, const char *path) { int retval = 1; char *quiet_command = NULL; - if (chaz_OS.shell_type == CHAZ_OS_POSIX) { + if (chaz_OS.shell_type == CHAZ_OS_POSIX + || chaz_OS.shell_type == CHAZ_OS_CMD_EXE + ) { char pattern[] = "%s > %s 2>&1"; size_t size = sizeof(pattern) + strlen(command) - + strlen(chaz_OS.dev_null) + + strlen(path) + 10; quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command, chaz_OS.dev_null); - } - else if (chaz_OS.shell_type == CHAZ_OS_CMD_EXE) { - char pattern[] = "%s > NUL 2> NUL"; - size_t size = sizeof(pattern) + strlen(command) + 10; - quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command); + sprintf(quiet_command, pattern, command, path); } else { chaz_Util_die("Don't know the shell type"); } retval = system(quiet_command); free(quiet_command); - return retval; } @@ -2774,14 +2768,6 @@ chaz_Util_can_open_file(const char *file_path) { /* #include "Charmonizer/Core/Compiler.h" */ /* #include "Charmonizer/Core/OperatingSystem.h" */ -/* Write the "_charm.h" file used by every probe. - */ -static void -chaz_Probe_write_charm_h(void); - -static void -chaz_Probe_remove_charm_h(void); - void chaz_Probe_init(const char *cc_command, const char *cc_flags) { /* Proces CHARM_VERBOSITY environment variable. */ @@ -2795,7 +2781,6 @@ chaz_Probe_init(const char *cc_command, const char *cc_flags) { chaz_CC_init(cc_command, cc_flags); chaz_ConfWriter_init(); chaz_HeadCheck_init(); - chaz_Probe_write_charm_h(); if (chaz_Util_verbosity) { printf("Initialization complete.\n"); } } @@ -2805,29 +2790,12 @@ chaz_Probe_clean_up(void) { if (chaz_Util_verbosity) { printf("Cleaning up...\n"); } /* Dispatch various clean up routines. */ - chaz_Probe_remove_charm_h(); chaz_ConfWriter_clean_up(); chaz_CC_clean_up(); if (chaz_Util_verbosity) { printf("Cleanup complete.\n"); } } -static void -chaz_Probe_write_charm_h(void) { - static const char charm_h_code[] = - CHAZ_QUOTE( #ifndef CHARM_H ) - CHAZ_QUOTE( #define CHARM_H 1 ) - CHAZ_QUOTE( #include <stdio.h> ) - CHAZ_QUOTE( #define Charm_Setup freopen("_charmonizer_target", "w", stdout) ) - CHAZ_QUOTE( #endif ); - chaz_Util_write_file("_charm.h", charm_h_code); -} - -static void -chaz_Probe_remove_charm_h(void) { - chaz_Util_remove_and_verify("_charm.h"); -} - /***************************************************************************/ @@ -3182,9 +3150,8 @@ chaz_Floats_run(void) { static int chaz_FuncMacro_probe_iso() { static const char iso_func_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%s", __func__); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3205,9 +3172,8 @@ static int chaz_FuncMacro_probe_gnu() { /* Code for verifying GNU func macro. */ static const char gnu_func_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%s", __FUNCTION__); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3228,10 +3194,9 @@ chaz_FuncMacro_probe_gnu() { static char* chaz_FuncMacro_try_inline(const char *keyword, size_t *output_len) { static const char inline_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( static %s int foo() { return 1; } ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", foo()); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -3550,9 +3515,8 @@ static int chaz_Integers_machine_is_big_endian(void); static const char chaz_Integers_sizes_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main () { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%d ", (int)sizeof(char)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(short)); ) CHAZ_QUOTE( printf("%d ", (int)sizeof(int)); ) @@ -3562,32 +3526,29 @@ static const char chaz_Integers_sizes_code[] = CHAZ_QUOTE( } ); static const char chaz_Integers_type64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_literal64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define big 9000000000000000000%s ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( int truncated = (int)big; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d\n", truncated); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); static const char chaz_Integers_u64_to_double_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) CHAZ_QUOTE( unsigned __int64 int_num = 0; ) CHAZ_QUOTE( double float_num; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( float_num = (double)int_num; ) CHAZ_QUOTE( printf("%%f\n", float_num); ) CHAZ_QUOTE( return 0; ) @@ -3888,9 +3849,8 @@ chaz_Integers_run(void) { /* Buffer to hold the code, and its start and end. */ static const char format_64_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%%su", 18446744073709551615%s); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -4058,10 +4018,9 @@ static const int chaz_LargeFiles_probe_off64(void) { static const char off64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() ) CHAZ_QUOTE( { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); @@ -4105,11 +4064,10 @@ static int chaz_LargeFiles_try_stdio64(chaz_LargeFiles_stdio64_combo *combo) { static const char stdio64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( %s pos; ) CHAZ_QUOTE( FILE *f; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( f = %s("_charm_stdio64", "w"); ) CHAZ_QUOTE( if (f == NULL) return -1; ) CHAZ_QUOTE( printf("%%d", (int)sizeof(%s)); ) @@ -4174,10 +4132,9 @@ static int chaz_LargeFiles_probe_lseek(chaz_LargeFiles_unbuff_combo *combo) { static const char lseek_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( int fd; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( fd = open("_charm_lseek", O_WRONLY | O_CREAT, 0666); ) CHAZ_QUOTE( if (fd == -1) { return -1; } ) CHAZ_QUOTE( %s(fd, 0, SEEK_SET); ) @@ -4211,11 +4168,10 @@ chaz_LargeFiles_probe_pread64(chaz_LargeFiles_unbuff_combo *combo) { * fine as long as it compiles. */ static const char pread64_code[] = CHAZ_QUOTE( %s ) - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( int main() { ) CHAZ_QUOTE( int fd = 20; ) CHAZ_QUOTE( char buf[1]; ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( printf("1"); ) CHAZ_QUOTE( %s(fd, buf, 1, 1); ) CHAZ_QUOTE( return 0; ) @@ -4471,21 +4427,19 @@ chaz_UnusedVars_run(void) { /* Code for verifying ISO-style variadic macros. */ static const char chaz_VariadicMacros_iso_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define ISO_TEST(fmt, ...) \\ ) " printf(fmt, __VA_ARGS__) \n" CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( ISO_TEST("%d %d", 1, 1); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } ); /* Code for verifying GNU-style variadic macros. */ static const char chaz_VariadicMacros_gnuc_code[] = - CHAZ_QUOTE( #include "_charm.h" ) + CHAZ_QUOTE( #include <stdio.h> ) CHAZ_QUOTE( #define GNU_TEST(fmt, args...) printf(fmt, ##args) ) CHAZ_QUOTE( int main() { ) - CHAZ_QUOTE( Charm_Setup; ) CHAZ_QUOTE( GNU_TEST("%d %d", 1, 1); ) CHAZ_QUOTE( return 0; ) CHAZ_QUOTE( } );
