man: fixlet for man links

This commit is contained in:
Denis Vlasenko 2008-08-05 13:45:22 +00:00
parent 540baf646a
commit 22b0bd85fd

View File

@ -74,32 +74,37 @@ static int run_pipe(const char *unpacker, const char *pager, char *man_filename,
*/ */
*strchrnul(line, '\n') = '\0'; *strchrnul(line, '\n') = '\0';
linkname = p = skip_whitespace(&line[4]); linkname = p = skip_whitespace(&line[4]);
while (1) {
char *newname_slash, *oldname_slash;
oldname_slash = strrchr(man_filename, '/'); /* If link has no slashes, we just replace man page name.
if (!oldname_slash) * If link has slashes (however many), we go back *once*.
* ".so zzz/ggg/page.3" does NOT go back two levels. */
p = strrchr(man_filename, '/');
if (!p)
goto ordinary_manpage;
*p = '\0';
if (strchr(linkname, '/')) {
p = strrchr(man_filename, '/');
if (!p)
goto ordinary_manpage; goto ordinary_manpage;
*oldname_slash = '\0'; *p = '\0';
newname_slash = strchr(p, '/');
if (!newname_slash)
break;
p = newname_slash + 1;
} }
/* Links do not have .gz extensions, even if manpage
* is compressed */
man_filename = xasprintf("%s/%s" ".bz2", man_filename, linkname); man_filename = xasprintf("%s/%s" ".bz2", man_filename, linkname);
free(line); free(line);
/* Note: we leak "new" man_filename string as well... */ /* Note: we leak "new" man_filename string as well... */
if (show_manpage(pager, man_filename, man, level + 1)) if (show_manpage(pager, man_filename, man, level + 1))
return 1; return 1;
/* else: show the link, it's better than nothing */ /* else: show the link, it's better than nothing */
} }
ordinary_manpage: ordinary_manpage:
/* "2>&1" is added so that nroff errors are shown in pager too. /* "2>&1" is added so that nroff errors are shown in pager too.
* Otherwise it may show just empty screen */ * Otherwise it may show just empty screen */
cmd = xasprintf( cmd = xasprintf(
man ? "%s '%s' | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s" man ? "%s '%s' 2>&1 | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s"
: "%s '%s' | %s", : "%s '%s' 2>&1 | %s",
unpacker, man_filename, pager); unpacker, man_filename, pager);
system(cmd); system(cmd);
free(cmd); free(cmd);