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