/* Copyright (c) 1979 Regents of the University of California */ #include <retrofit.h> #include <stdio.h> #include <sgtty.h> #include <sys/types.h> #include <sys/stat.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 and cr3" to eliminate piled * up blank lines. */ int nocr3; 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 't': troffit++; break; } argc--, argv++; } if (troffit == 0 && nocr3 == 0 && !isatty(1)) nocr3++; section = 0; do { if (eq(argv[0], "new") || eq(argv[0], "ucb")) { section = 'u'; goto sectin; } else if (eq(argv[0], "public")) { section = 'p'; goto sectin; } else if (eq(argv[0], "sccs")) { section = 's'; 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 = "u16823457ps"; strcpy(work, "manx/"); strcat(work, name); strcat(work, ".x"); last = strlen(work) - 1; if (section == '1') { sp = "u16p"; 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 | /usr/ucb/ssp | /usr/ucb/cr3", cp); system(cmdbuf); } troff(cp) char *cp; { char cmdbuf[BUFSIZ]; sprintf(cmdbuf, "/usr/ucb/troff -t -man /usr/lib/tmac/tmac.vcat %s | /usr/ucb/vsort | /usr/ucb/vpr -t", cp); system(cmdbuf); } any(c, sp) register int c; register char *sp; { register int d; while (d = *sp++) if (c == d) return (1); return (0); }