BSD 3 development
[unix-history] / usr / src / cmd / man / man.c
#include <stdio.h>
#include <sgtty.h>
#include <sys/types.h>
#include <stat.h>
#include <local/uparm.h>
/*
* man - intelligent man command
*
* Author: Bill Joy UCB August 25, 1977
*
* Man is an intelligent man command which obviates the need to know
* section numbers in the manual. Also if the standard output is a teletype and
* the option - is not given we pipe through "ssp, ul, and more" to eliminate piled
* up blank lines.
*/
int nocr3;
int cflag;
char *strcpy();
char *strcat();
int section;
int subsec;
int troffit;
#define eq(a,b) (strcmp(a,b) == 0)
main(argc, argv)
int argc;
char *argv[];
{
if (argc <= 1) {
fprintf(stderr, "Usage: man [ section ] name ...\n");
exit(1);
}
if (chdir("/usr/man") < 0) {
fprintf(stderr, "Can't chdir to /usr/man.\n");
exit(1);
}
argc--, argv++;
while (argc > 0 && argv[0][0] == '-') {
switch(argv[0][1]) {
case 0:
nocr3++;
break;
case 'c':
cflag++;
break;
case 't':
troffit++;
break;
}
argc--, argv++;
}
if (troffit == 0 && nocr3 == 0 && !isatty(1))
nocr3++;
section = 0;
do {
if (eq(argv[0], "ucb")) {
section = 'u';
goto sectin;
} else if (eq(argv[0], "local")) {
section = 'l';
goto sectin;
} else if (eq(argv[0], "new")) {
section = 'n';
goto sectin;
} else if (eq(argv[0], "public")) {
section = 'p';
goto sectin;
} else if (eq(argv[0], "sccs")) {
section = 's';
goto sectin;
} else if (eq(argv[0], "junk")) {
section = 'j';
goto sectin;
} else if (argv[0][0] >= '0' && argv[0][0] <= '9' && (argv[0][1] == 0 || argv[0][2] == 0)) {
section = argv[0][0];
subsec = argv[0][1];
sectin:
argc--, argv++;
if (argc == 0) {
fprintf(stderr, "But what do you want from section %s?\n", argv[-1]);
exit(1);
}
continue;
}
manual(section, argv[0]);
argc--, argv++;
} while (argc > 0);
exit(0);
}
manual(sec, name)
char sec;
char *name;
{
char section = sec;
char work[100];
int ss;
struct stat stbuf;
int last;
char *sp = "lun16823457psj";
strcpy(work, "manx/");
strcat(work, name);
strcat(work, ".x");
last = strlen(work) - 1;
if (section == '1') {
sp = "lun16pj";
section = 0;
}
if (section == 0) {
ss = 0;
for (section = *sp++; section; section = *sp++) {
work[3] = section;
work[last] = section;
work[last+1] = 0;
if (stat(work, &stbuf) >= 0)
break;
if (work[last] == '1' || work[last] == '3') {
char *cp;
search:
cp = work[last] == '1' ? "mcg" : "xmsf";
while (*cp) {
work[last+1] = *cp++;
if (stat(work, &stbuf) >= 0) {
ss = work[last+1];
goto found;
}
}
if (ss = 0)
work[last+1] = 0;
}
}
if (section == 0) {
if (sec == 0)
printf("No manual entry for %s.\n", name);
else
printf("No entry for %s in section %c of the manual.\n", name, sec);
return;
}
} else {
work[3] = section;
work[last] = section;
work[last+1] = subsec;
if (stat(work, &stbuf) < 0) {
if ((section == '1' || section == '3') && subsec == 0) {
sp = "\0";
goto search;
}
printf("No entry for %s in section %c", name, section);
if (subsec)
putchar(subsec);
printf(" of the manual.\n");
return;
}
}
found:
if (troffit)
troff(work);
else
nroff(work);
}
nroff(cp)
char *cp;
{
char cmdbuf[BUFSIZ];
if (nocr3)
sprintf(cmdbuf, "nroff -h -man %s", cp);
else
sprintf(cmdbuf, "nroff -h -man %s | %s | %s | %s",
cp, binpath(ssp), binpath(ul),
cflag ? binpath(cr3) : binpath(more));
system(cmdbuf);
}
troff(cp)
char *cp;
{
char cmdbuf[BUFSIZ];
sprintf(cmdbuf, "%s -t -man %s %s | %s | %s -t", "/usr/bin/troff",
libpath(tmac/tmac.vcat), cp, libpath(vsort), binpath(vpr));
system(cmdbuf);
}
any(c, sp)
register int c;
register char *sp;
{
register int d;
while (d = *sp++)
if (c == d)
return (1);
return (0);
}