man: implement SECTION parameters
function old new delta man_main 807 942 +135 is_section_name - 52 +52 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/0 up/down: 187/0) Total: 187 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
cad20ced86
commit
1462673dde
@ -13,7 +13,7 @@
|
||||
//kbuild:lib-$(CONFIG_MAN) += man.o
|
||||
|
||||
//usage:#define man_trivial_usage
|
||||
//usage: "[-aw] MANPAGE..."
|
||||
//usage: "[-aw] [SECTION] MANPAGE[.SECTION]..."
|
||||
//usage:#define man_full_usage "\n\n"
|
||||
//usage: "Display manual page\n"
|
||||
//usage: "\n -a Display all pages"
|
||||
@ -240,10 +240,21 @@ static const char *if_redefined(const char *var, const char *key, const char *li
|
||||
return xstrdup(skip_whitespace(line));
|
||||
}
|
||||
|
||||
static int is_section_name(const char *sections, const char *str)
|
||||
{
|
||||
const char *s = strstr(sections, str);
|
||||
if (s) {
|
||||
int l = strlen(str);
|
||||
return (s[l] == ':' || s[l] == '\0');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int man_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
parser_t *parser;
|
||||
char *conf_sec_list;
|
||||
char *sec_list;
|
||||
char **man_path_list;
|
||||
int count_mp;
|
||||
@ -255,7 +266,7 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
opt = getopt32(argv, "^+" "aw" "\0" "-1"/*at least one arg*/);
|
||||
argv += optind;
|
||||
|
||||
sec_list = xstrdup("0p:1:1p:2:3:3p:4:5:6:7:8:9");
|
||||
conf_sec_list = xstrdup("0p:1:1p:2:3:3p:4:5:6:7:8:9");
|
||||
|
||||
count_mp = 0;
|
||||
man_path_list = add_MANPATH(NULL, &count_mp,
|
||||
@ -285,8 +296,8 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
man_path_list = add_MANPATH(man_path_list, &count_mp, token[1]);
|
||||
}
|
||||
if (strcmp("MANSECT", token[0]) == 0) {
|
||||
free(sec_list);
|
||||
sec_list = xstrdup(token[1]);
|
||||
free(conf_sec_list);
|
||||
conf_sec_list = xstrdup(token[1]);
|
||||
}
|
||||
}
|
||||
config_close(parser);
|
||||
@ -311,6 +322,13 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
G.pager = xasprintf("%s -b -p -x", G.col);
|
||||
}
|
||||
|
||||
/* is 1st ARG a SECTION? */
|
||||
sec_list = conf_sec_list;
|
||||
if (is_section_name(conf_sec_list, *argv)) {
|
||||
/* yes */
|
||||
sec_list = *argv++;
|
||||
}
|
||||
|
||||
not_found = 0;
|
||||
do { /* for each argv[] */
|
||||
const char *cur_path;
|
||||
@ -321,11 +339,20 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
found = show_manpage(*argv, /*man:*/ 1, 0);
|
||||
goto check_found;
|
||||
}
|
||||
|
||||
/* for each MANPATH */
|
||||
cur_mp = 0;
|
||||
while ((cur_path = man_path_list[cur_mp++]) != NULL) {
|
||||
/* for each MANPATH */
|
||||
const char *cur_sect = sec_list;
|
||||
do { /* for each section */
|
||||
|
||||
/* is MANPAGE of the form NAME.SECTION? */
|
||||
char *sect_ext = strrchr(*argv, '.');
|
||||
if (sect_ext && is_section_name(conf_sec_list, sect_ext + 1)) {
|
||||
*sect_ext = '\0';
|
||||
cur_sect = sect_ext + 1;
|
||||
}
|
||||
|
||||
do { /* for each SECTION in cur_sect */
|
||||
char *next_sect = strchrnul(cur_sect, ':');
|
||||
int sect_len = next_sect - cur_sect;
|
||||
char *man_filename;
|
||||
@ -352,6 +379,8 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
||||
while (*cur_sect == ':')
|
||||
cur_sect++;
|
||||
} while (*cur_sect);
|
||||
|
||||
if (sect_ext) *sect_ext = '.';
|
||||
}
|
||||
check_found:
|
||||
if (!found) {
|
||||
|
Loading…
Reference in New Issue
Block a user