Annotation of 3BSD/cmd/man/man.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <sgtty.h>
                      3: #include <sys/types.h>
                      4: #include <stat.h>
                      5: #include <local/uparm.h>
                      6: /*
                      7:  * man - intelligent man command
                      8:  *
                      9:  * Author: Bill Joy UCB August 25, 1977
                     10:  *
                     11:  * Man is an intelligent man command which obviates the need to know
                     12:  * section numbers in the manual.  Also if the standard output is a teletype and
                     13:  * the option - is not given we pipe through "ssp, ul, and more" to eliminate piled
                     14:  * up blank lines.
                     15:  */
                     16: int    nocr3;
                     17: int    cflag;
                     18: char   *strcpy();
                     19: char   *strcat();
                     20: int    section;
                     21: int    subsec;
                     22: int    troffit;
                     23: 
                     24: #define        eq(a,b) (strcmp(a,b) == 0)
                     25: 
                     26: main(argc, argv)
                     27:        int argc;
                     28:        char *argv[];
                     29: {
                     30: 
                     31:        if (argc <= 1) {
                     32:                fprintf(stderr, "Usage: man [ section ] name ...\n");
                     33:                exit(1);
                     34:        }
                     35:        if (chdir("/usr/man") < 0) {
                     36:                fprintf(stderr, "Can't chdir to /usr/man.\n");
                     37:                exit(1);
                     38:        }
                     39:        argc--, argv++;
                     40:        while (argc > 0 && argv[0][0] == '-') {
                     41:                switch(argv[0][1]) {
                     42: 
                     43:                case 0:
                     44:                        nocr3++;
                     45:                        break;
                     46: 
                     47:                case 'c':
                     48:                        cflag++;
                     49:                        break;
                     50: 
                     51:                case 't':
                     52:                        troffit++;
                     53:                        break;
                     54:                }
                     55:                argc--, argv++;
                     56:        }
                     57:        if (troffit == 0 && nocr3 == 0 && !isatty(1))
                     58:                nocr3++;
                     59:        section = 0;
                     60:        do {
                     61:                if (eq(argv[0], "ucb")) {
                     62:                        section = 'u';
                     63:                        goto sectin;
                     64:                } else if (eq(argv[0], "local")) {
                     65:                        section = 'l';
                     66:                        goto sectin;
                     67:                } else if (eq(argv[0], "new")) {
                     68:                        section = 'n';
                     69:                        goto sectin;
                     70:                } else if (eq(argv[0], "public")) {
                     71:                        section = 'p';
                     72:                        goto sectin;
                     73:                } else if (eq(argv[0], "sccs")) {
                     74:                        section = 's';
                     75:                        goto sectin;
                     76:                } else if (eq(argv[0], "junk")) {
                     77:                        section = 'j';
                     78:                        goto sectin;
                     79:                } else if (argv[0][0] >= '0' && argv[0][0] <= '9' && (argv[0][1] == 0 || argv[0][2] == 0)) {
                     80:                        section = argv[0][0];
                     81:                        subsec = argv[0][1];
                     82: sectin:
                     83:                        argc--, argv++;
                     84:                        if (argc == 0) {
                     85:                                fprintf(stderr, "But what do you want from section %s?\n", argv[-1]);
                     86:                                exit(1);
                     87:                        }
                     88:                        continue;
                     89:                }
                     90:                manual(section, argv[0]);
                     91:                argc--, argv++;
                     92:        } while (argc > 0);
                     93:        exit(0);
                     94: }
                     95: 
                     96: manual(sec, name)
                     97:        char sec;
                     98:        char *name;
                     99: {
                    100:        char section = sec;
                    101:        char work[100];
                    102:        int ss;
                    103:        struct stat stbuf;
                    104:        int last;
                    105:        char *sp = "lun16823457psj";
                    106: 
                    107:        strcpy(work, "manx/");
                    108:        strcat(work, name);
                    109:        strcat(work, ".x");
                    110:        last = strlen(work) - 1;
                    111:        if (section == '1') {
                    112:                sp = "lun16pj";
                    113:                section = 0;
                    114:        }
                    115:        if (section == 0) {
                    116:                ss = 0;
                    117:                for (section = *sp++; section; section = *sp++) {
                    118:                        work[3] = section;
                    119:                        work[last] = section;
                    120:                        work[last+1] = 0;
                    121:                        if (stat(work, &stbuf) >= 0)
                    122:                                break;
                    123:                        if (work[last] == '1' || work[last] == '3') {
                    124:                                char *cp;
                    125: search:
                    126:                                cp = work[last] == '1' ? "mcg" : "xmsf";
                    127:                                while (*cp) {
                    128:                                        work[last+1] = *cp++;
                    129:                                        if (stat(work, &stbuf) >= 0) {
                    130:                                                ss = work[last+1];
                    131:                                                goto found;
                    132:                                        }
                    133:                                }
                    134:                                if (ss = 0)
                    135:                                        work[last+1] = 0;
                    136:                        }
                    137:                }
                    138:                if (section == 0) {
                    139:                        if (sec == 0)
                    140:                                printf("No manual entry for %s.\n", name);
                    141:                        else
                    142:                                printf("No entry for %s in section %c of the manual.\n", name, sec);
                    143:                        return;
                    144:                }
                    145:        } else {
                    146:                work[3] = section;
                    147:                work[last] = section;
                    148:                work[last+1] = subsec;
                    149:                if (stat(work, &stbuf) < 0) {
                    150:                        if ((section == '1' || section == '3') && subsec == 0) {
                    151:                                sp = "\0";
                    152:                                goto search;
                    153:                        }
                    154:                        printf("No entry for %s in section %c", name, section);
                    155:                        if (subsec)
                    156:                                putchar(subsec);
                    157:                        printf(" of the manual.\n");
                    158:                        return;
                    159:                }
                    160:        }
                    161: found:
                    162:        if (troffit)
                    163:                troff(work);
                    164:        else
                    165:                nroff(work);
                    166: }
                    167: 
                    168: nroff(cp)
                    169:        char *cp;
                    170: {
                    171:        char cmdbuf[BUFSIZ];
                    172: 
                    173:        if (nocr3)
                    174:                sprintf(cmdbuf, "nroff -h -man %s", cp);
                    175:        else
                    176:                sprintf(cmdbuf, "nroff -h -man %s | %s | %s | %s",
                    177:                        cp, binpath(ssp), binpath(ul),
                    178:                        cflag ? binpath(cr3) : binpath(more));
                    179:        system(cmdbuf);
                    180: }
                    181: 
                    182: troff(cp)
                    183:        char *cp;
                    184: {
                    185:        char cmdbuf[BUFSIZ];
                    186: 
                    187:        sprintf(cmdbuf, "%s -t -man %s %s | %s | %s -t", "/usr/bin/troff",
                    188:                libpath(tmac/tmac.vcat), cp, libpath(vsort), binpath(vpr));
                    189:        system(cmdbuf);
                    190: }
                    191: 
                    192: any(c, sp)
                    193:        register int c;
                    194:        register char *sp;
                    195: {
                    196:        register int d;
                    197: 
                    198:        while (d = *sp++)
                    199:                if (c == d)
                    200:                        return (1);
                    201:        return (0);
                    202: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.