[PATCH 3/6] builtin-help: make it possible to exclude some commands in list_commands()
- From
Miklos Vajna <vmiklos@frugalware.org>
- Date
- Jul 28, 2008, 23:24 UTC
- Message-ID
- <5ad105819efb1c905bd01db3d08eb3422d283b3b.1217287269.git.vmiklos@frugalware.org>
- In-Reply-To
- <7vr69ex00x.fsf@gitster.siamese.dyndns.org>
The supposed method is to build a list of commands to be excluded using add_cmdname(), then pass the list as the new exclude parameter. If no exclude is needed, NULL should be used.
Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> ---
On Sun, Jul 27, 2008 at 06:36:30PM -0700, Junio C Hamano <gitster@pobox.com> wrote:
Show 9 quoted lines
> > + struct cmdname {
> > + size_t len;
> > + char name[1];
> > + } **names;
> > +};
>
> I thought we do this kind of thing using FLEX_ARRAY macro. Is there
> any
> reason its use is not appropriate here?Now I'm using it. :-)
Note that FLEX_ARRAY would be a drop-in replacement only in case it would be name[0], so I needed
- struct cmdname *ent = xmalloc(sizeof(*ent) + len); + struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
later in add_cmdname().
help.c | 26 +++++++++++--------------- help.h | 14 +++++++++++++- 2 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/help.c b/help.c index 7a42517..858f76a 100644 --- a/help.c +++ b/help.c @@ -9,6 +9,7 @@ #include "common-cmds.h" #include "parse-options.h" #include "run-command.h" +#include "help.h" static struct man_viewer_list { struct man_viewer_list *next; @@ -300,18 +301,11 @@ static inline void mput_char(char c, unsigned int num) putchar(c); } -static struct cmdnames { - int alloc; - int cnt; - struct cmdname { - size_t len; - char name[1]; - } **names; -} main_cmds, other_cmds; +struct cmdnames main_cmds, other_cmds; -static void add_cmdname(struct cmdnames *cmds, const char *name, int len) +void add_cmdname(struct cmdnames *cmds, const char *name, int len) { - struct cmdname *ent = xmalloc(sizeof(*ent) + len); + struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1); ent->len = len; memcpy(ent->name, name, len); @@ -463,7 +457,7 @@ static unsigned int list_commands_in_dir(struct cmdnames *cmds, return longest; } -static unsigned int load_command_list(const char *prefix) +static unsigned int load_command_list(const char *prefix, struct cmdnames *exclude) { unsigned int longest = 0; unsigned int len; @@ -502,13 +496,15 @@ static unsigned int load_command_list(const char *prefix) sizeof(*other_cmds.names), cmdname_compare); uniq(&other_cmds); exclude_cmds(&other_cmds, &main_cmds); + if (exclude) + exclude_cmds(&main_cmds, exclude); return longest; } -void list_commands(const char *prefix, const char *title) +void list_commands(const char *prefix, const char *title, struct cmdnames *exclude) { - unsigned int longest = load_command_list(prefix); + unsigned int longest = load_command_list(prefix, exclude); const char *exec_path = git_exec_path(); if (main_cmds.cnt) { @@ -558,7 +554,7 @@ static int is_in_cmdlist(struct cmdnames *c, const char *s) int is_git_command(const char *s, const char *prefix) { - load_command_list(prefix); + load_command_list(prefix, NULL); return is_in_cmdlist(&main_cmds, s) || is_in_cmdlist(&other_cmds, s); } @@ -704,7 +700,7 @@ int cmd_help(int argc, const char **argv, const char *prefix) if (show_all) { printf("usage: %s\n\n", git_usage_string); - list_commands("git-", "git commands"); + list_commands("git-", "git commands", NULL); printf("%s\n", git_more_info_string); return 0; } diff --git a/help.h b/help.h index 0741662..3eb8cfb 100644 --- a/help.h +++ b/help.h @@ -1,7 +1,19 @@ #ifndef HELP_H #define HELP_H +struct cmdnames { + int alloc; + int cnt; + struct cmdname { + size_t len; + char name[FLEX_ARRAY]; + } **names; +}; + int is_git_command(const char *s, const char *prefix); -void list_commands(const char *prefix, const char *title); +void list_commands(const char *prefix, const char *title, struct cmdnames *exclude); +void add_cmdname(struct cmdnames *cmds, const char *name, int len); + +extern struct cmdnames main_cmds, other_cmds; #endif /* HELP_H */
-- 1.6.0.rc0.14.g95f8.dirty