diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-16 07:05:13 +0300 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-16 07:05:13 +0300 |
commit | e88bd2d9318417d01e141e598c3870def0eddfcc (patch) | |
tree | 06afd0c5b9fec38fbed14873ea659392ca6f9e47 /miscutils/man.c | |
parent | 2479cd4a5d50044e9d8e791a6ac17d528761a0a6 (diff) |
man: better check for duplicated MANPATH. Also -10 bytes.
Diffstat (limited to 'miscutils/man.c')
-rw-r--r-- | miscutils/man.c | 103 |
1 files changed, 56 insertions, 47 deletions
diff --git a/miscutils/man.c b/miscutils/man.c index 24551c0e0..672ddb1c8 100644 --- a/miscutils/man.c +++ b/miscutils/man.c @@ -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; - - /* 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); - } - - 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); + 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, + 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); } check_found: if (!found) { |