Annotation of GNUtools/emacs/src/keyboard.c, revision 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.