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:
@ -13,7 +13,7 @@
|
|||||||
//kbuild:lib-$(CONFIG_MAN) += man.o
|
//kbuild:lib-$(CONFIG_MAN) += man.o
|
||||||
|
|
||||||
//usage:#define man_trivial_usage
|
//usage:#define man_trivial_usage
|
||||||
//usage: "[-aw] MANPAGE..."
|
//usage: "[-aw] [SECTION] MANPAGE[.SECTION]..."
|
||||||
//usage:#define man_full_usage "\n\n"
|
//usage:#define man_full_usage "\n\n"
|
||||||
//usage: "Display manual page\n"
|
//usage: "Display manual page\n"
|
||||||
//usage: "\n -a Display all pages"
|
//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));
|
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, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int man_main(int argc UNUSED_PARAM, char **argv)
|
int man_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
parser_t *parser;
|
parser_t *parser;
|
||||||
|
char *conf_sec_list;
|
||||||
char *sec_list;
|
char *sec_list;
|
||||||
char **man_path_list;
|
char **man_path_list;
|
||||||
int count_mp;
|
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*/);
|
opt = getopt32(argv, "^+" "aw" "\0" "-1"/*at least one arg*/);
|
||||||
argv += optind;
|
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;
|
count_mp = 0;
|
||||||
man_path_list = add_MANPATH(NULL, &count_mp,
|
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]);
|
man_path_list = add_MANPATH(man_path_list, &count_mp, token[1]);
|
||||||
}
|
}
|
||||||
if (strcmp("MANSECT", token[0]) == 0) {
|
if (strcmp("MANSECT", token[0]) == 0) {
|
||||||
free(sec_list);
|
free(conf_sec_list);
|
||||||
sec_list = xstrdup(token[1]);
|
conf_sec_list = xstrdup(token[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config_close(parser);
|
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);
|
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;
|
not_found = 0;
|
||||||
do { /* for each argv[] */
|
do { /* for each argv[] */
|
||||||
const char *cur_path;
|
const char *cur_path;
|
||||||
@ -321,11 +339,20 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
found = show_manpage(*argv, /*man:*/ 1, 0);
|
found = show_manpage(*argv, /*man:*/ 1, 0);
|
||||||
goto check_found;
|
goto check_found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* for each MANPATH */
|
||||||
cur_mp = 0;
|
cur_mp = 0;
|
||||||
while ((cur_path = man_path_list[cur_mp++]) != NULL) {
|
while ((cur_path = man_path_list[cur_mp++]) != NULL) {
|
||||||
/* for each MANPATH */
|
|
||||||
const char *cur_sect = sec_list;
|
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, ':');
|
char *next_sect = strchrnul(cur_sect, ':');
|
||||||
int sect_len = next_sect - cur_sect;
|
int sect_len = next_sect - cur_sect;
|
||||||
char *man_filename;
|
char *man_filename;
|
||||||
@ -352,6 +379,8 @@ int man_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
while (*cur_sect == ':')
|
while (*cur_sect == ':')
|
||||||
cur_sect++;
|
cur_sect++;
|
||||||
} while (*cur_sect);
|
} while (*cur_sect);
|
||||||
|
|
||||||
|
if (sect_ext) *sect_ext = '.';
|
||||||
}
|
}
|
||||||
check_found:
|
check_found:
|
||||||
if (!found) {
|
if (!found) {
|
||||||
|
Reference in New Issue
Block a user