diff options
Diffstat (limited to 'usr.bin/mg/help.c')
-rw-r--r-- | usr.bin/mg/help.c | 450 |
1 files changed, 249 insertions, 201 deletions
diff --git a/usr.bin/mg/help.c b/usr.bin/mg/help.c index ae9268aa85a..4f70c009d86 100644 --- a/usr.bin/mg/help.c +++ b/usr.bin/mg/help.c @@ -1,4 +1,4 @@ -/* Help functions for MicroGnuEmacs 2 */ +/* Help functions for Mg 2 */ #include "def.h" @@ -8,263 +8,311 @@ #ifndef NO_MACRO #include "macro.h" #endif -extern int rescan(); + +static int showall __P((char *ind, KEYMAP *map)); +static VOID findbind __P((PF, char *, KEYMAP *)); +static VOID bindfound __P((void)); /* - * Read a key from the keyboard, and look it - * up in the keymap. Display the name of the function - * currently bound to the key. + * Read a key from the keyboard, and look it up in the keymap. + * Display the name of the function currently bound to the key. */ -/*ARGSUSED*/ +/* ARGSUSED */ +int desckey(f, n) + int f, n; { - register KEYMAP *curmap; - register PF funct; - register char *pep; - char prompt[80]; - int c; - int m; - int i; + KEYMAP *curmap; + PF funct; + char *pep; + char prompt[80]; + int c; + int m; + int i; #ifndef NO_MACRO - if(inmacro) return TRUE; /* ignore inside keyboard macro */ + if (inmacro) + return TRUE; /* ignore inside keyboard macro */ #endif - (VOID) strcpy(prompt, "Describe key briefly: "); - pep = prompt + strlen(prompt); - key.k_count = 0; - m = curbp->b_nmodes; - curmap = curbp->b_modes[m]->p_map; - for(;;) { - for(;;) { - ewprintf("%s", prompt); - pep[-1] = ' '; - pep = keyname(pep, key.k_chars[key.k_count++] = c = getkey(FALSE)); - if((funct = doscan(curmap, c)) != prefix) break; - *pep++ = '-'; - *pep = '\0'; - curmap = ele->k_prefmap; - } - if(funct != rescan) break; - if(ISUPPER(key.k_chars[key.k_count-1])) { - funct = doscan(curmap, TOLOWER(key.k_chars[key.k_count-1])); - if(funct == prefix) { + (VOID) strcpy(prompt, "Describe key briefly: "); + pep = prompt + strlen(prompt); + key.k_count = 0; + m = curbp->b_nmodes; + curmap = curbp->b_modes[m]->p_map; + for (;;) { + for (;;) { + ewprintf("%s", prompt); + pep[-1] = ' '; + pep = keyname(pep, key.k_chars[key.k_count++] = + c = getkey(FALSE)); + if ((funct = doscan(curmap, c)) != prefix) + break; + *pep++ = '-'; + *pep = '\0'; + curmap = ele->k_prefmap; + } + if (funct != rescan) + break; + if (ISUPPER(key.k_chars[key.k_count - 1])) { + funct = doscan(curmap, + TOLOWER(key.k_chars[key.k_count - 1])); + if (funct == prefix) { + *pep++ = '-'; + *pep = '\0'; + curmap = ele->k_prefmap; + continue; + } + if (funct != rescan) + break; + } +nextmode: + if (--m < 0) + break; + curmap = curbp->b_modes[m]->p_map; + for (i = 0; i < key.k_count; i++) { + funct = doscan(curmap, key.k_chars[i]); + if (funct != prefix) { + if (i == key.k_count - 1 && funct != rescan) + goto found; + funct = rescan; + goto nextmode; + } + curmap = ele->k_prefmap; + } *pep++ = '-'; *pep = '\0'; - curmap = ele->k_prefmap; - continue; - } - if(funct != rescan) break; } -nextmode: - if(--m < 0) break; - curmap = curbp->b_modes[m]->p_map; - for(i=0; i < key.k_count; i++) { - funct = doscan(curmap, key.k_chars[i]); - if(funct != prefix) { - if(i == key.k_count - 1 && funct != rescan) goto found; - funct = rescan; - goto nextmode; - } - curmap = ele->k_prefmap; - } - *pep++ = '-'; - *pep = '\0'; - } found: - if(funct == rescan) ewprintf("%k is not bound to any function"); - else if((pep = function_name(funct)) != NULL) - ewprintf("%k runs the command %s", pep); - else ewprintf("%k is bound to an unnamed function"); - return TRUE; + if (funct == rescan) + ewprintf("%k is not bound to any function"); + else if ((pep = function_name(funct)) != NULL) + ewprintf("%k runs the command %s", pep); + else + ewprintf("%k is bound to an unnamed function"); + return TRUE; } /* - * This function creates a table, listing all - * of the command keys and their current bindings, and stores - * the table in the *help* pop-up buffer. This - * lets MicroGnuEMACS produce it's own wall chart. + * This function creates a table, listing all of the command + * keys and their current bindings, and stores the table in the + * *help* pop-up buffer. This lets Mg produce it's own wall chart. */ -static BUFFER *bp; -static char buf[80]; /* used by showall and findbind */ +static BUFFER *bp; +static char buf[80]; /* used by showall and findbind */ -/*ARGSUSED*/ +/* ARGSUSED */ +int wallchart(f, n) { - int m; - static char locbind[80] = "Local keybindings for mode "; - static int showall(); + int m; + static char locbind[80] = "Local keybindings for mode "; bp = bfind("*help*", TRUE); - if (bclear(bp) != TRUE) return FALSE; /* Clear it out. */ - for(m=curbp->b_nmodes; m > 0; m--) { - (VOID) strcpy(&locbind[27], curbp->b_modes[m]->p_name); - (VOID) strcat(&locbind[27], ":"); - if((addline(bp, locbind) == FALSE) || - (showall(buf, curbp->b_modes[m]->p_map) == FALSE) || - (addline(bp, "") == FALSE)) return FALSE; + if (bclear(bp) != TRUE) + return FALSE; /* Clear it out. */ + for (m = curbp->b_nmodes; m > 0; m--) { + (VOID) strcpy(&locbind[27], curbp->b_modes[m]->p_name); + (VOID) strcat(&locbind[27], ":"); + if ((addline(bp, locbind) == FALSE) || + (showall(buf, curbp->b_modes[m]->p_map) == FALSE) || + (addline(bp, "") == FALSE)) + return FALSE; } - if((addline(bp, "Global bindings:") == FALSE) || - (showall(buf, map_table[0].p_map) == FALSE)) return FALSE; + if ((addline(bp, "Global bindings:") == FALSE) || + (showall(buf, map_table[0].p_map) == FALSE)) + return FALSE; return popbuftop(bp); } -static int showall(ind, map) -char *ind; -KEYMAP *map; +static int +showall(ind, map) + char *ind; + KEYMAP *map; { - register MAP_ELEMENT *ele; - register int i; - PF functp; - char *cp; - char *cp2; - int last; + MAP_ELEMENT *ele; + int i; + PF functp; + char *cp; + char *cp2; + int last; - if(addline(bp, "") == FALSE) return FALSE; + if (addline(bp, "") == FALSE) + return FALSE; last = -1; - for(ele = &map->map_element[0]; ele < &map->map_element[map->map_num] ; ele++) { - if(map->map_default != rescan && ++last < ele->k_base) { - cp = keyname(ind, last); - if(last < ele->k_base - 1) { - (VOID) strcpy(cp, " .. "); - cp = keyname(cp + 4, ele->k_base - 1); + for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; + ele++) { + if (map->map_default != rescan && ++last < ele->k_base) { + cp = keyname(ind, last); + if (last < ele->k_base - 1) { + (VOID) strcpy(cp, " .. "); + cp = keyname(cp + 4, ele->k_base - 1); + } + do { + *cp++ = ' '; + } while (cp < &buf[16]); + (VOID) strcpy(cp, function_name(map->map_default)); + if (addline(bp, buf) == FALSE) + return FALSE; } - do { *cp++ = ' '; } while(cp < &buf[16]); - (VOID) strcpy(cp, function_name(map->map_default)); - if(addline(bp, buf) == FALSE) return FALSE; - } - last = ele->k_num; - for(i=ele->k_base; i <= last; i++) { - functp = ele->k_funcp[i - ele->k_base]; - if(functp != rescan) { - if(functp != prefix) cp2 = function_name(functp); - else cp2 = map_name(ele->k_prefmap); - if(cp2 != NULL) { - cp = keyname(ind, i); - do { *cp++ = ' '; } while(cp < &buf[16]); - (VOID) strcpy(cp, cp2); - if (addline(bp, buf) == FALSE) return FALSE; - } + last = ele->k_num; + for (i = ele->k_base; i <= last; i++) { + functp = ele->k_funcp[i - ele->k_base]; + if (functp != rescan) { + if (functp != prefix) + cp2 = function_name(functp); + else + cp2 = map_name(ele->k_prefmap); + if (cp2 != NULL) { + cp = keyname(ind, i); + do { + *cp++ = ' '; + } while (cp < &buf[16]); + (VOID) strcpy(cp, cp2); + if (addline(bp, buf) == FALSE) + return FALSE; + } + } } - } } - for(ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; ele++) { - if(ele->k_prefmap != NULL) { - for(i = ele->k_base; ele->k_funcp[i - ele->k_base] != prefix; i++) { - if(i >= ele->k_num) /* damaged map */ - return FALSE; + for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; + ele++) { + if (ele->k_prefmap != NULL) { + for (i = ele->k_base; + ele->k_funcp[i - ele->k_base] != prefix; i++) { + if (i >= ele->k_num) /* damaged map */ + return FALSE; + } + cp = keyname(ind, i); + *cp++ = ' '; + if (showall(cp, ele->k_prefmap) == FALSE) + return FALSE; } - cp = keyname(ind, i); - *cp++ = ' '; - if(showall(cp, ele->k_prefmap) == FALSE) return FALSE; - } } return TRUE; } +int help_help(f, n) -int f, n; + int f, n; { - KEYMAP *kp; - PF funct; + KEYMAP *kp; + PF funct; - if((kp = name_map("help")) == NULL) return FALSE; - ewprintf("a b c: "); - do { - funct = doscan(kp, getkey(FALSE)); - } while(funct==NULL || funct==help_help); + if ((kp = name_map("help")) == NULL) + return FALSE; + ewprintf("a b c: "); + do { + funct = doscan(kp, getkey(FALSE)); + } while (funct == NULL || funct == help_help); #ifndef NO_MACRO - if(macrodef && macrocount < MAXMACRO) macro[macrocount-1].m_funct = funct; + if (macrodef && macrocount < MAXMACRO) + macro[macrocount - 1].m_funct = funct; #endif - return (*funct)(f, n); + return (*funct) (f, n); } -static char buf2[128]; -static char *buf2p; +static char buf2[128]; +static char *buf2p; -/*ARGSUSED*/ +/* ARGSUSED */ +int apropos_command(f, n) -int f, n; + int f, n; { - register char *cp1, *cp2; - char string[32]; - FUNCTNAMES *fnp; - BUFFER *bp; - static VOID findbind(); + char *cp1, *cp2; + char string[32]; + FUNCTNAMES *fnp; + BUFFER *bp; - if(eread("apropos: ", string, sizeof(string), EFNEW) == ABORT) return ABORT; + if (eread("apropos: ", string, sizeof(string), EFNEW) == ABORT) + return ABORT; /* FALSE means we got a 0 character string, which is fine */ - bp = bfind("*help*", TRUE); - if(bclear(bp) == FALSE) return FALSE; - for(fnp = &functnames[0]; fnp < &functnames[nfunct]; fnp++) { - for(cp1 = fnp->n_name; *cp1; cp1++) { - cp2 = string; - while(*cp2 && *cp1 == *cp2) - cp1++, cp2++; - if(!*cp2) { - (VOID) strcpy(buf2, fnp->n_name); - buf2p = &buf2[strlen(buf2)]; - findbind(fnp->n_funct, buf, map_table[0].p_map); - if(addline(bp, buf2) == FALSE) return FALSE; - break; - } else cp1 -= cp2 - string; + bp = bfind("*help*", TRUE); + if (bclear(bp) == FALSE) + return FALSE; + for (fnp = &functnames[0]; fnp < &functnames[nfunct]; fnp++) { + for (cp1 = fnp->n_name; *cp1; cp1++) { + cp2 = string; + while (*cp2 && *cp1 == *cp2) + cp1++, cp2++; + if (!*cp2) { + (VOID) strcpy(buf2, fnp->n_name); + buf2p = &buf2[strlen(buf2)]; + findbind(fnp->n_funct, buf, map_table[0].p_map); + if (addline(bp, buf2) == FALSE) + return FALSE; + break; + } else + cp1 -= cp2 - string; + } } - } - return popbuftop(bp); + return popbuftop(bp); } -static VOID findbind(funct, ind, map) -PF funct; -char *ind; -KEYMAP *map; +static VOID +findbind(funct, ind, map) + PF funct; + char *ind; + KEYMAP *map; { - register MAP_ELEMENT *ele; - register int i; - char *cp; - int last; - static VOID bindfound(); + MAP_ELEMENT *ele; + int i; + char *cp; + int last; - last = -1; - for(ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; ele++) { - if(map->map_default == funct && ++last < ele->k_base) { - cp = keyname(ind, last); - if(last < ele->k_base - 1) { - (VOID) strcpy(cp, " .. "); - (VOID) keyname(cp + 4, ele->k_base - 1); - } - bindfound(); - } - last = ele->k_num; - for(i=ele->k_base; i <= last; i++) { - if(funct == ele->k_funcp[i - ele->k_base]) { - if(funct == prefix) { - cp = map_name(ele->k_prefmap); - if(!cp || strncmp(cp, buf2, strlen(cp)) != 0) continue; + last = -1; + for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; + ele++) { + if (map->map_default == funct && ++last < ele->k_base) { + cp = keyname(ind, last); + if (last < ele->k_base - 1) { + (VOID) strcpy(cp, " .. "); + (VOID) keyname(cp + 4, ele->k_base - 1); + } + bindfound(); + } + last = ele->k_num; + for (i = ele->k_base; i <= last; i++) { + if (funct == ele->k_funcp[i - ele->k_base]) { + if (funct == prefix) { + cp = map_name(ele->k_prefmap); + if (!cp || + strncmp(cp, buf2, strlen(cp)) != 0) + continue; + } + (VOID) keyname(ind, i); + bindfound(); + } } - (VOID) keyname(ind, i); - bindfound(); - } } - } - for(ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; ele++) { - if(ele->k_prefmap != NULL) { - for(i = ele->k_base; ele->k_funcp[i - ele->k_base] != prefix; i++) { - if(i >= ele->k_num) return; /* damaged */ - } - cp = keyname(ind, i); - *cp++ = ' '; - findbind(funct, cp, ele->k_prefmap); + for (ele = &map->map_element[0]; ele < &map->map_element[map->map_num]; + ele++) { + if (ele->k_prefmap != NULL) { + for (i = ele->k_base; + ele->k_funcp[i - ele->k_base] != prefix; i++) { + if (i >= ele->k_num) + return; /* damaged */ + } + cp = keyname(ind, i); + *cp++ = ' '; + findbind(funct, cp, ele->k_prefmap); + } } - } } -static VOID bindfound() { - if(buf2p < &buf2[32]) { - do { *buf2p++ = ' '; } while(buf2p < &buf2[32]); - } else { - *buf2p++ = ','; - *buf2p++ = ' '; - } - (VOID) strcpy(buf2p, buf); - buf2p += strlen(buf); +static VOID +bindfound() +{ + + if (buf2p < &buf2[32]) { + do { + *buf2p++ = ' '; + } while (buf2p < &buf2[32]); + } else { + *buf2p++ = ','; + *buf2p++ = ' '; + } + (VOID) strcpy(buf2p, buf); + buf2p += strlen(buf); } #endif |