Annotation of coherent/b/bin/man.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * man.c
                      3:  * 9/2/93
                      4:  * Usage: man [ -w ] [ topic ... ]
                      5:  * Quick and dirty man hack.
                      6:  * Read manual index, print manual sections to screen via $PAGER.
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include <string.h>
                     11: 
                     12: #define        BBBIGBUF        64000                   /* index buffer size    */
                     13: #define        DEFPAGER        "exec /bin/scat -1"     /* default $PAGER       */
                     14: #define        MANINX          "/usr/man/man.index"    /* manual index file    */
                     15: #define        NBUF            160                     /* buf[] buffer size    */
                     16: #define        NCMD            512                     /* cmd[] buffer size    */
                     17: #define USAGE          "man article ..."
                     18: #define        VERSION         "1.5"                   /* version id           */
                     19: 
                     20: extern char    *getenv();
                     21: 
                     22: /* Globals. */
                     23: char   buf[NBUF];
                     24: char   cmd[NCMD];
                     25: char   *indexp;
                     26: char   manindex[BBBIGBUF];
                     27: int    wflag;
                     28: 
                     29: /* Forward. */
                     30: void   cmdcat();
                     31: void   fatal();
                     32: char   *lookup();
                     33: void   nonfatal();
                     34: 
                     35: main(argc, argv) int argc; char *argv[];
                     36: {
                     37:        int     i, fd, status, found, nfound;
                     38:        char    *cp;
                     39: 
                     40:        status = 0;
                     41: 
                     42:        /* Look for environmental $PAGER. */
                     43:        if ((cp = getenv("PAGER")) == NULL)
                     44:                cp = DEFPAGER;
                     45:        strcpy(cmd, cp);
                     46: 
                     47:        /* Parse option args. */
                     48:        if (argc > 1 && strcmp(argv[1], "-w") == 0) {
                     49:                ++wflag;
                     50:                --argc;
                     51:                ++argv;
                     52:        }
                     53:        if (argc > 1 && strcmp(argv[1], "-V") == 0) {
                     54:                fprintf(stderr, "man: V%s\n", VERSION);
                     55:                --argc;
                     56:                ++argv;
                     57:        }
                     58: 
                     59:        /* If no args, print manual help information. */
                     60:        if (argc == 1) {
                     61:                fprintf(stderr, "%s\n", USAGE);
                     62:                exit(status);
                     63:        }
                     64: 
                     65:        /* Args given.  First read the index. */
                     66:        if ((fd = open(MANINX, 0)) == -1)
                     67:                fatal("cannot open manual index %s: on-line manual probably not installed", MANINX);
                     68:        else if ((i = read(fd, manindex, BBBIGBUF)) == -1)
                     69:                fatal("cannot read index buffer");
                     70:        else if (i >= BBBIGBUF)
                     71:                fatal("index file too large");
                     72:        close(fd);
                     73: #if    DEBUG
                     74:        nonfatal("%s=%d bytes", MANHELP, i);
                     75: #endif]
                     76: 
                     77:        /* Look up each arg. */
                     78:        nfound = 0;
                     79:        for (i = 1; i < argc; i++) {
                     80: #if    DEBUG
                     81:                nonfatal("argv[%d]=%s", i, argv[i]);
                     82: #endif
                     83:                indexp = manindex;
                     84:                found = 0;
                     85: 
                     86:                /* Look up arg in index.  May find multiple hits. */
                     87:                while ((cp = lookup(argv[i])) != NULL) {
                     88:                        found++;
                     89:                        nfound++;
                     90: #if    DEBUG
                     91:                        nonfatal("index line=%s", cp);
                     92: #endif
                     93:                        if (wflag)
                     94:                                printf("/usr/man/%s\n", cp);
                     95:                        else {
                     96:                                cmdcat(" ");
                     97:                                cmdcat("/usr/man/");
                     98:                                cmdcat(cp);
                     99: #if    DEBUG
                    100:                                nonfatal("command=%s", cmd);
                    101: #endif
                    102:                        }
                    103:                }
                    104:                if (found == 0) {
                    105:                        nonfatal("%s not found in manual", argv[i]);
                    106:                        status = 1;
                    107:                }
                    108:        }
                    109:        if (!wflag && nfound)
                    110:                system(cmd);
                    111:        exit(status);
                    112: }
                    113: 
                    114: /*
                    115:  * Concatenate given string to cmd buffer.
                    116:  * Complain if too long.
                    117:  */
                    118: void
                    119: cmdcat(s) register char *s;
                    120: {
                    121:        register int len;
                    122: 
                    123:        len = strlen(cmd);
                    124:        if (len + strlen(s) + 1 >= NCMD)
                    125: {printf("cmd=%s\ns=%s\nlen=%d\n", cmd, s, len);
                    126:                fatal("command buffer overflow");
                    127: }
                    128:        strcpy(&cmd[len], s);
                    129: }
                    130: 
                    131: /* Cry and die. */
                    132: void
                    133: fatal(s) char *s;
                    134: {
                    135:        fprintf(stderr, "man: %r\n", &s);
                    136:        exit(1);
                    137: }
                    138: 
                    139: /*
                    140:  * Look up string s in helpfile index starting at indexp.
                    141:  * Return name of file on match, else NULL.
                    142:  */
                    143: char *
                    144: lookup(s) char *s;
                    145: {
                    146:        register char *namep, *next, *endptr;
                    147: 
                    148:        while ((next = strchr(indexp, '\n')) != NULL) {
                    149:                if (next - indexp + 1 >= NBUF)
                    150:                        fatal("index buffer overflow");
                    151:                strncpy(buf, indexp, next - indexp);
                    152: 
                    153:                /* crop off description - fwb, 4/13/93 */
                    154:                if ((endptr = strrchr(buf, '\t')) != NULL)
                    155:                        *endptr = '\0';
                    156:                else
                    157:                        buf[next-indexp] = '\0';
                    158: 
                    159:                /* crop off terminal parentheses, if any - fwb, 4/13/93 */
                    160:                if ((endptr = strrchr(buf, '(')) != NULL)
                    161:                        *endptr = '\0';
                    162: 
                    163: #if    DEBUG
                    164:                nonfatal("[%s]", buf);
                    165: #endif
                    166:                /* split the article name from the file name */
                    167:                if ((namep = strchr(buf, '\t')) == NULL)
                    168:                        if ((namep = strrchr(buf, ' ')) == NULL)
                    169:                                continue;
                    170: 
                    171:                indexp = next + 1;              /* bump to next index line */
                    172: 
                    173:                *namep++ = '\0';        /* NUL-terminate index entry */
                    174: 
                    175:                /* crop off terminal parentheses, if any - fwb, 4/13/93 */
                    176:                if ((endptr = strrchr(namep, '(')) != NULL)
                    177:                        *endptr = '\0';
                    178: 
                    179: #if    DEBUG
                    180:                nonfatal("buf=%s namep=%s", buf, namep);
                    181: #endif
                    182:                if (strcmp(namep, s) == 0)
                    183:                        return buf;             /* gotcha */
                    184:        }
                    185:        return NULL;                            /* no match */
                    186: }
                    187: 
                    188: void
                    189: nonfatal(s) char *s;
                    190: {
                    191:        fprintf(stderr, "man: %r\n", &s);
                    192: }
                    193:        
                    194: /* end of man.c */

unix.superglobalmegacorp.com

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