Annotation of coherent/d/usr/bin/emacs/help.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Command to give help on various command's usages.
        !             3:  * Also, this command allows user-specific information
        !             4:  * to be kept.
        !             5:  */
        !             6: 
        !             7: #include <stdio.h>
        !             8: #include <sys/stat.h>
        !             9: 
        !            10: #define        NLINE   512             /* Longest helpfile line */
        !            11: #define HELPSEP '@'
        !            12: 
        !            13: uchar  doc[50];
        !            14: uchar  buf[BUFSIZ];
        !            15: uchar  *list[2];
        !            16: 
        !            17: uchar  helpline[NLINE];
        !            18: uchar  helpfile[] = "/etc/helpfile";
        !            19: FILE   *shf;                   /* System helpfile */
        !            20: FILE   *uhf;                   /* User helpfile */
        !            21: 
        !            22: /*
        !            23:  * Structure to speed lookup time.
        !            24:  */
        !            25: struct look    {
        !            26:        long    l_seek;
        !            27:        uchar   *l_name;
        !            28: };
        !            29: 
        !            30: struct look    *lread();
        !            31: 
        !            32: uchar  helpuse[] = "\
        !            33: The 'help' command prints a brief description of the usage of a command.\n\
        !            34: For example, to get information about the 'who' command, type:\n\
        !            35:        help who\n\
        !            36: The 'man' command provides more detailed descriptions of commands.\n\
        !            37: \n\
        !            38: ";
        !            39: 
        !            40: uchar  noinf[] = "No information on %s\n";
        !            41: uchar  *getenv();
        !            42: 
        !            43: main(argc, argv)
        !            44: uuchar *argv[];
        !            45: {
        !            46:        register uchar **ap;
        !            47:        register int estat = 0;
        !            48:        uchar *fn;
        !            49: 
        !            50:        shf = fopen(helpfile, "r");
        !            51:        if ((fn = getenv("HELP")) != NULL)
        !            52:                uhf = fopen(fn, "r");
        !            53:        setbuf(stdout, buf);
        !            54:        ap = argv+1;
        !            55:        if (argc < 2) {
        !            56:                fprintf(stderr, helpuse);
        !            57:                ap = list;
        !            58:                if ((*ap = getenv("LASTERROR")) == NULL)
        !            59:                        exit(0);
        !            60:        }
        !            61:        while (*ap != NULL) {
        !            62:                if (help(*ap)) {
        !            63:                        printf(noinf, *ap);
        !            64:                        estat |= 1;
        !            65:                }
        !            66:                if (*++ap != NULL)
        !            67:                        putchar('\n');
        !            68:                fflush(stdout);
        !            69:        }
        !            70:        exit(estat);
        !            71: }
        !            72: 
        !            73: /*
        !            74:  * This routine looks for information
        !            75:  * in the on-line documentation for
        !            76:  * the specified command.
        !            77:  * The information is bracketed by `.HS'
        !            78:  * and `.HE'.
        !            79:  * If nothing is found, search the other two places.
        !            80:  */
        !            81: help(command)
        !            82: uchar *command;
        !            83: {
        !            84:        register int bad = 1;
        !            85:        register FILE *hf;
        !            86: 
        !            87:        sprintf(doc, "/usr/man/cmd/%s", command);
        !            88:        if ((hf = fopen(doc, "r")) == NULL) {
        !            89:                strcat(doc, "m");
        !            90:                if ((hf = fopen(doc, "r")) == NULL)
        !            91:                        goto other;
        !            92:        }
        !            93:        for (;;) {
        !            94:                if (fgets(helpline, NLINE, hf) == NULL)
        !            95:                        break;
        !            96:                if (strcmp(helpline, ".HS\n") == 0) {
        !            97:                        bad = 0;
        !            98:                        break;
        !            99:                }
        !           100:        }
        !           101:        if (!bad)
        !           102:                while (fgets(helpline, NLINE, hf) != NULL
        !           103:                    && strcmp(helpline, ".HE\n") != 0)
        !           104:                        fputs(helpline, stdout);
        !           105:        fclose(hf);
        !           106: other:
        !           107:        if (bad)
        !           108:                if (bad = lookup(command, shf, "/etc/helpindex"))
        !           109:                        bad = lookup(command, uhf, NULL);
        !           110:        return (bad);
        !           111: }
        !           112: 
        !           113: /*
        !           114:  * Lookup a command in the given file.
        !           115:  * The format is to look for # lines.
        !           116:  * The index-file is provided to speed up
        !           117:  * the lookup in situations where there is a very
        !           118:  * large system help file.
        !           119:  */
        !           120: lookup(com, fp, ind)
        !           121: register uchar *com;
        !           122: FILE *fp;
        !           123: uchar *ind;
        !           124: {
        !           125:        if (fp == NULL)
        !           126:                return (1);
        !           127:        if (fastlook(com, fp, ind))
        !           128:                return (1);
        !           129:        while (fgets(helpline, NLINE, fp) != NULL)
        !           130:                if (helpline[0] == HELPSEP) {
        !           131:                        helpline[strlen(helpline)-1] = '\0';
        !           132:                        if (strcmp(com, helpline+1) == 0) {
        !           133:                                while (fgets(helpline, NLINE, fp) != NULL) {
        !           134:                                        if (helpline[0] == HELPSEP)
        !           135:                                                break;
        !           136:                                        fputs(helpline, stdout);
        !           137:                                }
        !           138:                                return (0);
        !           139:                        }
        !           140:                }
        !           141:        return (1);
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * Possibly seek the helpfile to the right place
        !           146:  * based on an index file.
        !           147:  * Return non-zero only when it is impossible to
        !           148:  * find it.
        !           149:  * If the index file is out of date, re-build it.
        !           150:  */
        !           151: fastlook(com, fp, ind)
        !           152: uchar *com;
        !           153: FILE *fp;
        !           154: uchar *ind;
        !           155: {
        !           156:        register uchar *cp, *ep;
        !           157:        register struct look *lp;
        !           158:        struct look look;
        !           159:        FILE *ifp;
        !           160:        long seek = 0;
        !           161:        int found = 0;
        !           162:        static struct stat sb;
        !           163:        long htime;
        !           164: 
        !           165:        fstat(fileno(fp), &sb);
        !           166:        htime = sb.st_mtime;
        !           167:        if (stat(ind, &sb) < 0)
        !           168:                goto rebuild;
        !           169:        if (htime < sb.st_mtime) {
        !           170:                if ((ifp = fopen(ind, "r")) == NULL)
        !           171:                        goto rebuild;
        !           172:                while ((lp = lread(ifp)) != NULL)
        !           173:                        if (strcmp(com, lp->l_name) == 0) {
        !           174:                                seek = lp->l_seek;
        !           175:                                found++;
        !           176:                                break;
        !           177:                        }
        !           178:                fclose(ifp);
        !           179:                if (found) {
        !           180:                        fseek(fp, seek, 0);
        !           181:                        return (0);
        !           182:                }
        !           183:                return (1);
        !           184:        }
        !           185: 
        !           186: rebuild:
        !           187:        /*
        !           188:         * Re-build the index file.
        !           189:         */
        !           190:        if ((ifp = fopen(ind, "w")) == NULL)
        !           191:                return (0);
        !           192:        for (;;) {
        !           193:                look.l_seek = ftell(fp);
        !           194:                if (fgets(helpline, NLINE, fp) == NULL)
        !           195:                        break;
        !           196:                cp = helpline;
        !           197:                if (*cp++ != HELPSEP)
        !           198:                        continue;
        !           199:                while (*cp==' ' && *cp=='\t')
        !           200:                        cp++;
        !           201:                ep = cp;
        !           202:                while (*ep!='\n' && *ep!='\0' && *ep!=' ' && *ep!='\t')
        !           203:                        ep++;
        !           204:                *ep = '\0';
        !           205:                look.l_name = cp;
        !           206:                if (strcmp(com, cp) == 0) {
        !           207:                        seek = look.l_seek;
        !           208:                        found++;
        !           209:                }
        !           210:                lwrite(&look, ifp);
        !           211:        }
        !           212:        fclose(ifp);
        !           213:        if (found) {
        !           214:                fseek(fp, seek, 0);
        !           215:                return (0);
        !           216:        }
        !           217:        return (1);
        !           218: }
        !           219: 
        !           220: /*
        !           221:  * Read in a look structure.  Return NULL
        !           222:  * on end of file or error.
        !           223:  */
        !           224: struct look *
        !           225: lread(fp)
        !           226: register FILE *fp;
        !           227: {
        !           228:        register uchar *cp;
        !           229:        register int c;
        !           230:        static struct look look;
        !           231:        static uchar name[50];
        !           232: 
        !           233:        look.l_name = name;
        !           234:        if (fread(&look.l_seek, sizeof look.l_seek, 1, fp) != 1)
        !           235:                return (NULL);
        !           236:        for (cp = name; cp<&name[49]; cp++) {
        !           237:                if ((c = getc(fp)) == EOF)
        !           238:                        return (NULL);
        !           239:                *cp = c;
        !           240:                if (c == '\0')
        !           241:                        break;
        !           242:        }
        !           243:        return (&look);
        !           244: }
        !           245: 
        !           246: /*
        !           247:  * Write out a structure to the
        !           248:  * given file pointer.
        !           249:  */
        !           250: lwrite(lp, fp)
        !           251: register struct look *lp;
        !           252: FILE *fp;
        !           253: {
        !           254:        register uchar *cp;
        !           255: 
        !           256:        fwrite(&lp->l_seek, 1, sizeof lp->l_seek, fp);
        !           257:        cp = lp->l_name; do {
        !           258:                putc(*cp, fp);
        !           259:        } while (*cp++ != '\0');
        !           260: }

unix.superglobalmegacorp.com

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