perf tools: Remove subcmd dependencies on strbuf
authorJosh Poimboeuf <jpoimboe@redhat.com>
Tue, 15 Dec 2015 15:39:36 +0000 (09:39 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 17 Dec 2015 00:33:13 +0000 (21:33 -0300)
Introduce and use new astrcat() and astrcatf() functions which replace
the strbuf functionality for subcmd.

For now they duplicate strbuf's die-on-allocation-error policy.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/957d207e1254406fa11fc2e405e75a7e405aad8f.1450193761.git.jpoimboe@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/exec_cmd.c
tools/perf/util/help.c
tools/perf/util/parse-options.c
tools/perf/util/subcmd-util.h [new file with mode: 0644]

index b935e4ce62a232566df223a63992461a2e8bc54a..65d86dcaa984cb6af78aaa4f021db0b115455338 100644 (file)
@@ -4,6 +4,7 @@
 #include "subcmd-config.h"
 
 #include <string.h>
+#include "subcmd-util.h"
 
 #define MAX_ARGS       32
 
@@ -21,14 +22,14 @@ void exec_cmd_init(const char *exec_name, const char *prefix,
 
 char *system_path(const char *path)
 {
-       struct strbuf d = STRBUF_INIT;
+       char *buf = NULL;
 
        if (is_absolute_path(path))
                return strdup(path);
 
-       strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path);
-       path = strbuf_detach(&d, NULL);
-       return (char *)path;
+       astrcatf(&buf, "%s/%s", subcmd_config.prefix, path);
+
+       return buf;
 }
 
 const char *perf_extract_argv0_path(const char *argv0)
@@ -75,22 +76,22 @@ char *perf_exec_path(void)
        return system_path(subcmd_config.exec_path);
 }
 
-static void add_path(struct strbuf *out, const char *path)
+static void add_path(char **out, const char *path)
 {
        if (path && *path) {
                if (is_absolute_path(path))
-                       strbuf_addstr(out, path);
+                       astrcat(out, path);
                else
-                       strbuf_addstr(out, make_nonrelative_path(path));
+                       astrcat(out, make_nonrelative_path(path));
 
-               strbuf_addch(out, PATH_SEP);
+               astrcat(out, ":");
        }
 }
 
 void setup_path(void)
 {
        const char *old_path = getenv("PATH");
-       struct strbuf new_path = STRBUF_INIT;
+       char *new_path = NULL;
        char *tmp = perf_exec_path();
 
        add_path(&new_path, tmp);
@@ -98,13 +99,13 @@ void setup_path(void)
        free(tmp);
 
        if (old_path)
-               strbuf_addstr(&new_path, old_path);
+               astrcat(&new_path, old_path);
        else
-               strbuf_addstr(&new_path, "/usr/local/bin:/usr/bin:/bin");
+               astrcat(&new_path, "/usr/local/bin:/usr/bin:/bin");
 
-       setenv("PATH", new_path.buf, 1);
+       setenv("PATH", new_path, 1);
 
-       strbuf_release(&new_path);
+       free(new_path);
 }
 
 static const char **prepare_perf_cmd(const char **argv)
index 8d74f7d056740520391dd2117963279354991e37..8e5e0ce3870efa62ec5ac66aff68ff681771db01 100644 (file)
@@ -2,6 +2,7 @@
 #include "../builtin.h"
 #include "exec_cmd.h"
 #include "help.h"
+#include "subcmd-util.h"
 
 void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
 {
@@ -119,8 +120,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
        int prefix_len;
        DIR *dir = opendir(path);
        struct dirent *de;
-       struct strbuf buf = STRBUF_INIT;
-       int len;
+       char *buf = NULL;
 
        if (!dir)
                return;
@@ -128,8 +128,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
                prefix = "perf-";
        prefix_len = strlen(prefix);
 
-       strbuf_addf(&buf, "%s/", path);
-       len = buf.len;
+       astrcatf(&buf, "%s/", path);
 
        while ((de = readdir(dir)) != NULL) {
                int entlen;
@@ -137,9 +136,8 @@ static void list_commands_in_dir(struct cmdnames *cmds,
                if (prefixcmp(de->d_name, prefix))
                        continue;
 
-               strbuf_setlen(&buf, len);
-               strbuf_addstr(&buf, de->d_name);
-               if (!is_executable(buf.buf))
+               astrcat(&buf, de->d_name);
+               if (!is_executable(buf))
                        continue;
 
                entlen = strlen(de->d_name) - prefix_len;
@@ -149,7 +147,7 @@ static void list_commands_in_dir(struct cmdnames *cmds,
                add_cmdname(cmds, de->d_name + prefix_len, entlen);
        }
        closedir(dir);
-       strbuf_release(&buf);
+       free(buf);
 }
 
 void load_command_list(const char *prefix,
index da4ba21cad212de48bcab566db9680b89cd1856a..c1da2a53ed4e596eb5017cdb5d42c2b73853d45a 100644 (file)
@@ -1,4 +1,5 @@
 #include "util.h"
+#include "subcmd-util.h"
 #include "parse-options.h"
 #include "cache.h"
 #include "header.h"
@@ -8,7 +9,7 @@
 #define OPT_SHORT 1
 #define OPT_UNSET 2
 
-static struct strbuf error_buf = STRBUF_INIT;
+char *error_buf;
 
 static int opterror(const struct option *opt, const char *reason, int flags)
 {
@@ -576,19 +577,18 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
 
        /* build usage string if it's not provided */
        if (subcommands && !usagestr[0]) {
-               struct strbuf buf = STRBUF_INIT;
+               char *buf = NULL;
+
+               astrcatf(&buf, "%s %s [<options>] {", subcmd_config.exec_name, argv[0]);
 
-               strbuf_addf(&buf, "%s %s [<options>] {",
-                           subcmd_config.exec_name, argv[0]);
                for (int i = 0; subcommands[i]; i++) {
                        if (i)
-                               strbuf_addstr(&buf, "|");
-                       strbuf_addstr(&buf, subcommands[i]);
+                               astrcat(&buf, "|");
+                       astrcat(&buf, subcommands[i]);
                }
-               strbuf_addstr(&buf, "}");
+               astrcat(&buf, "}");
 
-               usagestr[0] = strdup(buf.buf);
-               strbuf_release(&buf);
+               usagestr[0] = buf;
        }
 
        parse_options_start(&ctx, argc, argv, flags);
@@ -613,13 +613,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
                putchar('\n');
                exit(130);
        default: /* PARSE_OPT_UNKNOWN */
-               if (ctx.argv[0][1] == '-') {
-                       strbuf_addf(&error_buf, "unknown option `%s'",
-                                   ctx.argv[0] + 2);
-               } else {
-                       strbuf_addf(&error_buf, "unknown switch `%c'",
-                                   *ctx.opt);
-               }
+               if (ctx.argv[0][1] == '-')
+                       astrcatf(&error_buf, "unknown option `%s'",
+                                ctx.argv[0] + 2);
+               else
+                       astrcatf(&error_buf, "unknown switch `%c'", *ctx.opt);
                usage_with_options(usagestr, options);
        }
 
@@ -806,9 +804,9 @@ static int usage_with_options_internal(const char * const *usagestr,
 
        setup_pager();
 
-       if (strbuf_avail(&error_buf)) {
-               fprintf(stderr, "  Error: %s\n", error_buf.buf);
-               strbuf_release(&error_buf);
+       if (error_buf) {
+               fprintf(stderr, "  Error: %s\n", error_buf);
+               zfree(&error_buf);
        }
 
        fprintf(stderr, "\n Usage: %s\n", *usagestr++);
@@ -852,11 +850,15 @@ void usage_with_options_msg(const char * const *usagestr,
                            const struct option *opts, const char *fmt, ...)
 {
        va_list ap;
+       char *tmp = error_buf;
 
        va_start(ap, fmt);
-       strbuf_addv(&error_buf, fmt, ap);
+       if (vasprintf(&error_buf, fmt, ap) == -1)
+               die("vasprintf failed");
        va_end(ap);
 
+       free(tmp);
+
        usage_with_options_internal(usagestr, opts, 0, NULL);
        exit(129);
 }
diff --git a/tools/perf/util/subcmd-util.h b/tools/perf/util/subcmd-util.h
new file mode 100644 (file)
index 0000000..98fb9f9
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __PERF_SUBCMD_UTIL_H
+#define __PERF_SUBCMD_UTIL_H
+
+#include <stdio.h>
+
+#define astrcatf(out, fmt, ...)                                                \
+({                                                                     \
+       char *tmp = *(out);                                             \
+       if (asprintf((out), "%s" fmt, tmp ?: "", ## __VA_ARGS__) == -1) \
+               die("asprintf failed");                                 \
+       free(tmp);                                                      \
+})
+
+static inline void astrcat(char **out, const char *add)
+{
+       char *tmp = *out;
+
+       if (asprintf(out, "%s%s", tmp ?: "", add) == -1)
+               die("asprintf failed");
+
+       free(tmp);
+}
+
+#endif /* __PERF_SUBCMD_UTIL_H */