Annotation of src/usr.bin/mg/keymap.c, Revision 1.3
1.1 deraadt 1: /*
2: * Keyboard maps. This is character set dependent.
3: * The terminal specific parts of building the
4: * keymap has been moved to a better place.
5: */
6: #include "def.h"
7: #include "kbd.h"
8:
9: /*
10: * defined by "macro.c"
11: */
12: #ifndef NO_MACRO
1.3 ! millert 13: extern int definemacro(); /* Begin macro */
! 14: extern int finishmacro(); /* End macro */
! 15: extern int executemacro(); /* Execute macro */
1.1 deraadt 16: #endif
17:
18: /*
19: * Defined by "main.c".
20: */
1.3 ! millert 21: extern int ctrlg(); /* Abort out of things */
! 22: extern int quit(); /* Quit */
1.1 deraadt 23:
24: /*
25: * Defined by "match.c"
26: */
1.3 ! millert 27: extern int showmatch(); /* Hack to show matching paren */
1.1 deraadt 28:
29: /* defined by "modes.c" */
30:
1.3 ! millert 31: extern int indentmode(); /* set auto-indent mode */
! 32: extern int fillmode(); /* set word-wrap mode */
! 33: extern int blinkparen(); /* Fake blink-matching-paren var */
1.1 deraadt 34: #ifdef NOTAB
1.3 ! millert 35: extern int notabmode(); /* no tab mode */
1.1 deraadt 36: #endif
1.3 ! millert 37: extern int overwrite(); /* overwrite mode */
! 38: extern int set_default_mode(); /* set default modes */
1.1 deraadt 39:
40: /*
41: * defined by "paragraph.c" - the paragraph justification code.
42: */
1.3 ! millert 43: extern int gotobop(); /* Move to start of paragraph. */
! 44: extern int gotoeop(); /* Move to end of paragraph. */
! 45: extern int fillpara(); /* Justify a paragraph. */
! 46: extern int killpara(); /* Delete a paragraph. */
! 47: extern int setfillcol(); /* Set fill column for justify. */
! 48: extern int fillword(); /* Insert char with word wrap. */
1.1 deraadt 49:
50: /*
51: * Defined by "random.c".
52: */
1.3 ! millert 53: extern int showcpos(); /* Show the cursor position */
! 54: extern int twiddle(); /* Twiddle characters */
! 55: extern int quote(); /* Insert literal */
! 56: extern int openline(); /* Open up a blank line */
! 57: extern int newline(); /* Insert newline */
! 58: extern int deblank(); /* Delete blank lines */
! 59: extern int justone(); /* Delete extra whitespace */
! 60: extern int delwhite(); /* Delete all whitespace */
! 61: extern int indent(); /* Insert newline, then indent */
! 62: extern int forwdel(); /* Forward delete */
! 63: extern int backdel(); /* Backward delete in */
! 64: extern int killline(); /* Kill forward */
! 65: extern int yank(); /* Yank back from killbuffer. */
1.1 deraadt 66: #ifdef NOTAB
1.3 ! millert 67: extern int space_to_tabstop();
1.1 deraadt 68: #endif
69:
70: #ifdef REGEX
71: /*
72: * Defined by "re_search.c"
73: */
1.3 ! millert 74: extern int re_forwsearch();/* Regex search forward */
! 75: extern int re_backsearch();/* Regex search backwards */
! 76: extern int re_searchagain(); /* Repeat regex search command */
! 77: extern int re_queryrepl(); /* Regex query replace */
! 78: extern int setcasefold(); /* Set case fold in searches */
! 79: extern int delmatchlines();/* Delete all lines matching */
! 80: extern int delnonmatchlines(); /* Delete all lines not matching */
! 81: extern int cntmatchlines();/* Count matching lines */
! 82: extern int cntnonmatchlines(); /* Count nonmatching lines */
1.1 deraadt 83: #endif
84:
85: /*
86: * Defined by "region.c".
87: */
1.3 ! millert 88: extern int killregion(); /* Kill region. */
! 89: extern int copyregion(); /* Copy region to kill buffer. */
! 90: extern int lowerregion(); /* Lower case region. */
! 91: extern int upperregion(); /* Upper case region. */
1.1 deraadt 92: #ifdef PREFIXREGION
1.3 ! millert 93: extern int prefixregion(); /* Prefix all lines in region */
! 94: extern int setprefix(); /* Set line prefix string */
1.1 deraadt 95: #endif
96:
97: /*
98: * Defined by "search.c".
99: */
1.3 ! millert 100: extern int forwsearch(); /* Search forward */
! 101: extern int backsearch(); /* Search backwards */
! 102: extern int searchagain(); /* Repeat last search command */
! 103: extern int forwisearch(); /* Incremental search forward */
! 104: extern int backisearch(); /* Incremental search backwards */
! 105: extern int queryrepl(); /* Query replace */
1.1 deraadt 106:
107: /*
108: * Defined by "spawn.c".
109: */
1.3 ! millert 110: extern int spawncli(); /* Run CLI in a subjob. */
1.2 millert 111: #ifdef VMS
1.3 ! millert 112: extern int attachtoparent(); /* Attach to parent process */
1.2 millert 113: #endif
1.1 deraadt 114:
115: /* defined by "version.c" */
116:
1.3 ! millert 117: extern int showversion(); /* Show version numbers, etc. */
1.1 deraadt 118:
119: /*
120: * Defined by "window.c".
121: */
1.3 ! millert 122: extern int reposition(); /* Reposition window */
! 123: extern int refresh(); /* Refresh the screen */
! 124: extern int nextwind(); /* Move to the next window */
1.1 deraadt 125: #ifdef GOSMACS
1.3 ! millert 126: extern int prevwind(); /* Move to the previous window */
1.1 deraadt 127: #endif
1.3 ! millert 128: extern int onlywind(); /* Make current window only one */
! 129: extern int splitwind(); /* Split current window */
! 130: extern int delwind(); /* Delete current window */
! 131: extern int enlargewind(); /* Enlarge display window. */
! 132: extern int shrinkwind(); /* Shrink window. */
1.1 deraadt 133:
134: /*
135: * Defined by "word.c".
136: */
1.3 ! millert 137: extern int backword(); /* Backup by words */
! 138: extern int forwword(); /* Advance by words */
! 139: extern int upperword(); /* Upper case word. */
! 140: extern int lowerword(); /* Lower case word. */
! 141: extern int capword(); /* Initial capitalize word. */
! 142: extern int delfword(); /* Delete forward word. */
! 143: extern int delbword(); /* Delete backward word. */
1.1 deraadt 144:
145: #ifdef AMIGA
146: #ifdef DO_ICONIFY
1.3 ! millert 147: extern int tticon();
1.1 deraadt 148: #endif
149: #ifdef DO_MENU
1.3 ! millert 150: extern int amigamenu(); /* Menu function */
1.1 deraadt 151: #endif
152: #ifdef MOUSE
1.3 ! millert 153: extern int amigamouse(); /* Amiga mouse functions */
! 154: extern int mgotobob();
! 155: extern int mforwdel();
! 156: extern int mdelwhite();
! 157: extern int mdelwind();
! 158: extern int mgotoeob();
! 159: extern int menlargewind();
! 160: extern int mkillline();
! 161: extern int mkillregion();
! 162: extern int mdelfword();
! 163: extern int mreposition();
! 164: extern int mbackpage();
! 165: extern int mforwpage();
! 166: extern int mshrinkwind();
! 167: extern int msplitwind();
! 168: extern int myank();
! 169: #endif /* MOUSE */
1.1 deraadt 170:
1.3 ! millert 171: extern int togglewindow(); /* Defined by "ttyio.c" */
! 172: extern int togglezooms(); /* "" "" */
1.1 deraadt 173:
174: #ifdef CHANGE_FONT
1.3 ! millert 175: extern int setfont(); /* Defined by "ttyio.c" */
1.1 deraadt 176: #endif
177:
178: #ifdef CHANGE_COLOR
1.3 ! millert 179: /* functions to mess with the mode line rendition, window colors */
! 180: extern int ttmode(); /* Defined by "tty.c" */
! 181: extern int tttext(); /* "" */
! 182: extern int textforeground(); /* "" */
! 183: extern int textbackground(); /* "" */
! 184: extern int modeforeground(); /* "" */
! 185: extern int modebackground(); /* "" */
1.1 deraadt 186: #endif
187:
188: /*
189: * This file contains map segment definitions for adding function keys to
190: * keymap declarations. Currently you can add things to the fundamental
191: * mode keymap and the dired mode keymap. See the declaration of
192: * diredmap and fundmap for details.
193: */
194: #include "amiga_maps.c"
195:
1.3 ! millert 196: #endif /* AMIGA */
1.1 deraadt 197:
198: /* initial keymap declarations, deepest first */
199:
200: #ifndef NO_HELP
1.3 ! millert 201: static PF cHcG[] = {
! 202: ctrlg, /* ^G */
! 203: help_help, /* ^H */
! 204: };
! 205: static PF cHa[] = {
! 206: apropos_command, /* a */
! 207: wallchart, /* b */
! 208: desckey, /* c */
1.1 deraadt 209: };
1.3 ! millert 210: static struct KEYMAPE (2 + IMAPEXT) helpmap = {
1.1 deraadt 211: 2,
1.3 ! millert 212: 2 + IMAPEXT,
1.1 deraadt 213: rescan,
214: {
1.3 ! millert 215: {
! 216: CCHR('G'), CCHR('H'), cHcG, (KEYMAP *) NULL
! 217: },
! 218: {
! 219: 'a', 'c', cHa, (KEYMAP *) NULL
! 220: },
1.1 deraadt 221: }
222: };
223: #endif
224:
1.3 ! millert 225: static struct KEYMAPE (1 + IMAPEXT) extramap1 = {
1.1 deraadt 226: 0,
1.3 ! millert 227: 1 + IMAPEXT,
1.1 deraadt 228: rescan
229: };
230:
1.3 ! millert 231: static struct KEYMAPE (1 + IMAPEXT) extramap2 = {
1.1 deraadt 232: 0,
1.3 ! millert 233: 1 + IMAPEXT,
1.1 deraadt 234: rescan
235: };
236:
1.3 ! millert 237: static struct KEYMAPE (1 + IMAPEXT) extramap3 = {
1.1 deraadt 238: 0,
1.3 ! millert 239: 1 + IMAPEXT,
1.1 deraadt 240: rescan
241: };
242:
1.3 ! millert 243: static struct KEYMAPE (1 + IMAPEXT) extramap4 = {
1.1 deraadt 244: 0,
1.3 ! millert 245: 1 + IMAPEXT,
1.1 deraadt 246: rescan
247: };
248:
1.3 ! millert 249: static struct KEYMAPE (1 + IMAPEXT) extramap5 = {
1.1 deraadt 250: 0,
1.3 ! millert 251: 1 + IMAPEXT,
1.1 deraadt 252: rescan
253: };
254:
1.3 ! millert 255: static PF cX4cF[] = {
! 256: poptofile, /* ^f */
! 257: ctrlg, /* ^g */
! 258: };
! 259: static PF cX4b[] = {
! 260: poptobuffer, /* b */
! 261: rescan, /* c */
! 262: rescan, /* d */
! 263: rescan, /* e */
! 264: poptofile, /* f */
1.1 deraadt 265: };
1.3 ! millert 266: static struct KEYMAPE (2 + IMAPEXT) cX4map = {
1.1 deraadt 267: 2,
1.3 ! millert 268: 2 + IMAPEXT,
1.1 deraadt 269: rescan,
270: {
1.3 ! millert 271: {
! 272: CCHR('F'), CCHR('G'), cX4cF, (KEYMAP *) NULL
! 273: },
! 274: {
! 275: 'b', 'f', cX4b, (KEYMAP *) NULL
! 276: },
1.1 deraadt 277: }
278: };
279:
1.3 ! millert 280: static PF cXcB[] = {
! 281: listbuffers, /* ^B */
! 282: quit, /* ^C */
! 283: rescan, /* ^D */
! 284: rescan, /* ^E */
! 285: filevisit, /* ^F */
! 286: ctrlg, /* ^G */
! 287: };
! 288: static PF cXcL[] = {
! 289: lowerregion, /* ^L */
! 290: rescan, /* ^M */
! 291: rescan, /* ^N */
! 292: deblank, /* ^O */
! 293: rescan, /* ^P */
! 294: rescan, /* ^Q */
! 295: rescan, /* ^R */
! 296: filesave, /* ^S */
! 297: rescan, /* ^T */
! 298: upperregion, /* ^U */
! 299: rescan, /* ^V */
! 300: filewrite, /* ^W */
! 301: swapmark, /* ^X */
1.1 deraadt 302: };
303: #ifndef NO_MACRO
1.3 ! millert 304: static PF cXlp[] = {
! 305: definemacro, /* ( */
! 306: finishmacro, /* ) */
! 307: };
! 308: #endif
! 309: static PF cX0[] = {
! 310: delwind, /* 0 */
! 311: onlywind, /* 1 */
! 312: splitwind, /* 2 */
! 313: rescan, /* 3 */
! 314: prefix, /* 4 */
! 315: };
! 316: static PF cXeq[] = {
! 317: showcpos, /* = */
! 318: };
! 319: static PF cXcar[] = {
! 320: enlargewind, /* ^ */
! 321: rescan, /* _ */
! 322: rescan, /* ` */
! 323: rescan, /* a */
! 324: usebuffer, /* b */
! 325: rescan, /* c */
1.1 deraadt 326: #ifndef NO_DIRED
1.3 ! millert 327: dired, /* d */
1.1 deraadt 328: #else
1.3 ! millert 329: rescan, /* d */
1.1 deraadt 330: #endif
331: #ifndef NO_MACRO
1.3 ! millert 332: executemacro, /* e */
1.1 deraadt 333: #else
1.3 ! millert 334: rescan, /* e */
1.1 deraadt 335: #endif
1.3 ! millert 336: setfillcol, /* f */
! 337: rescan, /* g */
! 338: rescan, /* h */
! 339: fileinsert, /* i */
! 340: rescan, /* j */
! 341: killbuffer, /* k */
! 342: rescan, /* l */
! 343: rescan, /* m */
! 344: rescan, /* n */
! 345: nextwind, /* o */
! 346: rescan, /* p */
! 347: rescan, /* q */
! 348: rescan, /* r */
! 349: savebuffers, /* s */
1.1 deraadt 350: };
351: #ifndef NO_MACRO
1.3 ! millert 352: static struct KEYMAPE (6 + IMAPEXT) cXmap = {
1.1 deraadt 353: 6,
1.3 ! millert 354: 6 + IMAPEXT,
1.1 deraadt 355: #else
1.3 ! millert 356: static struct KEYMAPE (5 + IMAPEXT) cXmap = {
1.1 deraadt 357: 5,
1.3 ! millert 358: 5 + IMAPEXT,
1.1 deraadt 359: #endif
360: rescan,
361: {
1.3 ! millert 362: {
! 363: CCHR('B'), CCHR('G'), cXcB, (KEYMAP *) NULL
! 364: },
! 365: {
! 366: CCHR('L'), CCHR('X'), cXcL, (KEYMAP *) NULL
! 367: },
1.1 deraadt 368: #ifndef NO_MACRO
1.3 ! millert 369: {
! 370: '(', ')', cXlp, (KEYMAP *) NULL
! 371: },
! 372: #endif
! 373: {
! 374: '0', '4', cX0, (KEYMAP *) & cX4map
! 375: },
! 376: {
! 377: '=', '=', cXeq, (KEYMAP *) NULL
! 378: },
! 379: {
! 380: '^', 's', cXcar, (KEYMAP *) NULL
! 381: },
1.1 deraadt 382: }
383: };
384:
1.3 ! millert 385: static PF metacG[] = {
! 386: ctrlg, /* ^G */
1.1 deraadt 387: };
1.3 ! millert 388: static PF metacV[] = {
! 389: pagenext, /* ^V */
1.1 deraadt 390: };
1.3 ! millert 391: static PF metasp[] = {
! 392: justone, /* space */
1.1 deraadt 393: };
1.3 ! millert 394: static PF metapct[] = {
! 395: queryrepl, /* % */
1.1 deraadt 396: };
1.3 ! millert 397: static PF metami[] = {
1.1 deraadt 398: negative_argument, /* - */
1.3 ! millert 399: rescan, /* . */
! 400: rescan, /* / */
! 401: digit_argument, /* 0 */
! 402: digit_argument, /* 1 */
! 403: digit_argument, /* 2 */
! 404: digit_argument, /* 3 */
! 405: digit_argument, /* 4 */
! 406: digit_argument, /* 5 */
! 407: digit_argument, /* 6 */
! 408: digit_argument, /* 7 */
! 409: digit_argument, /* 8 */
! 410: digit_argument, /* 9 */
! 411: rescan, /* : */
! 412: rescan, /* ; */
! 413: gotobob, /* < */
! 414: rescan, /* = */
! 415: gotoeob, /* > */
! 416: };
! 417: static PF metalb[] = {
! 418: gotobop, /* [ */
! 419: delwhite, /* \ */
! 420: gotoeop, /* ] */
! 421: rescan, /* ^ */
! 422: rescan, /* _ */
! 423: rescan, /* ` */
! 424: rescan, /* a */
! 425: backword, /* b */
! 426: capword, /* c */
! 427: delfword, /* d */
! 428: rescan, /* e */
! 429: forwword, /* f */
! 430: };
! 431: static PF metal[] = {
! 432: lowerword, /* l */
! 433: rescan, /* m */
! 434: rescan, /* n */
! 435: rescan, /* o */
! 436: rescan, /* p */
! 437: fillpara, /* q */
! 438: backsearch, /* r */
! 439: forwsearch, /* s */
! 440: rescan, /* t */
! 441: upperword, /* u */
! 442: backpage, /* v */
! 443: copyregion, /* w */
! 444: extend, /* x */
! 445: };
! 446: static PF metatilde[] = {
! 447: notmodified, /* ~ */
! 448: delbword, /* DEL */
1.1 deraadt 449: };
1.3 ! millert 450: static struct KEYMAPE (8 + IMAPEXT) metamap = {
1.1 deraadt 451: 8,
1.3 ! millert 452: 8 + IMAPEXT,
1.1 deraadt 453: rescan,
454: {
1.3 ! millert 455: {
! 456: CCHR('G'), CCHR('G'), metacG, (KEYMAP *) NULL
! 457: },
! 458: {
! 459: CCHR('V'), CCHR('V'), metacV, (KEYMAP *) NULL
! 460: },
! 461: {
! 462: ' ', ' ', metasp, (KEYMAP *) NULL
! 463: },
! 464: {
! 465: '%', '%', metapct, (KEYMAP *) NULL
! 466: },
! 467: {
! 468: '-', '>', metami, (KEYMAP *) NULL
! 469: },
! 470: {
! 471: '[', 'f', metalb, (KEYMAP *) NULL
! 472: },
! 473: {
! 474: 'l', 'x', metal, (KEYMAP *) NULL
! 475: },
! 476: {
! 477: '~', CCHR('?'), metatilde, (KEYMAP *) NULL
! 478: },
1.1 deraadt 479: }
480: };
481:
1.3 ! millert 482: static PF fund_at[] = {
! 483: setmark, /* ^@ */
! 484: gotobol, /* ^A */
! 485: backchar, /* ^B */
! 486: rescan, /* ^C */
! 487: forwdel, /* ^D */
! 488: gotoeol, /* ^E */
! 489: forwchar, /* ^F */
! 490: ctrlg, /* ^G */
1.1 deraadt 491: #ifndef NO_HELP
1.3 ! millert 492: prefix, /* ^H */
1.1 deraadt 493: #else
1.3 ! millert 494: rescan, /* ^H */
1.1 deraadt 495: #endif
496: };
497: /* ^I is selfinsert */
1.3 ! millert 498: static PF fund_CJ[] = {
! 499: indent, /* ^J */
! 500: killline, /* ^K */
! 501: reposition, /* ^L */
! 502: newline, /* ^M */
! 503: forwline, /* ^N */
! 504: openline, /* ^O */
! 505: backline, /* ^P */
! 506: quote, /* ^Q */
! 507: backisearch, /* ^R */
! 508: forwisearch, /* ^S */
! 509: twiddle, /* ^T */
1.1 deraadt 510: universal_argument, /* ^U */
1.3 ! millert 511: forwpage, /* ^V */
! 512: killregion, /* ^W */
! 513: prefix, /* ^X */
! 514: yank, /* ^Y */
1.2 millert 515: #ifndef VMS
1.3 ! millert 516: spawncli, /* ^Z */
1.2 millert 517: #else
1.3 ! millert 518: attachtoparent, /* ^Z */
1.2 millert 519: #endif
1.1 deraadt 520: };
1.3 ! millert 521: static PF fund_esc[] = {
! 522: prefix, /* esc */
! 523: rescan, /* ^\ *//* selfinsert is default on
! 524: * fundamental */
! 525: rescan, /* ^] */
! 526: rescan, /* ^^ */
! 527: rescan, /* ^_ */
1.1 deraadt 528: };
1.3 ! millert 529: static PF fund_del[] = {
! 530: backdel, /* DEL */
1.1 deraadt 531: };
532:
533: #ifndef FUND_XMAPS
534: #define NFUND_XMAPS 0 /* extra map sections after normal ones */
535: #endif
536:
1.3 ! millert 537: static struct KEYMAPE (4 + NFUND_XMAPS + IMAPEXT) fundmap = {
1.1 deraadt 538: 4 + NFUND_XMAPS,
539: 4 + NFUND_XMAPS + IMAPEXT,
540: selfinsert,
541: {
542: #ifndef NO_HELP
1.3 ! millert 543: {
! 544: CCHR('@'), CCHR('H'), fund_at, (KEYMAP *) & helpmap
! 545: },
1.1 deraadt 546: #else
1.3 ! millert 547: {
! 548: CCHR('@'), CCHR('H'), fund_at, (KEYMAP *) NULL
! 549: },
! 550: #endif
! 551: {
! 552: CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
! 553: },
! 554: {
! 555: CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
! 556: },
! 557: {
! 558: CCHR('?'), CCHR('?'), fund_del, (KEYMAP *) NULL
! 559: },
1.1 deraadt 560: #ifdef FUND_XMAPS
561: FUND_XMAPS,
562: #endif
563: }
564: };
565:
1.3 ! millert 566: static PF fill_sp[] = {
! 567: fillword, /* ' ' */
1.1 deraadt 568: };
1.3 ! millert 569: static struct KEYMAPE (1 + IMAPEXT) fillmap = {
1.1 deraadt 570: 1,
1.3 ! millert 571: 1 + IMAPEXT,
1.1 deraadt 572: rescan,
573: {
1.3 ! millert 574: {
! 575: ' ', ' ', fill_sp, (KEYMAP *) NULL
! 576: },
1.1 deraadt 577: }
578: };
579:
1.3 ! millert 580: static PF indent_lf[] = {
! 581: newline, /* ^J */
! 582: rescan, /* ^K */
! 583: rescan, /* ^L */
! 584: indent, /* ^M */
1.1 deraadt 585: };
1.3 ! millert 586: static struct KEYMAPE (1 + IMAPEXT) indntmap = {
1.1 deraadt 587: 1,
1.3 ! millert 588: 1 + IMAPEXT,
1.1 deraadt 589: rescan,
590: {
1.3 ! millert 591: {
! 592: CCHR('J'), CCHR('M'), indent_lf, (KEYMAP *) NULL
! 593: },
1.1 deraadt 594: }
595: };
1.3 ! millert 596: static PF blink_rp[] = {
! 597: showmatch, /* ) */
1.1 deraadt 598: };
1.3 ! millert 599: static struct KEYMAPE (1 + IMAPEXT) blinkmap = {
1.1 deraadt 600: 1,
1.3 ! millert 601: 1 + IMAPEXT,
1.1 deraadt 602: rescan,
603: {
1.3 ! millert 604: {
! 605: ')', ')', blink_rp, (KEYMAP *) NULL
! 606: },
1.1 deraadt 607: }
608: };
609:
610: #ifdef NOTAB
1.3 ! millert 611: static PF notab_tab[] = {
1.1 deraadt 612: space_to_tabstop, /* ^I */
613: };
1.3 ! millert 614: static struct KEYMAPE (1 + IMAPEXT) notabmap = {
1.1 deraadt 615: 1,
1.3 ! millert 616: 1 + IMAPEXT,
1.1 deraadt 617: rescan,
618: {
1.3 ! millert 619: {
! 620: CCHR('I'), CCHR('I'), notab_tab, (KEYMAP *) NULL
! 621: },
1.1 deraadt 622: }
623: };
624: #endif
625:
1.3 ! millert 626: static struct KEYMAPE (1 + IMAPEXT) overwmap = {
1.1 deraadt 627: 0,
1.3 ! millert 628: 1 + IMAPEXT, /* 1 to avoid 0 sized array */
1.1 deraadt 629: rescan,
630: {
631: /* unused dummy entry for VMS C */
1.3 ! millert 632: {
! 633: (KCHAR) 0, (KCHAR) 0, (PF *) NULL, (KEYMAP *) NULL
! 634: },
1.1 deraadt 635: }
636: };
637:
638: #ifndef NO_DIRED
1.3 ! millert 639: static PF dirednul[] = {
! 640: setmark, /* ^@ */
! 641: gotobol, /* ^A */
! 642: backchar, /* ^B */
! 643: rescan, /* ^C */
! 644: d_del, /* ^D */
! 645: gotoeol, /* ^E */
! 646: forwchar, /* ^F */
! 647: ctrlg, /* ^G */
1.1 deraadt 648: #ifndef NO_HELP
1.3 ! millert 649: prefix, /* ^H */
1.1 deraadt 650: #endif
651: };
1.3 ! millert 652: static PF diredcl[] = {
! 653: reposition, /* ^L */
! 654: forwline, /* ^M */
! 655: forwline, /* ^N */
! 656: rescan, /* ^O */
! 657: backline, /* ^P */
! 658: rescan, /* ^Q */
! 659: backisearch, /* ^R */
! 660: forwisearch, /* ^S */
! 661: rescan, /* ^T */
! 662: universal_argument, /* ^U */
! 663: forwpage, /* ^V */
! 664: rescan, /* ^W */
! 665: prefix, /* ^X */
1.1 deraadt 666: };
1.3 ! millert 667: static PF diredcz[] = {
1.2 millert 668: #ifndef VMS
1.3 ! millert 669: spawncli, /* ^Z */
1.2 millert 670: #else
1.3 ! millert 671: attachtoparent, /* ^Z */
1.2 millert 672: #endif
1.3 ! millert 673: prefix, /* esc */
! 674: rescan, /* ^\ */
! 675: rescan, /* ^] */
! 676: rescan, /* ^^ */
! 677: rescan, /* ^_ */
! 678: forwline, /* SP */
! 679: };
! 680: static PF diredc[] = {
! 681: d_copy, /* c */
! 682: d_del, /* d */
! 683: d_findfile, /* e */
! 684: d_findfile, /* f */
! 685: };
! 686: static PF diredn[] = {
! 687: forwline, /* n */
! 688: d_ffotherwindow, /* o */
! 689: backline, /* p */
! 690: rescan, /* q */
! 691: d_rename, /* r */
! 692: rescan, /* s */
! 693: rescan, /* t */
! 694: d_undel, /* u */
! 695: rescan, /* v */
! 696: rescan, /* w */
! 697: d_expunge, /* x */
1.1 deraadt 698: };
1.3 ! millert 699: static PF direddl[] = {
! 700: d_undelbak, /* del */
1.1 deraadt 701: };
702:
703: #ifndef DIRED_XMAPS
704: #define NDIRED_XMAPS 0 /* number of extra map sections */
705: #endif
706:
1.3 ! millert 707: static struct KEYMAPE (6 + NDIRED_XMAPS + IMAPEXT) diredmap = {
1.1 deraadt 708: 6 + NDIRED_XMAPS,
709: 6 + NDIRED_XMAPS + IMAPEXT,
710: rescan,
711: {
712: #ifndef NO_HELP
1.3 ! millert 713: {
! 714: CCHR('@'), CCHR('H'), dirednul, (KEYMAP *) & helpmap
! 715: },
1.1 deraadt 716: #else
1.3 ! millert 717: {
! 718: CCHR('@'), CCHR('G'), dirednul, (KEYMAP *) NULL
! 719: },
! 720: #endif
! 721: {
! 722: CCHR('L'), CCHR('X'), diredcl, (KEYMAP *) & cXmap
! 723: },
! 724: {
! 725: CCHR('Z'), ' ', diredcz, (KEYMAP *) & metamap
! 726: },
! 727: {
! 728: 'c', 'f', diredc, (KEYMAP *) NULL
! 729: },
! 730: {
! 731: 'n', 'x', diredn, (KEYMAP *) NULL
! 732: },
! 733: {
! 734: CCHR('?'), CCHR('?'), direddl, (KEYMAP *) NULL
! 735: },
1.1 deraadt 736: #ifdef DIRED_XMAPS
1.3 ! millert 737: DIRED_XMAPS, /* map sections for dired mode keys */
1.1 deraadt 738: #endif
739: }
740: };
741: #endif
742:
1.3 ! millert 743: /*
! 744: * give names to the maps, for use by help etc. If the map is to be bindable,
! 745: * it must also be listed in the function name table below with the same
! 746: * name. Maps created dynamicly currently don't get added here, thus are
! 747: * unnamed. Modes are just named keymaps with functions to add/subtract them
! 748: * from a buffer's list of modes. If you change a mode name, change it in
1.1 deraadt 749: * modes.c also.
750: */
751:
1.3 ! millert 752: MAPS map_table[] = {
1.1 deraadt 753: /* fundamental map MUST be first entry */
1.3 ! millert 754: {(KEYMAP *) & fundmap, "fundamental"},
! 755: {(KEYMAP *) & fillmap, "fill"},
! 756: {(KEYMAP *) & indntmap, "indent"},
! 757: {(KEYMAP *) & blinkmap, "blink"},
1.1 deraadt 758: #ifdef NOTAB
1.3 ! millert 759: {(KEYMAP *) & notabmap, "notab"},
1.1 deraadt 760: #endif
1.3 ! millert 761: {(KEYMAP *) & overwmap, "overwrite"},
! 762: {(KEYMAP *) & metamap, "esc prefix"},
! 763: {(KEYMAP *) & cXmap, "c-x prefix"},
! 764: {(KEYMAP *) & cX4map, "c-x 4 prefix"},
! 765: {(KEYMAP *) & extramap1, "extra prefix 1"},
! 766: {(KEYMAP *) & extramap2, "extra prefix 2"},
! 767: {(KEYMAP *) & extramap3, "extra prefix 3"},
! 768: {(KEYMAP *) & extramap4, "extra prefix 4"},
! 769: {(KEYMAP *) & extramap5, "extra prefix 5"},
1.1 deraadt 770: #ifndef NO_HELP
1.3 ! millert 771: {(KEYMAP *) & helpmap, "help"},
1.1 deraadt 772: #endif
773: #ifndef NO_DIRED
1.3 ! millert 774: {(KEYMAP *) & diredmap, "dired"},
1.1 deraadt 775: #endif
776: };
777:
778: #define NMAPS (sizeof map_table/sizeof(MAPS))
1.3 ! millert 779: int nmaps = NMAPS; /* for use by rebind in extend.c */
1.1 deraadt 780:
1.3 ! millert 781: char *
! 782: map_name(map)
! 783: KEYMAP *map;
1.1 deraadt 784: {
1.3 ! millert 785: MAPS *mp = &map_table[0];
1.1 deraadt 786:
787: do {
1.3 ! millert 788: if (mp->p_map == map)
! 789: return mp->p_name;
! 790: } while (++mp < &map_table[NMAPS]);
! 791: return (char *) NULL;
1.1 deraadt 792: }
793:
1.3 ! millert 794: MAPS *
! 795: name_mode(name)
! 796: char *name;
1.1 deraadt 797: {
1.3 ! millert 798: MAPS *mp = &map_table[0];
1.1 deraadt 799:
800: do {
1.3 ! millert 801: if (strcmp(mp->p_name, name) == 0)
! 802: return mp;
! 803: } while (++mp < &map_table[NMAPS]);
! 804: return (MAPS *) NULL;
1.1 deraadt 805: }
806:
1.3 ! millert 807: KEYMAP *
! 808: name_map(name)
! 809: char *name;
1.1 deraadt 810: {
1.3 ! millert 811: MAPS *mp;
! 812: return (mp = name_mode(name)) == NULL ? (KEYMAP *) NULL : mp->p_map;
1.1 deraadt 813: }
814:
1.3 ! millert 815: /*
! 816: * Warning: functnames MUST be in alphabetical order! (due to binary search
! 817: * in name_function.) If the function is prefix, it must be listed with the
! 818: * same name in the map_table above.
1.1 deraadt 819: */
820:
1.3 ! millert 821: FUNCTNAMES functnames[] = {
1.1 deraadt 822: #ifdef AMIGA
823: #ifdef DO_ICONIFY
1.3 ! millert 824: {tticon, "amiga-iconify"},
1.1 deraadt 825: #endif
826: #ifdef DO_MENU
1.3 ! millert 827: {amigamenu, "amiga-menu"},
1.1 deraadt 828: #endif
829: #ifdef CHANGE_COLOR
1.3 ! millert 830: {modebackground, "amiga-mode-background"},
! 831: {modeforeground, "amiga-mode-foreground"},
! 832: {ttmode, "amiga-mode-rendition"},
1.1 deraadt 833: #endif
834: #ifdef CHANGE_FONT
1.3 ! millert 835: {setfont, "amiga-set-font"},
1.1 deraadt 836: #endif
837: #ifdef CHANGE_COLOR
1.3 ! millert 838: {textbackground, "amiga-text-background"},
! 839: {textforeground, "amiga-text-foreground"},
! 840: {tttext, "amiga-text-rendition"},
! 841: #endif
! 842: {togglewindow, "amiga-toggle-border"},
! 843: {togglezooms, "amiga-zoom-mode"},
! 844: #endif /* AMIGA */
1.1 deraadt 845: #ifndef NO_HELP
846: {apropos_command, "apropos"},
847: #endif
1.3 ! millert 848: {fillmode, "auto-fill-mode"},
! 849: {indentmode, "auto-indent-mode"},
! 850: {backchar, "backward-char"},
! 851: {delbword, "backward-kill-word"},
! 852: {gotobop, "backward-paragraph"},
! 853: {backword, "backward-word"},
! 854: {gotobob, "beginning-of-buffer"},
! 855: {gotobol, "beginning-of-line"},
! 856: {blinkparen, "blink-matching-paren"},
! 857: {showmatch, "blink-matching-paren-hack"},
1.1 deraadt 858: #ifdef BSMAP
1.3 ! millert 859: {bsmap, "bsmap-mode"},
1.1 deraadt 860: #endif
1.3 ! millert 861: {prefix, "c-x 4 prefix"},
! 862: {prefix, "c-x prefix"},
1.1 deraadt 863: #ifndef NO_MACRO
1.3 ! millert 864: {executemacro, "call-last-kbd-macro"},
1.1 deraadt 865: #endif
1.3 ! millert 866: {capword, "capitalize-word"},
1.1 deraadt 867: #ifndef NO_DIR
1.3 ! millert 868: {changedir, "cd"},
1.1 deraadt 869: #endif
1.3 ! millert 870: {copyregion, "copy-region-as-kill"},
1.1 deraadt 871: #ifdef REGEX
872: {cntmatchlines, "count-matches"},
1.3 ! millert 873: {cntnonmatchlines, "count-non-matches"},
1.1 deraadt 874: #endif
1.3 ! millert 875: {define_key, "define-key"},
! 876: {backdel, "delete-backward-char"},
! 877: {deblank, "delete-blank-lines"},
! 878: {forwdel, "delete-char"},
! 879: {delwhite, "delete-horizontal-space"},
1.1 deraadt 880: #ifdef REGEX
881: {delmatchlines, "delete-matching-lines"},
1.3 ! millert 882: {delnonmatchlines, "delete-non-matching-lines"},
1.1 deraadt 883: #endif
1.3 ! millert 884: {onlywind, "delete-other-windows"},
! 885: {delwind, "delete-window"},
1.1 deraadt 886: #ifndef NO_HELP
1.3 ! millert 887: {wallchart, "describe-bindings"},
! 888: {desckey, "describe-key-briefly"},
1.1 deraadt 889: #endif
1.3 ! millert 890: {digit_argument, "digit-argument"},
1.1 deraadt 891: #ifndef NO_DIRED
1.3 ! millert 892: {dired, "dired"},
! 893: {d_undelbak, "dired-backup-unflag"},
! 894: {d_copy, "dired-copy-file"},
! 895: {d_expunge, "dired-do-deletions"},
! 896: {d_findfile, "dired-find-file"},
1.1 deraadt 897: {d_ffotherwindow, "dired-find-file-other-window"},
1.3 ! millert 898: {d_del, "dired-flag-file-deleted"},
1.1 deraadt 899: {d_otherwindow, "dired-other-window"},
1.3 ! millert 900: {d_rename, "dired-rename-file"},
! 901: {d_undel, "dired-unflag"},
1.1 deraadt 902: #endif
1.3 ! millert 903: {lowerregion, "downcase-region"},
! 904: {lowerword, "downcase-word"},
! 905: {showversion, "emacs-version"},
1.1 deraadt 906: #ifndef NO_MACRO
1.3 ! millert 907: {finishmacro, "end-kbd-macro"},
1.1 deraadt 908: #endif
1.3 ! millert 909: {gotoeob, "end-of-buffer"},
! 910: {gotoeol, "end-of-line"},
! 911: {enlargewind, "enlarge-window"},
! 912: {prefix, "esc prefix"},
1.1 deraadt 913: #ifndef NO_STARTUP
1.3 ! millert 914: {evalbuffer, "eval-current-buffer"},
! 915: {evalexpr, "eval-expression"},
1.1 deraadt 916: #endif
1.3 ! millert 917: {swapmark, "exchange-point-and-mark"},
! 918: {extend, "execute-extended-command"},
! 919: {prefix, "extra prefix 1"},
! 920: {prefix, "extra prefix 2"},
! 921: {prefix, "extra prefix 3"},
! 922: {prefix, "extra prefix 4"},
! 923: {prefix, "extra prefix 5"},
! 924: {fillpara, "fill-paragraph"},
! 925: {filevisit, "find-file"},
! 926: {poptofile, "find-file-other-window"},
! 927: {forwchar, "forward-char"},
! 928: {gotoeop, "forward-paragraph"},
! 929: {forwword, "forward-word"},
! 930: {bindtokey, "global-set-key"},
! 931: {unbindtokey, "global-unset-key"},
! 932: {gotoline, "goto-line"},
1.1 deraadt 933: #ifndef NO_HELP
1.3 ! millert 934: {prefix, "help"},
! 935: {help_help, "help-help"},
1.1 deraadt 936: #endif
1.3 ! millert 937: {insert, "insert"},
! 938: {bufferinsert, "insert-buffer"},
! 939: {fileinsert, "insert-file"},
! 940: {fillword, "insert-with-wrap"},
! 941: {backisearch, "isearch-backward"},
! 942: {forwisearch, "isearch-forward"},
! 943: {justone, "just-one-space"},
! 944: {ctrlg, "keyboard-quit"},
! 945: {killbuffer, "kill-buffer"},
! 946: {killline, "kill-line"},
! 947: {killpara, "kill-paragraph"},
! 948: {killregion, "kill-region"},
! 949: {delfword, "kill-word"},
! 950: {listbuffers, "list-buffers"},
1.1 deraadt 951: #ifndef NO_STARTUP
1.3 ! millert 952: {evalfile, "load"},
1.1 deraadt 953: #endif
1.3 ! millert 954: {localbind, "local-set-key"},
! 955: {localunbind, "local-unset-key"},
1.1 deraadt 956: #ifndef NO_BACKUP
1.3 ! millert 957: {makebkfile, "make-backup-files"},
1.1 deraadt 958: #endif
959: #ifdef DO_METAKEY
1.3 ! millert 960: {do_meta, "meta-key-mode"}, /* better name, anyone? */
1.1 deraadt 961: #endif
962: #ifdef AMIGA
963: #ifdef MOUSE
1.3 ! millert 964: {mgotobob, "mouse-beginning-of-buffer"},
! 965: {mforwdel, "mouse-delete-char"},
! 966: {mdelwhite, "mouse-delete-horizontal-space"},
! 967: {mdelwind, "mouse-delete-window"},
! 968: {mgotoeob, "mouse-end-of-buffer"},
! 969: {menlargewind, "mouse-enlarge-window"},
! 970: {mkillline, "mouse-kill-line"},
! 971: {mkillregion, "mouse-kill-region"},
! 972: {mdelfword, "mouse-kill-word"},
! 973: {mreposition, "mouse-recenter"},
! 974: {mbackpage, "mouse-scroll-down"},
! 975: {mforwpage, "mouse-scroll-up"},
! 976: {amigamouse, "mouse-set-point"},
! 977: {mshrinkwind, "mouse-shrink-window"},
! 978: {msplitwind, "mouse-split-window-vertically"},
! 979: {myank, "mouse-yank"},
1.1 deraadt 980: #endif
981: #endif
982: {negative_argument, "negative-argument"},
1.3 ! millert 983: {newline, "newline"},
! 984: {indent, "newline-and-indent"},
! 985: {forwline, "next-line"},
1.1 deraadt 986: #ifdef NOTAB
1.3 ! millert 987: {notabmode, "no-tab-mode"},
1.1 deraadt 988: #endif
1.3 ! millert 989: {notmodified, "not-modified"},
! 990: {openline, "open-line"},
! 991: {nextwind, "other-window"},
! 992: {overwrite, "overwrite-mode"},
1.1 deraadt 993: #ifdef PREFIXREGION
1.3 ! millert 994: {prefixregion, "prefix-region"},
1.1 deraadt 995: #endif
1.3 ! millert 996: {backline, "previous-line"},
1.1 deraadt 997: #ifdef GOSMACS
1.3 ! millert 998: {prevwind, "previous-window"},
1.1 deraadt 999: #endif
1000: #ifdef VMS
1.3 ! millert 1001: {spawncli, "push-to-dcl"},
1.1 deraadt 1002: #else
1.3 ! millert 1003: {spawncli, "push-shell"},
1.1 deraadt 1004: #endif
1005: #ifndef NO_DIR
1.3 ! millert 1006: {showcwdir, "pwd"},
1.1 deraadt 1007: #endif
1.3 ! millert 1008: {queryrepl, "query-replace"},
1.1 deraadt 1009: #ifdef REGEX
1.3 ! millert 1010: {re_queryrepl, "query-replace-regexp"},
1.1 deraadt 1011: #endif
1.3 ! millert 1012: {quote, "quoted-insert"},
1.1 deraadt 1013: #ifdef REGEX
1.3 ! millert 1014: {re_searchagain, "re-search-again"},
1.1 deraadt 1015: {re_backsearch, "re-search-backward"},
1016: {re_forwsearch, "re-search-forward"},
1017: #endif
1.3 ! millert 1018: {reposition, "recenter"},
! 1019: {refresh, "redraw-display"},
! 1020: {filesave, "save-buffer"},
! 1021: {quit, "save-buffers-kill-emacs"},
! 1022: {savebuffers, "save-some-buffers"},
! 1023: {backpage, "scroll-down"},
1.1 deraadt 1024: #ifdef GOSMACS
1.3 ! millert 1025: {back1page, "scroll-one-line-down"},
! 1026: {forw1page, "scroll-one-line-up"},
1.1 deraadt 1027: #endif
1.3 ! millert 1028: {pagenext, "scroll-other-window"},
! 1029: {forwpage, "scroll-up"},
! 1030: {searchagain, "search-again"},
! 1031: {backsearch, "search-backward"},
! 1032: {forwsearch, "search-forward"},
! 1033: {selfinsert, "self-insert-command"},
1.1 deraadt 1034: #ifdef REGEX
1.3 ! millert 1035: {setcasefold, "set-case-fold-search"},
1.1 deraadt 1036: #endif
1037: {set_default_mode, "set-default-mode"},
1.3 ! millert 1038: {setfillcol, "set-fill-column"},
! 1039: {setmark, "set-mark-command"},
1.1 deraadt 1040: #ifdef PREFIXREGION
1.3 ! millert 1041: {setprefix, "set-prefix-string"},
1.1 deraadt 1042: #endif
1.3 ! millert 1043: {shrinkwind, "shrink-window"},
1.1 deraadt 1044: #ifdef NOTAB
1045: {space_to_tabstop, "space-to-tabstop"},
1046: #endif
1.3 ! millert 1047: {splitwind, "split-window-vertically"},
1.1 deraadt 1048: #ifndef NO_MACRO
1.3 ! millert 1049: {definemacro, "start-kbd-macro"},
1.1 deraadt 1050: #endif
1.2 millert 1051: #ifdef VMS
1.3 ! millert 1052: {attachtoparent, "suspend-emacs"},
1.2 millert 1053: #else
1.3 ! millert 1054: {spawncli, "suspend-emacs"},
1.2 millert 1055: #endif
1.3 ! millert 1056: {usebuffer, "switch-to-buffer"},
! 1057: {poptobuffer, "switch-to-buffer-other-window"},
! 1058: {twiddle, "transpose-chars"},
1.1 deraadt 1059: {universal_argument, "universal-argument"},
1.3 ! millert 1060: {upperregion, "upcase-region"},
! 1061: {upperword, "upcase-word"},
! 1062: {showcpos, "what-cursor-position"},
! 1063: {filewrite, "write-file"},
! 1064: {yank, "yank"},
1.1 deraadt 1065: };
1066:
1067: #define NFUNCT (sizeof(functnames)/sizeof(FUNCTNAMES))
1068:
1.3 ! millert 1069: int nfunct = NFUNCT;/* used by help.c */
1.1 deraadt 1070:
1071: /*
1072: * The general-purpose version of ROUND2 blows osk C (2.0) out of the water.
1073: * (reboot required) If you need to build a version of mg with less than 32
1074: * or more than 511 functions, something better must be done.
1075: * The version that should work, but doesn't is:
1076: * #define ROUND2(x) (1+((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)|\
1077: * (x>>8)|(x>>9)|(x>>10)|(x>>11)|(x>>12)|(x>>13)|(x>>14)|(x>>15)))
1078: */
1079: #define ROUND2(x) (x<128?(x<64?32:64):(x<256?128:256))
1080:
1.3 ! millert 1081: static
! 1082: name_fent(fname, flag)
! 1083: register char *fname;
! 1084: int flag;
1.1 deraadt 1085: {
1.3 ! millert 1086: register int try;
! 1087: register int x = ROUND2(NFUNCT);
! 1088: register int base = 0;
! 1089: register int notit;
1.1 deraadt 1090:
1091: do {
1.3 ! millert 1092: /* + can be used instead of | here if more efficent. */
! 1093: if ((try = base | x) < NFUNCT) {
! 1094: if ((notit = strcmp(fname, functnames[try].n_name)) >= 0) {
! 1095: if (!notit)
! 1096: return try;
! 1097: base = try;
! 1098: }
1.1 deraadt 1099: }
1.3 ! millert 1100: } while ((x >>= 1) || (try == 1 && base == 0)); /* try 0 once if needed */
1.1 deraadt 1101: return flag ? base : -1;
1102: }
1103:
1104: /*
1105: * Translate from function name to function pointer, using binary search.
1106: */
1107:
1.3 ! millert 1108: PF
! 1109: name_function(fname)
! 1110: char *fname;
1.1 deraadt 1111: {
1.3 ! millert 1112: int i;
! 1113: if ((i = name_fent(fname, FALSE)) >= 0)
! 1114: return functnames[i].n_funct;
! 1115: return (PF) NULL;
1.1 deraadt 1116: }
1117:
1118: /* complete function name */
1119:
1.3 ! millert 1120: int
1.1 deraadt 1121: complete_function(fname, c)
1.3 ! millert 1122: register char *fname;
! 1123: int c;
1.1 deraadt 1124: {
1.3 ! millert 1125: register int i, j, k, l;
! 1126: int oj;
1.1 deraadt 1127:
1128: i = name_fent(fname, TRUE);
1.3 ! millert 1129: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++) {
1.1 deraadt 1130: }
1.3 ! millert 1131: if (fname[j] != '\0') {
! 1132: if (++i >= NFUNCT)
! 1133: return -2; /* no match */
! 1134: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++) {
! 1135: }
! 1136: if (fname[j] != '\0')
! 1137: return -2; /* no match */
! 1138: }
! 1139: if (c == CCHR('M') && functnames[i].n_name[j] == '\0')
! 1140: return -1;
! 1141: for (k = i + 1; k < NFUNCT; k++) { /* find last match */
! 1142: for (l = 0; functnames[k].n_name[l] == fname[l]; l++) {
! 1143: }
! 1144: if (l < j)
! 1145: break;
1.1 deraadt 1146: }
1147: k--;
1148: oj = j;
1.3 ! millert 1149: if (k > i) { /* multiple matches */
! 1150: while ((l = functnames[i].n_name[j]) == functnames[k].n_name[j]) {
! 1151: fname[j++] = l;
! 1152: if (l == '-' && c == ' ')
! 1153: break;
! 1154: }
! 1155: if (j == oj)
! 1156: return -3; /* ambiguous */
! 1157: } else { /* single match */
! 1158: while (l = functnames[i].n_name[j]) {
! 1159: fname[j++] = l;
! 1160: if (l == '-' && c == ' ')
! 1161: break;
! 1162: }
1.1 deraadt 1163: }
1164: fname[j] = '\0';
1165: return j - oj;
1166: }
1167:
1168: /* list possible function name completions */
1169:
1.3 ! millert 1170: LIST *
! 1171: complete_function_list(fname, c)
! 1172: register char *fname;
1.1 deraadt 1173: {
1.3 ! millert 1174: register int i, j, k, l;
! 1175: int oj;
! 1176: LIST *current, *last;
1.1 deraadt 1177:
1178: i = name_fent(fname, TRUE);
1.3 ! millert 1179: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++) {
! 1180: }
! 1181: if (fname[j] != '\0') {
! 1182: if (++i >= NFUNCT)
! 1183: return NULL; /* no match */
! 1184: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++) {
! 1185: }
! 1186: if (fname[j] != '\0')
! 1187: return NULL; /* no match */
1.1 deraadt 1188: }
1.3 ! millert 1189: /*
! 1190: * if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1;
! 1191: */
! 1192: for (k = i + 1; k < NFUNCT; k++) { /* find last match */
! 1193: for (l = 0; functnames[k].n_name[l] == fname[l]; l++) {
! 1194: }
! 1195: if (l < j)
! 1196: break;
1.1 deraadt 1197: }
1198: k--;
1199: last = NULL;
1200: for (; k >= i; k--) {
1.3 ! millert 1201: current = (LIST *) malloc(sizeof(LIST));
! 1202: current->l_next = last;
! 1203: current->l_name = functnames[k].n_name;
! 1204: last = current;
1.1 deraadt 1205: }
1.3 ! millert 1206: return (last);
1.1 deraadt 1207: }
1208:
1209: /* translate from function pointer to function name. */
1210:
1.3 ! millert 1211: char *
! 1212: function_name(fpoint)
! 1213: register PF fpoint;
1.1 deraadt 1214: {
1.3 ! millert 1215: register FUNCTNAMES *fnp = &functnames[0];
1.1 deraadt 1216:
1.3 ! millert 1217: if (fpoint == prefix)
! 1218: return (char *) NULL; /* ambiguous */
1.1 deraadt 1219: do {
1.3 ! millert 1220: if (fnp->n_funct == fpoint)
! 1221: return fnp->n_name;
! 1222: } while (++fnp < &functnames[NFUNCT]);
! 1223: return (char *) NULL;
1.1 deraadt 1224: }