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])
continue;
if (strcmp("MANPATH", token[0]) == 0) {
/* Do we already have it? */
char **path_element = man_path_list;
while (*path_element) {
if (strcmp(*path_element, token[1]) == 0)
goto skip;
path_element++;
char *path = token[1];
while (*path) {
char *next_path;
char **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) {
free(sec_list);
sec_list = xstrdup(token[1]);
}
skip: ;
}
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) {
/* for each MANPATH */
do { /* for each MANPATH item */
char *next_path = strchrnul(cur_path, ':');
int path_len = next_path - cur_path;
cur_sect = sec_list;
do { /* for each section */
char *next_sect = strchrnul(cur_sect, ':');
int sect_len = next_sect - cur_sect;
char *man_filename;
int cat0man1 = 0;
cur_sect = sec_list;
do { /* for each section */
char *next_sect = strchrnul(cur_sect, ':');
int sect_len = next_sect - cur_sect;
char *man_filename;
int cat0man1 = 0;
/* Search for cat, then man page */
while (cat0man1 < 2) {
int found_here;
man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" Z_SUFFIX,
path_len, cur_path,
"cat\0man" + (cat0man1 * 4),
sect_len, cur_sect,
*argv,
sect_len, cur_sect);
found_here = show_manpage(pager, man_filename, cat0man1, 0);
found |= found_here;
cat0man1 += found_here + 1;
free(man_filename);
}
/* Search for cat, then man page */
while (cat0man1 < 2) {
int found_here;
man_filename = xasprintf("%s/%s%.*s/%s.%.*s" Z_SUFFIX,
cur_path,
"cat\0man" + (cat0man1 * 4),
sect_len, cur_sect,
*argv,
sect_len, cur_sect);
found_here = show_manpage(pager, man_filename, cat0man1, 0);
found |= found_here;
cat0man1 += found_here + 1;
free(man_filename);
}
if (found && !(opt & OPT_a))
goto next_arg;
cur_sect = next_sect;
while (*cur_sect == ':')
cur_sect++;
} while (*cur_sect);
cur_path = next_path;
while (*cur_path == ':')
cur_path++;
} while (*cur_path);
if (found && !(opt & OPT_a))
goto next_arg;
cur_sect = next_sect;
while (*cur_sect == ':')
cur_sect++;
} while (*cur_sect);
}
check_found:
if (!found) {