Annotation of GNUtools/emacs/src/keyboard.c, revision 1.1.1.1

1.1       root        1: /* Keyboard input; editor command loop.
                      2:    Copyright (C) 1985, 1986, 1987, 1988, 1990 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 1, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU Emacs is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU Emacs; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: /*** For version 19, can simplify this by making interrupt_input 1 on VMS.  */
                     21: 
                     22: /* This must precede sys/signal.h on certain machines.  */
                     23: #include <sys/types.h>
                     24: /* Allow config.h to undefine symbols found here.  */
                     25: #include <signal.h>
                     26: 
                     27: #include "config.h"
                     28: #include <stdio.h>
                     29: #undef NULL
                     30: #include "termchar.h"
                     31: #include "termopts.h"
                     32: #include "termhooks.h"
                     33: #include "lisp.h"
                     34: #include "macros.h"
                     35: #include "window.h"
                     36: #include "commands.h"
                     37: #include "buffer.h"
                     38: #include <setjmp.h>
                     39: #include <errno.h>
                     40: 
                     41: extern int errno;
                     42: 
                     43: /* Get FIONREAD, if it is available.  */
                     44: #ifdef USG
                     45: #include <termio.h>
                     46: #include <fcntl.h>
                     47: #else /* not USG */
                     48: #ifndef VMS
                     49: #include <sys/ioctl.h>
                     50: #endif /* not VMS */
                     51: #endif /* not USG */
                     52: 
                     53: #include "emacssignal.h"
                     54: 
                     55: /* Allow m- file to inhibit use of FIONREAD.  */
                     56: #ifdef BROKEN_FIONREAD
                     57: #undef FIONREAD
                     58: #endif
                     59: 
                     60: /* Make all keyboard buffers much bigger when using X windows.  */
                     61: #ifdef HAVE_X_WINDOWS
                     62: #define BUFFER_SIZE_FACTOR 16
                     63: #else
                     64: #define BUFFER_SIZE_FACTOR 1
                     65: #endif
                     66: 
                     67: /* Following definition copied from eval.c */
                     68: 
                     69: struct backtrace
                     70:   {
                     71:     struct backtrace *next;
                     72:     Lisp_Object *function;
                     73:     Lisp_Object *args; /* Points to vector of args. */
                     74:     int nargs;         /* length of vector */
                     75:               /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */
                     76:     char evalargs;
                     77:   };
                     78: 
                     79: /* Non-nil disable property on a command means
                     80:  do not execute it; call disabled-command-hook's value instead. */
                     81: Lisp_Object Qdisabled, Vdisabled_command_hook;
                     82: 
                     83: int recent_keys_index; /* Index for storing next element into recent_keys */
                     84: int total_keys;                /* Total number of elements stored into recent_keys */
                     85: char recent_keys[100]; /* Holds last 100 keystrokes */
                     86: 
                     87: /* Buffer holding the key that invoked the current command.  */
                     88: unsigned char *this_command_keys;
                     89: int this_command_key_count;    /* Size in use.  */
                     90: int this_command_keys_size;    /* Size allocated.  */
                     91: 
                     92: extern struct backtrace *backtrace_list;
                     93: 
                     94: static jmp_buf getcjmp;        /* for longjmp to where kbd input is being done. */
                     95: 
                     96: int waiting_for_input; /* True while doing kbd input */
                     97: 
                     98: /* True while displaying for echoing.   Delays C-g throwing. */
                     99: static int echoing;
                    100: 
                    101: int immediate_quit;    /* Nonzero means C-G should cause immediate error-signal. */
                    102: 
                    103: int help_char;         /* Character to recognize as the help char.  */
                    104: 
                    105: Lisp_Object Vhelp_form;        /* Form to execute when help char is typed.  */
                    106: 
                    107: /* Character that causes a quit.  Normally C-g.  */
                    108: 
                    109: int quit_char;
                    110: 
                    111: extern Lisp_Object global_map;
                    112: 
                    113: /* Current depth in recursive edits.  */
                    114: 
                    115: int command_loop_level;
                    116: 
                    117: /* Last input character read as a command.  */
                    118: 
                    119: int last_command_char;
                    120: 
                    121: /* Last input character read for any purpose.  */
                    122: 
                    123: int last_input_char;
                    124: 
                    125: /* If not -1, a character to be read as the next command input */
                    126: 
                    127: int unread_command_char;
                    128: 
                    129: /* Char to use as prefix when a meta character is typed in.
                    130:  This is bound on entry to minibuffer in case Esc is changed there.  */
                    131: 
                    132: int meta_prefix_char;
                    133: 
                    134: /* Total number of times read_command_char has returned.  */
                    135: 
                    136: int num_input_chars;
                    137: 
                    138: /* Auto-save automatically when this many characters have been typed
                    139:    since the last time.  */
                    140: 
                    141: static int auto_save_interval;
                    142: 
                    143: /* Value of num_input_chars as of last auto save.  */
                    144: 
                    145: int last_auto_save;
                    146: 
                    147: /* Last command executed by the editor command loop, not counting
                    148:    commands that set the prefix argument.  */
                    149: 
                    150: Lisp_Object last_command;
                    151: 
                    152: /* The command being executed by the command loop.
                    153:    Commands may set this, and the value set will be copied into last_command
                    154:    instead of the actual command.  */
                    155: Lisp_Object this_command;
                    156: 
                    157: Lisp_Object Qself_insert_command;
                    158: Lisp_Object Qforward_char;
                    159: Lisp_Object Qbackward_char;
                    160: 
                    161: /* read_key_sequence stores here the command definition of the
                    162:    key sequence that it reads.  */
                    163: Lisp_Object read_key_sequence_cmd;
                    164: 
                    165: /* Form to evaluate (if non-nil) when Emacs is started */
                    166: Lisp_Object Vtop_level;
                    167: 
                    168: /* User-supplied string to translate input characters through */
                    169: Lisp_Object Vkeyboard_translate_table;
                    170: 
                    171: FILE *dribble;                 /* File in which we write all commands we read */
                    172: 
                    173: /* Nonzero if input is available */
                    174: int input_pending;
                    175: 
                    176: /* Nonzero if should obey 0200 bit in input chars as "Meta" */
                    177: int meta_key;
                    178: 
                    179: extern char *pending_malloc_warning;
                    180: 
                    181: /* Buffer for pre-read keyboard input */
                    182: unsigned char kbd_buffer [256 * BUFFER_SIZE_FACTOR];
                    183: 
                    184: /* Number of characters available in kbd_buffer.  */
                    185: int kbd_count;
                    186: 
                    187: /* Pointer to next available character in kbd_buffer.  */
                    188: unsigned char *kbd_ptr;
                    189: 
                    190: /* Address (if not 0) of word to zero out
                    191:    if a SIGIO interrupt happens */
                    192: long *input_available_clear_word;
                    193: 
                    194: /* Nonzero means use SIGIO interrupts; zero means use CBREAK mode.
                    195:    Default is 1 if INTERRUPT_INPUT is defined.  */
                    196: 
                    197: int interrupt_input;
                    198: 
                    199: /* Nonzero while interrupts are temporarily deferred during redisplay.  */
                    200: 
                    201: int interrupts_deferred;
                    202: 
                    203: /* nonzero means use ^S/^Q for flow control.  */
                    204: 
                    205: int flow_control;
                    206: 
                    207: #ifndef BSD4_1
                    208: #define sigfree() sigsetmask (SIGEMPTYMASK)
                    209: #define sigholdx(sig) sigsetmask (sigmask (sig))
                    210: #define sigblockx(sig) sigblock (sigmask (sig))
                    211: #define sigunblockx(sig) sigblock (SIGEMPTYMASK)
                    212: #define sigpausex(sig) sigpause (0)
                    213: #endif /* not BSD4_1 */
                    214: 
                    215: #ifdef BSD4_1
                    216: #define SIGIO SIGTINT
                    217: /* sigfree and sigholdx are in sysdep.c */
                    218: #define sigblockx(sig) sighold (sig)
                    219: #define sigunblockx(sig) sigrelse (sig)
                    220: #define sigpausex(sig) sigpause (sig)
                    221: #endif /* BSD4_1 */
                    222: 
                    223: /* We are unable to use interrupts if FIONREAD is not available,
                    224:    so flush SIGIO so we won't try. */
                    225: #ifndef FIONREAD
                    226: #ifdef SIGIO
                    227: #undef SIGIO
                    228: #endif
                    229: #endif
                    230: 
                    231: /* If we support X Windows, and won't get an interrupt when input
                    232:    arrives from the server, poll periodically so we can detect C-g.  */
                    233: #ifdef HAVE_X_WINDOWS
                    234: #ifndef SIGIO
                    235: #define POLL_FOR_INPUT
                    236: #endif
                    237: #endif
                    238: 
                    239: /* Function for init_keyboard to call with no args (if nonzero).  */
                    240: void (*keyboard_init_hook) ();
                    241: 
                    242: static void read_avail_input ();
                    243: static void get_input_pending ();
                    244: 
                    245: /* Non-zero tells input_available_signal to call read_socket_hook
                    246:    even if FIONREAD returns zero.  */
                    247: static int force_input;
                    248: 
                    249: static int echo_keystrokes;    /* > 0 if we are to echo keystrokes */
                    250: 
                    251: /* Nonzero means echo each character as typed.  */
                    252: static int immediate_echo;
                    253: 
                    254: #define        min(a,b)        ((a)<(b)?(a):(b))
                    255: #define        max(a,b)        ((a)>(b)?(a):(b))
                    256: 
                    257: static char echobuf[100];
                    258: static char *echoptr;
                    259: 
                    260: /* Install the string STR as the beginning of the string of echoing,
                    261:    so that it serves as a prompt for the next character.
                    262:    Also start echoing.  */
                    263: 
                    264: echo_prompt (str)
                    265:      char *str;
                    266: {
                    267:   int len = strlen (str);
                    268:   if (len > sizeof echobuf - 4)
                    269:     len = sizeof echobuf - 4;
                    270:   bcopy (str, echobuf, len + 1);
                    271:   echoptr = echobuf + len;
                    272: 
                    273:   echo ();
                    274: }
                    275: 
                    276: /* Add the character C to the echo string,
                    277:    if echoing is going on.  */
                    278: 
                    279: echo_char (c)
                    280:      int c;
                    281: {
                    282:   extern char *push_key_description ();
                    283: 
                    284:   if (immediate_echo)
                    285:     {
                    286:       char *ptr = echoptr;
                    287: 
                    288:       if (ptr - echobuf > sizeof echobuf - 6)
                    289:        return;
                    290: 
                    291:       if (echoptr != echobuf)
                    292:        *ptr++ = ' ';
                    293: 
                    294:       ptr = push_key_description (c, ptr);
                    295:       if (echoptr == echobuf && c == help_char)
                    296:        {
                    297:          strcpy (ptr, " (Type ? for further options)");
                    298:          ptr += strlen (ptr);
                    299:        }
                    300: 
                    301:       *ptr = 0;
                    302:       echoptr = ptr;
                    303: 
                    304:       echo ();
                    305:     }
                    306: }
                    307: 
                    308: /* Temporarily add a dash to the end of the echo string,
                    309:    so that it serves as a mini-prompt for the very next character.  */
                    310: 
                    311: echo_dash ()
                    312: {
                    313:   if (!immediate_echo && echoptr == echobuf)
                    314:     return;
                    315: 
                    316:   /* Put a dash at the end of the buffer temporarily,
                    317:      but make it go away when the next character is added.  */
                    318:   echoptr[0] = '-';
                    319:   echoptr[1] = 0;
                    320: 
                    321:   echo ();
                    322: }
                    323: 
                    324: /* Display the current echo string, and begin echoing if not already
                    325:    doing so.  */
                    326: 
                    327: echo ()
                    328: {
                    329:   if (!immediate_echo)
                    330:     {
                    331:       int i;
                    332:       immediate_echo = 1;
                    333: 
                    334:       for (i = 0; i < this_command_key_count; i++)
                    335:        echo_char (this_command_keys[i]);
                    336:       echo_dash ();
                    337:     }
                    338: 
                    339:   echoing = 1;
                    340:   message1 (echobuf);
                    341:   echoing = 0;
                    342: 
                    343:   if (waiting_for_input && !NULL (Vquit_flag))
                    344:     quit_throw_to_read_command_char ();
                    345: }
                    346: 
                    347: /* Turn off echoing, for the start of a new command.  */
                    348: 
                    349: cancel_echoing ()
                    350: {
                    351:   immediate_echo = 0;
                    352:   echoptr = echobuf;
                    353: }
                    354: 
                    355: /* When an auto-save happens, record the "time", and don't do again soon.  */
                    356: record_auto_save ()
                    357: {
                    358:   last_auto_save = num_input_chars;
                    359: }
                    360: 
                    361: Lisp_Object recursive_edit_unwind (), command_loop ();
                    362: 
                    363: DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
                    364:   "Invoke the editor command loop recursively.\n\
                    365: Do (throw 'exit nil) within the command loop to make this function return,\n\
                    366: or (throw 'exit t) to make this function signal an error.\n\
                    367: This function is called by the editor initialization\n\
                    368: to begin editing.")
                    369:   ()
                    370: {
                    371:   int count = specpdl_ptr - specpdl;
                    372: 
                    373:   command_loop_level++;
                    374:   update_mode_lines = 1;
                    375: 
                    376:   record_unwind_protect (recursive_edit_unwind,
                    377:                         (current_buffer != XBUFFER (XWINDOW (selected_window)->buffer)
                    378:                          ? Fcurrent_buffer ()
                    379:                          : Qnil));
                    380: 
                    381:   recursive_edit_1 ();
                    382: 
                    383:   unbind_to (count);
                    384:   return Qnil;
                    385: }
                    386: 
                    387: Lisp_Object
                    388: recursive_edit_1 ()
                    389: {
                    390:   int count = specpdl_ptr - specpdl;
                    391:   Lisp_Object val;
                    392: 
                    393:   if (command_loop_level > 0)
                    394:     {
                    395:       specbind (Qstandard_output, Qt);
                    396:       specbind (Qstandard_input, Qt);
                    397:     }
                    398: 
                    399:   val = command_loop ();
                    400:   if (EQ (val, Qt))
                    401:     Fsignal (Qquit, Qnil);
                    402: 
                    403:   unbind_to (count);
                    404:   return Qnil;
                    405: }
                    406: 
                    407: Lisp_Object
                    408: recursive_edit_unwind (buffer)
                    409:      Lisp_Object buffer;
                    410: {
                    411:   if (!NULL (buffer))
                    412:     Fset_buffer (buffer);
                    413:   command_loop_level--;
                    414:   update_mode_lines = 1;
                    415:   return Qnil;
                    416: }
                    417: 
                    418: Lisp_Object
                    419: cmd_error (data)
                    420:      Lisp_Object data;
                    421: {
                    422:   Lisp_Object errmsg, tail, errname, file_error;
                    423:   struct gcpro gcpro1;
                    424:   int i;
                    425: 
                    426:   Vquit_flag = Qnil;
                    427:   Vinhibit_quit = Qt;
                    428:   Vstandard_output = Qt;
                    429:   Vstandard_input = Qt;
                    430:   Vexecuting_macro = Qnil;
                    431:   echo_area_contents = 0;
                    432: 
                    433:   Fdiscard_input ();
                    434:   bell ();
                    435: 
                    436:   errname = Fcar (data);
                    437: 
                    438:   if (EQ (errname, Qerror))
                    439:     {
                    440:       data = Fcdr (data);
                    441:       if (!CONSP (data)) data = Qnil;
                    442:       errmsg = Fcar (data);
                    443:       file_error = Qnil;
                    444:     }
                    445:   else
                    446:     {
                    447:       errmsg = Fget (errname, Qerror_message);
                    448:       file_error = Fmemq (Qfile_error,
                    449:                          Fget (errname, Qerror_conditions));
                    450:     }
                    451: 
                    452:   /* Print an error message including the data items.
                    453:      This is done by printing it into a scratch buffer
                    454:      and then making a copy of the text in the buffer. */
                    455:   
                    456:   if (!CONSP (data)) data = Qnil;
                    457:   tail = Fcdr (data);
                    458:   GCPRO1 (tail);
                    459: 
                    460:   /* For file-error, make error message by concatenating
                    461:      all the data items.  They are all strings.  */
                    462:   if (!NULL (file_error))
                    463:     errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr;
                    464: 
                    465:   if (XTYPE (errmsg) == Lisp_String)
                    466:     Fprinc (errmsg, Qt);
                    467:   else
                    468:     write_string_1 ("peculiar error", -1, Qt);
                    469: 
                    470:   for (i = 0; CONSP (tail); tail = Fcdr (tail), i++)
                    471:     {
                    472:       write_string_1 (i ? ", " : ": ", 2, Qt);
                    473:       if (!NULL (file_error))
                    474:        Fprinc (Fcar (tail), Qt);
                    475:       else
                    476:        Fprin1 (Fcar (tail), Qt);
                    477:     }
                    478:   UNGCPRO;
                    479: 
                    480:   /* In -batch mode, force out the error message and newlines after it
                    481:      and then die.  */
                    482:   if (noninteractive)
                    483:     {
                    484:       message ("");
                    485:       Fkill_emacs (make_number (-1));
                    486:     }
                    487: 
                    488:   Vquit_flag = Qnil;
                    489: 
                    490:   Vinhibit_quit = Qnil;
                    491:   return make_number (0);
                    492: }
                    493: 
                    494: Lisp_Object command_loop_1 ();
                    495: Lisp_Object command_loop_2 ();
                    496: Lisp_Object cmd_error ();
                    497: Lisp_Object top_level_1 ();
                    498: 
                    499: /* Entry to editor-command-loop.
                    500:    This level has the catches for exiting/returning to editor command loop.
                    501:    It returns nil to exit recursive edit, t to abort it.  */
                    502: 
                    503: Lisp_Object
                    504: command_loop ()
                    505: {
                    506:   if (command_loop_level > 0 || minibuf_level > 0)
                    507:     {
                    508:       return internal_catch (Qexit, command_loop_2, Qnil);
                    509:     }
                    510:   else
                    511:     while (1)
                    512:       {
                    513:        internal_catch (Qtop_level, top_level_1, Qnil);
                    514:        internal_catch (Qtop_level, command_loop_2, Qnil);
                    515:        /* End of file in -batch run causes exit here.  */
                    516:        if (noninteractive)
                    517:          Fkill_emacs (Qt);
                    518:       }
                    519: }
                    520: 
                    521: /* Here we catch errors in execution of commands within the
                    522:    editing loop, and reenter the editing loop.
                    523:    When there is an error, cmd_error runs and returns a non-nil
                    524:    value to us.  A value of nil means that cmd_loop_1 itself
                    525:    returned due to end of file (or end of kbd macro).  */
                    526: 
                    527: Lisp_Object
                    528: command_loop_2 ()
                    529: {
                    530:   register Lisp_Object val;
                    531:   do
                    532:     val = internal_condition_case (command_loop_1, Qerror, cmd_error);
                    533:   while (!NULL (val));
                    534:   return Qnil;
                    535: }
                    536: 
                    537: Lisp_Object
                    538: top_level_2 ()
                    539: {
                    540:   return Feval (Vtop_level);
                    541: }
                    542: 
                    543: Lisp_Object
                    544: top_level_1 ()
                    545: {
                    546:   /* On entry to the outer level, run the startup file */
                    547:   if (!NULL (Vtop_level))
                    548:     internal_condition_case (top_level_2, Qerror, cmd_error);
                    549:   else if (!NULL (Vpurify_flag))
                    550:     message ("Bare impure Emacs (standard Lisp code not loaded)");
                    551:   else
                    552:     message ("Bare Emacs (standard Lisp code not loaded)");
                    553:   return Qnil;
                    554: }
                    555: 
                    556: DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
                    557:   "Exit all recursive editing levels.")
                    558:   ()
                    559: {
                    560:   Fthrow (Qtop_level, Qnil);
                    561: }
                    562: 
                    563: DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
                    564:   "Exit from the innermost recursive edit or minibuffer.")
                    565:   ()
                    566: {
                    567:   if (command_loop_level > 0 || minibuf_level > 0)
                    568:     Fthrow (Qexit, Qnil);
                    569:   error ("No recursive edit is in progress");
                    570: }
                    571: 
                    572: DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
                    573:   "Abort the command that requested this recursive edit or minibuffer input.")
                    574:   ()
                    575: {
                    576:   if (command_loop_level > 0 || minibuf_level > 0)
                    577:     Fthrow (Qexit, Qt);
                    578:   error ("No recursive edit is in progress");
                    579: }
                    580: 
                    581: /* This is the actual command reading loop,
                    582:  sans error-handling encapsulation */
                    583: 
                    584: Lisp_Object Fcommand_execute ();
                    585: 
                    586: Lisp_Object
                    587: command_loop_1 ()
                    588: {
                    589:   Lisp_Object cmd;
                    590:   int lose;
                    591:   int nonundocount;
                    592:   char keybuf[30];
                    593:   int i;
                    594:   int no_redisplay;
                    595:   int no_direct;
                    596: 
                    597:   Vprefix_arg = Qnil;
                    598:   waiting_for_input = 0;
                    599:   cancel_echoing ();
                    600: 
                    601:   /* Don't clear out last_command at the beginning of a macro.  */
                    602:   if (NULL (Vexecuting_macro)
                    603:       || XTYPE (Vexecuting_macro) != Lisp_String)
                    604:     last_command = Qt;
                    605:   nonundocount = 0;
                    606:   no_redisplay = 0;
                    607:   this_command_key_count = 0;
                    608:   
                    609:   while (1)
                    610:     {
                    611:       /* Install chars successfully executed in kbd macro */
                    612:       if (defining_kbd_macro && NULL (Vprefix_arg))
                    613:        finalize_kbd_macro_chars ();
                    614: 
                    615:       /* Make sure current window's buffer is selected.  */
                    616: 
                    617:       if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
                    618:        set_buffer_internal (XBUFFER (XWINDOW (selected_window)->buffer));
                    619: 
                    620:       /* Display any malloc warning that just came out.
                    621:         Use while because displaying one warning can cause another.  */
                    622:       while (pending_malloc_warning)
                    623:        display_malloc_warning ();
                    624: 
                    625:       no_direct = 0;
                    626: 
                    627:       /* If minibuffer on and echo area in use,
                    628:         wait 2 sec and redraw minibufer.  */
                    629: 
                    630:       if (minibuf_level && echo_area_contents)
                    631:        {
                    632:          int count = specpdl_ptr - specpdl;
                    633:          specbind (Qinhibit_quit, Qt);
                    634:          Fsit_for (make_number (2), Qnil);
                    635:          unbind_to (count);
                    636: 
                    637:          echo_area_contents = 0;
                    638:          no_direct = 1;
                    639:          if (!NULL (Vquit_flag))
                    640:            {
                    641:              Vquit_flag = Qnil;
                    642:              unread_command_char = quit_char;
                    643:            }
                    644:        }
                    645: 
                    646:       i = 0;
                    647: #if 0
                    648:       /* If prev. command was directly displayed, we don't need
                    649:         redisplay.  Try shortcut for reading single-char key sequence.  */
                    650:       if (no_redisplay)
                    651:        i = fast_read_one_key (keybuf);
                    652: #endif /* 0 */
                    653:       /* Shortcut not applicable or found a prefix key.
                    654:         Take full precautions and read key sequence the hard way.  */
                    655:       if (i == 0)
                    656:        {
                    657: #ifdef C_ALLOCA
                    658:          alloca (0);           /* Cause a garbage collection now */
                    659:                                /* Since we can free the most stuff here.  */
                    660: #endif /* C_ALLOCA */
                    661: 
                    662:          /* Read next key sequence; i gets its length.  */
                    663: 
                    664:          i = read_key_sequence (keybuf, sizeof keybuf, 0,
                    665:                                 no_redisplay && buffer_shared <= 1);
                    666:        }
                    667: 
                    668:       /* Now we have read a key sequence of length I,
                    669:         or else I is 0 and we found end of file.  */
                    670: 
                    671:       if (i == 0)              /* End of file -- happens only in */
                    672:        return Qnil;            /* a kbd macro, at the end */
                    673: 
                    674:       last_command_char = keybuf[i - 1];
                    675:       
                    676:       cmd = read_key_sequence_cmd;
                    677:       if (!NULL (Vexecuting_macro))
                    678:        {
                    679:          if (!NULL (Vquit_flag))
                    680:            {
                    681:              Vexecuting_macro = Qt;
                    682:              QUIT;             /* Make some noise. */
                    683:                                /* Will return since macro now empty. */
                    684:            }
                    685:        }
                    686: 
                    687:       /* Do redisplay processing after this command except in special
                    688:         cases identified below that set no_redisplay to 1.  */
                    689:       no_redisplay = 0;
                    690: 
                    691:       /* Execute the command.  */
                    692: 
                    693:       if (NULL (cmd))
                    694:        {
                    695:          /* nil means key is undefined.  */
                    696:          bell ();
                    697:          defining_kbd_macro = 0;
                    698:          update_mode_lines++;
                    699:          Vprefix_arg = Qnil;
                    700:        }
                    701:       else
                    702:        {
                    703:          this_command = cmd;
                    704:          if (NULL (Vprefix_arg) && ! no_direct)
                    705:            {
                    706:              if (EQ (cmd, Qforward_char) && point < ZV)
                    707:                {
                    708:                  lose = FETCH_CHAR (point);
                    709:                  SET_PT (point + 1);
                    710:                  if (lose >= ' ' && lose < 0177
                    711:                      && (XFASTINT (XWINDOW (selected_window)->last_modified)
                    712:                          >= MODIFF)
                    713:                      && (XFASTINT (XWINDOW (selected_window)->last_point)
                    714:                          == point)
                    715:                      && !windows_or_buffers_changed
                    716:                      && EQ (current_buffer->selective_display, Qnil)
                    717:                      && !detect_input_pending ()
                    718:                      && NULL (Vexecuting_macro))
                    719:                    no_redisplay = direct_output_forward_char (1);
                    720:                  goto directly_done;
                    721:                }
                    722:              else if (EQ (cmd, Qbackward_char) && point > BEGV)
                    723:                {
                    724:                  SET_PT (point - 1);
                    725:                  lose = FETCH_CHAR (point);
                    726:                  if (lose >= ' ' && lose < 0177
                    727:                      && (XFASTINT (XWINDOW (selected_window)->last_modified)
                    728:                          >= MODIFF)
                    729:                      && (XFASTINT (XWINDOW (selected_window)->last_point)
                    730:                          == point)
                    731:                      && !windows_or_buffers_changed
                    732:                      && EQ (current_buffer->selective_display, Qnil)
                    733:                      && !detect_input_pending ()
                    734:                      && NULL (Vexecuting_macro))
                    735:                    no_redisplay = direct_output_forward_char (-1);
                    736:                  goto directly_done;
                    737:                }
                    738:              else if (EQ (cmd, Qself_insert_command))
                    739:                {
                    740:                  if (NULL (Vexecuting_macro) &&
                    741:                      !EQ (minibuf_window, selected_window))
                    742:                    {
                    743:                      if (!nonundocount || nonundocount >= 20)
                    744:                        {
                    745:                          Fundo_boundary ();
                    746:                          nonundocount = 0;
                    747:                        }
                    748:                      nonundocount++;
                    749:                    }
                    750:                  lose = (XFASTINT (XWINDOW (selected_window)->last_modified)
                    751:                          < MODIFF)
                    752:                    || (XFASTINT (XWINDOW (selected_window)->last_point)
                    753:                          != point)
                    754:                    || MODIFF <= current_buffer->save_modified
                    755:                    || windows_or_buffers_changed
                    756:                    || !EQ (current_buffer->selective_display, Qnil)
                    757:                    || detect_input_pending ()
                    758:                    || !NULL (Vexecuting_macro);
                    759:                  if (self_insert_internal (last_command_char, 0))
                    760:                    {
                    761:                      lose = 1;
                    762:                      nonundocount = 0;
                    763:                    }
                    764:                  if (!lose
                    765:                      && (point == ZV || FETCH_CHAR (point) == '\n')
                    766:                      && last_command_char >= ' '
                    767:                      && last_command_char < 0177)
                    768:                    no_redisplay
                    769:                      = direct_output_for_insert (last_command_char);
                    770:                  goto directly_done;
                    771:                }
                    772:            }
                    773: 
                    774:          /* Here for a command that isn't executed directly */
                    775: 
                    776:          nonundocount = 0;
                    777:          if (NULL (Vprefix_arg))
                    778:            Fundo_boundary ();
                    779:          Fcommand_execute (cmd, Qnil);
                    780:        }
                    781:       /* This label logically belongs inside the above group,
                    782:         but moving it is said to avoid a compiler bug on SCO V.3.2v2.  */
                    783:     directly_done: ;
                    784: 
                    785:       if (NULL (Vprefix_arg))
                    786:        {
                    787:          last_command = this_command;
                    788:          this_command_key_count = 0;
                    789:          cancel_echoing ();
                    790:        }
                    791:     }
                    792: }
                    793: 
                    794: /* Input of single characters from keyboard */
                    795: 
                    796: Lisp_Object print_help ();
                    797: 
                    798: int echo_flag;
                    799: int echo_now;
                    800: 
                    801: /* Alarm interrupt calls this and requests echoing at earliest safe time. */
                    802: request_echo ()
                    803: {
                    804:   int old_errno = errno;
                    805: 
                    806:   /* Note: no need to reestablish handler on USG systems
                    807:      because it is established, if approriate, each time an alarm is requested.  */
                    808: #ifdef subprocesses
                    809: #ifdef BSD4_1
                    810:   extern int select_alarmed;
                    811:   if (select_alarmed == 0)
                    812:     {
                    813:       select_alarmed = 1;
                    814:       sigrelse (SIGALRM);
                    815:       return;
                    816:     }
                    817: #endif
                    818: #endif
                    819: 
                    820: #ifdef BSD4_1
                    821:   sigisheld (SIGALRM);
                    822: #endif
                    823: 
                    824:   if (echo_now)
                    825:     echo ();
                    826:   else
                    827:     echo_flag = 1;
                    828: 
                    829: #ifdef BSD4_1
                    830:   sigunhold (SIGALRM);
                    831: #endif
                    832: 
                    833:   errno = old_errno;
                    834: }
                    835: 
                    836: /* Nonzero means polling for input is temporarily suppresed.  */
                    837: int poll_suppress_count;
                    838: 
                    839: /* Number of seconds between polling for input.  */
                    840: int polling_period;
                    841: 
                    842: #ifdef POLL_FOR_INPUT
                    843: int polling_for_input;
                    844: 
                    845: /* Handle an alarm once each second and read pending input
                    846:    so as to handle a C-g if it comces in.  */
                    847: 
                    848: input_poll_signal ()
                    849: {
                    850:   int junk;
                    851: 
                    852:   if (!waiting_for_input)
                    853:     read_avail_input (&junk);
                    854:   signal (SIGALRM, input_poll_signal);
                    855:   alarm (polling_period);
                    856: }
                    857: 
                    858: #endif
                    859: 
                    860: /* Begin signals to poll for input, if they are appropriate.
                    861:    This function is called unconditionally from various places.  */
                    862: 
                    863: start_polling ()
                    864: {
                    865: #ifdef POLL_FOR_INPUT
                    866:   if (read_socket_hook)
                    867:     {
                    868:       poll_suppress_count--;
                    869:       if (poll_suppress_count == 0)
                    870:        {
                    871:          signal (SIGALRM, input_poll_signal);
                    872:          polling_for_input = 1;
                    873:          alarm (polling_period);
                    874:        }
                    875:     }
                    876: #endif
                    877: }
                    878: 
                    879: /* Turn off polling.  */
                    880: 
                    881: stop_polling ()
                    882: {
                    883: #ifdef POLL_FOR_INPUT
                    884:   if (read_socket_hook)
                    885:     {
                    886:       if (poll_suppress_count == 0)
                    887:        {
                    888:          polling_for_input = 0;
                    889:          alarm (0);
                    890:        }
                    891:       poll_suppress_count++;
                    892:     }
                    893: #endif
                    894: }
                    895: 
                    896: /* read a character from the keyboard; call the redisplay if needed */
                    897: /* commandflag 0 means do not do auto-saving, but do do redisplay.
                    898:    -1 means do not do redisplay, but do do autosaving.
                    899:    1 means do both.  */
                    900: 
                    901: read_command_char (commandflag)
                    902:      int commandflag;
                    903: {
                    904:   register int c;
                    905:   int alarmtime;
                    906:   int count;
                    907:   Lisp_Object tem;
                    908:   jmp_buf save_jump;
                    909:   extern request_echo ();
                    910: 
                    911:   if (unread_command_char >= 0)
                    912:     {
                    913:       c = unread_command_char;
                    914:       unread_command_char = -1;
                    915:       if (this_command_key_count == 0)
                    916:        goto reread_first;
                    917:       goto reread;
                    918:     }
                    919: 
                    920:   if (!NULL (Vexecuting_macro))
                    921:     {
                    922:       if (XTYPE (Vexecuting_macro) != Lisp_String
                    923:          || XSTRING (Vexecuting_macro)->size <= executing_macro_index)
                    924:        return -1;
                    925:       QUIT;
                    926:       c = XSTRING (Vexecuting_macro)->data[executing_macro_index++];
                    927:       goto from_macro;
                    928:     }
                    929: 
                    930:   /* Save outer setjmp data, in case called recursively.  */
                    931:   bcopy (getcjmp, save_jump, sizeof getcjmp);
                    932: 
                    933:   stop_polling ();
                    934: 
                    935:   if (commandflag >= 0 && !detect_input_pending ())
                    936:     redisplay ();
                    937: 
                    938:   if (commandflag != 0
                    939:       && auto_save_interval > 0
                    940:       && num_input_chars - last_auto_save > max (auto_save_interval, 20)
                    941:       && !detect_input_pending ())
                    942:     Fdo_auto_save (Qnil);
                    943: 
                    944:   if (_setjmp (getcjmp))
                    945:     {
                    946:       c = quit_char;
                    947:       waiting_for_input = 0;
                    948:       input_available_clear_word = 0;
                    949: 
                    950:       goto non_reread;
                    951:     }
                    952: 
                    953:   /* Message turns off echoing unless more keystrokes turn it on again. */
                    954:   if (echo_area_contents && *echo_area_contents && echo_area_contents != echobuf)
                    955:     cancel_echoing ();
                    956:   else
                    957:     /* If already echoing, continue, and prompt.  */
                    958:     echo_dash ();
                    959: 
                    960:   /* If in middle of key sequence and minibuffer not active,
                    961:      start echoing if enough time elapses.  */
                    962:   if (minibuf_level == 0 && !immediate_echo && this_command_key_count > 0
                    963:       && echo_keystrokes > 0
                    964:       && (echo_area_contents == 0 || *echo_area_contents == 0))
                    965:     {
                    966:       /* Else start echoing if user waits more than `alarmtime' seconds. */
                    967:       /* This interrupt either calls echo right away
                    968:         or sets echo_flag, which causes echo to be called
                    969:         by set_waiting_for_input's next invocation.  */
                    970:       signal (SIGALRM, request_echo);
                    971:       echo_flag = 0;
                    972:       echo_now = 0;
                    973:       alarmtime = echo_keystrokes;
                    974:       alarm ((unsigned) alarmtime);
                    975:     }
                    976: 
                    977:   c = kbd_buffer_read_command_char ();
                    978: 
                    979:   /* Terminate Emacs in batch mode if at eof.  */
                    980:   if (noninteractive && c < 0)
                    981:     Fkill_emacs (make_number (1));
                    982: 
                    983:  non_reread:
                    984: 
                    985:   bcopy (save_jump, getcjmp, sizeof getcjmp);
                    986: 
                    987:   /* Cancel alarm if it was set and has not already gone off. */
                    988:   if (alarmtime > 0) alarm (0);
                    989: 
                    990:   echo_area_contents = 0;
                    991: 
                    992:   if (c < 0) return -1;
                    993: 
                    994:   c &= meta_key ? 0377 : 0177;
                    995: 
                    996:   if (XTYPE (Vkeyboard_translate_table) == Lisp_String
                    997:       && XSTRING (Vkeyboard_translate_table)->size > c)
                    998:     c = XSTRING (Vkeyboard_translate_table)->data[c];
                    999: 
                   1000:   total_keys++;
                   1001:   recent_keys[recent_keys_index] = c;
                   1002:   recent_keys_index = (recent_keys_index + 1) % sizeof recent_keys;
                   1003: 
                   1004:   if (dribble)
                   1005:     {
                   1006:       putc (c, dribble);
                   1007:       fflush (dribble);
                   1008:     }
                   1009: 
                   1010:   store_kbd_macro_char (c);
                   1011: 
                   1012:   start_polling ();
                   1013: 
                   1014:  from_macro:
                   1015:  reread_first:  /* Rereading a char and it is the first in a command.  */
                   1016: 
                   1017:   echo_char (c);
                   1018: 
                   1019:   /* Record this character as part of the current key.  */
                   1020:   if (this_command_key_count == this_command_keys_size)
                   1021:     {
                   1022:       this_command_keys_size *= 2;
                   1023:       this_command_keys
                   1024:        = (unsigned char *) xrealloc (this_command_keys,
                   1025:                                      this_command_keys_size);
                   1026:     }
                   1027:   this_command_keys[this_command_key_count++] = c;
                   1028: 
                   1029:   /* Rereading in the middle of a command.  */
                   1030:  reread:
                   1031: 
                   1032:   last_input_char = c;
                   1033: 
                   1034:   num_input_chars++;
                   1035: 
                   1036:   /* Process the help character specially if enabled */
                   1037:   if (c == help_char && !NULL (Vhelp_form))
                   1038:     {
                   1039:       count = specpdl_ptr - specpdl;
                   1040: 
                   1041:       record_unwind_protect (Fset_window_configuration,
                   1042:                             Fcurrent_window_configuration ());
                   1043: 
                   1044:       tem = Feval (Vhelp_form);
                   1045:       if (XTYPE (tem) == Lisp_String)
                   1046:        internal_with_output_to_temp_buffer ("*Help*", print_help, tem);
                   1047: 
                   1048:       cancel_echoing ();
                   1049:       c = read_command_char (0);
                   1050:       /* Remove the help from the screen */
                   1051:       unbind_to (count);
                   1052:       redisplay ();
                   1053:       if (c == 040)
                   1054:        {
                   1055:          cancel_echoing ();
                   1056:          c = read_command_char (0);
                   1057:        }
                   1058:     }
                   1059: 
                   1060:   return c;
                   1061: }
                   1062: 
                   1063: Lisp_Object
                   1064: print_help (object)
                   1065:      Lisp_Object object;
                   1066: {
                   1067:   Fprinc (object, Qnil);
                   1068:   return Qnil;
                   1069: }
                   1070: 
                   1071: /* Low level keyboard input.
                   1072:  Read characters into kbd_buffer
                   1073:  from which they are obtained by kbd_buffer_read_command_char.  */
                   1074: 
                   1075: /* Set this for debugging, to have a way to get out */
                   1076: int stop_character;
                   1077: 
                   1078: /* Store a character obtained at interrupt level into kbd_buffer, fifo */
                   1079: kbd_buffer_store_char (c)
                   1080:      register int c;
                   1081: {
                   1082:   c &= 0377;
                   1083: 
                   1084:   if (c == quit_char
                   1085:       || ((c == (0200 | quit_char)) && !meta_key))
                   1086:     {
                   1087:       interrupt_signal ();
                   1088:       return;
                   1089:     }
                   1090: 
                   1091:   if (c && c == stop_character)
                   1092:     {
                   1093:       sys_suspend ();
                   1094:       return;
                   1095:     }
                   1096: 
                   1097:   if (kbd_ptr != kbd_buffer)
                   1098:     {
                   1099:       bcopy (kbd_ptr, kbd_buffer, kbd_count);
                   1100:       kbd_ptr = kbd_buffer;
                   1101:     }
                   1102: 
                   1103:   if (kbd_count < sizeof kbd_buffer)
                   1104:     {
                   1105:       kbd_buffer[kbd_count++] = c;
                   1106:     }
                   1107: }
                   1108: 
                   1109: kbd_buffer_read_command_char ()
                   1110: {
                   1111:   register int c;
                   1112: 
                   1113:   if (noninteractive)
                   1114:     {
                   1115:       c = getchar ();
                   1116:       return c;
                   1117:     }
                   1118: 
                   1119:   /* Either ordinary input buffer or C-g buffered means we can return.  */
                   1120:   while (!kbd_count)
                   1121:     {
                   1122:       if (!NULL (Vquit_flag))
                   1123:        quit_throw_to_read_command_char ();
                   1124: 
                   1125:       /* One way or another, wait until input is available; then, if
                   1126:         interrupt handlers have not read it, read it now.  */
                   1127: 
                   1128: #ifdef VMS
                   1129:       wait_for_kbd_input ();
                   1130: #else
                   1131: /* Note SIGIO has been undef'd if FIONREAD is missing.  */
                   1132: #ifdef SIGIO
                   1133:       gobble_input ();
                   1134: #endif /* SIGIO */
                   1135:       if (!kbd_count)
                   1136:        {
                   1137: #ifdef subprocesses
                   1138:          wait_reading_process_input (0, -1, 1);
                   1139: #else
                   1140: /* Note SIGIO has been undef'd if FIONREAD is missing.  */
                   1141: #ifdef SIGIO
                   1142:          if (interrupt_input)
                   1143:            {
                   1144:              sigblockx (SIGIO);
                   1145:              set_waiting_for_input (0);
                   1146:              while (!kbd_count)
                   1147:                sigpausex (SIGIO);
                   1148:              clear_waiting_for_input ();
                   1149:              sigunblockx (SIGIO);
                   1150:            }
                   1151: #else
                   1152:          interrupt_input = 0;
                   1153: #endif /* not SIGIO */
                   1154: #endif /* subprocesses */
                   1155: 
                   1156:          if (!interrupt_input && !kbd_count)
                   1157:            {
                   1158:              read_avail_input (0);
                   1159:            }
                   1160:        }
                   1161: #endif /* not VMS */
                   1162:     }
                   1163: 
                   1164:   input_pending = --kbd_count > 0;
                   1165:   c = *kbd_ptr;                        /* *kbd_ptr++ would have a timing error. */
                   1166:   kbd_ptr++;                   /* See kbd_buffer_store_char. */
                   1167:   return (c & (meta_key ? 0377 : 0177)); /* Clean up if sign was extended. */
                   1168: }
                   1169: 
                   1170: /* Force an attempt to read input regardless of what FIONREAD says.  */
                   1171: 
                   1172: force_input_read ()
                   1173: {
                   1174:   force_input = 1;
                   1175:   detect_input_pending ();
                   1176:   force_input = 0;
                   1177: }
                   1178: 
                   1179: /* Store into *addr the number of terminal input chars available.
                   1180:    Equivalent to ioctl (0, FIONREAD, addr) but works
                   1181:    even if FIONREAD does not exist.  */
                   1182: 
                   1183: static void
                   1184: get_input_pending (addr)
                   1185:      int *addr;
                   1186: {
                   1187: #ifdef VMS
                   1188:   /* On VMS, we always have something in the buffer
                   1189:      if any input is available.  */
                   1190:   /*** It might be simpler to make interrupt_input 1 on VMS ***/
                   1191:   *addr = kbd_count | !NULL (Vquit_flag);
                   1192: #else
                   1193:   /* First of all, have we already counted some input?  */
                   1194:   *addr = kbd_count | !NULL (Vquit_flag);
                   1195:   /* If input is being read as it arrives, and we have none, there is none.  */
                   1196:   if (*addr > 0 || (interrupt_input && ! interrupts_deferred && ! force_input))
                   1197:     return;
                   1198: #ifdef FIONREAD
                   1199:   if (! force_input)
                   1200:     {
                   1201:       /* If we can count the input without reading it, do so.  */
                   1202:       if (ioctl (0, FIONREAD, addr) < 0)
                   1203:        *addr = 0;
                   1204:       if (*addr == 0 || read_socket_hook == 0)
                   1205:        return;
                   1206:       /* If the input consists of window-events, not all of them
                   1207:         are necessarily kbd chars.  So process all the input
                   1208:         and see how many kbd chars we got.  */
                   1209:     }
                   1210: #endif
                   1211: #ifdef SIGIO
                   1212:   {
                   1213:     /* It seems there is a timing error such that a SIGIO can be handled here
                   1214:        and cause kbd_count to become nonzero even though raising of SIGIO
                   1215:        has already been turned off.  */
                   1216:     SIGMASKTYPE mask = sigblock (sigmask (SIGIO));
                   1217:     if (kbd_count == 0)
                   1218:       read_avail_input (*addr);
                   1219:     sigsetmask (mask);
                   1220:   }
                   1221: #else
                   1222:   /* If we can't count the input, read it (if any) and see what we got.  */
                   1223:   read_avail_input (*addr);
                   1224: #endif
                   1225:   *addr = kbd_count | !NULL (Vquit_flag);
                   1226: #endif
                   1227: }
                   1228: 
                   1229: /* Read pending any input out of the system and into Emacs.  */
                   1230: 
                   1231: /* This function is temporary in Emacs 18.  It is used only
                   1232:    with X windows.  X windows always turns on interrupt input
                   1233:    if possible, so this function has nothing to do except
                   1234:    on systems that don't have SIGIO.  And they also don't have FIONREAD.  */
                   1235: void
                   1236: consume_available_input ()
                   1237: {
                   1238: #ifdef SIGIO
                   1239:   if (!interrupt_input || interrupts_deferred)
                   1240: #endif
                   1241:     read_avail_input (0);
                   1242: }
                   1243: 
                   1244: /* Read any terminal input already buffered up by the system
                   1245:    into the kbd_buffer, assuming the buffer is currently empty.
                   1246:    Never waits.
                   1247: 
                   1248:    If NREAD is nonzero, assume it contains # chars of raw data waiting.
                   1249:    If it is zero, we determine that datum.
                   1250: 
                   1251:    Input gets into the kbd_buffer either through this function
                   1252:    (at main program level) or at interrupt level if input
                   1253:    is interrupt-driven.  */
                   1254: 
                   1255: static void
                   1256: read_avail_input (nread)
                   1257:      int nread;
                   1258: {
                   1259:   /* This function is not used on VMS.  */
                   1260: #ifndef VMS
                   1261:   char buf[256 * BUFFER_SIZE_FACTOR];
                   1262:   register int i;
                   1263: 
                   1264: #ifdef FIONREAD
                   1265:   if (! force_input)
                   1266:     {
                   1267:       if (nread == 0)
                   1268:        get_input_pending (&nread);
                   1269:       if (nread == 0)
                   1270:        return;
                   1271:     }
                   1272:   if (nread > sizeof buf)
                   1273:     nread = sizeof buf;
                   1274: 
                   1275:   /* Read what is waiting.  */
                   1276:   if (read_socket_hook)
                   1277:     nread = (*read_socket_hook) (0, buf, nread);
                   1278:   else
                   1279:     nread = read (0, buf, nread);
                   1280: 
                   1281: #else /* no FIONREAD */
                   1282: #ifdef USG
                   1283: #ifdef SYSV_STREAMS
                   1284:   /* When talking to Xwindows using streams, something gets screwed up
                   1285:      if Emacs alters this flag in the descriptor.  */
                   1286:   if (!read_socket_hook)
                   1287: #endif
                   1288:     fcntl (fileno (stdin), F_SETFL, O_NDELAY);
                   1289:   if (read_socket_hook)
                   1290:     {
                   1291:       nread = (*read_socket_hook) (0, buf, sizeof buf);
                   1292:     }
                   1293:   else
                   1294:     {
                   1295:       nread = read (fileno (stdin), buf, sizeof buf);
                   1296:     }
                   1297: #ifdef AIX
                   1298:   /* The kernel sometimes fails to deliver SIGHUP for ptys.
                   1299:      This looks incorrect, but it isn't, because _BSD causes
                   1300:      O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
                   1301:      and that causes a value other than 0 when there is no input.  */
                   1302:   if (nread == 0)
                   1303:     kill (SIGHUP, 0);
                   1304: #endif
                   1305: #ifdef EBADSLT
                   1306:   if (nread == -1 && (errno == EAGAIN || errno == EBADSLT))
                   1307: #else
                   1308:   if (nread == -1 && errno == EAGAIN)
                   1309: #endif
                   1310:     nread = 0;
                   1311: #ifdef SYSV_STREAMS
                   1312:   if (!read_socket_hook)
                   1313: #endif
                   1314:     fcntl (fileno (stdin), F_SETFL, 0);
                   1315: #else /* not USG */
                   1316:   you lose
                   1317: #endif /* not USG */
                   1318: #endif /* no FIONREAD */
                   1319: 
                   1320:   /* Scan the chars for C-g and store them in kbd_buffer.  */
                   1321:   if (kbd_count == 0)
                   1322:     kbd_ptr = kbd_buffer;
                   1323: 
                   1324:   for (i = 0; i < nread; i++)
                   1325:     {
                   1326:       kbd_buffer_store_char (buf[i]);
                   1327:       /* Don't look at input that follows a C-g too closely.
                   1328:         This reduces lossage due to autorepeat on C-g.  */
                   1329:       if (buf[i] == quit_char)
                   1330:        break;
                   1331:     }
                   1332: #endif /* not VMS */
                   1333: }
                   1334: 
                   1335: #ifdef SIGIO   /* for entire page */
                   1336: /* Note SIGIO has been undef'd if FIONREAD is missing.  */
                   1337: 
                   1338: /* If using interrupt input and some input chars snuck into the
                   1339:    buffer before we enabled interrupts, fake an interrupt for them.  */
                   1340: 
                   1341: gobble_input ()
                   1342: {
                   1343:   int nread;
                   1344:   if (interrupt_input)
                   1345:     {
                   1346:       if (ioctl (0, FIONREAD, &nread) < 0)
                   1347:        nread = 0;
                   1348:       if (nread)
                   1349:        {
                   1350:          sigholdx (SIGIO);
                   1351:          input_available_signal (SIGIO);
                   1352:          sigfree ();
                   1353:        }
                   1354:     }
                   1355: }
                   1356: 
                   1357: input_available_signal (signo)
                   1358:      int signo;
                   1359: {
                   1360:   unsigned char buf[256 * BUFFER_SIZE_FACTOR];
                   1361:   int nread;
                   1362:   register int i;
                   1363:   /* Must preserve main program's value of errno.  */
                   1364:   int old_errno = errno;
                   1365: #ifdef BSD4_1
                   1366:   extern int select_alarmed;
                   1367: #endif
                   1368: 
                   1369: #ifdef USG
                   1370:   /* USG systems forget handlers when they are used;
                   1371:      must reestablish each time */
                   1372:   signal (signo, input_available_signal);
                   1373: #endif /* USG */
                   1374: 
                   1375: #ifdef BSD4_1
                   1376:   sigisheld (SIGIO);
                   1377: #endif
                   1378: 
                   1379:   if (input_available_clear_word)
                   1380:     *input_available_clear_word = 0;
                   1381: 
                   1382:   while (1)
                   1383:     {
                   1384:       if (ioctl (0, FIONREAD, &nread) < 0)
                   1385:        /* Formerly simply exited the loop, but that sometimes led to
                   1386:           a failure of Emacs to terminate.
                   1387:           SIGHUP seems appropriate if we can't reach the terminal.  */
                   1388:        kill (getpid (), SIGHUP);
                   1389:       if (nread <= 0)
                   1390:        break;
                   1391: #ifdef BSD4_1
                   1392:       select_alarmed = 1;  /* Force the select emulator back to life */
                   1393: #endif
                   1394:       if (read_socket_hook)
                   1395:        {
                   1396:          nread = (*read_socket_hook) (0, buf, sizeof buf);
                   1397:          if (!nread)
                   1398:            continue;
                   1399:        }
                   1400:       else
                   1401:        {
                   1402:          if (nread > sizeof buf)
                   1403:            nread = sizeof buf;
                   1404:          nread = read (0, buf, nread);
                   1405:        }
                   1406: 
                   1407:       for (i = 0; i < nread; i++)
                   1408:        {
                   1409:          kbd_buffer_store_char (buf[i]);
                   1410:          /* Don't look at input that follows a C-g too closely.
                   1411:             This reduces lossage due to autorepeat on C-g.  */
                   1412:          if (buf[i] == quit_char)
                   1413:            break;
                   1414:        }
                   1415:     }
                   1416: #ifdef BSD4_1
                   1417:   sigfree ();
                   1418: #endif
                   1419:   errno = old_errno;
                   1420: }
                   1421: #endif /* SIGIO */
                   1422: 
                   1423: #if 0
                   1424: /* This is turned off because it didn't produce much speedup.  */
                   1425: 
                   1426: /* Read a single-char key sequence.  Do not redisplay.
                   1427:    Return 1 if successful, or 0 if what follows is not
                   1428:    a single-char key.  (In that case, a char has been unread.)
                   1429:    This is used instead of read_key_sequence as an optimization
                   1430:    just after a direct-updating command is done, since at such
                   1431:    times we know that no redisplay is required.  */
                   1432: 
                   1433: int
                   1434: fast_read_one_key (keybuf)
                   1435:      char *keybuf;
                   1436: {
                   1437:   register Lisp_Object map;
                   1438:   register int c;
                   1439:   register Lisp_Object tem;
                   1440: 
                   1441:   keys_prompt = 0;
                   1442:   /* Read a character, and do not redisplay.  */
                   1443:   c = read_command_char (-1);
                   1444:   Vquit_flag = Qnil;
                   1445: 
                   1446:   /* Assume until further notice that we are unlucky
                   1447:      and will return zero, so this char will be
                   1448:      reread by read_key_sequence.  */
                   1449: 
                   1450:   unread_command_char = c;
                   1451: 
                   1452:   if (c < 0 || c >= 0200)
                   1453:     return 0;
                   1454: 
                   1455:   map = current_buffer->keymap;
                   1456:   if (!EQ (map, Qnil))
                   1457:     {
                   1458:       tem = get_keyelt (access_keymap (map, c));
                   1459:       if (!EQ (tem, Qnil))
                   1460:        return 0;
                   1461:     }
                   1462: 
                   1463:   XSET (map, Lisp_Vector, global_map);
                   1464:   tem = !NULL (map)
                   1465:     ? get_keyelt (access_keymap (map, c))
                   1466:       : Qnil;
                   1467: 
                   1468:   read_key_sequence_cmd = tem;
                   1469: 
                   1470:   /* trace symbols to their function definitions */
                   1471: 
                   1472:   while (XTYPE (tem) == Lisp_Symbol && !NULL (tem)
                   1473:         && !EQ (tem, Qunbound))
                   1474:     tem = XSYMBOL (tem)->function;
                   1475: 
                   1476:   /* Is the definition a prefix character?  */
                   1477: 
                   1478:   if (XTYPE (tem) == Lisp_Vector ||
                   1479:       (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap)))
                   1480:     return 0;
                   1481: 
                   1482:   unread_command_char = -1;
                   1483:   keybuf[0] = c;
                   1484:   return 1;
                   1485: }
                   1486: 
                   1487: #endif /* 0 */
                   1488: 
                   1489: /* Read a sequence of keys that ends with a non prefix character,
                   1490:  and store them in KEYBUF, a buffer of size BUFSIZE.
                   1491:  Prompt with PROMPT.  Echo starting immediately unless `prompt' is 0.
                   1492:  Return the length of the key sequence stored.
                   1493:  NODISPLAY nonzero means don't do redisplay before the first character
                   1494:  (just for speedup).  */
                   1495: 
                   1496: int
                   1497: read_key_sequence (keybuf, bufsize, prompt, nodisplay)
                   1498:      char *keybuf;
                   1499:      int bufsize;
                   1500:      unsigned char *prompt;
                   1501:      int nodisplay;
                   1502: {
                   1503:   register int i;
                   1504:   Lisp_Object nextlocal, nextglobal;
                   1505:   register int c, nextc;
                   1506:   Lisp_Object local, global;
                   1507: 
                   1508:   if (FROM_KBD)
                   1509:     {
                   1510:       if (prompt)
                   1511:        echo_prompt (prompt);
                   1512:       else if (cursor_in_echo_area)
                   1513:        echo_dash ();
                   1514:     }
                   1515: 
                   1516:   nextc = read_command_char (nodisplay ? -1 : !prompt);
                   1517:   nextlocal = current_buffer->keymap;
                   1518:   XSET (nextglobal, Lisp_Vector, global_map);
                   1519: 
                   1520:   i = 0;
                   1521:   while (!NULL (nextlocal) || !NULL (nextglobal))
                   1522:     {
                   1523:       if (i == bufsize)
                   1524:        error ("key sequence too long");
                   1525: 
                   1526:       if (nextc >= 0)
                   1527:        {
                   1528:          c = nextc;
                   1529:          nextc = -1;
                   1530:        }
                   1531:       else
                   1532:        c = read_command_char (!prompt);
                   1533:       Vquit_flag = Qnil;
                   1534:       nodisplay = 0;
                   1535: 
                   1536:       if (c < 0)
                   1537:        return 0;
                   1538:       if (c >= 0200)
                   1539:        {
                   1540:          nextc = c & 0177;
                   1541:          c = meta_prefix_char;
                   1542:        }
                   1543: 
                   1544:       keybuf[i] = c;
                   1545: 
                   1546:       global = !NULL (nextglobal)
                   1547:        ? get_keyelt (access_keymap (nextglobal, c))
                   1548:          : Qnil;
                   1549: 
                   1550:       local = !NULL (nextlocal)
                   1551:        ? get_keyelt (access_keymap (nextlocal, c))
                   1552:          : Qnil;
                   1553: 
                   1554:       /* If C is not defined in either keymap
                   1555:         and it is an uppercase letter, try corresponding lowercase.  */
                   1556: 
                   1557:       if (NULL (global) && NULL (local) && UPPERCASEP (c))
                   1558:        {
                   1559:          global = !NULL (nextglobal)
                   1560:            ? get_keyelt (access_keymap (nextglobal, DOWNCASE (c)))
                   1561:              : Qnil;
                   1562: 
                   1563:          local = !NULL (nextlocal)
                   1564:            ? get_keyelt (access_keymap (nextlocal, DOWNCASE (c)))
                   1565:              : Qnil;
                   1566: 
                   1567:          /* If that has worked better that the original char,
                   1568:             downcase it permanently.  */
                   1569: 
                   1570:          if (!NULL (global) || !NULL (local))
                   1571:            {
                   1572:              keybuf[i] = c = DOWNCASE (c);
                   1573:            }
                   1574:        }
                   1575: 
                   1576:       i++;
                   1577: 
                   1578:       nextlocal = Qnil;
                   1579:       nextglobal = Qnil;
                   1580: 
                   1581:       read_key_sequence_cmd = !NULL (local) ? local : global;
                   1582: 
                   1583:       /* trace symbols to their function definitions */
                   1584: 
                   1585:       while (XTYPE (global) == Lisp_Symbol && !NULL (global)
                   1586:             && !EQ (global, Qunbound))
                   1587:        global = XSYMBOL (global)->function;
                   1588:       while (XTYPE (local) == Lisp_Symbol && !NULL (local)
                   1589:             && !EQ (local, Qunbound))
                   1590:        local = XSYMBOL (local)->function;
                   1591: 
                   1592:       /* Are the definitions prefix characters? */
                   1593: 
                   1594:       if (XTYPE (local) == Lisp_Vector ||
                   1595:          (CONSP (local) && EQ (XCONS (local)->car, Qkeymap))
                   1596:          ||
                   1597:          /* If nextc is set, we are processing a prefix char
                   1598:             that represents a meta-bit.
                   1599:             Let a global prefix definition override a local non-prefix.
                   1600:             This is for minibuffers that redefine Escape for completion.
                   1601:             A real Escape gets completion, but Meta bits get ESC-prefix.  */
                   1602:          ((NULL (local) || nextc >= 0)
                   1603:           && (XTYPE (global) == Lisp_Vector ||
                   1604:               (CONSP (global) && EQ (XCONS (global)->car, Qkeymap)))))
                   1605:        {
                   1606:          if (XTYPE (local) == Lisp_Vector ||
                   1607:              (CONSP (local) && EQ (XCONS (local)->car, Qkeymap)))
                   1608:            nextlocal = local;
                   1609:          else
                   1610:            nextlocal = Qnil;
                   1611: 
                   1612:          if (XTYPE (global) == Lisp_Vector ||
                   1613:              (CONSP (global) && EQ (XCONS (global)->car, Qkeymap)))
                   1614:            nextglobal = global;
                   1615:          else
                   1616:            nextglobal = Qnil;
                   1617:        }
                   1618:     }
                   1619: 
                   1620:   return i;
                   1621: }
                   1622: 
                   1623: DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 1, 0,
                   1624:   "Read a sequence of keystrokes and return as a string.\n\
                   1625: The sequence is sufficient to specify a non-prefix command\n\
                   1626: starting from the current local and global keymaps.\n\
                   1627: A C-g typed while in this function is treated like\n\
                   1628: any other character, and quit-flag is not set.\n\
                   1629: One arg, PROMPT, a prompt string or  nil, meaning do not prompt specially.")
                   1630:   (prompt)
                   1631:      Lisp_Object prompt;
                   1632: {
                   1633:   char keybuf[30];
                   1634:   register int i;
                   1635: 
                   1636:   if (!NULL (prompt))
                   1637:     CHECK_STRING (prompt, 0);
                   1638:   QUIT;
                   1639: 
                   1640:   this_command_key_count = 0;
                   1641:   i = read_key_sequence (keybuf, sizeof keybuf,
                   1642:                         (NULL (prompt)) ? 0 : XSTRING (prompt)->data,
                   1643:                         0);
                   1644:   return make_string (keybuf, i);
                   1645: }
                   1646: 
                   1647: DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 2, 0,
                   1648:  "Execute CMD as an editor command.\n\
                   1649: CMD must be a symbol that satisfies the `commandp' predicate.\n\
                   1650: Optional second arg RECORD-FLAG non-nil\n\
                   1651: means unconditionally put this command in the command-history.\n\
                   1652: Otherwise, this is done only if an arg is read using the minibuffer.")
                   1653:      (cmd, record)
                   1654:      Lisp_Object cmd, record;
                   1655: {
                   1656:   register Lisp_Object final;
                   1657:   register Lisp_Object tem;
                   1658:   Lisp_Object prefixarg;
                   1659:   struct backtrace backtrace;
                   1660:   extern int debug_on_next_call;
                   1661: 
                   1662:   prefixarg = Vprefix_arg, Vprefix_arg = Qnil;
                   1663:   Vcurrent_prefix_arg = prefixarg;
                   1664:   debug_on_next_call = 0;
                   1665: 
                   1666:   if (XTYPE (cmd) == Lisp_Symbol)
                   1667:     {
                   1668:       tem = Fget (cmd, Qdisabled);
                   1669:       if (!NULL (tem))
                   1670:        return call0 (Vdisabled_command_hook);
                   1671:     }
                   1672: 
                   1673:   while (1)
                   1674:     {
                   1675:       final = cmd;
                   1676:       while (XTYPE (final) == Lisp_Symbol)
                   1677:        {
                   1678:          if (EQ (Qunbound, XSYMBOL (final)->function))
                   1679:            Fsymbol_function (final);    /* Get an error! */
                   1680:          final = XSYMBOL (final)->function;
                   1681:        }
                   1682: 
                   1683:       if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
                   1684:        do_autoload (final, cmd);
                   1685:       else
                   1686:        break;
                   1687:     }
                   1688: 
                   1689:   if (CONSP (final) || XTYPE (final) == Lisp_Subr)
                   1690:     {
                   1691:       backtrace.next = backtrace_list;
                   1692:       backtrace_list = &backtrace;
                   1693:       backtrace.function = &Qcall_interactively;
                   1694:       backtrace.args = &cmd;
                   1695:       backtrace.nargs = 1;
                   1696:       backtrace.evalargs = 0;
                   1697: 
                   1698:       tem = Fcall_interactively (cmd, record);
                   1699: 
                   1700:       backtrace_list = backtrace.next;
                   1701:       return tem;
                   1702:     }
                   1703:   if (XTYPE (final) == Lisp_String)
                   1704:     {
                   1705:       return Fexecute_kbd_macro (final, prefixarg);
                   1706:     }
                   1707:   return Qnil;
                   1708: }
                   1709: 
                   1710: DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
                   1711:   1, 1, "P",
                   1712:   "Read function name, then read its arguments and call it.")
                   1713:   (prefixarg)
                   1714:      Lisp_Object prefixarg;
                   1715: {
                   1716:   Lisp_Object function;
                   1717:   char buf[40];
                   1718:   Lisp_Object saved_keys;
                   1719:   struct gcpro gcpro1;
                   1720: 
                   1721:   saved_keys = Fthis_command_keys ();
                   1722:   GCPRO1 (saved_keys);
                   1723: 
                   1724:   buf[0] = 0;
                   1725: 
                   1726:   if (EQ (prefixarg, Qminus))
                   1727:     strcpy (buf, "- ");
                   1728:   else if (CONSP (prefixarg) && XINT (XCONS (prefixarg)->car) == 4)
                   1729:     strcpy (buf, "C-u ");
                   1730:   else if (CONSP (prefixarg) && XTYPE (XCONS (prefixarg)->car) == Lisp_Int)
                   1731:     sprintf (buf, "%d ", XINT (XCONS (prefixarg)->car));
                   1732:   else if (XTYPE (prefixarg) == Lisp_Int)
                   1733:     sprintf (buf, "%d ", XINT (prefixarg));
                   1734: 
                   1735:   /* This isn't strictly correct if execute-extended-command
                   1736:      is bound to anything else */
                   1737:   strcat (buf, "M-x ");
                   1738: 
                   1739:   function = Fcompleting_read (build_string (buf), Vobarray, Qcommandp, Qt, Qnil);
                   1740: 
                   1741:   saved_keys = concat2 (saved_keys, function);
                   1742:   if (this_command_keys_size < XSTRING (saved_keys)->size)
                   1743:     {
                   1744:       /* This makes the buffer bigger than necessary, but that's okay.  */
                   1745:       this_command_keys_size += XSTRING (saved_keys)->size;
                   1746:       this_command_keys = (unsigned char *) xrealloc (this_command_keys,
                   1747:                                                      this_command_keys_size);
                   1748:     }
                   1749:   bcopy (XSTRING (saved_keys)->data, this_command_keys,
                   1750:         XSTRING (saved_keys)->size + 1);
                   1751:   this_command_key_count = XSTRING (saved_keys)->size;
                   1752: 
                   1753:   UNGCPRO;
                   1754: 
                   1755:   function = Fintern (function, Vobarray);
                   1756:   Vprefix_arg = prefixarg;
                   1757:   this_command = function;
                   1758: 
                   1759:   return Fcommand_execute (function, Qt);
                   1760: }
                   1761: 
                   1762: detect_input_pending ()
                   1763: {
                   1764:   if (!input_pending)
                   1765:     get_input_pending (&input_pending);
                   1766: 
                   1767:   return input_pending;
                   1768: }
                   1769: 
                   1770: /* This is called in some cases before a possible quit.
                   1771:    It cases the next call to detect_input_pending to recompute input_pending.
                   1772:    So calling this function unnecessarily can't do any harm.  */
                   1773: clear_input_pending ()
                   1774: {
                   1775:   input_pending = 0;
                   1776: }
                   1777: 
                   1778: DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 0, 0,
                   1779:   "T if command input is currently available with no waiting.\n\
                   1780: Actually, the value is NIL only if we can be sure that no input is available.")
                   1781:   ()
                   1782: {
                   1783:   if (unread_command_char >= 0) return Qt;
                   1784: 
                   1785:   return detect_input_pending () ? Qt : Qnil;
                   1786: }
                   1787: 
                   1788: DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 0, 0,
                   1789:   "Return string of last 100 chars read from terminal.")
                   1790:   ()
                   1791: {
                   1792:   Lisp_Object val;
                   1793:   if (total_keys < sizeof recent_keys)
                   1794:     return make_string (recent_keys, total_keys);
                   1795: 
                   1796:   val = make_string (recent_keys, sizeof recent_keys);
                   1797:   bcopy (recent_keys + recent_keys_index,
                   1798:         XSTRING (val)->data,
                   1799:         sizeof recent_keys - recent_keys_index);
                   1800:   bcopy (recent_keys,
                   1801:         XSTRING (val)->data + sizeof recent_keys - recent_keys_index,
                   1802:         recent_keys_index);
                   1803:   return val;
                   1804: }
                   1805: 
                   1806: DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
                   1807:   "Return string of the keystrokes that invoked this command.")
                   1808:   ()
                   1809: {
                   1810:   return make_string (this_command_keys, this_command_key_count);
                   1811: }
                   1812: 
                   1813: DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
                   1814:   "Return the current depth in recursive edits.")
                   1815:   ()
                   1816: {
                   1817:   Lisp_Object temp;
                   1818:   XFASTINT (temp) = command_loop_level + minibuf_level;
                   1819:   return temp;
                   1820: }
                   1821: 
                   1822: DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
                   1823:   "FOpen dribble file: ",
                   1824:   "Start writing all keyboard characters to FILE.\n\
                   1825: Use nil as an argument to close the dribble file.")
                   1826:   (file)
                   1827:      Lisp_Object file;
                   1828: {
                   1829:   if (dribble != 0)
                   1830:     fclose (dribble);
                   1831:   dribble = 0;
                   1832:   if (!NULL (file))
                   1833:     {
                   1834:       file = Fexpand_file_name (file, Qnil);
                   1835:       dribble = fopen (XSTRING (file)->data, "w");
                   1836:     }
                   1837:   return Qnil;
                   1838: }
                   1839: 
                   1840: DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
                   1841:   "Discard the contents of the terminal input buffer.\n\
                   1842: Also flush any kbd macro definition in progress.")
                   1843:   ()
                   1844: {
                   1845:   defining_kbd_macro = 0;
                   1846:   update_mode_lines++;
                   1847: 
                   1848:   unread_command_char = -1;
                   1849:   Vquit_flag = Qnil;
                   1850:   discard_tty_input ();
                   1851: 
                   1852:   kbd_count = 0;
                   1853:   input_pending = 0;
                   1854: 
                   1855:   return Qnil;
                   1856: }
                   1857: 
                   1858: DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
                   1859:   "Stop Emacs and return to superior process.  You can resume.\n\
                   1860: If optional arg STUFFSTRING is non-nil, its characters are stuffed\n\
                   1861: to be read as terminal input by Emacs's superior shell.\n\
                   1862: Before suspending, if `suspend-hook' is bound and value is non-nil\n\
                   1863: call the value as a function of no args.  Don't suspend if it returns non-nil.\n\
                   1864: Otherwise, suspend normally and after resumption call\n\
                   1865: `suspend-resume-hook' if that is bound and non-nil.")
                   1866:   (stuffstring)
                   1867:      Lisp_Object stuffstring;
                   1868: {
                   1869:   register Lisp_Object tem;
                   1870:   int count = specpdl_ptr - specpdl;
                   1871:   int old_height, old_width;
                   1872:   int width, height;
                   1873:   struct gcpro gcpro1;
                   1874:   extern init_sys_modes ();
                   1875: 
                   1876:   if (!NULL (stuffstring))
                   1877:     CHECK_STRING (stuffstring, 0);
                   1878:   GCPRO1 (stuffstring);
                   1879: 
                   1880:   /* Call value of suspend-hook
                   1881:      if it is bound and value is non-nil.  */
                   1882:   tem = intern ("suspend-hook");
                   1883:   tem = XSYMBOL (tem)->value;
                   1884:   if (! EQ (tem, Qunbound) && ! EQ (tem, Qnil))
                   1885:     {
                   1886:       tem = call0 (tem);
                   1887:       if (!EQ (tem, Qnil)) return Qnil;
                   1888:     }
                   1889: 
                   1890:   get_screen_size (&old_width, &old_height);
                   1891:   reset_sys_modes ();
                   1892:   /* sys_suspend can get an error if it tries to fork a subshell
                   1893:      and the system resources aren't available for that.  */
                   1894:   record_unwind_protect (init_sys_modes, 0);
                   1895:   stuff_buffered_input (stuffstring);
                   1896:   sys_suspend ();
                   1897:   unbind_to (count);
                   1898: 
                   1899:   /* Check if terminal/window size has changed.
                   1900:      Note that this is not useful when we are running directly
                   1901:      with a window system; but suspend should be disabled in that case.  */
                   1902:   get_screen_size (&width, &height);
                   1903:   if (width != old_width || height != old_height)
                   1904:     change_screen_size (height, width, 0, 0, 0);
                   1905: 
                   1906:   /* Call value of suspend-resume-hook
                   1907:      if it is bound and value is non-nil.  */
                   1908:   tem = intern ("suspend-resume-hook");
                   1909:   tem = XSYMBOL (tem)->value;
                   1910:   if (! EQ (tem, Qunbound) && ! EQ (tem, Qnil))
                   1911:     call0 (tem);
                   1912:   UNGCPRO;
                   1913:   return Qnil;
                   1914: }
                   1915: 
                   1916: /* If STUFFSTRING is a string, stuff its contents as pending terminal input.
                   1917:    Then in any case stuff anthing Emacs has read ahead and not used.  */
                   1918: 
                   1919: stuff_buffered_input (stuffstring)
                   1920:      Lisp_Object stuffstring;
                   1921: {
                   1922:   register unsigned char *p;
                   1923: 
                   1924: /* stuff_char works only in BSD, versions 4.2 and up.  */
                   1925: #ifdef BSD
                   1926: #ifndef BSD4_1
                   1927:   if (XTYPE (stuffstring) == Lisp_String)
                   1928:     {
                   1929:       register int count;
                   1930: 
                   1931:       p = XSTRING (stuffstring)->data;
                   1932:       count = XSTRING (stuffstring)->size;
                   1933:       while (count-- > 0)
                   1934:        stuff_char (*p++);
                   1935:       stuff_char ('\n');
                   1936:     }
                   1937:   /* Anything we have read ahead, put back for the shell to read.  */
                   1938:   while (kbd_count)
                   1939:     {
                   1940:       stuff_char (*kbd_ptr++);
                   1941:       kbd_count--;
                   1942:     }
                   1943:   input_pending = 0;
                   1944: #endif
                   1945: #endif /* BSD and not BSD4_1 */
                   1946: }
                   1947: 
                   1948: set_waiting_for_input (word_to_clear)
                   1949:      long *word_to_clear;
                   1950: {
                   1951:   input_available_clear_word = word_to_clear;
                   1952: 
                   1953:   /* Tell interrupt_signal to throw back to read_command_char,  */
                   1954:   waiting_for_input = 1;
                   1955: 
                   1956:   /* If interrupt_signal was called before and buffered a C-g,
                   1957:      make it run again now, to avoid timing error.  */
                   1958:   if (!NULL (Vquit_flag))
                   1959:     quit_throw_to_read_command_char ();
                   1960: 
                   1961:   /* Tell alarm signal to echo right away */
                   1962:   echo_now = 1;
                   1963: 
                   1964:   /* If alarm has gone off already, echo now.  */
                   1965:   if (echo_flag)
                   1966:     {
                   1967:       echo ();
                   1968:       echo_flag = 0;
                   1969:     }
                   1970: }
                   1971: 
                   1972: clear_waiting_for_input ()
                   1973: {
                   1974:   /* Tell interrupt_signal not to throw back to read_command_char,  */
                   1975:   waiting_for_input = 0;
                   1976:   echo_now = 0;
                   1977:   input_available_clear_word = 0;
                   1978: }
                   1979: 
                   1980: /* This routine is called at interrupt level in response to C-G.
                   1981:  If interrupt_input, this is the handler for SIGINT.
                   1982:  Otherwise, it is called from kbd_buffer_store_char,
                   1983:  in handling SIGIO or SIGTINT.
                   1984: 
                   1985:  If `waiting_for_input' is non zero, then unless `echoing' is nonzero,
                   1986:  immediately throw back to read_command_char.
                   1987: 
                   1988:  Otherwise it sets the Lisp variable  quit-flag  not-nil.
                   1989:  This causes  eval  to throw, when it gets a chance.
                   1990:  If  quit-flag  is already non-nil, it stops the job right away.  */
                   1991: 
                   1992: interrupt_signal ()
                   1993: {
                   1994:   char c;
                   1995:   /* Must preserve main program's value of errno.  */
                   1996:   int old_errno = errno;
                   1997:   extern Lisp_Object Vwindow_system;
                   1998: 
                   1999: #ifdef USG
                   2000:   /* USG systems forget handlers when they are used;
                   2001:      must reestablish each time */
                   2002:   signal (SIGINT, interrupt_signal);
                   2003:   signal (SIGQUIT, interrupt_signal);
                   2004: #endif /* USG */
                   2005: 
                   2006:   cancel_echoing ();
                   2007: 
                   2008:   if (!NULL (Vquit_flag) && NULL (Vwindow_system))
                   2009:     {
                   2010:       fflush (stdout);
                   2011:       reset_sys_modes ();
                   2012:       sigfree ();
                   2013: #ifdef SIGTSTP                 /* Support possible in later USG versions */
                   2014: /*
                   2015:  * On systems which can suspend the current process and return to the original
                   2016:  * shell, this command causes the user to end up back at the shell.
                   2017:  * The "Auto-save" and "Abort" questions are not asked until
                   2018:  * the user elects to return to emacs, at which point he can save the current
                   2019:  * job and either dump core or continue.
                   2020:  */
                   2021:       sys_suspend ();
                   2022: #else
                   2023: #ifdef VMS
                   2024:       if (sys_suspend () == -1)
                   2025:        {
                   2026:          printf ("Not running as a subprocess;\n");
                   2027:          printf ("you can continue or abort.\n");
                   2028:        }
                   2029: #else /* not VMS */
                   2030:       /* Perhaps should really fork an inferior shell?
                   2031:         But that would not provide any way to get back
                   2032:         to the original shell, ever.  */
                   2033:       printf ("No support for stopping a process on this operating system;\n");
                   2034:       printf ("you can continue or abort.\n");
                   2035: #endif /* not VMS */
                   2036: #endif /* not SIGTSTP */
                   2037:       printf ("Auto-save? (y or n) ");
                   2038:       fflush (stdout);
                   2039:       if (((c = getchar ()) & ~040) == 'Y')
                   2040:        Fdo_auto_save (Qnil);
                   2041:       while (c != '\n') c = getchar ();
                   2042: #ifdef VMS
                   2043:       printf ("Abort (and enter debugger)? (y or n) ");
                   2044: #else /* not VMS */
                   2045:       printf ("Abort (and dump core)? (y or n) ");
                   2046: #endif /* not VMS */
                   2047:       fflush (stdout);
                   2048:       if (((c = getchar ()) & ~040) == 'Y')
                   2049:        abort ();
                   2050:       while (c != '\n') c = getchar ();
                   2051:       printf ("Continuing...\n");
                   2052:       fflush (stdout);
                   2053:       init_sys_modes ();
                   2054:     }
                   2055:   else
                   2056:     {
                   2057:       /* If executing a function that wants to be interrupted out of
                   2058:             and the user has not deferred quitting by binding `inhibit-quit'
                   2059:             then quit right away.  */
                   2060:       if (immediate_quit && NULL (Vinhibit_quit))
                   2061:        {
                   2062:          immediate_quit = 0;
                   2063:           sigfree ();
                   2064:          Fsignal (Qquit, Qnil);
                   2065:        }
                   2066:       else
                   2067:        /* Else request quit when it's safe */
                   2068:        Vquit_flag = Qt;
                   2069:     }
                   2070: 
                   2071:   if (waiting_for_input && !echoing)
                   2072:     quit_throw_to_read_command_char ();
                   2073: 
                   2074:   errno = old_errno;
                   2075: }
                   2076: 
                   2077: /* Handle a C-g by making read_command_char return C-g.  */
                   2078: 
                   2079: quit_throw_to_read_command_char ()
                   2080: {
                   2081:   quit_error_check ();
                   2082:   sigfree ();
                   2083:   /* Prevent another signal from doing this before we finish.  */
                   2084:   waiting_for_input = 0;
                   2085:   input_pending = 0;
                   2086:   unread_command_char = -1;
                   2087: #ifdef POLL_FOR_INPUT
                   2088:   if (poll_suppress_count != 1)
                   2089:     abort ();
                   2090: #endif
                   2091:   _longjmp (getcjmp, 1);
                   2092: }
                   2093: 
                   2094: DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 2, 3, 0,
                   2095:   "Set mode of reading keyboard input.\n\
                   2096: First arg non-nil means use input interrupts; nil means use CBREAK mode.\n\
                   2097: Second arg non-nil means use ^S/^Q flow control for output to terminal\n\
                   2098:  (no effect except in CBREAK mode).\n\
                   2099: Optional third arg non-nil specifies character to use for quitting.\n\n\
                   2100: Note that the arguments will change incompatibly in version 19.")
                   2101:   (interrupt, flow, quit)
                   2102:      Lisp_Object interrupt, flow, quit;
                   2103: {
                   2104:   reset_sys_modes ();
                   2105: #ifdef SIGIO
                   2106: /* Note SIGIO has been undef'd if FIONREAD is missing.  */
                   2107: #ifdef NO_SOCK_SIGIO
                   2108:   if (read_socket_hook)
                   2109:     interrupt_input = 0;       /* No interrupts if reading from a socket.  */
                   2110:   else
                   2111: #endif /* NO_SOCK_SIGIO */
                   2112:     interrupt_input = !NULL (interrupt);
                   2113: #else /* not SIGIO */
                   2114:   interrupt_input = 0;
                   2115: #endif /* not SIGIO */
                   2116:   flow_control = !NULL (flow);
                   2117:   if (!NULL (quit))
                   2118:     {
                   2119:       CHECK_NUMBER (quit, 2);
                   2120:       quit_char = XINT (quit);
                   2121:       /* Don't let this value be out of range.  */
                   2122:       quit_char &= (meta_key ? 0377 : 0177);
                   2123:     }
                   2124:   init_sys_modes ();
                   2125:   return Qnil;
                   2126: }
                   2127: 
                   2128: init_keyboard ()
                   2129: {
                   2130:   this_command_keys_size = 40;
                   2131:   this_command_keys = (unsigned char *) xmalloc (40);
                   2132: 
                   2133:   command_loop_level = -1;     /* Correct, before outermost invocation.  */
                   2134:   quit_char = Ctl ('G');
                   2135:   immediate_quit = 0;
                   2136:   unread_command_char = -1;
                   2137:   recent_keys_index = 0;
                   2138:   total_keys = 0;
                   2139:   kbd_count = 0;
                   2140:   kbd_ptr = kbd_buffer;
                   2141:   input_pending = 0;
                   2142:   force_input = 0;
                   2143:   if (!noninteractive)
                   2144:     {
                   2145:       signal (SIGINT, interrupt_signal);
                   2146: #ifdef HAVE_TERMIO
                   2147:       /* On  systems with TERMIO, C-g is set up for both SIGINT and SIGQUIT
                   2148:         and we can't tell which one it will give us.  */
                   2149:       signal (SIGQUIT, interrupt_signal);
                   2150: #endif /* HAVE_TERMIO */
                   2151: /* Note SIGIO has been undef'd if FIONREAD is missing.  */
                   2152: #ifdef SIGIO
                   2153:       signal (SIGIO, input_available_signal);
                   2154: #endif /* SIGIO */
                   2155:     }
                   2156: 
                   2157: /* Use interrupt input by default, if it works and noninterrupt input
                   2158:    has deficiencies.  */
                   2159: 
                   2160: #ifdef INTERRUPT_INPUT
                   2161:   interrupt_input = 1;
                   2162: #else
                   2163:   interrupt_input = 0;
                   2164: #endif
                   2165: 
                   2166:   sigfree ();
                   2167:   dribble = 0;
                   2168: 
                   2169:   if (keyboard_init_hook)
                   2170:     (*keyboard_init_hook) ();
                   2171: 
                   2172:   poll_suppress_count = 1;
                   2173: #ifdef POLL_FOR_INPUT
                   2174:   start_polling ();
                   2175: #endif
                   2176: }
                   2177: 
                   2178: syms_of_keyboard ()
                   2179: {
                   2180:   Qself_insert_command = intern ("self-insert-command");
                   2181:   staticpro (&Qself_insert_command);
                   2182: 
                   2183:   Qforward_char = intern ("forward-char");
                   2184:   staticpro (&Qforward_char);
                   2185: 
                   2186:   Qbackward_char = intern ("backward-char");
                   2187:   staticpro (&Qbackward_char);
                   2188: 
                   2189:   Qdisabled = intern ("disabled");
                   2190:   staticpro (&Qdisabled);
                   2191: 
                   2192:   defsubr (&Sread_key_sequence);
                   2193:   defsubr (&Srecursive_edit);
                   2194:   defsubr (&Sinput_pending_p);
                   2195:   defsubr (&Scommand_execute);
                   2196:   defsubr (&Srecent_keys);
                   2197:   defsubr (&Sthis_command_keys);
                   2198:   defsubr (&Ssuspend_emacs);
                   2199:   defsubr (&Sabort_recursive_edit);
                   2200:   defsubr (&Sexit_recursive_edit);
                   2201:   defsubr (&Srecursion_depth);
                   2202:   defsubr (&Stop_level);
                   2203:   defsubr (&Sdiscard_input);
                   2204:   defsubr (&Sopen_dribble_file);
                   2205:   defsubr (&Sset_input_mode);
                   2206:   defsubr (&Sexecute_extended_command);
                   2207: 
                   2208:   DEFVAR_LISP ("disabled-command-hook", &Vdisabled_command_hook,
                   2209:     "Value is called instead of any command that is disabled\n\
                   2210: \(has a non-nil  disabled  property).");
                   2211: 
                   2212:   DEFVAR_BOOL ("meta-flag", &meta_key,
                   2213:     "*Non-nil means treat 0200 bit in terminal input as Meta bit.");
                   2214: 
                   2215:   DEFVAR_INT ("last-command-char", &last_command_char,
                   2216:     "Last terminal input character that was part of a command, as an integer.");
                   2217: 
                   2218:   DEFVAR_INT ("last-input-char", &last_input_char,
                   2219:     "Last terminal input character, as an integer.");
                   2220: 
                   2221:   DEFVAR_INT ("unread-command-char", &unread_command_char,
                   2222:     "Character to be read as next input from command input stream, or -1 if none.");
                   2223: 
                   2224:   DEFVAR_INT ("meta-prefix-char", &meta_prefix_char,
                   2225:     "Meta-prefix character code.  Meta-foo as command input\n\
                   2226: turns into this character followed by foo.");
                   2227:   meta_prefix_char = 033;
                   2228: 
                   2229:   DEFVAR_LISP ("last-command", &last_command,
                   2230:     "The last command executed.  Normally a symbol with a function definition,\n\
                   2231: but can be whatever was found in the keymap, or whatever the variable\n\
                   2232: `this-command' was set to by that command.");
                   2233:   last_command = Qnil;
                   2234: 
                   2235:   DEFVAR_LISP ("this-command", &this_command,
                   2236:     "The command now being executed.\n\
                   2237: The command can set this variable; whatever is put here\n\
                   2238: will be in  last-command  during the following command.");
                   2239:   this_command = Qnil;
                   2240: 
                   2241:   DEFVAR_INT ("auto-save-interval", &auto_save_interval,
                   2242:     "*Number of keyboard input characters between auto-saves.\n\
                   2243: Zero means disable autosaving.");
                   2244:   auto_save_interval = 300;
                   2245: 
                   2246:   DEFVAR_INT ("echo-keystrokes", &echo_keystrokes,
                   2247:     "*Nonzero means echo unfinished commands after this many seconds of pause.");
                   2248:   echo_keystrokes = 1;
                   2249: 
                   2250:   DEFVAR_INT ("polling-period", &polling_period,
                   2251:     "*Interval between polling for input during Lisp execution.\n\
                   2252: The reason for polling is to make C-g work to stop a running program.\n\
                   2253: Polling is needed only when using X windows and SIGIO does not work.\n\
                   2254: Polling is automatically disabled in all other cases.");
                   2255:   polling_period = 2;
                   2256: 
                   2257:   DEFVAR_INT ("help-char", &help_char,
                   2258:     "Character to recognize as meaning Help.\n\
                   2259: When it is read, do (eval help-form), and display result if it's a string.\n\
                   2260: If help-form's value is nil, this char can be read normally.");
                   2261:   help_char = Ctl ('H');
                   2262: 
                   2263:   DEFVAR_LISP ("help-form", &Vhelp_form,
                   2264:     "Form to execute when character help-char is read.\n\
                   2265: If the form returns a string, that string is displayed.\n\
                   2266: If help-form is nil, the help char is not recognized.");
                   2267:   Vhelp_form = Qnil;
                   2268:   
                   2269:   DEFVAR_LISP ("top-level", &Vtop_level,
                   2270:     "Form to evaluate when Emacs starts up.\n\
                   2271: Useful to set before you dump a modified Emacs.");
                   2272:   Vtop_level = Qnil;
                   2273: 
                   2274:   DEFVAR_LISP ("keyboard-translate-table", &Vkeyboard_translate_table,
                   2275:     "String used as translate table for keyboard input, or nil.\n\
                   2276: Each character is looked up in this string and the contents used instead.\n\
                   2277: If string is of length N, character codes N and up are untranslated."); 
                   2278:   Vkeyboard_translate_table = Qnil;
                   2279: }
                   2280: 
                   2281: keys_of_keyboard ()
                   2282: {
                   2283:   ndefkey (Vglobal_map, Ctl ('Z'), "suspend-emacs");
                   2284:   ndefkey (Vctl_x_map, Ctl ('Z'), "suspend-emacs");
                   2285:   ndefkey (Vesc_map, Ctl ('C'), "exit-recursive-edit");
                   2286:   ndefkey (Vglobal_map, Ctl (']'), "abort-recursive-edit");
                   2287:   ndefkey (Vesc_map, 'x', "execute-extended-command");
                   2288: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.