man: fixlet for man links
This commit is contained in:
parent
540baf646a
commit
22b0bd85fd
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user