[BACK]Return to help.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

Annotation of src/usr.bin/mg/help.c, Revision 1.2

1.2     ! millert     1: /* Help functions for Mg 2 */
1.1       deraadt     2:
                      3: #include "def.h"
                      4:
                      5: #ifndef NO_HELP
                      6: #include "kbd.h"
                      7: #include "key.h"
                      8: #ifndef NO_MACRO
                      9: #include "macro.h"
                     10: #endif
1.2     ! millert    11:
        !            12: static int showall     __P((char *ind, KEYMAP *map));
        !            13: static VOID findbind   __P((PF, char *, KEYMAP *));
        !            14: static VOID bindfound  __P((void));
1.1       deraadt    15:
                     16: /*
1.2     ! millert    17:  * Read a key from the keyboard, and look it up in the keymap.
        !            18:  * Display the name of the function currently bound to the key.
1.1       deraadt    19:  */
1.2     ! millert    20: /* ARGSUSED */
        !            21: int
1.1       deraadt    22: desckey(f, n)
1.2     ! millert    23:        int     f, n;
1.1       deraadt    24: {
1.2     ! millert    25:        KEYMAP *curmap;
        !            26:        PF      funct;
        !            27:        char   *pep;
        !            28:        char    prompt[80];
        !            29:        int     c;
        !            30:        int     m;
        !            31:        int     i;
1.1       deraadt    32:
                     33: #ifndef NO_MACRO
1.2     ! millert    34:        if (inmacro)
        !            35:                return TRUE;    /* ignore inside keyboard macro */
1.1       deraadt    36: #endif
1.2     ! millert    37:        (VOID) strcpy(prompt, "Describe key briefly: ");
        !            38:        pep = prompt + strlen(prompt);
        !            39:        key.k_count = 0;
        !            40:        m = curbp->b_nmodes;
        !            41:        curmap = curbp->b_modes[m]->p_map;
        !            42:        for (;;) {
        !            43:                for (;;) {
        !            44:                        ewprintf("%s", prompt);
        !            45:                        pep[-1] = ' ';
        !            46:                        pep = keyname(pep, key.k_chars[key.k_count++] =
        !            47:                            c = getkey(FALSE));
        !            48:                        if ((funct = doscan(curmap, c)) != prefix)
        !            49:                                break;
        !            50:                        *pep++ = '-';
        !            51:                        *pep = '\0';
        !            52:                        curmap = ele->k_prefmap;
        !            53:                }
        !            54:                if (funct != rescan)
        !            55:                        break;
        !            56:                if (ISUPPER(key.k_chars[key.k_count - 1])) {
        !            57:                        funct = doscan(curmap,
        !            58:                            TOLOWER(key.k_chars[key.k_count - 1]));
        !            59:                        if (funct == prefix) {
        !            60:                                *pep++ = '-';
        !            61:                                *pep = '\0';
        !            62:                                curmap = ele->k_prefmap;
        !            63:                                continue;
        !            64:                        }
        !            65:                        if (funct != rescan)
        !            66:                                break;
        !            67:                }
        !            68: nextmode:
        !            69:                if (--m < 0)
        !            70:                        break;
        !            71:                curmap = curbp->b_modes[m]->p_map;
        !            72:                for (i = 0; i < key.k_count; i++) {
        !            73:                        funct = doscan(curmap, key.k_chars[i]);
        !            74:                        if (funct != prefix) {
        !            75:                                if (i == key.k_count - 1 && funct != rescan)
        !            76:                                        goto found;
        !            77:                                funct = rescan;
        !            78:                                goto nextmode;
        !            79:                        }
        !            80:                        curmap = ele->k_prefmap;
        !            81:                }
1.1       deraadt    82:                *pep++ = '-';
                     83:                *pep = '\0';
                     84:        }
                     85: found:
1.2     ! millert    86:        if (funct == rescan)
        !            87:                ewprintf("%k is not bound to any function");
        !            88:        else if ((pep = function_name(funct)) != NULL)
        !            89:                ewprintf("%k runs the command %s", pep);
        !            90:        else
        !            91:                ewprintf("%k is bound to an unnamed function");
        !            92:        return TRUE;
1.1       deraadt    93: }
                     94:
                     95: /*
1.2     ! millert    96:  * This function creates a table, listing all of the command
        !            97:  * keys and their current bindings, and stores the table in the
        !            98:  * *help* pop-up buffer.  This lets Mg produce it's own wall chart.
1.1       deraadt    99:  */
1.2     ! millert   100: static BUFFER  *bp;
        !           101: static char     buf[80];       /* used by showall and findbind */
1.1       deraadt   102:
1.2     ! millert   103: /* ARGSUSED */
        !           104: int
1.1       deraadt   105: wallchart(f, n)
                    106: {
1.2     ! millert   107:        int             m;
        !           108:        static char     locbind[80] = "Local keybindings for mode ";
1.1       deraadt   109:
                    110:        bp = bfind("*help*", TRUE);
1.2     ! millert   111:        if (bclear(bp) != TRUE)
        !           112:                return FALSE;   /* Clear it out.         */
        !           113:        for (m = curbp->b_nmodes; m > 0; m--) {
        !           114:                (VOID) strcpy(&locbind[27], curbp->b_modes[m]->p_name);
        !           115:                (VOID) strcat(&locbind[27], ":");
        !           116:                if ((addline(bp, locbind) == FALSE) ||
        !           117:                    (showall(buf, curbp->b_modes[m]->p_map) == FALSE) ||
        !           118:                    (addline(bp, "") == FALSE))
        !           119:                        return FALSE;
1.1       deraadt   120:        }
1.2     ! millert   121:        if ((addline(bp, "Global bindings:") == FALSE) ||
        !           122:            (showall(buf, map_table[0].p_map) == FALSE))
        !           123:                return FALSE;
1.1       deraadt   124:        return popbuftop(bp);
                    125: }
                    126:
1.2     ! millert   127: static int
        !           128: showall(ind, map)
        !           129:        char           *ind;
        !           130:        KEYMAP         *map;
1.1       deraadt   131: {
1.2     ! millert   132:        MAP_ELEMENT    *ele;
        !           133:        int             i;
        !           134:        PF              functp;
        !           135:        char           *cp;
        !           136:        char           *cp2;
        !           137:        int             last;
1.1       deraadt   138:
1.2     ! millert   139:        if (addline(bp, "") == FALSE)
        !           140:                return FALSE;
1.1       deraadt   141:        last = -1;
1.2     ! millert   142:        for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num];
        !           143:            ele++) {
        !           144:                if (map->map_default != rescan && ++last < ele->k_base) {
        !           145:                        cp = keyname(ind, last);
        !           146:                        if (last < ele->k_base - 1) {
        !           147:                                (VOID) strcpy(cp, " .. ");
        !           148:                                cp = keyname(cp + 4, ele->k_base - 1);
        !           149:                        }
        !           150:                        do {
        !           151:                                *cp++ = ' ';
        !           152:                        } while (cp < &buf[16]);
        !           153:                        (VOID) strcpy(cp, function_name(map->map_default));
        !           154:                        if (addline(bp, buf) == FALSE)
        !           155:                                return FALSE;
1.1       deraadt   156:                }
1.2     ! millert   157:                last = ele->k_num;
        !           158:                for (i = ele->k_base; i <= last; i++) {
        !           159:                        functp = ele->k_funcp[i - ele->k_base];
        !           160:                        if (functp != rescan) {
        !           161:                                if (functp != prefix)
        !           162:                                        cp2 = function_name(functp);
        !           163:                                else
        !           164:                                        cp2 = map_name(ele->k_prefmap);
        !           165:                                if (cp2 != NULL) {
        !           166:                                        cp = keyname(ind, i);
        !           167:                                        do {
        !           168:                                                *cp++ = ' ';
        !           169:                                        } while (cp < &buf[16]);
        !           170:                                        (VOID) strcpy(cp, cp2);
        !           171:                                        if (addline(bp, buf) == FALSE)
        !           172:                                                return FALSE;
        !           173:                                }
        !           174:                        }
1.1       deraadt   175:                }
                    176:        }
1.2     ! millert   177:        for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num];
        !           178:            ele++) {
        !           179:                if (ele->k_prefmap != NULL) {
        !           180:                        for (i = ele->k_base;
        !           181:                            ele->k_funcp[i - ele->k_base] != prefix; i++) {
        !           182:                                if (i >= ele->k_num)    /* damaged map */
        !           183:                                        return FALSE;
        !           184:                        }
        !           185:                        cp = keyname(ind, i);
        !           186:                        *cp++ = ' ';
        !           187:                        if (showall(cp, ele->k_prefmap) == FALSE)
        !           188:                                return FALSE;
1.1       deraadt   189:                }
                    190:        }
                    191:        return TRUE;
                    192: }
                    193:
1.2     ! millert   194: int
1.1       deraadt   195: help_help(f, n)
1.2     ! millert   196:        int             f, n;
1.1       deraadt   197: {
1.2     ! millert   198:        KEYMAP         *kp;
        !           199:        PF              funct;
1.1       deraadt   200:
1.2     ! millert   201:        if ((kp = name_map("help")) == NULL)
        !           202:                return FALSE;
        !           203:        ewprintf("a b c: ");
        !           204:        do {
        !           205:                funct = doscan(kp, getkey(FALSE));
        !           206:        } while (funct == NULL || funct == help_help);
1.1       deraadt   207: #ifndef NO_MACRO
1.2     ! millert   208:        if (macrodef && macrocount < MAXMACRO)
        !           209:                macro[macrocount - 1].m_funct = funct;
1.1       deraadt   210: #endif
1.2     ! millert   211:        return (*funct) (f, n);
1.1       deraadt   212: }
                    213:
1.2     ! millert   214: static char     buf2[128];
        !           215: static char    *buf2p;
1.1       deraadt   216:
1.2     ! millert   217: /* ARGSUSED */
        !           218: int
1.1       deraadt   219: apropos_command(f, n)
1.2     ! millert   220:        int             f, n;
1.1       deraadt   221: {
1.2     ! millert   222:        char           *cp1, *cp2;
        !           223:        char            string[32];
        !           224:        FUNCTNAMES     *fnp;
        !           225:        BUFFER         *bp;
1.1       deraadt   226:
1.2     ! millert   227:        if (eread("apropos: ", string, sizeof(string), EFNEW) == ABORT)
        !           228:                return ABORT;
1.1       deraadt   229:        /* FALSE means we got a 0 character string, which is fine */
1.2     ! millert   230:        bp = bfind("*help*", TRUE);
        !           231:        if (bclear(bp) == FALSE)
        !           232:                return FALSE;
        !           233:        for (fnp = &functnames[0]; fnp < &functnames[nfunct]; fnp++) {
        !           234:                for (cp1 = fnp->n_name; *cp1; cp1++) {
        !           235:                        cp2 = string;
        !           236:                        while (*cp2 && *cp1 == *cp2)
        !           237:                                cp1++, cp2++;
        !           238:                        if (!*cp2) {
        !           239:                                (VOID) strcpy(buf2, fnp->n_name);
        !           240:                                buf2p = &buf2[strlen(buf2)];
        !           241:                                findbind(fnp->n_funct, buf, map_table[0].p_map);
        !           242:                                if (addline(bp, buf2) == FALSE)
        !           243:                                        return FALSE;
        !           244:                                break;
        !           245:                        } else
        !           246:                                cp1 -= cp2 - string;
        !           247:                }
1.1       deraadt   248:        }
1.2     ! millert   249:        return popbuftop(bp);
1.1       deraadt   250: }
                    251:
1.2     ! millert   252: static VOID
        !           253: findbind(funct, ind, map)
        !           254:        PF              funct;
        !           255:        char           *ind;
        !           256:        KEYMAP         *map;
1.1       deraadt   257: {
1.2     ! millert   258:        MAP_ELEMENT    *ele;
        !           259:        int             i;
        !           260:        char           *cp;
        !           261:        int             last;
        !           262:
        !           263:        last = -1;
        !           264:        for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num];
        !           265:            ele++) {
        !           266:                if (map->map_default == funct && ++last < ele->k_base) {
        !           267:                        cp = keyname(ind, last);
        !           268:                        if (last < ele->k_base - 1) {
        !           269:                                (VOID) strcpy(cp, " .. ");
        !           270:                                (VOID) keyname(cp + 4, ele->k_base - 1);
        !           271:                        }
        !           272:                        bindfound();
        !           273:                }
        !           274:                last = ele->k_num;
        !           275:                for (i = ele->k_base; i <= last; i++) {
        !           276:                        if (funct == ele->k_funcp[i - ele->k_base]) {
        !           277:                                if (funct == prefix) {
        !           278:                                        cp = map_name(ele->k_prefmap);
        !           279:                                        if (!cp ||
        !           280:                                            strncmp(cp, buf2, strlen(cp)) != 0)
        !           281:                                                continue;
        !           282:                                }
        !           283:                                (VOID) keyname(ind, i);
        !           284:                                bindfound();
        !           285:                        }
        !           286:                }
1.1       deraadt   287:        }
1.2     ! millert   288:        for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num];
        !           289:            ele++) {
        !           290:                if (ele->k_prefmap != NULL) {
        !           291:                        for (i = ele->k_base;
        !           292:                            ele->k_funcp[i - ele->k_base] != prefix; i++) {
        !           293:                                if (i >= ele->k_num)
        !           294:                                        return; /* damaged */
        !           295:                        }
        !           296:                        cp = keyname(ind, i);
        !           297:                        *cp++ = ' ';
        !           298:                        findbind(funct, cp, ele->k_prefmap);
1.1       deraadt   299:                }
                    300:        }
                    301: }
                    302:
1.2     ! millert   303: static VOID
        !           304: bindfound()
        !           305: {
        !           306:
        !           307:        if (buf2p < &buf2[32]) {
        !           308:                do {
        !           309:                        *buf2p++ = ' ';
        !           310:                } while (buf2p < &buf2[32]);
        !           311:        } else {
        !           312:                *buf2p++ = ',';
        !           313:                *buf2p++ = ' ';
        !           314:        }
        !           315:        (VOID) strcpy(buf2p, buf);
        !           316:        buf2p += strlen(buf);
1.1       deraadt   317: }
                    318: #endif