All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Josh Poimboeuf <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: jolsa@redhat.com, hpa@zytor.com, peterz@infradead.org,
	jpoimboe@redhat.com, linux-kernel@vger.kernel.org,
	tglx@linutronix.de, namhyung@kernel.org, mingo@kernel.org,
	acme@redhat.com
Subject: [tip:perf/core] perf tools: Move help_unknown_cmd() to its own file
Date: Fri, 18 Dec 2015 00:50:16 -0800	[thread overview]
Message-ID: <tip-5feaac248a46dd5f9876c4ae45c4bbbde5472e90@git.kernel.org> (raw)
In-Reply-To: <562d918bcaaf340c1ae3e47586b3f0ae33b9918b.1449965119.git.jpoimboe@redhat.com>

Commit-ID:  5feaac248a46dd5f9876c4ae45c4bbbde5472e90
Gitweb:     http://git.kernel.org/tip/5feaac248a46dd5f9876c4ae45c4bbbde5472e90
Author:     Josh Poimboeuf <jpoimboe@redhat.com>
AuthorDate: Sun, 13 Dec 2015 22:18:09 -0600
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 14 Dec 2015 12:30:37 -0300

perf tools: Move help_unknown_cmd() to its own file

help_unknown_cmd() is quite perf-specific because it relies on some
perf_config*() functions.  Move it and its supporting functions out into
a separate file so that help.c can be moved to a library.

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/562d918bcaaf340c1ae3e47586b3f0ae33b9918b.1449965119.git.jpoimboe@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/Build                              |   1 +
 tools/perf/util/help-unknown-cmd.c                 | 103 ++++++++++++++++++++
 .../perf/util/help-unknown-cmd.h                   |   0
 tools/perf/util/help.c                             | 107 +--------------------
 tools/perf/util/help.h                             |   3 +
 5 files changed, 110 insertions(+), 104 deletions(-)

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 65fef59..99b3dae 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -87,6 +87,7 @@ libperf-$(CONFIG_AUXTRACE) += intel-bts.o
 libperf-y += parse-branch-options.o
 libperf-y += parse-regs-options.o
 libperf-y += term.o
+libperf-y += help-unknown-cmd.o
 
 libperf-$(CONFIG_LIBBPF) += bpf-loader.o
 libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
diff --git a/tools/perf/util/help-unknown-cmd.c b/tools/perf/util/help-unknown-cmd.c
new file mode 100644
index 0000000..a0820f1
--- /dev/null
+++ b/tools/perf/util/help-unknown-cmd.c
@@ -0,0 +1,103 @@
+#include "cache.h"
+#include "help.h"
+#include "../builtin.h"
+#include "levenshtein.h"
+
+static int autocorrect;
+static struct cmdnames aliases;
+
+static int perf_unknown_cmd_config(const char *var, const char *value, void *cb)
+{
+	if (!strcmp(var, "help.autocorrect"))
+		autocorrect = perf_config_int(var,value);
+	/* Also use aliases for command lookup */
+	if (!prefixcmp(var, "alias."))
+		add_cmdname(&aliases, var + 6, strlen(var + 6));
+
+	return perf_default_config(var, value, cb);
+}
+
+static int levenshtein_compare(const void *p1, const void *p2)
+{
+	const struct cmdname *const *c1 = p1, *const *c2 = p2;
+	const char *s1 = (*c1)->name, *s2 = (*c2)->name;
+	int l1 = (*c1)->len;
+	int l2 = (*c2)->len;
+	return l1 != l2 ? l1 - l2 : strcmp(s1, s2);
+}
+
+static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
+{
+	unsigned int i;
+
+	ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);
+
+	for (i = 0; i < old->cnt; i++)
+		cmds->names[cmds->cnt++] = old->names[i];
+	zfree(&old->names);
+	old->cnt = 0;
+}
+
+const char *help_unknown_cmd(const char *cmd)
+{
+	unsigned int i, n = 0, best_similarity = 0;
+	struct cmdnames main_cmds, other_cmds;
+
+	memset(&main_cmds, 0, sizeof(main_cmds));
+	memset(&other_cmds, 0, sizeof(main_cmds));
+	memset(&aliases, 0, sizeof(aliases));
+
+	perf_config(perf_unknown_cmd_config, NULL);
+
+	load_command_list("perf-", &main_cmds, &other_cmds);
+
+	add_cmd_list(&main_cmds, &aliases);
+	add_cmd_list(&main_cmds, &other_cmds);
+	qsort(main_cmds.names, main_cmds.cnt,
+	      sizeof(main_cmds.names), cmdname_compare);
+	uniq(&main_cmds);
+
+	if (main_cmds.cnt) {
+		/* This reuses cmdname->len for similarity index */
+		for (i = 0; i < main_cmds.cnt; ++i)
+			main_cmds.names[i]->len =
+				levenshtein(cmd, main_cmds.names[i]->name, 0, 2, 1, 4);
+
+		qsort(main_cmds.names, main_cmds.cnt,
+		      sizeof(*main_cmds.names), levenshtein_compare);
+
+		best_similarity = main_cmds.names[0]->len;
+		n = 1;
+		while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len)
+			++n;
+	}
+
+	if (autocorrect && n == 1) {
+		const char *assumed = main_cmds.names[0]->name;
+
+		main_cmds.names[0] = NULL;
+		clean_cmdnames(&main_cmds);
+		fprintf(stderr, "WARNING: You called a perf program named '%s', "
+			"which does not exist.\n"
+			"Continuing under the assumption that you meant '%s'\n",
+			cmd, assumed);
+		if (autocorrect > 0) {
+			fprintf(stderr, "in %0.1f seconds automatically...\n",
+				(float)autocorrect/10.0);
+			poll(NULL, 0, autocorrect * 100);
+		}
+		return assumed;
+	}
+
+	fprintf(stderr, "perf: '%s' is not a perf-command. See 'perf --help'.\n", cmd);
+
+	if (main_cmds.cnt && best_similarity < 6) {
+		fprintf(stderr, "\nDid you mean %s?\n",
+			n < 2 ? "this": "one of these");
+
+		for (i = 0; i < n; i++)
+			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
+	}
+
+	exit(1);
+}
diff --git a/arch/arm/mach-imx/Makefile.boot b/tools/perf/util/help-unknown-cmd.h
similarity index 100%
copy from arch/arm/mach-imx/Makefile.boot
copy to tools/perf/util/help-unknown-cmd.h
diff --git a/tools/perf/util/help.c b/tools/perf/util/help.c
index 929c93f..8d74f7d 100644
--- a/tools/perf/util/help.c
+++ b/tools/perf/util/help.c
@@ -1,9 +1,7 @@
 #include "cache.h"
 #include "../builtin.h"
 #include "exec_cmd.h"
-#include "levenshtein.h"
 #include "help.h"
-#include <termios.h>
 
 void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
 {
@@ -17,7 +15,7 @@ void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
 	cmds->names[cmds->cnt++] = ent;
 }
 
-static void clean_cmdnames(struct cmdnames *cmds)
+void clean_cmdnames(struct cmdnames *cmds)
 {
 	unsigned int i;
 
@@ -28,14 +26,14 @@ static void clean_cmdnames(struct cmdnames *cmds)
 	cmds->alloc = 0;
 }
 
-static int cmdname_compare(const void *a_, const void *b_)
+int cmdname_compare(const void *a_, const void *b_)
 {
 	struct cmdname *a = *(struct cmdname **)a_;
 	struct cmdname *b = *(struct cmdname **)b_;
 	return strcmp(a->name, b->name);
 }
 
-static void uniq(struct cmdnames *cmds)
+void uniq(struct cmdnames *cmds)
 {
 	unsigned int i, j;
 
@@ -233,102 +231,3 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 			return 1;
 	return 0;
 }
-
-static int autocorrect;
-static struct cmdnames aliases;
-
-static int perf_unknown_cmd_config(const char *var, const char *value, void *cb)
-{
-	if (!strcmp(var, "help.autocorrect"))
-		autocorrect = perf_config_int(var,value);
-	/* Also use aliases for command lookup */
-	if (!prefixcmp(var, "alias."))
-		add_cmdname(&aliases, var + 6, strlen(var + 6));
-
-	return perf_default_config(var, value, cb);
-}
-
-static int levenshtein_compare(const void *p1, const void *p2)
-{
-	const struct cmdname *const *c1 = p1, *const *c2 = p2;
-	const char *s1 = (*c1)->name, *s2 = (*c2)->name;
-	int l1 = (*c1)->len;
-	int l2 = (*c2)->len;
-	return l1 != l2 ? l1 - l2 : strcmp(s1, s2);
-}
-
-static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
-{
-	unsigned int i;
-
-	ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);
-
-	for (i = 0; i < old->cnt; i++)
-		cmds->names[cmds->cnt++] = old->names[i];
-	zfree(&old->names);
-	old->cnt = 0;
-}
-
-const char *help_unknown_cmd(const char *cmd)
-{
-	unsigned int i, n = 0, best_similarity = 0;
-	struct cmdnames main_cmds, other_cmds;
-
-	memset(&main_cmds, 0, sizeof(main_cmds));
-	memset(&other_cmds, 0, sizeof(main_cmds));
-	memset(&aliases, 0, sizeof(aliases));
-
-	perf_config(perf_unknown_cmd_config, NULL);
-
-	load_command_list("perf-", &main_cmds, &other_cmds);
-
-	add_cmd_list(&main_cmds, &aliases);
-	add_cmd_list(&main_cmds, &other_cmds);
-	qsort(main_cmds.names, main_cmds.cnt,
-	      sizeof(main_cmds.names), cmdname_compare);
-	uniq(&main_cmds);
-
-	if (main_cmds.cnt) {
-		/* This reuses cmdname->len for similarity index */
-		for (i = 0; i < main_cmds.cnt; ++i)
-			main_cmds.names[i]->len =
-				levenshtein(cmd, main_cmds.names[i]->name, 0, 2, 1, 4);
-
-		qsort(main_cmds.names, main_cmds.cnt,
-		      sizeof(*main_cmds.names), levenshtein_compare);
-
-		best_similarity = main_cmds.names[0]->len;
-		n = 1;
-		while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len)
-			++n;
-	}
-
-	if (autocorrect && n == 1) {
-		const char *assumed = main_cmds.names[0]->name;
-
-		main_cmds.names[0] = NULL;
-		clean_cmdnames(&main_cmds);
-		fprintf(stderr, "WARNING: You called a perf program named '%s', "
-			"which does not exist.\n"
-			"Continuing under the assumption that you meant '%s'\n",
-			cmd, assumed);
-		if (autocorrect > 0) {
-			fprintf(stderr, "in %0.1f seconds automatically...\n",
-				(float)autocorrect/10.0);
-			poll(NULL, 0, autocorrect * 100);
-		}
-		return assumed;
-	}
-
-	fprintf(stderr, "perf: '%s' is not a perf-command. See 'perf --help'.\n", cmd);
-
-	if (main_cmds.cnt && best_similarity < 6) {
-		fprintf(stderr, "\nDid you mean %s?\n",
-			n < 2 ? "this": "one of these");
-
-		for (i = 0; i < n; i++)
-			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
-	}
-
-	exit(1);
-}
diff --git a/tools/perf/util/help.h b/tools/perf/util/help.h
index 7f5c6de..14851b0 100644
--- a/tools/perf/util/help.h
+++ b/tools/perf/util/help.h
@@ -20,6 +20,9 @@ void load_command_list(const char *prefix,
 		struct cmdnames *main_cmds,
 		struct cmdnames *other_cmds);
 void add_cmdname(struct cmdnames *cmds, const char *name, size_t len);
+void clean_cmdnames(struct cmdnames *cmds);
+int cmdname_compare(const void *a, const void *b);
+void uniq(struct cmdnames *cmds);
 /* Here we require that excludes is a sorted list. */
 void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
 int is_in_cmdlist(struct cmdnames *c, const char *s);

  reply	other threads:[~2015-12-18  8:50 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-14  4:18 [PATCH v3 00/17] perf tools: Move perf subcommand framework to a library Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 01/17] perf build: Remove unnecessary line in Makefile.feature Josh Poimboeuf
2015-12-14 10:05   ` Jiri Olsa
2015-12-14 15:16     ` Arnaldo Carvalho de Melo
2015-12-18  8:47   ` [tip:perf/core] " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 02/17] tools build: Fix feature Makefile dependencies for 'O=' Josh Poimboeuf
2015-12-14 10:08   ` Jiri Olsa
2015-12-14 14:02     ` Josh Poimboeuf
2015-12-14 14:29       ` [PATCH v3.1 " Josh Poimboeuf
2015-12-14 15:16         ` Arnaldo Carvalho de Melo
2015-12-14 15:29         ` Jiri Olsa
2015-12-14 15:38           ` Josh Poimboeuf
2015-12-14 15:55             ` Jiri Olsa
2015-12-14 16:03               ` Josh Poimboeuf
2015-12-14 18:32               ` [PATCH v3.2] tools build: Fix feature Makefile issues with 'O=' Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 03/17] perf test: Add Build file to dependencies for llvm-src-*.c Josh Poimboeuf
2015-12-14 10:10   ` Jiri Olsa
2015-12-14 15:17     ` Arnaldo Carvalho de Melo
2015-12-18  8:47   ` [tip:perf/core] " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 04/17] perf test: remove tarpkg at end of test Josh Poimboeuf
2015-12-18  8:48   ` [tip:perf/core] perf test: Remove " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 05/17] perf build: Fix 'make clean' Josh Poimboeuf
2015-12-14 10:14   ` Jiri Olsa
2015-12-14 15:18     ` Arnaldo Carvalho de Melo
2015-12-18  8:48   ` [tip:perf/core] " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 06/17] perf build: Rename LIB_PATH -> API_PATH Josh Poimboeuf
2015-12-14 10:34   ` Jiri Olsa
2015-12-14 15:19     ` Arnaldo Carvalho de Melo
2015-12-18  8:49   ` [tip:perf/core] " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 07/17] perf: Create pager.h Josh Poimboeuf
2015-12-18  8:49   ` [tip:perf/core] perf tools: " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 08/17] perf: Remove check for unused PERF_PAGER_IN_USE Josh Poimboeuf
2015-12-18  8:49   ` [tip:perf/core] perf tools: " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 09/17] perf: Move help_unknown_cmd() to its own file Josh Poimboeuf
2015-12-18  8:50   ` tip-bot for Josh Poimboeuf [this message]
2015-12-14  4:18 ` [PATCH v3 10/17] perf: Provide subcmd configuration at runtime Josh Poimboeuf
2015-12-14 10:33   ` Jiri Olsa
2015-12-14 14:06     ` Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 11/17] perf: Remove 'perf' from subcmd function and variable names Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 12/17] perf: Convert parse-options.c internal functions to static Josh Poimboeuf
2015-12-18  8:50   ` [tip:perf/core] perf tools: " tip-bot for Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 13/17] perf: Document the fact that parse_options*() may exit Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 14/17] perf: Remove subcmd dependencies on strbuf Josh Poimboeuf
2015-12-14 10:25   ` Jiri Olsa
2015-12-14 14:11     ` Josh Poimboeuf
2015-12-14 15:44   ` Arnaldo Carvalho de Melo
2015-12-14 16:05     ` Josh Poimboeuf
2015-12-14 17:50       ` Arnaldo Carvalho de Melo
2015-12-14 18:04         ` Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 15/17] perf: Finalize subcmd independence Josh Poimboeuf
2015-12-14 10:32   ` Jiri Olsa
2015-12-14 14:13     ` Josh Poimboeuf
2015-12-14 15:27       ` Jiri Olsa
2015-12-14 15:51       ` Arnaldo Carvalho de Melo
2015-12-14  4:18 ` [PATCH v3 16/17] perf subcmd: Create subcmd library Josh Poimboeuf
2015-12-14  4:18 ` [PATCH v3 17/17] tools subcmd: Rename subcmd header include guards Josh Poimboeuf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-5feaac248a46dd5f9876c4ae45c4bbbde5472e90@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=acme@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@redhat.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.