man: better check for duplicated MANPATH. Also -10 bytes.

This commit is contained in:
Denis Vlasenko 2008-11-16 04:05:13 +00:00
parent 2479cd4a5d
commit e88bd2d931

View File

@ -188,24 +188,40 @@ int man_main(int argc UNUSED_PARAM, char **argv)
if (!token[1]) if (!token[1])
continue; continue;
if (strcmp("MANPATH", token[0]) == 0) { if (strcmp("MANPATH", token[0]) == 0) {
/* Do we already have it? */ char *path = token[1];
char **path_element = man_path_list; while (*path) {
while (*path_element) { char *next_path;
if (strcmp(*path_element, token[1]) == 0) char **path_element;
goto skip;
path_element++; next_path = strchr(path, ':');
if (next_path) {
*next_path = '\0';
if (next_path++ == path) /* "::"? */
goto next;
}
/* Do we already have path? */
path_element = man_path_list;
while (*path_element) {
if (strcmp(*path_element, path) == 0)
goto skip;
path_element++;
}
man_path_list = xrealloc_vector(man_path_list, 4, count_mp);
man_path_list[count_mp] = xstrdup(path);
count_mp++;
/* man_path_list is NULL terminated */
/*man_path_list[count_mp] = NULL; - xrealloc_vector did it */
skip:
if (!next_path)
break;
next:
path = next_path;
} }
man_path_list = xrealloc_vector(man_path_list, 4, count_mp);
man_path_list[count_mp] = xstrdup(token[1]);
count_mp++;
/* man_path_list is NULL terminated */
/*man_path_list[count_mp] = NULL; - xrealloc_vector did it */
} }
if (strcmp("MANSECT", token[0]) == 0) { if (strcmp("MANSECT", token[0]) == 0) {
free(sec_list); free(sec_list);
sec_list = xstrdup(token[1]); sec_list = xstrdup(token[1]);
} }
skip: ;
} }
config_close(parser); config_close(parser);
@ -220,41 +236,34 @@ int man_main(int argc UNUSED_PARAM, char **argv)
} }
while ((cur_path = man_path_list[cur_mp++]) != NULL) { while ((cur_path = man_path_list[cur_mp++]) != NULL) {
/* for each MANPATH */ /* for each MANPATH */
do { /* for each MANPATH item */ cur_sect = sec_list;
char *next_path = strchrnul(cur_path, ':'); do { /* for each section */
int path_len = next_path - cur_path; char *next_sect = strchrnul(cur_sect, ':');
cur_sect = sec_list; int sect_len = next_sect - cur_sect;
do { /* for each section */ char *man_filename;
char *next_sect = strchrnul(cur_sect, ':'); int cat0man1 = 0;
int sect_len = next_sect - cur_sect;
char *man_filename;
int cat0man1 = 0;
/* Search for cat, then man page */ /* Search for cat, then man page */
while (cat0man1 < 2) { while (cat0man1 < 2) {
int found_here; int found_here;
man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" Z_SUFFIX, man_filename = xasprintf("%s/%s%.*s/%s.%.*s" Z_SUFFIX,
path_len, cur_path, cur_path,
"cat\0man" + (cat0man1 * 4), "cat\0man" + (cat0man1 * 4),
sect_len, cur_sect, sect_len, cur_sect,
*argv, *argv,
sect_len, cur_sect); sect_len, cur_sect);
found_here = show_manpage(pager, man_filename, cat0man1, 0); found_here = show_manpage(pager, man_filename, cat0man1, 0);
found |= found_here; found |= found_here;
cat0man1 += found_here + 1; cat0man1 += found_here + 1;
free(man_filename); free(man_filename);
} }
if (found && !(opt & OPT_a)) if (found && !(opt & OPT_a))
goto next_arg; goto next_arg;
cur_sect = next_sect; cur_sect = next_sect;
while (*cur_sect == ':') while (*cur_sect == ':')
cur_sect++; cur_sect++;
} while (*cur_sect); } while (*cur_sect);
cur_path = next_path;
while (*cur_path == ':')
cur_path++;
} while (*cur_path);
} }
check_found: check_found:
if (!found) { if (!found) {