Introduce chaz_Util_join
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/180dab35 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/180dab35 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/180dab35 Branch: refs/heads/master Commit: 180dab35d6598a61e20c10273f1516e9727eb7e0 Parents: fae078a Author: Nick Wellnhofer <[email protected]> Authored: Sun Mar 24 17:06:40 2013 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Sun Mar 24 17:13:47 2013 +0100 ---------------------------------------------------------------------- charmonizer/src/Charmonizer/Core/Compiler.c | 31 +++-------- charmonizer/src/Charmonizer/Core/Make.c | 26 ++------ charmonizer/src/Charmonizer/Core/OperatingSystem.c | 28 ++------- charmonizer/src/Charmonizer/Core/Util.c | 44 +++++++++++++++ charmonizer/src/Charmonizer/Core/Util.h | 5 ++ 5 files changed, 71 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/180dab35/charmonizer/src/Charmonizer/Core/Compiler.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Compiler.c b/charmonizer/src/Charmonizer/Core/Compiler.c index 151d89a..516823c 100644 --- a/charmonizer/src/Charmonizer/Core/Compiler.c +++ b/charmonizer/src/Charmonizer/Core/Compiler.c @@ -84,16 +84,10 @@ chaz_CC_init(const char *compiler_command, const char *compiler_flags) { chaz_CC.extra_cflags = chaz_Util_strdup(""); /* Set names for the targets which we "try" to compile. */ - { - const char *exe_ext = chaz_OS_exe_ext(); - const char *obj_ext = chaz_OS_obj_ext(); - size_t exe_len = strlen(CHAZ_CC_TRY_BASENAME) + strlen(exe_ext) + 1; - size_t obj_len = strlen(CHAZ_CC_TRY_BASENAME) + strlen(obj_ext) + 1; - chaz_CC.try_exe_name = (char*)malloc(exe_len); - chaz_CC.try_obj_name = (char*)malloc(obj_len); - sprintf(chaz_CC.try_exe_name, "%s%s", CHAZ_CC_TRY_BASENAME, exe_ext); - sprintf(chaz_CC.try_obj_name, "%s%s", CHAZ_CC_TRY_BASENAME, obj_ext); - } + chaz_CC.try_exe_name + = chaz_Util_join("", CHAZ_CC_TRY_BASENAME, chaz_OS_exe_ext(), NULL); + chaz_CC.try_obj_name + = chaz_Util_join("", CHAZ_CC_TRY_BASENAME, chaz_OS_obj_ext(), NULL); /* If we can't compile anything, game over. */ if (chaz_Util_verbosity) { @@ -337,12 +331,8 @@ chaz_CC_add_extra_cflags(const char *flags) { chaz_CC.extra_cflags = chaz_Util_strdup(flags); } else { - size_t size = strlen(chaz_CC.extra_cflags) - + 1 // Space separation - + strlen(flags) - + 1; // NULL termination - char *newflags = (char*)malloc(size); - sprintf(newflags, "%s %s", chaz_CC.extra_cflags, flags); + char *newflags + = chaz_Util_join(" ", chaz_CC.extra_cflags, flags, NULL); free(chaz_CC.extra_cflags); chaz_CC.extra_cflags = newflags; } @@ -350,9 +340,7 @@ chaz_CC_add_extra_cflags(const char *flags) { void chaz_CC_add_include_dir(const char *dir) { - size_t size = strlen(chaz_CC.include_flag) + strlen(dir) + 1; - char *flag = (char*)malloc(size); - sprintf(flag, "%s%s", chaz_CC.include_flag, dir); + char *flag = chaz_Util_join("", chaz_CC.include_flag, dir, NULL); chaz_CC_add_extra_cflags(flag); free(flag); } @@ -361,7 +349,6 @@ void chaz_CC_set_optimization_level(const char *level) { const char *opt_flag; char *flag; - size_t size; if (chaz_CC.intval__MSC_VER) { opt_flag = "/O"; @@ -369,9 +356,7 @@ chaz_CC_set_optimization_level(const char *level) { else { opt_flag = "-O"; } - size = strlen(opt_flag) + strlen(level) + 1; - flag = (char*)malloc(size); - sprintf(flag, "%s%s", opt_flag, level); + flag = chaz_Util_join("", opt_flag, level, NULL); chaz_CC_add_extra_cflags(flag); free(flag); } http://git-wip-us.apache.org/repos/asf/lucy/blob/180dab35/charmonizer/src/Charmonizer/Core/Make.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Make.c b/charmonizer/src/Charmonizer/Core/Make.c index 9a44d27..a434fdc 100644 --- a/charmonizer/src/Charmonizer/Core/Make.c +++ b/charmonizer/src/Charmonizer/Core/Make.c @@ -123,10 +123,7 @@ chaz_Make_detect(const char *make1, ...) { static int chaz_Make_audition(const char *make) { int succeeded = 0; - const char pattern[] = "%s -f _charm_Makefile"; - size_t size = strlen(make) + sizeof(pattern) + 10; - char *command = (char*)malloc(size); - sprintf(command, pattern, make); + char *command = chaz_Util_join(" ", make, "-f", "_charm_Makefile", NULL); chaz_Util_remove_and_verify("_charm_foo"); chaz_OS_run_redirected(command, "_charm_foo"); @@ -436,8 +433,7 @@ chaz_MakeRule_add_target(chaz_MakeRule *rule, const char *target) { targets = chaz_Util_strdup(target); } else { - targets = (char*)malloc(strlen(rule->targets) + strlen(target) + 20); - sprintf(targets, "%s %s", rule->targets, target); + targets = chaz_Util_join(" ", rule->targets, target, NULL); free(rule->targets); } @@ -452,8 +448,7 @@ chaz_MakeRule_add_prereq(chaz_MakeRule *rule, const char *prereq) { prereqs = chaz_Util_strdup(prereq); } else { - prereqs = (char*)malloc(strlen(rule->prereqs) + strlen(prereq) + 20); - sprintf(prereqs, "%s %s", rule->prereqs, prereq); + prereqs = chaz_Util_join(" ", rule->prereqs, prereq, NULL); free(rule->prereqs); } @@ -485,21 +480,16 @@ chaz_MakeRule_add_command_make(chaz_MakeRule *rule, const char *dir, if (chaz_Make.is_gnu_make) { if (!target) { - size_t size = strlen(dir) + 20; - command = (char*)malloc(size); - sprintf(command, "$(MAKE) -C %s", dir); + command = chaz_Util_join(" ", "$(MAKE)", "-C", dir, NULL); } else { - size_t size = strlen(dir) + strlen(target) + 20; - command = (char*)malloc(size); - sprintf(command, "$(MAKE) -C %s %s", dir, target); + command = chaz_Util_join(" ", "$(MAKE)", "-C", dir, target, NULL); } chaz_MakeRule_add_command(rule, command); free(command); } else if (chaz_Make.is_nmake) { - command = (char*)malloc(strlen(dir) + 20); - sprintf(command, "cd %s", dir); + command = chaz_Util_join(" ", "cd", dir, NULL); chaz_MakeRule_add_command(rule, command); free(command); @@ -507,9 +497,7 @@ chaz_MakeRule_add_command_make(chaz_MakeRule *rule, const char *dir, chaz_MakeRule_add_command(rule, "$(MAKE)"); } else { - size_t size = strlen(target) + 20; - command = (char*)malloc(size); - sprintf(command, "$(MAKE) %s", target); + command = chaz_Util_join(" ", "$(MAKE)", target, NULL); chaz_MakeRule_add_command(rule, command); free(command); } http://git-wip-us.apache.org/repos/asf/lucy/blob/180dab35/charmonizer/src/Charmonizer/Core/OperatingSystem.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/OperatingSystem.c b/charmonizer/src/Charmonizer/Core/OperatingSystem.c index 3a9975f..519cffc 100644 --- a/charmonizer/src/Charmonizer/Core/OperatingSystem.c +++ b/charmonizer/src/Charmonizer/Core/OperatingSystem.c @@ -172,11 +172,9 @@ chaz_OS_remove(const char *name) { int 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); + char *local_command + = chaz_Util_join("", chaz_OS.local_command_start, command, NULL); + int retval = chaz_OS_run_redirected(local_command, path); free(local_command); return retval; } @@ -193,13 +191,7 @@ chaz_OS_run_redirected(const char *command, const char *path) { 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(path) - + 10; - quiet_command = (char*)malloc(size); - sprintf(quiet_command, pattern, command, path); + quiet_command = chaz_Util_join(" ", command, ">", path, "2>&1", NULL); } else { chaz_Util_die("Don't know the shell type"); @@ -224,9 +216,7 @@ chaz_OS_mkdir(const char *filepath) { if (chaz_OS.shell_type == CHAZ_OS_POSIX || chaz_OS.shell_type == CHAZ_OS_CMD_EXE ) { - unsigned size = sizeof("mkdir") + 1 + strlen(filepath) + 1; - command = (char*)malloc(size); - sprintf(command, "mkdir %s", filepath); + command = chaz_Util_join(" ", "mkdir", filepath, NULL); } else { chaz_Util_die("Don't know the shell type"); @@ -239,14 +229,10 @@ void chaz_OS_rmdir(const char *filepath) { char *command = NULL; if (chaz_OS.shell_type == CHAZ_OS_POSIX) { - unsigned size = strlen("rmdir") + 1 + strlen(filepath) + 1; - command = (char*)malloc(size); - sprintf(command, "rmdir %s", filepath); + command = chaz_Util_join(" ", "rmdir", filepath, NULL); } else if (chaz_OS.shell_type == CHAZ_OS_CMD_EXE) { - unsigned size = strlen("rmdir /q") + 1 + strlen(filepath) + 1; - command = (char*)malloc(size); - sprintf(command, "rmdir /q %s", filepath); + command = chaz_Util_join(" ", "rmdir", "/q", filepath, NULL); } else { chaz_Util_die("Don't know the shell type"); http://git-wip-us.apache.org/repos/asf/lucy/blob/180dab35/charmonizer/src/Charmonizer/Core/Util.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Util.c b/charmonizer/src/Charmonizer/Core/Util.c index 8f9e269..575e0db 100644 --- a/charmonizer/src/Charmonizer/Core/Util.c +++ b/charmonizer/src/Charmonizer/Core/Util.c @@ -116,6 +116,50 @@ chaz_Util_strdup(const char *string) { return copy; } +char* +chaz_Util_join(const char *sep, ...) { + va_list args; + const char *string; + char *result, *p; + size_t sep_len = strlen(sep); + size_t size; + int i; + + /* Determine result size. */ + va_start(args, sep); + size = 1; + string = va_arg(args, const char*); + for (i = 0; string; ++i) { + if (i != 0) { size += sep_len; } + size += strlen(string); + string = va_arg(args, const char*); + } + va_end(args); + + result = (char*)malloc(size); + + /* Create result string. */ + va_start(args, sep); + p = result; + string = va_arg(args, const char*); + for (i = 0; string; ++i) { + size_t len; + if (i != 0) { + memcpy(p, sep, sep_len); + p += sep_len; + } + len = strlen(string); + memcpy(p, string, len); + p += len; + string = va_arg(args, const char*); + } + va_end(args); + + *p = '\0'; + + return result; +} + void chaz_Util_die(const char* format, ...) { va_list args; http://git-wip-us.apache.org/repos/asf/lucy/blob/180dab35/charmonizer/src/Charmonizer/Core/Util.h ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Util.h b/charmonizer/src/Charmonizer/Core/Util.h index 6dbfd90..cde04d0 100644 --- a/charmonizer/src/Charmonizer/Core/Util.h +++ b/charmonizer/src/Charmonizer/Core/Util.h @@ -46,6 +46,11 @@ chaz_Util_slurp_file(const char *file_path, size_t *len_ptr); char* chaz_Util_strdup(const char *string); +/* Join a NULL-terminated list of strings using a separator. + */ +char* +chaz_Util_join(const char *sep, ...); + /* Get the length of a file (may overshoot on text files under DOS). */ long
