You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2013/03/24 17:15:59 UTC

[lucy-commits] [2/5] git commit: refs/heads/master - Introduce chaz_Util_join

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 <we...@aevum.de>
Authored: Sun Mar 24 17:06:40 2013 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
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