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

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

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