* readline.c (insert_some_chars): Return void.
[deliverable/binutils-gdb.git] / readline / readline.c
1 /* readline.c -- a general facility for reading lines of input
2 with emacs style editing and completion. */
3
4 /* Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
5
6 This file contains the Readline Library (the Library), a set of
7 routines for providing Emacs style line input to programs that ask
8 for it.
9
10 The Library is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 The Library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24 /* Remove these declarations when we have a complete libgnu.a. */
25 /* #define STATIC_MALLOC */
26 #if !defined (STATIC_MALLOC)
27 extern char *xmalloc (), *xrealloc ();
28 #else
29 static char *xmalloc (), *xrealloc ();
30 #endif /* STATIC_MALLOC */
31
32 #include "sysdep.h"
33 #include <sys/types.h>
34 #include <stdio.h>
35 #include <fcntl.h>
36 #ifndef NO_SYS_FILE
37 #include <sys/file.h>
38 #endif
39 #include <signal.h>
40
41 #if defined (HAVE_UNISTD_H)
42 # include <unistd.h>
43 #endif
44
45 #define NEW_TTY_DRIVER
46 #define HAVE_BSD_SIGNALS
47 /* #define USE_XON_XOFF */
48
49 #ifdef __MSDOS__
50 #undef NEW_TTY_DRIVER
51 #undef HAVE_BSD_SIGNALS
52 #endif
53
54 /* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */
55 #if defined (USG) && !defined (hpux)
56 #undef HAVE_BSD_SIGNALS
57 #endif
58
59 /* System V machines use termio. */
60 #if !defined (_POSIX_VERSION)
61 # if defined (USG) || defined (hpux) || defined (Xenix) || defined (sgi) || defined (DGUX)
62 # undef NEW_TTY_DRIVER
63 # define TERMIO_TTY_DRIVER
64 # include <termio.h>
65 # if !defined (TCOON)
66 # define TCOON 1
67 # endif
68 # endif /* USG || hpux || Xenix || sgi || DUGX */
69 #endif /* !_POSIX_VERSION */
70
71 /* Posix systems use termios and the Posix signal functions. */
72 #if defined (_POSIX_VERSION)
73 # if !defined (TERMIOS_MISSING)
74 # undef NEW_TTY_DRIVER
75 # define TERMIOS_TTY_DRIVER
76 # include <termios.h>
77 # endif /* !TERMIOS_MISSING */
78 # define HAVE_POSIX_SIGNALS
79 # if !defined (O_NDELAY)
80 # define O_NDELAY O_NONBLOCK /* Posix-style non-blocking i/o */
81 # endif /* O_NDELAY */
82 #endif /* _POSIX_VERSION */
83
84 /* Other (BSD) machines use sgtty. */
85 #if defined (NEW_TTY_DRIVER)
86 #include <sgtty.h>
87 #endif
88
89 /* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
90 it is not already defined. It is used both to determine if a
91 special character is disabled and to disable certain special
92 characters. Posix systems should set to 0, USG systems to -1. */
93 #if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE)
94 # if defined (_POSIX_VERSION)
95 # define _POSIX_VDISABLE 0
96 # else /* !_POSIX_VERSION */
97 # define _POSIX_VDISABLE -1
98 # endif /* !_POSIX_VERSION */
99 #endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */
100
101 #include <errno.h>
102 extern int errno;
103
104 #include <setjmp.h>
105 #include <sys/stat.h>
106
107 /* Posix macro to check file in statbuf for directory-ness. */
108 #if defined (S_IFDIR) && !defined (S_ISDIR)
109 #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
110 #endif
111
112 #ifndef __MSDOS__
113 /* These next are for filename completion. Perhaps this belongs
114 in a different place. */
115 #include <pwd.h>
116 #endif /* __MSDOS__ */
117
118 #if defined (USG) && !defined (isc386) && !defined (sgi)
119 struct passwd *getpwuid (), *getpwent ();
120 #endif
121
122 /* #define HACK_TERMCAP_MOTION */
123
124 /* Some standard library routines. */
125 #include "readline.h"
126 #include "history.h"
127
128 #ifndef digit
129 #define digit(c) ((c) >= '0' && (c) <= '9')
130 #endif
131
132 #ifndef isletter
133 #define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
134 #endif
135
136 #ifndef digit_value
137 #define digit_value(c) ((c) - '0')
138 #endif
139
140 #ifndef member
141 #define member(c, s) ((c) ? index ((s), (c)) : 0)
142 #endif
143
144 #ifndef isident
145 #define isident(c) ((isletter(c) || digit(c) || c == '_'))
146 #endif
147
148 #ifndef exchange
149 #define exchange(x, y) {int temp = x; x = y; y = temp;}
150 #endif
151
152 #if !defined (rindex)
153 extern char *rindex ();
154 #endif /* rindex */
155
156 #if !defined (index)
157 extern char *index ();
158 #endif /* index */
159
160 extern char *getenv ();
161 extern char *tilde_expand ();
162
163 static update_line ();
164 static void output_character_function ();
165 static delete_chars ();
166 static void insert_some_chars ();
167
168 #if defined (VOID_SIGHANDLER)
169 # define sighandler void
170 #else
171 # define sighandler int
172 #endif /* VOID_SIGHANDLER */
173
174 /* This typedef is equivalant to the one for Function; it allows us
175 to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */
176 typedef sighandler SigHandler ();
177
178 /* If on, then readline handles signals in a way that doesn't screw. */
179 #define HANDLE_SIGNALS
180
181 #ifdef __GO32__
182 #include <sys/pc.h>
183 #undef HANDLE_SIGNALS
184 #endif
185
186 \f
187 /* **************************************************************** */
188 /* */
189 /* Line editing input utility */
190 /* */
191 /* **************************************************************** */
192
193 /* A pointer to the keymap that is currently in use.
194 By default, it is the standard emacs keymap. */
195 Keymap keymap = emacs_standard_keymap;
196
197 #define no_mode -1
198 #define vi_mode 0
199 #define emacs_mode 1
200
201 /* The current style of editing. */
202 int rl_editing_mode = emacs_mode;
203
204 /* Non-zero if the previous command was a kill command. */
205 static int last_command_was_kill = 0;
206
207 /* The current value of the numeric argument specified by the user. */
208 int rl_numeric_arg = 1;
209
210 /* Non-zero if an argument was typed. */
211 int rl_explicit_arg = 0;
212
213 /* Temporary value used while generating the argument. */
214 int rl_arg_sign = 1;
215
216 /* Non-zero means we have been called at least once before. */
217 static int rl_initialized = 0;
218
219 /* If non-zero, this program is running in an EMACS buffer. */
220 static char *running_in_emacs = (char *)NULL;
221
222 /* The current offset in the current input line. */
223 int rl_point;
224
225 /* Mark in the current input line. */
226 int rl_mark;
227
228 /* Length of the current input line. */
229 int rl_end;
230
231 /* Make this non-zero to return the current input_line. */
232 int rl_done;
233
234 /* The last function executed by readline. */
235 Function *rl_last_func = (Function *)NULL;
236
237 /* Top level environment for readline_internal (). */
238 static jmp_buf readline_top_level;
239
240 /* The streams we interact with. */
241 static FILE *in_stream, *out_stream;
242
243 /* The names of the streams that we do input and output to. */
244 FILE *rl_instream, *rl_outstream;
245
246 /* Non-zero means echo characters as they are read. */
247 int readline_echoing_p = 1;
248
249 /* Current prompt. */
250 char *rl_prompt;
251
252 /* The number of characters read in order to type this complete command. */
253 int rl_key_sequence_length = 0;
254
255 /* If non-zero, then this is the address of a function to call just
256 before readline_internal () prints the first prompt. */
257 Function *rl_startup_hook = (Function *)NULL;
258
259 /* If non-zero, then this is the address of a function to call when
260 completing on a directory name. The function is called with
261 the address of a string (the current directory name) as an arg. */
262 Function *rl_symbolic_link_hook = (Function *)NULL;
263
264 /* What we use internally. You should always refer to RL_LINE_BUFFER. */
265 static char *the_line;
266
267 /* The character that can generate an EOF. Really read from
268 the terminal driver... just defaulted here. */
269 static int eof_char = CTRL ('D');
270
271 /* Non-zero makes this the next keystroke to read. */
272 int rl_pending_input = 0;
273
274 /* Pointer to a useful terminal name. */
275 char *rl_terminal_name = (char *)NULL;
276
277 /* Line buffer and maintenence. */
278 char *rl_line_buffer = (char *)NULL;
279 int rl_line_buffer_len = 0;
280 #define DEFAULT_BUFFER_SIZE 256
281
282 \f
283 /* **************************************************************** */
284 /* */
285 /* `Forward' declarations */
286 /* */
287 /* **************************************************************** */
288
289 /* Non-zero means do not parse any lines other than comments and
290 parser directives. */
291 static unsigned char parsing_conditionalized_out = 0;
292
293 /* Caseless strcmp (). */
294 static int stricmp (), strnicmp ();
295 static char *strpbrk ();
296
297 /* Non-zero means to save keys that we dispatch on in a kbd macro. */
298 static int defining_kbd_macro = 0;
299
300 \f
301 /* **************************************************************** */
302 /* */
303 /* Top Level Functions */
304 /* */
305 /* **************************************************************** */
306
307 static void rl_prep_terminal (), rl_deprep_terminal ();
308
309 /* Read a line of input. Prompt with PROMPT. A NULL PROMPT means
310 none. A return value of NULL means that EOF was encountered. */
311 char *
312 readline (prompt)
313 char *prompt;
314 {
315 char *readline_internal ();
316 char *value;
317
318 rl_prompt = prompt;
319
320 /* If we are at EOF return a NULL string. */
321 if (rl_pending_input == EOF)
322 {
323 rl_pending_input = 0;
324 return ((char *)NULL);
325 }
326
327 rl_initialize ();
328 rl_prep_terminal ();
329
330 #if defined (HANDLE_SIGNALS)
331 rl_set_signals ();
332 #endif
333
334 value = readline_internal ();
335 rl_deprep_terminal ();
336
337 #if defined (HANDLE_SIGNALS)
338 rl_clear_signals ();
339 #endif
340
341 return (value);
342 }
343
344 /* Read a line of input from the global rl_instream, doing output on
345 the global rl_outstream.
346 If rl_prompt is non-null, then that is our prompt. */
347 char *
348 readline_internal ()
349 {
350 int lastc, c, eof_found;
351
352 in_stream = rl_instream;
353 out_stream = rl_outstream;
354
355 lastc = -1;
356 eof_found = 0;
357
358 if (rl_startup_hook)
359 (*rl_startup_hook) ();
360
361 if (!readline_echoing_p)
362 {
363 if (rl_prompt)
364 {
365 fprintf (out_stream, "%s", rl_prompt);
366 fflush (out_stream);
367 }
368 }
369 else
370 {
371 rl_on_new_line ();
372 rl_redisplay ();
373 #if defined (VI_MODE)
374 if (rl_editing_mode == vi_mode)
375 rl_vi_insertion_mode ();
376 #endif /* VI_MODE */
377 }
378
379 while (!rl_done)
380 {
381 int lk = last_command_was_kill;
382 int code = setjmp (readline_top_level);
383
384 if (code)
385 rl_redisplay ();
386
387 if (!rl_pending_input)
388 {
389 /* Then initialize the argument and number of keys read. */
390 rl_init_argument ();
391 rl_key_sequence_length = 0;
392 }
393
394 c = rl_read_key ();
395
396 /* EOF typed to a non-blank line is a <NL>. */
397 if (c == EOF && rl_end)
398 c = NEWLINE;
399
400 /* The character eof_char typed to blank line, and not as the
401 previous character is interpreted as EOF. */
402 if (((c == eof_char && lastc != c) || c == EOF) && !rl_end)
403 {
404 eof_found = 1;
405 break;
406 }
407
408 lastc = c;
409 rl_dispatch (c, keymap);
410
411 /* If there was no change in last_command_was_kill, then no kill
412 has taken place. Note that if input is pending we are reading
413 a prefix command, so nothing has changed yet. */
414 if (!rl_pending_input)
415 {
416 if (lk == last_command_was_kill)
417 last_command_was_kill = 0;
418 }
419
420 #if defined (VI_MODE)
421 /* In vi mode, when you exit insert mode, the cursor moves back
422 over the previous character. We explicitly check for that here. */
423 if (rl_editing_mode == vi_mode && keymap == vi_movement_keymap)
424 rl_vi_check ();
425 #endif /* VI_MODE */
426
427 if (!rl_done)
428 rl_redisplay ();
429 }
430
431 /* Restore the original of this history line, iff the line that we
432 are editing was originally in the history, AND the line has changed. */
433 {
434 HIST_ENTRY *entry = current_history ();
435
436 if (entry && rl_undo_list)
437 {
438 char *temp = savestring (the_line);
439 rl_revert_line ();
440 entry = replace_history_entry (where_history (), the_line,
441 (HIST_ENTRY *)NULL);
442 free_history_entry (entry);
443
444 strcpy (the_line, temp);
445 free (temp);
446 }
447 }
448
449 /* At any rate, it is highly likely that this line has an undo list. Get
450 rid of it now. */
451 if (rl_undo_list)
452 free_undo_list ();
453
454 if (eof_found)
455 return (char *)NULL;
456 else
457 return (savestring (the_line));
458 }
459
460 \f
461 /* **************************************************************** */
462 /* */
463 /* Signal Handling */
464 /* */
465 /* **************************************************************** */
466
467 #if defined (SIGWINCH)
468 static SigHandler *old_sigwinch = (SigHandler *)NULL;
469
470 static sighandler
471 rl_handle_sigwinch (sig)
472 int sig;
473 {
474 char *term;
475
476 term = rl_terminal_name;
477
478 if (readline_echoing_p)
479 {
480 if (!term)
481 term = getenv ("TERM");
482 if (!term)
483 term = "dumb";
484 rl_reset_terminal (term);
485 #if defined (NOTDEF)
486 crlf ();
487 rl_forced_update_display ();
488 #endif /* NOTDEF */
489 }
490
491 if (old_sigwinch &&
492 old_sigwinch != (SigHandler *)SIG_IGN &&
493 old_sigwinch != (SigHandler *)SIG_DFL)
494 (*old_sigwinch) (sig);
495 #if !defined (VOID_SIGHANDLER)
496 return (0);
497 #endif /* VOID_SIGHANDLER */
498 }
499 #endif /* SIGWINCH */
500
501 #if defined (HANDLE_SIGNALS)
502 /* Interrupt handling. */
503 static SigHandler
504 *old_int = (SigHandler *)NULL,
505 *old_tstp = (SigHandler *)NULL,
506 *old_ttou = (SigHandler *)NULL,
507 *old_ttin = (SigHandler *)NULL,
508 *old_cont = (SigHandler *)NULL,
509 *old_alrm = (SigHandler *)NULL;
510
511 /* Handle an interrupt character. */
512 static sighandler
513 rl_signal_handler (sig)
514 int sig;
515 {
516 #if !defined (HAVE_BSD_SIGNALS)
517 /* Since the signal will not be blocked while we are in the signal
518 handler, ignore it until rl_clear_signals resets the catcher. */
519 if (sig == SIGINT)
520 signal (sig, SIG_IGN);
521 #endif /* !HAVE_BSD_SIGNALS */
522
523 switch (sig)
524 {
525 case SIGINT:
526 free_undo_list ();
527 rl_clear_message ();
528 rl_init_argument ();
529
530 #if defined (SIGTSTP)
531 case SIGTSTP:
532 case SIGTTOU:
533 case SIGTTIN:
534 #endif /* SIGTSTP */
535 case SIGALRM:
536 rl_clean_up_for_exit ();
537 rl_deprep_terminal ();
538 rl_clear_signals ();
539 rl_pending_input = 0;
540
541 kill (getpid (), sig);
542
543 #if defined (HAVE_POSIX_SIGNALS)
544 {
545 sigset_t set;
546
547 sigemptyset (&set);
548 sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL);
549 }
550 #else
551 #if defined (HAVE_BSD_SIGNALS)
552 sigsetmask (0);
553 #endif /* HAVE_BSD_SIGNALS */
554 #endif /* HAVE_POSIX_SIGNALS */
555
556 rl_prep_terminal ();
557 rl_set_signals ();
558 }
559
560 #if !defined (VOID_SIGHANDLER)
561 return (0);
562 #endif /* !VOID_SIGHANDLER */
563 }
564
565 rl_set_signals ()
566 {
567 old_int = (SigHandler *)signal (SIGINT, rl_signal_handler);
568 if (old_int == (SigHandler *)SIG_IGN)
569 signal (SIGINT, SIG_IGN);
570
571 old_alrm = (SigHandler *)signal (SIGALRM, rl_signal_handler);
572 if (old_alrm == (SigHandler *)SIG_IGN)
573 signal (SIGALRM, SIG_IGN);
574
575 #if defined (SIGTSTP)
576 old_tstp = (SigHandler *)signal (SIGTSTP, rl_signal_handler);
577 if (old_tstp == (SigHandler *)SIG_IGN)
578 signal (SIGTSTP, SIG_IGN);
579 #endif
580 #if defined (SIGTTOU)
581 old_ttou = (SigHandler *)signal (SIGTTOU, rl_signal_handler);
582 old_ttin = (SigHandler *)signal (SIGTTIN, rl_signal_handler);
583
584 if (old_tstp == (SigHandler *)SIG_IGN)
585 {
586 signal (SIGTTOU, SIG_IGN);
587 signal (SIGTTIN, SIG_IGN);
588 }
589 #endif
590
591 #if defined (SIGWINCH)
592 old_sigwinch = (SigHandler *)signal (SIGWINCH, rl_handle_sigwinch);
593 #endif
594 }
595
596 rl_clear_signals ()
597 {
598 signal (SIGINT, old_int);
599 signal (SIGALRM, old_alrm);
600
601 #if defined (SIGTSTP)
602 signal (SIGTSTP, old_tstp);
603 #endif
604
605 #if defined (SIGTTOU)
606 signal (SIGTTOU, old_ttou);
607 signal (SIGTTIN, old_ttin);
608 #endif
609
610 #if defined (SIGWINCH)
611 signal (SIGWINCH, old_sigwinch);
612 #endif
613 }
614 #endif /* HANDLE_SIGNALS */
615
616 \f
617 /* **************************************************************** */
618 /* */
619 /* Character Input Buffering */
620 /* */
621 /* **************************************************************** */
622
623 #if defined (USE_XON_XOFF)
624 /* If the terminal was in xoff state when we got to it, then xon_char
625 contains the character that is supposed to start it again. */
626 static int xon_char, xoff_state;
627 #endif /* USE_XON_XOFF */
628
629 static int pop_index = 0, push_index = 0, ibuffer_len = 511;
630 static unsigned char ibuffer[512];
631
632 /* Non-null means it is a pointer to a function to run while waiting for
633 character input. */
634 Function *rl_event_hook = (Function *)NULL;
635
636 #define any_typein (push_index != pop_index)
637
638 /* Add KEY to the buffer of characters to be read. */
639 rl_stuff_char (key)
640 int key;
641 {
642 if (key == EOF)
643 {
644 key = NEWLINE;
645 rl_pending_input = EOF;
646 }
647 ibuffer[push_index++] = key;
648 if (push_index >= ibuffer_len)
649 push_index = 0;
650 }
651
652 /* Return the amount of space available in the
653 buffer for stuffing characters. */
654 int
655 ibuffer_space ()
656 {
657 if (pop_index > push_index)
658 return (pop_index - push_index);
659 else
660 return (ibuffer_len - (push_index - pop_index));
661 }
662
663 /* Get a key from the buffer of characters to be read.
664 Return the key in KEY.
665 Result is KEY if there was a key, or 0 if there wasn't. */
666 int
667 rl_get_char (key)
668 int *key;
669 {
670 if (push_index == pop_index)
671 return (0);
672
673 *key = ibuffer[pop_index++];
674
675 if (pop_index >= ibuffer_len)
676 pop_index = 0;
677
678 return (1);
679 }
680
681 /* Stuff KEY into the *front* of the input buffer.
682 Returns non-zero if successful, zero if there is
683 no space left in the buffer. */
684 int
685 rl_unget_char (key)
686 int key;
687 {
688 if (ibuffer_space ())
689 {
690 pop_index--;
691 if (pop_index < 0)
692 pop_index = ibuffer_len - 1;
693 ibuffer[pop_index] = key;
694 return (1);
695 }
696 return (0);
697 }
698
699 /* If a character is available to be read, then read it
700 and stuff it into IBUFFER. Otherwise, just return. */
701 rl_gather_tyi ()
702 {
703 #ifdef __GO32__
704 char input;
705 if (isatty(0))
706 {
707 int i = rl_getc();
708 if (i != EOF)
709 rl_stuff_char(i);
710 }
711 else
712 if (kbhit() && ibuffer_space())
713 rl_stuff_char(getkey());
714 #else
715 int tty = fileno (in_stream);
716 register int tem, result = -1;
717 long chars_avail;
718 char input;
719
720 #if defined (FIONREAD)
721 result = ioctl (tty, FIONREAD, &chars_avail);
722 #endif
723
724 if (result == -1)
725 {
726 int flags;
727
728 flags = fcntl (tty, F_GETFL, 0);
729
730 fcntl (tty, F_SETFL, (flags | O_NDELAY));
731 chars_avail = read (tty, &input, 1);
732
733 fcntl (tty, F_SETFL, flags);
734 if (chars_avail == -1 && errno == EAGAIN)
735 return;
736 }
737
738 /* If there's nothing available, don't waste time trying to read
739 something. */
740 if (chars_avail == 0)
741 return;
742
743 tem = ibuffer_space ();
744
745 if (chars_avail > tem)
746 chars_avail = tem;
747
748 /* One cannot read all of the available input. I can only read a single
749 character at a time, or else programs which require input can be
750 thwarted. If the buffer is larger than one character, I lose.
751 Damn! */
752 if (tem < ibuffer_len)
753 chars_avail = 0;
754
755 if (result != -1)
756 {
757 while (chars_avail--)
758 rl_stuff_char (rl_getc (in_stream));
759 }
760 else
761 {
762 if (chars_avail)
763 rl_stuff_char (input);
764 }
765 #endif /* def __GO32__/else */
766 }
767
768 static int next_macro_key ();
769 /* Read a key, including pending input. */
770 int
771 rl_read_key ()
772 {
773 int c;
774
775 rl_key_sequence_length++;
776
777 if (rl_pending_input)
778 {
779 c = rl_pending_input;
780 rl_pending_input = 0;
781 }
782 else
783 {
784 /* If input is coming from a macro, then use that. */
785 if (c = next_macro_key ())
786 return (c);
787
788 /* If the user has an event function, then call it periodically. */
789 if (rl_event_hook)
790 {
791 while (rl_event_hook && !rl_get_char (&c))
792 {
793 (*rl_event_hook) ();
794 rl_gather_tyi ();
795 }
796 }
797 else
798 {
799 if (!rl_get_char (&c))
800 c = rl_getc (in_stream);
801 }
802 }
803
804 return (c);
805 }
806
807 /* I'm beginning to hate the declaration rules for various compilers. */
808 static void add_macro_char (), with_macro_input ();
809
810 /* Do the command associated with KEY in MAP.
811 If the associated command is really a keymap, then read
812 another key, and dispatch into that map. */
813 rl_dispatch (key, map)
814 register int key;
815 Keymap map;
816 {
817
818 if (defining_kbd_macro)
819 add_macro_char (key);
820
821 if (key > 127 && key < 256)
822 {
823 if (map[ESC].type == ISKMAP)
824 {
825 map = (Keymap)map[ESC].function;
826 key -= 128;
827 rl_dispatch (key, map);
828 }
829 else
830 ding ();
831 return;
832 }
833
834 switch (map[key].type)
835 {
836 case ISFUNC:
837 {
838 Function *func = map[key].function;
839
840 if (func != (Function *)NULL)
841 {
842 /* Special case rl_do_lowercase_version (). */
843 if (func == rl_do_lowercase_version)
844 {
845 rl_dispatch (to_lower (key), map);
846 return;
847 }
848
849 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
850
851 /* If we have input pending, then the last command was a prefix
852 command. Don't change the state of rl_last_func. Otherwise,
853 remember the last command executed in this variable. */
854 if (!rl_pending_input)
855 rl_last_func = map[key].function;
856 }
857 else
858 {
859 rl_abort ();
860 return;
861 }
862 }
863 break;
864
865 case ISKMAP:
866 if (map[key].function != (Function *)NULL)
867 {
868 int newkey;
869
870 rl_key_sequence_length++;
871 newkey = rl_read_key ();
872 rl_dispatch (newkey, (Keymap)map[key].function);
873 }
874 else
875 {
876 rl_abort ();
877 return;
878 }
879 break;
880
881 case ISMACR:
882 if (map[key].function != (Function *)NULL)
883 {
884 char *macro;
885
886 macro = savestring ((char *)map[key].function);
887 with_macro_input (macro);
888 return;
889 }
890 break;
891 }
892 }
893
894 \f
895 /* **************************************************************** */
896 /* */
897 /* Hacking Keyboard Macros */
898 /* */
899 /* **************************************************************** */
900
901 /* The currently executing macro string. If this is non-zero,
902 then it is a malloc ()'ed string where input is coming from. */
903 static char *executing_macro = (char *)NULL;
904
905 /* The offset in the above string to the next character to be read. */
906 static int executing_macro_index = 0;
907
908 /* The current macro string being built. Characters get stuffed
909 in here by add_macro_char (). */
910 static char *current_macro = (char *)NULL;
911
912 /* The size of the buffer allocated to current_macro. */
913 static int current_macro_size = 0;
914
915 /* The index at which characters are being added to current_macro. */
916 static int current_macro_index = 0;
917
918 /* A structure used to save nested macro strings.
919 It is a linked list of string/index for each saved macro. */
920 struct saved_macro {
921 struct saved_macro *next;
922 char *string;
923 int index;
924 };
925
926 /* The list of saved macros. */
927 struct saved_macro *macro_list = (struct saved_macro *)NULL;
928
929 /* Forward declarations of static functions. Thank you C. */
930 static void push_executing_macro (), pop_executing_macro ();
931
932 /* This one has to be declared earlier in the file. */
933 /* static void add_macro_char (); */
934
935 /* Set up to read subsequent input from STRING.
936 STRING is free ()'ed when we are done with it. */
937 static void
938 with_macro_input (string)
939 char *string;
940 {
941 push_executing_macro ();
942 executing_macro = string;
943 executing_macro_index = 0;
944 }
945
946 /* Return the next character available from a macro, or 0 if
947 there are no macro characters. */
948 static int
949 next_macro_key ()
950 {
951 if (!executing_macro)
952 return (0);
953
954 if (!executing_macro[executing_macro_index])
955 {
956 pop_executing_macro ();
957 return (next_macro_key ());
958 }
959
960 return (executing_macro[executing_macro_index++]);
961 }
962
963 /* Save the currently executing macro on a stack of saved macros. */
964 static void
965 push_executing_macro ()
966 {
967 struct saved_macro *saver;
968
969 saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
970 saver->next = macro_list;
971 saver->index = executing_macro_index;
972 saver->string = executing_macro;
973
974 macro_list = saver;
975 }
976
977 /* Discard the current macro, replacing it with the one
978 on the top of the stack of saved macros. */
979 static void
980 pop_executing_macro ()
981 {
982 if (executing_macro)
983 free (executing_macro);
984
985 executing_macro = (char *)NULL;
986 executing_macro_index = 0;
987
988 if (macro_list)
989 {
990 struct saved_macro *disposer = macro_list;
991 executing_macro = macro_list->string;
992 executing_macro_index = macro_list->index;
993 macro_list = macro_list->next;
994 free (disposer);
995 }
996 }
997
998 /* Add a character to the macro being built. */
999 static void
1000 add_macro_char (c)
1001 int c;
1002 {
1003 if (current_macro_index + 1 >= current_macro_size)
1004 {
1005 if (!current_macro)
1006 current_macro = (char *)xmalloc (current_macro_size = 25);
1007 else
1008 current_macro =
1009 (char *)xrealloc (current_macro, current_macro_size += 25);
1010 }
1011
1012 current_macro[current_macro_index++] = c;
1013 current_macro[current_macro_index] = '\0';
1014 }
1015
1016 /* Begin defining a keyboard macro.
1017 Keystrokes are recorded as they are executed.
1018 End the definition with rl_end_kbd_macro ().
1019 If a numeric argument was explicitly typed, then append this
1020 definition to the end of the existing macro, and start by
1021 re-executing the existing macro. */
1022 rl_start_kbd_macro (ignore1, ignore2)
1023 int ignore1, ignore2;
1024 {
1025 if (defining_kbd_macro)
1026 rl_abort ();
1027
1028 if (rl_explicit_arg)
1029 {
1030 if (current_macro)
1031 with_macro_input (savestring (current_macro));
1032 }
1033 else
1034 current_macro_index = 0;
1035
1036 defining_kbd_macro = 1;
1037 }
1038
1039 /* Stop defining a keyboard macro.
1040 A numeric argument says to execute the macro right now,
1041 that many times, counting the definition as the first time. */
1042 rl_end_kbd_macro (count, ignore)
1043 int count, ignore;
1044 {
1045 if (!defining_kbd_macro)
1046 rl_abort ();
1047
1048 current_macro_index -= (rl_key_sequence_length - 1);
1049 current_macro[current_macro_index] = '\0';
1050
1051 defining_kbd_macro = 0;
1052
1053 rl_call_last_kbd_macro (--count, 0);
1054 }
1055
1056 /* Execute the most recently defined keyboard macro.
1057 COUNT says how many times to execute it. */
1058 rl_call_last_kbd_macro (count, ignore)
1059 int count, ignore;
1060 {
1061 if (!current_macro)
1062 rl_abort ();
1063
1064 while (count--)
1065 with_macro_input (savestring (current_macro));
1066 }
1067
1068 \f
1069 /* **************************************************************** */
1070 /* */
1071 /* Initializations */
1072 /* */
1073 /* **************************************************************** */
1074
1075 /* Initliaze readline (and terminal if not already). */
1076 rl_initialize ()
1077 {
1078 extern char *rl_display_prompt;
1079
1080 /* If we have never been called before, initialize the
1081 terminal and data structures. */
1082 if (!rl_initialized)
1083 {
1084 readline_initialize_everything ();
1085 rl_initialized++;
1086 }
1087
1088 /* Initalize the current line information. */
1089 rl_point = rl_end = 0;
1090 the_line = rl_line_buffer;
1091 the_line[0] = 0;
1092
1093 /* We aren't done yet. We haven't even gotten started yet! */
1094 rl_done = 0;
1095
1096 /* Tell the history routines what is going on. */
1097 start_using_history ();
1098
1099 /* Make the display buffer match the state of the line. */
1100 {
1101 extern char *rl_display_prompt;
1102 extern int forced_display;
1103
1104 rl_on_new_line ();
1105
1106 rl_display_prompt = rl_prompt ? rl_prompt : "";
1107 forced_display = 1;
1108 }
1109
1110 /* No such function typed yet. */
1111 rl_last_func = (Function *)NULL;
1112
1113 /* Parsing of key-bindings begins in an enabled state. */
1114 parsing_conditionalized_out = 0;
1115 }
1116
1117 /* Initialize the entire state of the world. */
1118 readline_initialize_everything ()
1119 {
1120 /* Find out if we are running in Emacs. */
1121 running_in_emacs = getenv ("EMACS");
1122
1123 /* Set up input and output if they aren't already. */
1124 if (!rl_instream)
1125 rl_instream = stdin;
1126 if (!rl_outstream)
1127 rl_outstream = stdout;
1128
1129 /* Allocate data structures. */
1130 if (!rl_line_buffer)
1131 rl_line_buffer =
1132 (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
1133
1134 /* Initialize the terminal interface. */
1135 init_terminal_io ((char *)NULL);
1136
1137 /* Bind tty characters to readline functions. */
1138 readline_default_bindings ();
1139
1140 /* Initialize the function names. */
1141 rl_initialize_funmap ();
1142
1143 /* Read in the init file. */
1144 rl_read_init_file ((char *)NULL);
1145
1146 /* If the completion parser's default word break characters haven't
1147 been set yet, then do so now. */
1148 {
1149 extern char *rl_completer_word_break_characters;
1150 extern char *rl_basic_word_break_characters;
1151
1152 if (rl_completer_word_break_characters == (char *)NULL)
1153 rl_completer_word_break_characters = rl_basic_word_break_characters;
1154 }
1155 }
1156
1157 /* If this system allows us to look at the values of the regular
1158 input editing characters, then bind them to their readline
1159 equivalents, iff the characters are not bound to keymaps. */
1160 readline_default_bindings ()
1161 {
1162 #ifndef __GO32__
1163
1164 #if defined (NEW_TTY_DRIVER)
1165 struct sgttyb ttybuff;
1166 int tty = fileno (rl_instream);
1167
1168 if (ioctl (tty, TIOCGETP, &ttybuff) != -1)
1169 {
1170 int erase, kill;
1171
1172 erase = ttybuff.sg_erase;
1173 kill = ttybuff.sg_kill;
1174
1175 if (erase != -1 && keymap[erase].type == ISFUNC)
1176 keymap[erase].function = rl_rubout;
1177
1178 if (kill != -1 && keymap[kill].type == ISFUNC)
1179 keymap[kill].function = rl_unix_line_discard;
1180 }
1181
1182 #if defined (TIOCGLTC)
1183 {
1184 struct ltchars lt;
1185
1186 if (ioctl (tty, TIOCGLTC, &lt) != -1)
1187 {
1188 int erase, nextc;
1189
1190 erase = lt.t_werasc;
1191 nextc = lt.t_lnextc;
1192
1193 if (erase != -1 && keymap[erase].type == ISFUNC)
1194 keymap[erase].function = rl_unix_word_rubout;
1195
1196 if (nextc != -1 && keymap[nextc].type == ISFUNC)
1197 keymap[nextc].function = rl_quoted_insert;
1198 }
1199 }
1200 #endif /* TIOCGLTC */
1201 #else /* not NEW_TTY_DRIVER */
1202
1203 #if defined (TERMIOS_TTY_DRIVER)
1204 struct termios ttybuff;
1205 #else
1206 struct termio ttybuff;
1207 #endif /* TERMIOS_TTY_DRIVER */
1208 int tty = fileno (rl_instream);
1209
1210 #if defined (TERMIOS_TTY_DRIVER)
1211 if (tcgetattr (tty, &ttybuff) != -1)
1212 #else
1213 if (ioctl (tty, TCGETA, &ttybuff) != -1)
1214 #endif /* !TERMIOS_TTY_DRIVER */
1215 {
1216 int erase, kill;
1217
1218 erase = ttybuff.c_cc[VERASE];
1219 kill = ttybuff.c_cc[VKILL];
1220
1221 if (erase != _POSIX_VDISABLE &&
1222 keymap[(unsigned char)erase].type == ISFUNC)
1223 keymap[(unsigned char)erase].function = rl_rubout;
1224
1225 if (kill != _POSIX_VDISABLE &&
1226 keymap[(unsigned char)kill].type == ISFUNC)
1227 keymap[(unsigned char)kill].function = rl_unix_line_discard;
1228
1229 #if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
1230 {
1231 int nextc;
1232
1233 nextc = ttybuff.c_cc[VLNEXT];
1234
1235 if (nextc != _POSIX_VDISABLE &&
1236 keymap[(unsigned char)nextc].type == ISFUNC)
1237 keymap[(unsigned char)nextc].function = rl_quoted_insert;
1238 }
1239 #endif /* VLNEXT && TERMIOS_TTY_DRIVER */
1240
1241 #if defined (VWERASE)
1242 {
1243 int werase;
1244
1245 werase = ttybuff.c_cc[VWERASE];
1246
1247 if (werase != _POSIX_VDISABLE &&
1248 keymap[(unsigned char)werase].type == ISFUNC)
1249 keymap[(unsigned char)werase].function = rl_unix_word_rubout;
1250 }
1251 #endif /* VWERASE */
1252 }
1253 #endif /* !NEW_TTY_DRIVER */
1254 #endif /* def __GO32__ */
1255 }
1256
1257 \f
1258 /* **************************************************************** */
1259 /* */
1260 /* Numeric Arguments */
1261 /* */
1262 /* **************************************************************** */
1263
1264 /* Handle C-u style numeric args, as well as M--, and M-digits. */
1265
1266 /* Add the current digit to the argument in progress. */
1267 rl_digit_argument (ignore, key)
1268 int ignore, key;
1269 {
1270 rl_pending_input = key;
1271 rl_digit_loop ();
1272 }
1273
1274 /* What to do when you abort reading an argument. */
1275 rl_discard_argument ()
1276 {
1277 ding ();
1278 rl_clear_message ();
1279 rl_init_argument ();
1280 }
1281
1282 /* Create a default argument. */
1283 rl_init_argument ()
1284 {
1285 rl_numeric_arg = rl_arg_sign = 1;
1286 rl_explicit_arg = 0;
1287 }
1288
1289 /* C-u, universal argument. Multiply the current argument by 4.
1290 Read a key. If the key has nothing to do with arguments, then
1291 dispatch on it. If the key is the abort character then abort. */
1292 rl_universal_argument ()
1293 {
1294 rl_numeric_arg *= 4;
1295 rl_digit_loop ();
1296 }
1297
1298 rl_digit_loop ()
1299 {
1300 int key, c;
1301 while (1)
1302 {
1303 rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
1304 key = c = rl_read_key ();
1305
1306 if (keymap[c].type == ISFUNC &&
1307 keymap[c].function == rl_universal_argument)
1308 {
1309 rl_numeric_arg *= 4;
1310 continue;
1311 }
1312 c = UNMETA (c);
1313 if (numeric (c))
1314 {
1315 if (rl_explicit_arg)
1316 rl_numeric_arg = (rl_numeric_arg * 10) + (c - '0');
1317 else
1318 rl_numeric_arg = (c - '0');
1319 rl_explicit_arg = 1;
1320 }
1321 else
1322 {
1323 if (c == '-' && !rl_explicit_arg)
1324 {
1325 rl_numeric_arg = 1;
1326 rl_arg_sign = -1;
1327 }
1328 else
1329 {
1330 rl_clear_message ();
1331 rl_dispatch (key, keymap);
1332 return;
1333 }
1334 }
1335 }
1336 }
1337
1338 \f
1339 /* **************************************************************** */
1340 /* */
1341 /* Display stuff */
1342 /* */
1343 /* **************************************************************** */
1344
1345 /* This is the stuff that is hard for me. I never seem to write good
1346 display routines in C. Let's see how I do this time. */
1347
1348 /* (PWP) Well... Good for a simple line updater, but totally ignores
1349 the problems of input lines longer than the screen width.
1350
1351 update_line and the code that calls it makes a multiple line,
1352 automatically wrapping line update. Carefull attention needs
1353 to be paid to the vertical position variables.
1354
1355 handling of terminals with autowrap on (incl. DEC braindamage)
1356 could be improved a bit. Right now I just cheat and decrement
1357 screenwidth by one. */
1358
1359 /* Keep two buffers; one which reflects the current contents of the
1360 screen, and the other to draw what we think the new contents should
1361 be. Then compare the buffers, and make whatever changes to the
1362 screen itself that we should. Finally, make the buffer that we
1363 just drew into be the one which reflects the current contents of the
1364 screen, and place the cursor where it belongs.
1365
1366 Commands that want to can fix the display themselves, and then let
1367 this function know that the display has been fixed by setting the
1368 RL_DISPLAY_FIXED variable. This is good for efficiency. */
1369
1370 /* Termcap variables: */
1371 extern char *term_up, *term_dc, *term_cr;
1372 extern int screenheight, screenwidth, terminal_can_insert;
1373
1374 /* What YOU turn on when you have handled all redisplay yourself. */
1375 int rl_display_fixed = 0;
1376
1377 /* The visible cursor position. If you print some text, adjust this. */
1378 int last_c_pos = 0;
1379 int last_v_pos = 0;
1380
1381 /* The last left edge of text that was displayed. This is used when
1382 doing horizontal scrolling. It shifts in thirds of a screenwidth. */
1383 static int last_lmargin = 0;
1384
1385 /* The line display buffers. One is the line currently displayed on
1386 the screen. The other is the line about to be displayed. */
1387 static char *visible_line = (char *)NULL;
1388 static char *invisible_line = (char *)NULL;
1389
1390 /* Number of lines currently on screen minus 1. */
1391 int vis_botlin = 0;
1392
1393 /* A buffer for `modeline' messages. */
1394 char msg_buf[128];
1395
1396 /* Non-zero forces the redisplay even if we thought it was unnecessary. */
1397 int forced_display = 0;
1398
1399 /* The stuff that gets printed out before the actual text of the line.
1400 This is usually pointing to rl_prompt. */
1401 char *rl_display_prompt = (char *)NULL;
1402
1403 /* Default and initial buffer size. Can grow. */
1404 static int line_size = 1024;
1405
1406 /* Non-zero means to always use horizontal scrolling in line display. */
1407 static int horizontal_scroll_mode = 0;
1408
1409 /* Non-zero means to display an asterisk at the starts of history lines
1410 which have been modified. */
1411 static int mark_modified_lines = 0;
1412
1413 /* Non-zero means to use a visible bell if one is available rather than
1414 simply ringing the terminal bell. */
1415 static int prefer_visible_bell = 0;
1416
1417 /* I really disagree with this, but my boss (among others) insists that we
1418 support compilers that don't work. I don't think we are gaining by doing
1419 so; what is the advantage in producing better code if we can't use it? */
1420 /* The following two declarations belong inside the
1421 function block, not here. */
1422 static void move_cursor_relative ();
1423 static void output_some_chars ();
1424 static void output_character_function ();
1425 static int compare_strings ();
1426
1427 /* Basic redisplay algorithm. */
1428 rl_redisplay ()
1429 {
1430 register int in, out, c, linenum;
1431 register char *line = invisible_line;
1432 char *prompt_this_line;
1433 int c_pos = 0;
1434 int inv_botlin = 0; /* Number of lines in newly drawn buffer. */
1435
1436 extern int readline_echoing_p;
1437
1438 if (!readline_echoing_p)
1439 return;
1440
1441 if (!rl_display_prompt)
1442 rl_display_prompt = "";
1443
1444 if (!invisible_line)
1445 {
1446 visible_line = (char *)xmalloc (line_size);
1447 invisible_line = (char *)xmalloc (line_size);
1448 line = invisible_line;
1449 for (in = 0; in < line_size; in++)
1450 {
1451 visible_line[in] = 0;
1452 invisible_line[in] = 1;
1453 }
1454 rl_on_new_line ();
1455 }
1456
1457 /* Draw the line into the buffer. */
1458 c_pos = -1;
1459
1460 /* Mark the line as modified or not. We only do this for history
1461 lines. */
1462 out = 0;
1463 if (mark_modified_lines && current_history () && rl_undo_list)
1464 {
1465 line[out++] = '*';
1466 line[out] = '\0';
1467 }
1468
1469 /* If someone thought that the redisplay was handled, but the currently
1470 visible line has a different modification state than the one about
1471 to become visible, then correct the callers misconception. */
1472 if (visible_line[0] != invisible_line[0])
1473 rl_display_fixed = 0;
1474
1475 prompt_this_line = rindex (rl_display_prompt, '\n');
1476 if (!prompt_this_line)
1477 prompt_this_line = rl_display_prompt;
1478 else
1479 {
1480 prompt_this_line++;
1481 if (forced_display)
1482 output_some_chars (rl_display_prompt,
1483 prompt_this_line - rl_display_prompt);
1484 }
1485
1486 strncpy (line + out, prompt_this_line, strlen (prompt_this_line));
1487 out += strlen (prompt_this_line);
1488 line[out] = '\0';
1489
1490 for (in = 0; in < rl_end; in++)
1491 {
1492 c = (unsigned char)the_line[in];
1493
1494 if (out + 1 >= line_size)
1495 {
1496 line_size *= 2;
1497 visible_line = (char *)xrealloc (visible_line, line_size);
1498 invisible_line = (char *)xrealloc (invisible_line, line_size);
1499 line = invisible_line;
1500 }
1501
1502 if (in == rl_point)
1503 c_pos = out;
1504
1505 if (c > 127)
1506 {
1507 line[out++] = 'M';
1508 line[out++] = '-';
1509 line[out++] = c - 128;
1510 }
1511 #define DISPLAY_TABS
1512 #if defined (DISPLAY_TABS)
1513 else if (c == '\t')
1514 {
1515 register int newout = (out | (int)7) + 1;
1516 while (out < newout)
1517 line[out++] = ' ';
1518 }
1519 #endif
1520 else if (c < 32)
1521 {
1522 line[out++] = 'C';
1523 line[out++] = '-';
1524 line[out++] = c + 64;
1525 }
1526 else if (c == 127)
1527 {
1528 line[out++] = 'C';
1529 line[out++] = '-';
1530 line[out++] = '?';
1531 }
1532 else
1533 line[out++] = c;
1534 }
1535 line[out] = '\0';
1536 if (c_pos < 0)
1537 c_pos = out;
1538
1539 /* PWP: now is when things get a bit hairy. The visible and invisible
1540 line buffers are really multiple lines, which would wrap every
1541 (screenwidth - 1) characters. Go through each in turn, finding
1542 the changed region and updating it. The line order is top to bottom. */
1543
1544 /* If we can move the cursor up and down, then use multiple lines,
1545 otherwise, let long lines display in a single terminal line, and
1546 horizontally scroll it. */
1547
1548 if (!horizontal_scroll_mode && term_up && *term_up)
1549 {
1550 int total_screen_chars = (screenwidth * screenheight);
1551
1552 if (!rl_display_fixed || forced_display)
1553 {
1554 forced_display = 0;
1555
1556 /* If we have more than a screenful of material to display, then
1557 only display a screenful. We should display the last screen,
1558 not the first. I'll fix this in a minute. */
1559 if (out >= total_screen_chars)
1560 out = total_screen_chars - 1;
1561
1562 /* Number of screen lines to display. */
1563 inv_botlin = out / screenwidth;
1564
1565 /* For each line in the buffer, do the updating display. */
1566 for (linenum = 0; linenum <= inv_botlin; linenum++)
1567 update_line (linenum > vis_botlin ? ""
1568 : &visible_line[linenum * screenwidth],
1569 &invisible_line[linenum * screenwidth],
1570 linenum);
1571
1572 /* We may have deleted some lines. If so, clear the left over
1573 blank ones at the bottom out. */
1574 if (vis_botlin > inv_botlin)
1575 {
1576 char *tt;
1577 for (; linenum <= vis_botlin; linenum++)
1578 {
1579 tt = &visible_line[linenum * screenwidth];
1580 move_vert (linenum);
1581 move_cursor_relative (0, tt);
1582 clear_to_eol ((linenum == vis_botlin)?
1583 strlen (tt) : screenwidth);
1584 }
1585 }
1586 vis_botlin = inv_botlin;
1587
1588 /* Move the cursor where it should be. */
1589 move_vert (c_pos / screenwidth);
1590 move_cursor_relative (c_pos % screenwidth,
1591 &invisible_line[(c_pos / screenwidth) * screenwidth]);
1592 }
1593 }
1594 else /* Do horizontal scrolling. */
1595 {
1596 int lmargin;
1597
1598 /* Always at top line. */
1599 last_v_pos = 0;
1600
1601 /* If the display position of the cursor would be off the edge
1602 of the screen, start the display of this line at an offset that
1603 leaves the cursor on the screen. */
1604 if (c_pos - last_lmargin > screenwidth - 2)
1605 lmargin = (c_pos / (screenwidth / 3) - 2) * (screenwidth / 3);
1606 else if (c_pos - last_lmargin < 1)
1607 lmargin = ((c_pos - 1) / (screenwidth / 3)) * (screenwidth / 3);
1608 else
1609 lmargin = last_lmargin;
1610
1611 /* If the first character on the screen isn't the first character
1612 in the display line, indicate this with a special character. */
1613 if (lmargin > 0)
1614 line[lmargin] = '<';
1615
1616 if (lmargin + screenwidth < out)
1617 line[lmargin + screenwidth - 1] = '>';
1618
1619 if (!rl_display_fixed || forced_display || lmargin != last_lmargin)
1620 {
1621 forced_display = 0;
1622 update_line (&visible_line[last_lmargin],
1623 &invisible_line[lmargin], 0);
1624
1625 move_cursor_relative (c_pos - lmargin, &invisible_line[lmargin]);
1626 last_lmargin = lmargin;
1627 }
1628 }
1629 fflush (out_stream);
1630
1631 /* Swap visible and non-visible lines. */
1632 {
1633 char *temp = visible_line;
1634 visible_line = invisible_line;
1635 invisible_line = temp;
1636 rl_display_fixed = 0;
1637 }
1638 }
1639
1640 /* PWP: update_line() is based on finding the middle difference of each
1641 line on the screen; vis:
1642
1643 /old first difference
1644 /beginning of line | /old last same /old EOL
1645 v v v v
1646 old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as
1647 new: eddie> Oh, my little buggy says to me, as lurgid as
1648 ^ ^ ^ ^
1649 \beginning of line | \new last same \new end of line
1650 \new first difference
1651
1652 All are character pointers for the sake of speed. Special cases for
1653 no differences, as well as for end of line additions must be handeled.
1654
1655 Could be made even smarter, but this works well enough */
1656 static
1657 update_line (old, new, current_line)
1658 register char *old, *new;
1659 int current_line;
1660 {
1661 register char *ofd, *ols, *oe, *nfd, *nls, *ne;
1662 int lendiff, wsatend;
1663
1664 /* Find first difference. */
1665 for (ofd = old, nfd = new;
1666 (ofd - old < screenwidth) && *ofd && (*ofd == *nfd);
1667 ofd++, nfd++)
1668 ;
1669
1670 /* Move to the end of the screen line. */
1671 for (oe = ofd; ((oe - old) < screenwidth) && *oe; oe++);
1672 for (ne = nfd; ((ne - new) < screenwidth) && *ne; ne++);
1673
1674 /* If no difference, continue to next line. */
1675 if (ofd == oe && nfd == ne)
1676 return;
1677
1678 wsatend = 1; /* flag for trailing whitespace */
1679 ols = oe - 1; /* find last same */
1680 nls = ne - 1;
1681 while ((*ols == *nls) && (ols > ofd) && (nls > nfd))
1682 {
1683 if (*ols != ' ')
1684 wsatend = 0;
1685 ols--;
1686 nls--;
1687 }
1688
1689 if (wsatend)
1690 {
1691 ols = oe;
1692 nls = ne;
1693 }
1694 else if (*ols != *nls)
1695 {
1696 if (*ols) /* don't step past the NUL */
1697 ols++;
1698 if (*nls)
1699 nls++;
1700 }
1701
1702 move_vert (current_line);
1703 move_cursor_relative (ofd - old, old);
1704
1705 /* if (len (new) > len (old)) */
1706 lendiff = (nls - nfd) - (ols - ofd);
1707
1708 /* Insert (diff(len(old),len(new)) ch */
1709 if (lendiff > 0)
1710 {
1711 if (terminal_can_insert)
1712 {
1713 extern char *term_IC;
1714
1715 /* Sometimes it is cheaper to print the characters rather than
1716 use the terminal's capabilities. */
1717 if ((2 * (ne - nfd)) < lendiff && !term_IC)
1718 {
1719 output_some_chars (nfd, (ne - nfd));
1720 last_c_pos += (ne - nfd);
1721 }
1722 else
1723 {
1724 if (*ols)
1725 {
1726 insert_some_chars (nfd, lendiff);
1727 last_c_pos += lendiff;
1728 }
1729 else
1730 {
1731 /* At the end of a line the characters do not have to
1732 be "inserted". They can just be placed on the screen. */
1733 output_some_chars (nfd, lendiff);
1734 last_c_pos += lendiff;
1735 }
1736 /* Copy (new) chars to screen from first diff to last match. */
1737 if (((nls - nfd) - lendiff) > 0)
1738 {
1739 output_some_chars (&nfd[lendiff], ((nls - nfd) - lendiff));
1740 last_c_pos += ((nls - nfd) - lendiff);
1741 }
1742 }
1743 }
1744 else
1745 { /* cannot insert chars, write to EOL */
1746 output_some_chars (nfd, (ne - nfd));
1747 last_c_pos += (ne - nfd);
1748 }
1749 }
1750 else /* Delete characters from line. */
1751 {
1752 /* If possible and inexpensive to use terminal deletion, then do so. */
1753 if (term_dc && (2 * (ne - nfd)) >= (-lendiff))
1754 {
1755 if (lendiff)
1756 delete_chars (-lendiff); /* delete (diff) characters */
1757
1758 /* Copy (new) chars to screen from first diff to last match */
1759 if ((nls - nfd) > 0)
1760 {
1761 output_some_chars (nfd, (nls - nfd));
1762 last_c_pos += (nls - nfd);
1763 }
1764 }
1765 /* Otherwise, print over the existing material. */
1766 else
1767 {
1768 output_some_chars (nfd, (ne - nfd));
1769 last_c_pos += (ne - nfd);
1770 clear_to_eol ((oe - old) - (ne - new));
1771 }
1772 }
1773 }
1774
1775 /* (PWP) tell the update routines that we have moved onto a
1776 new (empty) line. */
1777 rl_on_new_line ()
1778 {
1779 if (visible_line)
1780 visible_line[0] = '\0';
1781
1782 last_c_pos = last_v_pos = 0;
1783 vis_botlin = last_lmargin = 0;
1784 }
1785
1786 /* Actually update the display, period. */
1787 rl_forced_update_display ()
1788 {
1789 if (visible_line)
1790 {
1791 register char *temp = visible_line;
1792
1793 while (*temp) *temp++ = '\0';
1794 }
1795 rl_on_new_line ();
1796 forced_display++;
1797 rl_redisplay ();
1798 }
1799
1800 /* Move the cursor from last_c_pos to NEW, which are buffer indices.
1801 DATA is the contents of the screen line of interest; i.e., where
1802 the movement is being done. */
1803 static void
1804 move_cursor_relative (new, data)
1805 int new;
1806 char *data;
1807 {
1808 register int i;
1809
1810 /* It may be faster to output a CR, and then move forwards instead
1811 of moving backwards. */
1812 if (new + 1 < last_c_pos - new)
1813 {
1814 #ifdef __MSDOS__
1815 putc('\r', out_stream);
1816 #else
1817 tputs (term_cr, 1, output_character_function);
1818 #endif
1819 last_c_pos = 0;
1820 }
1821
1822 if (last_c_pos == new) return;
1823
1824 if (last_c_pos < new)
1825 {
1826 /* Move the cursor forward. We do it by printing the command
1827 to move the cursor forward if there is one, else print that
1828 portion of the output buffer again. Which is cheaper? */
1829
1830 /* The above comment is left here for posterity. It is faster
1831 to print one character (non-control) than to print a control
1832 sequence telling the terminal to move forward one character.
1833 That kind of control is for people who don't know what the
1834 data is underneath the cursor. */
1835 #if defined (HACK_TERMCAP_MOTION)
1836 extern char *term_forward_char;
1837
1838 if (term_forward_char)
1839 for (i = last_c_pos; i < new; i++)
1840 tputs (term_forward_char, 1, output_character_function);
1841 else
1842 for (i = last_c_pos; i < new; i++)
1843 putc (data[i], out_stream);
1844 #else
1845 for (i = last_c_pos; i < new; i++)
1846 putc (data[i], out_stream);
1847 #endif /* HACK_TERMCAP_MOTION */
1848 }
1849 else
1850 backspace (last_c_pos - new);
1851 last_c_pos = new;
1852 }
1853
1854 /* PWP: move the cursor up or down. */
1855 move_vert (to)
1856 int to;
1857 {
1858 void output_character_function ();
1859 register int delta, i;
1860
1861 if (last_v_pos == to) return;
1862
1863 if (to > screenheight)
1864 return;
1865
1866 #ifdef __GO32__
1867 {
1868 int cur_r, cur_c;
1869 ScreenGetCursor(&cur_r, &cur_c);
1870 ScreenSetCursor(cur_r+to-last_v_pos, cur_c);
1871 }
1872 #else /* __GO32__ */
1873 if ((delta = to - last_v_pos) > 0)
1874 {
1875 for (i = 0; i < delta; i++)
1876 putc ('\n', out_stream);
1877 tputs (term_cr, 1, output_character_function);
1878 last_c_pos = 0;
1879 }
1880 else
1881 { /* delta < 0 */
1882 if (term_up && *term_up)
1883 for (i = 0; i < -delta; i++)
1884 tputs (term_up, 1, output_character_function);
1885 }
1886 #endif /* __GO32__ */
1887 last_v_pos = to; /* now to is here */
1888 }
1889
1890 /* Physically print C on out_stream. This is for functions which know
1891 how to optimize the display. */
1892 rl_show_char (c)
1893 int c;
1894 {
1895 if (c > 127)
1896 {
1897 fprintf (out_stream, "M-");
1898 c -= 128;
1899 }
1900
1901 #if defined (DISPLAY_TABS)
1902 if (c < 32 && c != '\t')
1903 #else
1904 if (c < 32)
1905 #endif
1906 {
1907
1908 c += 64;
1909 }
1910
1911 putc (c, out_stream);
1912 fflush (out_stream);
1913 }
1914
1915 #if defined (DISPLAY_TABS)
1916 int
1917 rl_character_len (c, pos)
1918 register int c, pos;
1919 {
1920 if (c < ' ' || c > 126)
1921 {
1922 if (c == '\t')
1923 return (((pos | (int)7) + 1) - pos);
1924 else
1925 return (3);
1926 }
1927 else
1928 return (1);
1929 }
1930 #else
1931 int
1932 rl_character_len (c)
1933 int c;
1934 {
1935 if (c < ' ' || c > 126)
1936 return (3);
1937 else
1938 return (1);
1939 }
1940 #endif /* DISPLAY_TAB */
1941
1942 /* How to print things in the "echo-area". The prompt is treated as a
1943 mini-modeline. */
1944 rl_message (string, arg1, arg2)
1945 char *string;
1946 {
1947 sprintf (msg_buf, string, arg1, arg2);
1948 rl_display_prompt = msg_buf;
1949 rl_redisplay ();
1950 }
1951
1952 /* How to clear things from the "echo-area". */
1953 rl_clear_message ()
1954 {
1955 rl_display_prompt = rl_prompt;
1956 rl_redisplay ();
1957 }
1958 \f
1959 /* **************************************************************** */
1960 /* */
1961 /* Terminal and Termcap */
1962 /* */
1963 /* **************************************************************** */
1964
1965 static char *term_buffer = (char *)NULL;
1966 static char *term_string_buffer = (char *)NULL;
1967
1968 /* Non-zero means this terminal can't really do anything. */
1969 int dumb_term = 0;
1970
1971 /* On Solaris2, sys/types.h brings in sys/reg.h,
1972 which screws up the Termcap variable PC, used below. */
1973
1974 #undef PC
1975
1976 char PC;
1977 char *BC, *UP;
1978
1979 /* Some strings to control terminal actions. These are output by tputs (). */
1980 char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;
1981
1982 int screenwidth, screenheight;
1983
1984 /* Non-zero if we determine that the terminal can do character insertion. */
1985 int terminal_can_insert = 0;
1986
1987 /* How to insert characters. */
1988 char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;
1989
1990 /* How to delete characters. */
1991 char *term_dc, *term_DC;
1992
1993 #if defined (HACK_TERMCAP_MOTION)
1994 char *term_forward_char;
1995 #endif /* HACK_TERMCAP_MOTION */
1996
1997 /* How to go up a line. */
1998 char *term_up;
1999
2000 /* A visible bell, if the terminal can be made to flash the screen. */
2001 char *visible_bell;
2002
2003 /* Re-initialize the terminal considering that the TERM/TERMCAP variable
2004 has changed. */
2005 rl_reset_terminal (terminal_name)
2006 char *terminal_name;
2007 {
2008 init_terminal_io (terminal_name);
2009 }
2010
2011 init_terminal_io (terminal_name)
2012 char *terminal_name;
2013 {
2014 #ifdef __GO32__
2015 screenwidth = ScreenCols();
2016 screenheight = ScreenRows();
2017 term_cr = "\r";
2018 term_im = term_ei = term_ic = term_IC = (char *)NULL;
2019 term_up = term_dc = term_DC = visible_bell = (char *)NULL;
2020 #if defined (HACK_TERMCAP_MOTION)
2021 term_forward_char = (char *)NULL;
2022 #endif
2023 terminal_can_insert = 0;
2024 return;
2025 #else
2026 extern char *tgetstr ();
2027 char *term, *buffer;
2028 #if defined (TIOCGWINSZ)
2029 struct winsize window_size;
2030 #endif
2031 int tty;
2032
2033 term = terminal_name ? terminal_name : getenv ("TERM");
2034
2035 if (!term_string_buffer)
2036 term_string_buffer = (char *)xmalloc (2048);
2037
2038 if (!term_buffer)
2039 term_buffer = (char *)xmalloc (2048);
2040
2041 buffer = term_string_buffer;
2042
2043 term_clrpag = term_cr = term_clreol = (char *)NULL;
2044
2045 if (!term)
2046 term = "dumb";
2047
2048 if (tgetent (term_buffer, term) < 0)
2049 {
2050 dumb_term = 1;
2051 screenwidth = 79;
2052 screenheight = 24;
2053 term_cr = "\r";
2054 term_im = term_ei = term_ic = term_IC = (char *)NULL;
2055 term_up = term_dc = term_DC = visible_bell = (char *)NULL;
2056 #if defined (HACK_TERMCAP_MOTION)
2057 term_forward_char = (char *)NULL;
2058 #endif
2059 terminal_can_insert = 0;
2060 return;
2061 }
2062
2063 BC = tgetstr ("pc", &buffer);
2064 PC = buffer ? *buffer : 0;
2065
2066 term_backspace = tgetstr ("le", &buffer);
2067
2068 term_cr = tgetstr ("cr", &buffer);
2069 term_clreol = tgetstr ("ce", &buffer);
2070 term_clrpag = tgetstr ("cl", &buffer);
2071
2072 if (!term_cr)
2073 term_cr = "\r";
2074
2075 #if defined (HACK_TERMCAP_MOTION)
2076 term_forward_char = tgetstr ("nd", &buffer);
2077 #endif /* HACK_TERMCAP_MOTION */
2078
2079 if (rl_instream)
2080 tty = fileno (rl_instream);
2081 else
2082 tty = 0;
2083
2084 screenwidth = screenheight = 0;
2085 #if defined (TIOCGWINSZ)
2086 if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
2087 {
2088 screenwidth = (int) window_size.ws_col;
2089 screenheight = (int) window_size.ws_row;
2090 }
2091 #endif
2092
2093 if (screenwidth <= 0 || screenheight <= 0)
2094 {
2095 screenwidth = tgetnum ("co");
2096 screenheight = tgetnum ("li");
2097 }
2098
2099 screenwidth--;
2100
2101 if (screenwidth <= 0)
2102 screenwidth = 79;
2103
2104 if (screenheight <= 0)
2105 screenheight = 24;
2106
2107 term_im = tgetstr ("im", &buffer);
2108 term_ei = tgetstr ("ei", &buffer);
2109 term_IC = tgetstr ("IC", &buffer);
2110 term_ic = tgetstr ("ic", &buffer);
2111
2112 /* "An application program can assume that the terminal can do
2113 character insertion if *any one of* the capabilities `IC',
2114 `im', `ic' or `ip' is provided." But we can't do anything if
2115 only `ip' is provided, so... */
2116 terminal_can_insert = (term_IC || term_im || term_ic);
2117
2118 term_up = tgetstr ("up", &buffer);
2119 term_dc = tgetstr ("dc", &buffer);
2120 term_DC = tgetstr ("DC", &buffer);
2121
2122 visible_bell = tgetstr ("vb", &buffer);
2123 #endif /* !__GO32__ */
2124 }
2125
2126 /* A function for the use of tputs () */
2127 static void
2128 output_character_function (c)
2129 int c;
2130 {
2131 putc (c, out_stream);
2132 }
2133
2134 /* Write COUNT characters from STRING to the output stream. */
2135 static void
2136 output_some_chars (string, count)
2137 char *string;
2138 int count;
2139 {
2140 fwrite (string, 1, count, out_stream);
2141 }
2142
2143 /* Delete COUNT characters from the display line. */
2144 static
2145 delete_chars (count)
2146 int count;
2147 {
2148 #ifdef __GO32__
2149 int r, c, w;
2150 ScreenGetCursor(&r, &c);
2151 w = ScreenCols();
2152 memcpy(ScreenPrimary+r*w+c, ScreenPrimary+r*w+c+count, w-c-count);
2153 memset(ScreenPrimary+r*w+w-count, 0, count*2);
2154 #else /* __GO32__ */
2155 if (count > screenwidth)
2156 return;
2157
2158 if (term_DC && *term_DC)
2159 {
2160 char *tgoto (), *buffer;
2161 buffer = tgoto (term_DC, 0, count);
2162 tputs (buffer, 1, output_character_function);
2163 }
2164 else
2165 {
2166 if (term_dc && *term_dc)
2167 while (count--)
2168 tputs (term_dc, 1, output_character_function);
2169 }
2170 #endif /* __GO32__ */
2171 }
2172
2173 /* Insert COUNT characters from STRING to the output stream. */
2174 static void
2175 insert_some_chars (string, count)
2176 char *string;
2177 int count;
2178 {
2179 #ifdef __GO32__
2180 int r, c, w;
2181 ScreenGetCursor(&r, &c);
2182 w = ScreenCols();
2183 memcpy(ScreenPrimary+r*w+c+count, ScreenPrimary+r*w+c, w-c-count);
2184 /* Print the text. */
2185 output_some_chars (string, count);
2186 #else /* __GO32__ */
2187 /* If IC is defined, then we do not have to "enter" insert mode. */
2188 if (term_IC)
2189 {
2190 char *tgoto (), *buffer;
2191 buffer = tgoto (term_IC, 0, count);
2192 tputs (buffer, 1, output_character_function);
2193 output_some_chars (string, count);
2194 }
2195 else
2196 {
2197 register int i;
2198
2199 /* If we have to turn on insert-mode, then do so. */
2200 if (term_im && *term_im)
2201 tputs (term_im, 1, output_character_function);
2202
2203 /* If there is a special command for inserting characters, then
2204 use that first to open up the space. */
2205 if (term_ic && *term_ic)
2206 {
2207 for (i = count; i--; )
2208 tputs (term_ic, 1, output_character_function);
2209 }
2210
2211 /* Print the text. */
2212 output_some_chars (string, count);
2213
2214 /* If there is a string to turn off insert mode, we had best use
2215 it now. */
2216 if (term_ei && *term_ei)
2217 tputs (term_ei, 1, output_character_function);
2218 }
2219 #endif /* __GO32__ */
2220 }
2221
2222 /* Move the cursor back. */
2223 backspace (count)
2224 int count;
2225 {
2226 register int i;
2227
2228 #ifndef __GO32__
2229 if (term_backspace)
2230 for (i = 0; i < count; i++)
2231 tputs (term_backspace, 1, output_character_function);
2232 else
2233 #endif /* !__GO32__ */
2234 for (i = 0; i < count; i++)
2235 putc ('\b', out_stream);
2236 }
2237
2238 /* Move to the start of the next line. */
2239 crlf ()
2240 {
2241 #if defined (NEW_TTY_DRIVER)
2242 tputs (term_cr, 1, output_character_function);
2243 #endif /* NEW_TTY_DRIVER */
2244 putc ('\n', out_stream);
2245 }
2246
2247 /* Clear to the end of the line. COUNT is the minimum
2248 number of character spaces to clear, */
2249 clear_to_eol (count)
2250 int count;
2251 {
2252 #ifndef __GO32__
2253 if (term_clreol)
2254 {
2255 tputs (term_clreol, 1, output_character_function);
2256 }
2257 else
2258 #endif /* !__GO32__ */
2259 {
2260 register int i;
2261
2262 /* Do one more character space. */
2263 count++;
2264
2265 for (i = 0; i < count; i++)
2266 putc (' ', out_stream);
2267
2268 backspace (count);
2269 }
2270 }
2271
2272 \f
2273 /* **************************************************************** */
2274 /* */
2275 /* Saving and Restoring the TTY */
2276 /* */
2277 /* **************************************************************** */
2278
2279 /* Non-zero means that the terminal is in a prepped state. */
2280 static int terminal_prepped = 0;
2281
2282 #if defined (NEW_TTY_DRIVER)
2283
2284 /* Standard flags, including ECHO. */
2285 static int original_tty_flags = 0;
2286
2287 /* Local mode flags, like LPASS8. */
2288 static int local_mode_flags = 0;
2289
2290 /* Terminal characters. This has C-s and C-q in it. */
2291 static struct tchars original_tchars;
2292
2293 /* Local special characters. This has the interrupt characters in it. */
2294 #if defined (TIOCGLTC)
2295 static struct ltchars original_ltchars;
2296 #endif
2297
2298 /* We use this to get and set the tty_flags. */
2299 static struct sgttyb the_ttybuff;
2300
2301 /* Put the terminal in CBREAK mode so that we can detect key presses. */
2302 static void
2303 rl_prep_terminal ()
2304 {
2305 #ifndef __GO32__
2306 int tty = fileno (rl_instream);
2307 #if defined (HAVE_BSD_SIGNALS)
2308 int oldmask;
2309 #endif /* HAVE_BSD_SIGNALS */
2310
2311 if (terminal_prepped)
2312 return;
2313
2314 oldmask = sigblock (sigmask (SIGINT));
2315
2316 /* We always get the latest tty values. Maybe stty changed them. */
2317 ioctl (tty, TIOCGETP, &the_ttybuff);
2318 original_tty_flags = the_ttybuff.sg_flags;
2319
2320 readline_echoing_p = (original_tty_flags & ECHO);
2321
2322 #if defined (TIOCLGET)
2323 ioctl (tty, TIOCLGET, &local_mode_flags);
2324 #endif
2325
2326 #if !defined (ANYP)
2327 # define ANYP (EVENP | ODDP)
2328 #endif
2329
2330 /* If this terminal doesn't care how the 8th bit is used,
2331 then we can use it for the meta-key. We check by seeing
2332 if BOTH odd and even parity are allowed. */
2333 if (the_ttybuff.sg_flags & ANYP)
2334 {
2335 #if defined (PASS8)
2336 the_ttybuff.sg_flags |= PASS8;
2337 #endif
2338
2339 /* Hack on local mode flags if we can. */
2340 #if defined (TIOCLGET) && defined (LPASS8)
2341 {
2342 int flags;
2343 flags = local_mode_flags | LPASS8;
2344 ioctl (tty, TIOCLSET, &flags);
2345 }
2346 #endif /* TIOCLGET && LPASS8 */
2347 }
2348
2349 #if defined (TIOCGETC)
2350 {
2351 struct tchars temp;
2352
2353 ioctl (tty, TIOCGETC, &original_tchars);
2354 temp = original_tchars;
2355
2356 #if defined (USE_XON_XOFF)
2357 /* Get rid of C-s and C-q.
2358 We remember the value of startc (C-q) so that if the terminal is in
2359 xoff state, the user can xon it by pressing that character. */
2360 xon_char = temp.t_startc;
2361 temp.t_stopc = -1;
2362 temp.t_startc = -1;
2363
2364 /* If there is an XON character, bind it to restart the output. */
2365 if (xon_char != -1)
2366 rl_bind_key (xon_char, rl_restart_output);
2367 #endif /* USE_XON_XOFF */
2368
2369 /* If there is an EOF char, bind eof_char to it. */
2370 if (temp.t_eofc != -1)
2371 eof_char = temp.t_eofc;
2372
2373 #if defined (NO_KILL_INTR)
2374 /* Get rid of C-\ and C-c. */
2375 temp.t_intrc = temp.t_quitc = -1;
2376 #endif /* NO_KILL_INTR */
2377
2378 ioctl (tty, TIOCSETC, &temp);
2379 }
2380 #endif /* TIOCGETC */
2381
2382 #if defined (TIOCGLTC)
2383 {
2384 struct ltchars temp;
2385
2386 ioctl (tty, TIOCGLTC, &original_ltchars);
2387 temp = original_ltchars;
2388
2389 /* Make the interrupt keys go away. Just enough to make people
2390 happy. */
2391 temp.t_dsuspc = -1; /* C-y */
2392 temp.t_lnextc = -1; /* C-v */
2393
2394 ioctl (tty, TIOCSLTC, &temp);
2395 }
2396 #endif /* TIOCGLTC */
2397
2398 the_ttybuff.sg_flags &= ~(ECHO | CRMOD);
2399 the_ttybuff.sg_flags |= CBREAK;
2400 ioctl (tty, TIOCSETN, &the_ttybuff);
2401
2402 terminal_prepped = 1;
2403
2404 #if defined (HAVE_BSD_SIGNALS)
2405 sigsetmask (oldmask);
2406 #endif
2407 #endif /* !__GO32__ */
2408 }
2409
2410 /* Restore the terminal to its original state. */
2411 static void
2412 rl_deprep_terminal ()
2413 {
2414 #ifndef __GO32__
2415 int tty = fileno (rl_instream);
2416 #if defined (HAVE_BSD_SIGNALS)
2417 int oldmask;
2418 #endif
2419
2420 if (!terminal_prepped)
2421 return;
2422
2423 oldmask = sigblock (sigmask (SIGINT));
2424
2425 the_ttybuff.sg_flags = original_tty_flags;
2426 ioctl (tty, TIOCSETN, &the_ttybuff);
2427 readline_echoing_p = 1;
2428
2429 #if defined (TIOCLGET)
2430 ioctl (tty, TIOCLSET, &local_mode_flags);
2431 #endif
2432
2433 #if defined (TIOCSLTC)
2434 ioctl (tty, TIOCSLTC, &original_ltchars);
2435 #endif
2436
2437 #if defined (TIOCSETC)
2438 ioctl (tty, TIOCSETC, &original_tchars);
2439 #endif
2440 terminal_prepped = 0;
2441
2442 #if defined (HAVE_BSD_SIGNALS)
2443 sigsetmask (oldmask);
2444 #endif
2445 #endif /* !__GO32 */
2446 }
2447
2448 #else /* !defined (NEW_TTY_DRIVER) */
2449
2450 #if !defined (VMIN)
2451 #define VMIN VEOF
2452 #endif
2453
2454 #if !defined (VTIME)
2455 #define VTIME VEOL
2456 #endif
2457
2458 #ifndef __GO32__
2459 #if defined (TERMIOS_TTY_DRIVER)
2460 static struct termios otio;
2461 #else
2462 static struct termio otio;
2463 #endif /* !TERMIOS_TTY_DRIVER */
2464 #endif /* __GO32__ */
2465
2466 static void
2467 rl_prep_terminal ()
2468 {
2469 #ifndef __GO32__
2470 int tty = fileno (rl_instream);
2471 #if defined (TERMIOS_TTY_DRIVER)
2472 struct termios tio;
2473 #else
2474 struct termio tio;
2475 #endif /* !TERMIOS_TTY_DRIVER */
2476
2477 #if defined (HAVE_POSIX_SIGNALS)
2478 sigset_t set, oset;
2479 #else
2480 # if defined (HAVE_BSD_SIGNALS)
2481 int oldmask;
2482 # endif /* HAVE_BSD_SIGNALS */
2483 #endif /* !HAVE_POSIX_SIGNALS */
2484
2485 if (terminal_prepped)
2486 return;
2487
2488 /* Try to keep this function from being INTerrupted. We can do it
2489 on POSIX and systems with BSD-like signal handling. */
2490 #if defined (HAVE_POSIX_SIGNALS)
2491 sigemptyset (&set);
2492 sigaddset (&set, SIGINT);
2493 sigprocmask (SIG_BLOCK, &set, &oset);
2494 #else /* !HAVE_POSIX_SIGNALS */
2495 # if defined (HAVE_BSD_SIGNALS)
2496 oldmask = sigblock (sigmask (SIGINT));
2497 # endif /* HAVE_BSD_SIGNALS */
2498 #endif /* !HAVE_POSIX_SIGNALS */
2499
2500 #if defined (TERMIOS_TTY_DRIVER)
2501 tcgetattr (tty, &tio);
2502 #else
2503 ioctl (tty, TCGETA, &tio);
2504 #endif /* !TERMIOS_TTY_DRIVER */
2505
2506 otio = tio;
2507
2508 readline_echoing_p = (tio.c_lflag & ECHO);
2509
2510 tio.c_lflag &= ~(ICANON|ECHO);
2511
2512 if (otio.c_cc[VEOF] != _POSIX_VDISABLE)
2513 eof_char = otio.c_cc[VEOF];
2514
2515 #if defined (USE_XON_XOFF)
2516 #if defined (IXANY)
2517 tio.c_iflag &= ~(IXON|IXOFF|IXANY);
2518 #else
2519 /* `strict' Posix systems do not define IXANY. */
2520 tio.c_iflag &= ~(IXON|IXOFF);
2521 #endif /* IXANY */
2522 #endif /* USE_XON_XOFF */
2523
2524 /* Only turn this off if we are using all 8 bits. */
2525 /* |ISTRIP|INPCK */
2526 tio.c_iflag &= ~(ISTRIP | INPCK);
2527
2528 /* Make sure we differentiate between CR and NL on input. */
2529 tio.c_iflag &= ~(ICRNL | INLCR);
2530
2531 #if !defined (HANDLE_SIGNALS)
2532 tio.c_lflag &= ~ISIG;
2533 #else
2534 tio.c_lflag |= ISIG;
2535 #endif
2536
2537 tio.c_cc[VMIN] = 1;
2538 tio.c_cc[VTIME] = 0;
2539
2540 /* Turn off characters that we need on Posix systems with job control,
2541 just to be sure. This includes ^Y and ^V. This should not really
2542 be necessary. */
2543 #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_JOB_CONTROL)
2544
2545 #if defined (VLNEXT)
2546 tio.c_cc[VLNEXT] = _POSIX_VDISABLE;
2547 #endif
2548
2549 #if defined (VDSUSP)
2550 tio.c_cc[VDSUSP] = _POSIX_VDISABLE;
2551 #endif
2552
2553 #endif /* POSIX && JOB_CONTROL */
2554
2555 #if defined (TERMIOS_TTY_DRIVER)
2556 tcsetattr (tty, TCSADRAIN, &tio);
2557 tcflow (tty, TCOON); /* Simulate a ^Q. */
2558 #else
2559 ioctl (tty, TCSETAW, &tio);
2560 ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */
2561 #endif /* !TERMIOS_TTY_DRIVER */
2562
2563 terminal_prepped = 1;
2564
2565 #if defined (HAVE_POSIX_SIGNALS)
2566 sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
2567 #else
2568 # if defined (HAVE_BSD_SIGNALS)
2569 sigsetmask (oldmask);
2570 # endif /* HAVE_BSD_SIGNALS */
2571 #endif /* !HAVE_POSIX_SIGNALS */
2572 #endif /* !__GO32__ */
2573 }
2574
2575 static void
2576 rl_deprep_terminal ()
2577 {
2578 #ifndef __GO32__
2579 int tty = fileno (rl_instream);
2580
2581 /* Try to keep this function from being INTerrupted. We can do it
2582 on POSIX and systems with BSD-like signal handling. */
2583 #if defined (HAVE_POSIX_SIGNALS)
2584 sigset_t set, oset;
2585 #else /* !HAVE_POSIX_SIGNALS */
2586 # if defined (HAVE_BSD_SIGNALS)
2587 int oldmask;
2588 # endif /* HAVE_BSD_SIGNALS */
2589 #endif /* !HAVE_POSIX_SIGNALS */
2590
2591 if (!terminal_prepped)
2592 return;
2593
2594 #if defined (HAVE_POSIX_SIGNALS)
2595 sigemptyset (&set);
2596 sigaddset (&set, SIGINT);
2597 sigprocmask (SIG_BLOCK, &set, &oset);
2598 #else /* !HAVE_POSIX_SIGNALS */
2599 # if defined (HAVE_BSD_SIGNALS)
2600 oldmask = sigblock (sigmask (SIGINT));
2601 # endif /* HAVE_BSD_SIGNALS */
2602 #endif /* !HAVE_POSIX_SIGNALS */
2603
2604 #if defined (TERMIOS_TTY_DRIVER)
2605 tcsetattr (tty, TCSADRAIN, &otio);
2606 tcflow (tty, TCOON); /* Simulate a ^Q. */
2607 #else /* TERMIOS_TTY_DRIVER */
2608 ioctl (tty, TCSETAW, &otio);
2609 ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */
2610 #endif /* !TERMIOS_TTY_DRIVER */
2611
2612 terminal_prepped = 0;
2613
2614 #if defined (HAVE_POSIX_SIGNALS)
2615 sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
2616 #else /* !HAVE_POSIX_SIGNALS */
2617 # if defined (HAVE_BSD_SIGNALS)
2618 sigsetmask (oldmask);
2619 # endif /* HAVE_BSD_SIGNALS */
2620 #endif /* !HAVE_POSIX_SIGNALS */
2621 #endif /* !__GO32__ */
2622 }
2623 #endif /* NEW_TTY_DRIVER */
2624
2625 \f
2626 /* **************************************************************** */
2627 /* */
2628 /* Utility Functions */
2629 /* */
2630 /* **************************************************************** */
2631
2632 /* Return 0 if C is not a member of the class of characters that belong
2633 in words, or 1 if it is. */
2634
2635 int allow_pathname_alphabetic_chars = 0;
2636 char *pathname_alphabetic_chars = "/-_=~.#$";
2637
2638 int
2639 alphabetic (c)
2640 int c;
2641 {
2642 if (pure_alphabetic (c) || (numeric (c)))
2643 return (1);
2644
2645 if (allow_pathname_alphabetic_chars)
2646 return ((int)rindex (pathname_alphabetic_chars, c));
2647 else
2648 return (0);
2649 }
2650
2651 /* Return non-zero if C is a numeric character. */
2652 int
2653 numeric (c)
2654 int c;
2655 {
2656 return (c >= '0' && c <= '9');
2657 }
2658
2659 /* Ring the terminal bell. */
2660 int
2661 ding ()
2662 {
2663 if (readline_echoing_p)
2664 {
2665 #ifndef __GO32__
2666 if (prefer_visible_bell && visible_bell)
2667 tputs (visible_bell, 1, output_character_function);
2668 else
2669 #endif /* !__GO32__ */
2670 {
2671 fprintf (stderr, "\007");
2672 fflush (stderr);
2673 }
2674 }
2675 return (-1);
2676 }
2677
2678 /* How to abort things. */
2679 rl_abort ()
2680 {
2681 ding ();
2682 rl_clear_message ();
2683 rl_init_argument ();
2684 rl_pending_input = 0;
2685
2686 defining_kbd_macro = 0;
2687 while (executing_macro)
2688 pop_executing_macro ();
2689
2690 rl_last_func = (Function *)NULL;
2691 longjmp (readline_top_level, 1);
2692 }
2693
2694 /* Return a copy of the string between FROM and TO.
2695 FROM is inclusive, TO is not. */
2696 #if defined (sun) /* Yes, that's right, some crufty function in sunview is
2697 called rl_copy (). */
2698 static
2699 #endif
2700 char *
2701 rl_copy (from, to)
2702 int from, to;
2703 {
2704 register int length;
2705 char *copy;
2706
2707 /* Fix it if the caller is confused. */
2708 if (from > to)
2709 {
2710 int t = from;
2711 from = to;
2712 to = t;
2713 }
2714
2715 length = to - from;
2716 copy = (char *)xmalloc (1 + length);
2717 strncpy (copy, the_line + from, length);
2718 copy[length] = '\0';
2719 return (copy);
2720 }
2721
2722 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
2723 LEN characters. */
2724 void
2725 rl_extend_line_buffer (len)
2726 int len;
2727 {
2728 while (len >= rl_line_buffer_len)
2729 rl_line_buffer =
2730 (char *)xrealloc
2731 (rl_line_buffer, rl_line_buffer_len += DEFAULT_BUFFER_SIZE);
2732
2733 the_line = rl_line_buffer;
2734 }
2735
2736 \f
2737 /* **************************************************************** */
2738 /* */
2739 /* Insert and Delete */
2740 /* */
2741 /* **************************************************************** */
2742
2743 /* Insert a string of text into the line at point. This is the only
2744 way that you should do insertion. rl_insert () calls this
2745 function. */
2746 rl_insert_text (string)
2747 char *string;
2748 {
2749 extern int doing_an_undo;
2750 register int i, l = strlen (string);
2751
2752 if (rl_end + l >= rl_line_buffer_len)
2753 rl_extend_line_buffer (rl_end + l);
2754
2755 for (i = rl_end; i >= rl_point; i--)
2756 the_line[i + l] = the_line[i];
2757 strncpy (the_line + rl_point, string, l);
2758
2759 /* Remember how to undo this if we aren't undoing something. */
2760 if (!doing_an_undo)
2761 {
2762 /* If possible and desirable, concatenate the undos. */
2763 if ((strlen (string) == 1) &&
2764 rl_undo_list &&
2765 (rl_undo_list->what == UNDO_INSERT) &&
2766 (rl_undo_list->end == rl_point) &&
2767 (rl_undo_list->end - rl_undo_list->start < 20))
2768 rl_undo_list->end++;
2769 else
2770 rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
2771 }
2772 rl_point += l;
2773 rl_end += l;
2774 the_line[rl_end] = '\0';
2775 }
2776
2777 /* Delete the string between FROM and TO. FROM is
2778 inclusive, TO is not. */
2779 rl_delete_text (from, to)
2780 int from, to;
2781 {
2782 extern int doing_an_undo;
2783 register char *text;
2784
2785 /* Fix it if the caller is confused. */
2786 if (from > to)
2787 {
2788 int t = from;
2789 from = to;
2790 to = t;
2791 }
2792 text = rl_copy (from, to);
2793 strncpy (the_line + from, the_line + to, rl_end - to);
2794
2795 /* Remember how to undo this delete. */
2796 if (!doing_an_undo)
2797 rl_add_undo (UNDO_DELETE, from, to, text);
2798 else
2799 free (text);
2800
2801 rl_end -= (to - from);
2802 the_line[rl_end] = '\0';
2803 }
2804
2805 \f
2806 /* **************************************************************** */
2807 /* */
2808 /* Readline character functions */
2809 /* */
2810 /* **************************************************************** */
2811
2812 /* This is not a gap editor, just a stupid line input routine. No hair
2813 is involved in writing any of the functions, and none should be. */
2814
2815 /* Note that:
2816
2817 rl_end is the place in the string that we would place '\0';
2818 i.e., it is always safe to place '\0' there.
2819
2820 rl_point is the place in the string where the cursor is. Sometimes
2821 this is the same as rl_end.
2822
2823 Any command that is called interactively receives two arguments.
2824 The first is a count: the numeric arg pased to this command.
2825 The second is the key which invoked this command.
2826 */
2827
2828 \f
2829 /* **************************************************************** */
2830 /* */
2831 /* Movement Commands */
2832 /* */
2833 /* **************************************************************** */
2834
2835 /* Note that if you `optimize' the display for these functions, you cannot
2836 use said functions in other functions which do not do optimizing display.
2837 I.e., you will have to update the data base for rl_redisplay, and you
2838 might as well let rl_redisplay do that job. */
2839
2840 /* Move forward COUNT characters. */
2841 rl_forward (count)
2842 int count;
2843 {
2844 if (count < 0)
2845 rl_backward (-count);
2846 else
2847 while (count)
2848 {
2849 #if defined (VI_MODE)
2850 if (rl_point == (rl_end - (rl_editing_mode == vi_mode)))
2851 #else
2852 if (rl_point == rl_end)
2853 #endif /* VI_MODE */
2854 {
2855 ding ();
2856 return;
2857 }
2858 else
2859 rl_point++;
2860 --count;
2861 }
2862 }
2863
2864 /* Move backward COUNT characters. */
2865 rl_backward (count)
2866 int count;
2867 {
2868 if (count < 0)
2869 rl_forward (-count);
2870 else
2871 while (count)
2872 {
2873 if (!rl_point)
2874 {
2875 ding ();
2876 return;
2877 }
2878 else
2879 --rl_point;
2880 --count;
2881 }
2882 }
2883
2884 /* Move to the beginning of the line. */
2885 rl_beg_of_line ()
2886 {
2887 rl_point = 0;
2888 }
2889
2890 /* Move to the end of the line. */
2891 rl_end_of_line ()
2892 {
2893 rl_point = rl_end;
2894 }
2895
2896 /* Move forward a word. We do what Emacs does. */
2897 rl_forward_word (count)
2898 int count;
2899 {
2900 int c;
2901
2902 if (count < 0)
2903 {
2904 rl_backward_word (-count);
2905 return;
2906 }
2907
2908 while (count)
2909 {
2910 if (rl_point == rl_end)
2911 return;
2912
2913 /* If we are not in a word, move forward until we are in one.
2914 Then, move forward until we hit a non-alphabetic character. */
2915 c = the_line[rl_point];
2916 if (!alphabetic (c))
2917 {
2918 while (++rl_point < rl_end)
2919 {
2920 c = the_line[rl_point];
2921 if (alphabetic (c)) break;
2922 }
2923 }
2924 if (rl_point == rl_end) return;
2925 while (++rl_point < rl_end)
2926 {
2927 c = the_line[rl_point];
2928 if (!alphabetic (c)) break;
2929 }
2930 --count;
2931 }
2932 }
2933
2934 /* Move backward a word. We do what Emacs does. */
2935 rl_backward_word (count)
2936 int count;
2937 {
2938 int c;
2939
2940 if (count < 0)
2941 {
2942 rl_forward_word (-count);
2943 return;
2944 }
2945
2946 while (count)
2947 {
2948 if (!rl_point)
2949 return;
2950
2951 /* Like rl_forward_word (), except that we look at the characters
2952 just before point. */
2953
2954 c = the_line[rl_point - 1];
2955 if (!alphabetic (c))
2956 {
2957 while (--rl_point)
2958 {
2959 c = the_line[rl_point - 1];
2960 if (alphabetic (c)) break;
2961 }
2962 }
2963
2964 while (rl_point)
2965 {
2966 c = the_line[rl_point - 1];
2967 if (!alphabetic (c))
2968 break;
2969 else --rl_point;
2970 }
2971 --count;
2972 }
2973 }
2974
2975 /* Clear the current line. Numeric argument to C-l does this. */
2976 rl_refresh_line ()
2977 {
2978 int curr_line = last_c_pos / screenwidth;
2979 extern char *term_clreol;
2980
2981 move_vert(curr_line);
2982 move_cursor_relative (0, the_line); /* XXX is this right */
2983
2984 #ifdef __GO32__
2985 {
2986 int r, c, w;
2987 ScreenGetCursor(&r, &c);
2988 w = ScreenCols();
2989 memset(ScreenPrimary+r*w+c, 0, (w-c)*2);
2990 }
2991 #else /* __GO32__ */
2992 if (term_clreol)
2993 tputs (term_clreol, 1, output_character_function);
2994 #endif /* __GO32__/else */
2995
2996 rl_forced_update_display ();
2997 rl_display_fixed = 1;
2998 }
2999
3000 /* C-l typed to a line without quoting clears the screen, and then reprints
3001 the prompt and the current input line. Given a numeric arg, redraw only
3002 the current line. */
3003 rl_clear_screen ()
3004 {
3005 extern char *term_clrpag;
3006
3007 if (rl_explicit_arg)
3008 {
3009 rl_refresh_line ();
3010 return;
3011 }
3012
3013 #ifndef __GO32__
3014 if (term_clrpag)
3015 tputs (term_clrpag, 1, output_character_function);
3016 else
3017 #endif /* !__GO32__ */
3018 crlf ();
3019
3020 rl_forced_update_display ();
3021 rl_display_fixed = 1;
3022 }
3023
3024 rl_arrow_keys (count, c)
3025 int count, c;
3026 {
3027 int ch;
3028
3029 ch = rl_read_key ();
3030
3031 switch (to_upper (ch))
3032 {
3033 case 'A':
3034 rl_get_previous_history (count);
3035 break;
3036
3037 case 'B':
3038 rl_get_next_history (count);
3039 break;
3040
3041 case 'C':
3042 rl_forward (count);
3043 break;
3044
3045 case 'D':
3046 rl_backward (count);
3047 break;
3048
3049 default:
3050 ding ();
3051 }
3052 }
3053
3054 \f
3055 /* **************************************************************** */
3056 /* */
3057 /* Text commands */
3058 /* */
3059 /* **************************************************************** */
3060
3061 /* Insert the character C at the current location, moving point forward. */
3062 rl_insert (count, c)
3063 int count, c;
3064 {
3065 register int i;
3066 char *string;
3067
3068 if (count <= 0)
3069 return;
3070
3071 /* If we can optimize, then do it. But don't let people crash
3072 readline because of extra large arguments. */
3073 if (count > 1 && count < 1024)
3074 {
3075 string = (char *)alloca (1 + count);
3076
3077 for (i = 0; i < count; i++)
3078 string[i] = c;
3079
3080 string[i] = '\0';
3081 rl_insert_text (string);
3082 return;
3083 }
3084
3085 if (count > 1024)
3086 {
3087 int decreaser;
3088
3089 string = (char *)alloca (1024 + 1);
3090
3091 for (i = 0; i < 1024; i++)
3092 string[i] = c;
3093
3094 while (count)
3095 {
3096 decreaser = (count > 1024 ? 1024 : count);
3097 string[decreaser] = '\0';
3098 rl_insert_text (string);
3099 count -= decreaser;
3100 }
3101 return;
3102 }
3103
3104 /* We are inserting a single character.
3105 If there is pending input, then make a string of all of the
3106 pending characters that are bound to rl_insert, and insert
3107 them all. */
3108 if (any_typein)
3109 {
3110 int key = 0, t;
3111
3112 i = 0;
3113 string = (char *)alloca (ibuffer_len + 1);
3114 string[i++] = c;
3115
3116 while ((t = rl_get_char (&key)) &&
3117 (keymap[key].type == ISFUNC &&
3118 keymap[key].function == rl_insert))
3119 string[i++] = key;
3120
3121 if (t)
3122 rl_unget_char (key);
3123
3124 string[i] = '\0';
3125 rl_insert_text (string);
3126 return;
3127 }
3128 else
3129 {
3130 /* Inserting a single character. */
3131 string = (char *)alloca (2);
3132
3133 string[1] = '\0';
3134 string[0] = c;
3135 rl_insert_text (string);
3136 }
3137 }
3138
3139 /* Insert the next typed character verbatim. */
3140 rl_quoted_insert (count)
3141 int count;
3142 {
3143 int c = rl_read_key ();
3144 rl_insert (count, c);
3145 }
3146
3147 /* Insert a tab character. */
3148 rl_tab_insert (count)
3149 int count;
3150 {
3151 rl_insert (count, '\t');
3152 }
3153
3154 /* What to do when a NEWLINE is pressed. We accept the whole line.
3155 KEY is the key that invoked this command. I guess it could have
3156 meaning in the future. */
3157 rl_newline (count, key)
3158 int count, key;
3159 {
3160
3161 rl_done = 1;
3162
3163 #if defined (VI_MODE)
3164 {
3165 extern int vi_doing_insert;
3166 if (vi_doing_insert)
3167 {
3168 rl_end_undo_group ();
3169 vi_doing_insert = 0;
3170 }
3171 }
3172 #endif /* VI_MODE */
3173
3174 if (readline_echoing_p)
3175 {
3176 move_vert (vis_botlin);
3177 vis_botlin = 0;
3178 crlf ();
3179 fflush (out_stream);
3180 rl_display_fixed++;
3181 }
3182 }
3183
3184 rl_clean_up_for_exit ()
3185 {
3186 if (readline_echoing_p)
3187 {
3188 move_vert (vis_botlin);
3189 vis_botlin = 0;
3190 fflush (out_stream);
3191 rl_restart_output ();
3192 }
3193 }
3194
3195 /* What to do for some uppercase characters, like meta characters,
3196 and some characters appearing in emacs_ctlx_keymap. This function
3197 is just a stub, you bind keys to it and the code in rl_dispatch ()
3198 is special cased. */
3199 rl_do_lowercase_version (ignore1, ignore2)
3200 int ignore1, ignore2;
3201 {
3202 }
3203
3204 /* Rubout the character behind point. */
3205 rl_rubout (count)
3206 int count;
3207 {
3208 if (count < 0)
3209 {
3210 rl_delete (-count);
3211 return;
3212 }
3213
3214 if (!rl_point)
3215 {
3216 ding ();
3217 return;
3218 }
3219
3220 if (count > 1)
3221 {
3222 int orig_point = rl_point;
3223 rl_backward (count);
3224 rl_kill_text (orig_point, rl_point);
3225 }
3226 else
3227 {
3228 int c = the_line[--rl_point];
3229 rl_delete_text (rl_point, rl_point + 1);
3230
3231 if (rl_point == rl_end && alphabetic (c) && last_c_pos)
3232 {
3233 backspace (1);
3234 putc (' ', out_stream);
3235 backspace (1);
3236 last_c_pos--;
3237 visible_line[last_c_pos] = '\0';
3238 rl_display_fixed++;
3239 }
3240 }
3241 }
3242
3243 /* Delete the character under the cursor. Given a numeric argument,
3244 kill that many characters instead. */
3245 rl_delete (count, invoking_key)
3246 int count, invoking_key;
3247 {
3248 if (count < 0)
3249 {
3250 rl_rubout (-count);
3251 return;
3252 }
3253
3254 if (rl_point == rl_end)
3255 {
3256 ding ();
3257 return;
3258 }
3259
3260 if (count > 1)
3261 {
3262 int orig_point = rl_point;
3263 rl_forward (count);
3264 rl_kill_text (orig_point, rl_point);
3265 rl_point = orig_point;
3266 }
3267 else
3268 rl_delete_text (rl_point, rl_point + 1);
3269 }
3270
3271 \f
3272 /* **************************************************************** */
3273 /* */
3274 /* Kill commands */
3275 /* */
3276 /* **************************************************************** */
3277
3278 /* The next two functions mimic unix line editing behaviour, except they
3279 save the deleted text on the kill ring. This is safer than not saving
3280 it, and since we have a ring, nobody should get screwed. */
3281
3282 /* This does what C-w does in Unix. We can't prevent people from
3283 using behaviour that they expect. */
3284 rl_unix_word_rubout ()
3285 {
3286 if (!rl_point) ding ();
3287 else {
3288 int orig_point = rl_point;
3289 while (rl_point && whitespace (the_line[rl_point - 1]))
3290 rl_point--;
3291 while (rl_point && !whitespace (the_line[rl_point - 1]))
3292 rl_point--;
3293 rl_kill_text (rl_point, orig_point);
3294 }
3295 }
3296
3297 /* Here is C-u doing what Unix does. You don't *have* to use these
3298 key-bindings. We have a choice of killing the entire line, or
3299 killing from where we are to the start of the line. We choose the
3300 latter, because if you are a Unix weenie, then you haven't backspaced
3301 into the line at all, and if you aren't, then you know what you are
3302 doing. */
3303 rl_unix_line_discard ()
3304 {
3305 if (!rl_point) ding ();
3306 else {
3307 rl_kill_text (rl_point, 0);
3308 rl_point = 0;
3309 }
3310 }
3311
3312 \f
3313
3314 /* **************************************************************** */
3315 /* */
3316 /* Commands For Typos */
3317 /* */
3318 /* **************************************************************** */
3319
3320 /* Random and interesting things in here. */
3321
3322 /* **************************************************************** */
3323 /* */
3324 /* Changing Case */
3325 /* */
3326 /* **************************************************************** */
3327
3328 /* The three kinds of things that we know how to do. */
3329 #define UpCase 1
3330 #define DownCase 2
3331 #define CapCase 3
3332
3333 /* Uppercase the word at point. */
3334 rl_upcase_word (count)
3335 int count;
3336 {
3337 rl_change_case (count, UpCase);
3338 }
3339
3340 /* Lowercase the word at point. */
3341 rl_downcase_word (count)
3342 int count;
3343 {
3344 rl_change_case (count, DownCase);
3345 }
3346
3347 /* Upcase the first letter, downcase the rest. */
3348 rl_capitalize_word (count)
3349 int count;
3350 {
3351 rl_change_case (count, CapCase);
3352 }
3353
3354 /* The meaty function.
3355 Change the case of COUNT words, performing OP on them.
3356 OP is one of UpCase, DownCase, or CapCase.
3357 If a negative argument is given, leave point where it started,
3358 otherwise, leave it where it moves to. */
3359 rl_change_case (count, op)
3360 int count, op;
3361 {
3362 register int start = rl_point, end;
3363 int state = 0;
3364
3365 rl_forward_word (count);
3366 end = rl_point;
3367
3368 if (count < 0)
3369 {
3370 int temp = start;
3371 start = end;
3372 end = temp;
3373 }
3374
3375 /* We are going to modify some text, so let's prepare to undo it. */
3376 rl_modifying (start, end);
3377
3378 for (; start < end; start++)
3379 {
3380 switch (op)
3381 {
3382 case UpCase:
3383 the_line[start] = to_upper (the_line[start]);
3384 break;
3385
3386 case DownCase:
3387 the_line[start] = to_lower (the_line[start]);
3388 break;
3389
3390 case CapCase:
3391 if (state == 0)
3392 {
3393 the_line[start] = to_upper (the_line[start]);
3394 state = 1;
3395 }
3396 else
3397 {
3398 the_line[start] = to_lower (the_line[start]);
3399 }
3400 if (!pure_alphabetic (the_line[start]))
3401 state = 0;
3402 break;
3403
3404 default:
3405 abort ();
3406 }
3407 }
3408 rl_point = end;
3409 }
3410
3411 /* **************************************************************** */
3412 /* */
3413 /* Transposition */
3414 /* */
3415 /* **************************************************************** */
3416
3417 /* Transpose the words at point. */
3418 rl_transpose_words (count)
3419 int count;
3420 {
3421 char *word1, *word2;
3422 int w1_beg, w1_end, w2_beg, w2_end;
3423 int orig_point = rl_point;
3424
3425 if (!count) return;
3426
3427 /* Find the two words. */
3428 rl_forward_word (count);
3429 w2_end = rl_point;
3430 rl_backward_word (1);
3431 w2_beg = rl_point;
3432 rl_backward_word (count);
3433 w1_beg = rl_point;
3434 rl_forward_word (1);
3435 w1_end = rl_point;
3436
3437 /* Do some check to make sure that there really are two words. */
3438 if ((w1_beg == w2_beg) || (w2_beg < w1_end))
3439 {
3440 ding ();
3441 rl_point = orig_point;
3442 return;
3443 }
3444
3445 /* Get the text of the words. */
3446 word1 = rl_copy (w1_beg, w1_end);
3447 word2 = rl_copy (w2_beg, w2_end);
3448
3449 /* We are about to do many insertions and deletions. Remember them
3450 as one operation. */
3451 rl_begin_undo_group ();
3452
3453 /* Do the stuff at word2 first, so that we don't have to worry
3454 about word1 moving. */
3455 rl_point = w2_beg;
3456 rl_delete_text (w2_beg, w2_end);
3457 rl_insert_text (word1);
3458
3459 rl_point = w1_beg;
3460 rl_delete_text (w1_beg, w1_end);
3461 rl_insert_text (word2);
3462
3463 /* This is exactly correct since the text before this point has not
3464 changed in length. */
3465 rl_point = w2_end;
3466
3467 /* I think that does it. */
3468 rl_end_undo_group ();
3469 free (word1); free (word2);
3470 }
3471
3472 /* Transpose the characters at point. If point is at the end of the line,
3473 then transpose the characters before point. */
3474 rl_transpose_chars (count)
3475 int count;
3476 {
3477 if (!count)
3478 return;
3479
3480 if (!rl_point || rl_end < 2) {
3481 ding ();
3482 return;
3483 }
3484
3485 while (count)
3486 {
3487 if (rl_point == rl_end)
3488 {
3489 int t = the_line[rl_point - 1];
3490
3491 the_line[rl_point - 1] = the_line[rl_point - 2];
3492 the_line[rl_point - 2] = t;
3493 }
3494 else
3495 {
3496 int t = the_line[rl_point];
3497
3498 the_line[rl_point] = the_line[rl_point - 1];
3499 the_line[rl_point - 1] = t;
3500
3501 if (count < 0 && rl_point)
3502 rl_point--;
3503 else
3504 rl_point++;
3505 }
3506
3507 if (count < 0)
3508 count++;
3509 else
3510 count--;
3511 }
3512 }
3513
3514 \f
3515 /* **************************************************************** */
3516 /* */
3517 /* Bogus Flow Control */
3518 /* */
3519 /* **************************************************************** */
3520
3521 rl_restart_output (count, key)
3522 int count, key;
3523 {
3524 int fildes = fileno (rl_outstream);
3525 #if defined (TIOCSTART)
3526 #if defined (apollo)
3527 ioctl (&fildes, TIOCSTART, 0);
3528 #else
3529 ioctl (fildes, TIOCSTART, 0);
3530 #endif /* apollo */
3531
3532 #else
3533 # if defined (TERMIOS_TTY_DRIVER)
3534 tcflow (fildes, TCOON);
3535 # else
3536 # if defined (TCXONC)
3537 ioctl (fildes, TCXONC, TCOON);
3538 # endif /* TCXONC */
3539 # endif /* !TERMIOS_TTY_DRIVER */
3540 #endif /* TIOCSTART */
3541 }
3542
3543 rl_stop_output (count, key)
3544 int count, key;
3545 {
3546 int fildes = fileno (rl_instream);
3547
3548 #if defined (TIOCSTOP)
3549 # if defined (apollo)
3550 ioctl (&fildes, TIOCSTOP, 0);
3551 # else
3552 ioctl (fildes, TIOCSTOP, 0);
3553 # endif /* apollo */
3554 #else
3555 # if defined (TERMIOS_TTY_DRIVER)
3556 tcflow (fildes, TCOOFF);
3557 # else
3558 # if defined (TCXONC)
3559 ioctl (fildes, TCXONC, TCOON);
3560 # endif /* TCXONC */
3561 # endif /* !TERMIOS_TTY_DRIVER */
3562 #endif /* TIOCSTOP */
3563 }
3564
3565 /* **************************************************************** */
3566 /* */
3567 /* Completion matching, from readline's point of view. */
3568 /* */
3569 /* **************************************************************** */
3570
3571 /* Pointer to the generator function for completion_matches ().
3572 NULL means to use filename_entry_function (), the default filename
3573 completer. */
3574 Function *rl_completion_entry_function = (Function *)NULL;
3575
3576 /* Pointer to alternative function to create matches.
3577 Function is called with TEXT, START, and END.
3578 START and END are indices in RL_LINE_BUFFER saying what the boundaries
3579 of TEXT are.
3580 If this function exists and returns NULL then call the value of
3581 rl_completion_entry_function to try to match, otherwise use the
3582 array of strings returned. */
3583 Function *rl_attempted_completion_function = (Function *)NULL;
3584
3585 /* Local variable states what happened during the last completion attempt. */
3586 static int completion_changed_buffer = 0;
3587
3588 /* Complete the word at or before point. You have supplied the function
3589 that does the initial simple matching selection algorithm (see
3590 completion_matches ()). The default is to do filename completion. */
3591
3592 rl_complete (ignore, invoking_key)
3593 int ignore, invoking_key;
3594 {
3595 if (rl_last_func == rl_complete && !completion_changed_buffer)
3596 rl_complete_internal ('?');
3597 else
3598 rl_complete_internal (TAB);
3599 }
3600
3601 /* List the possible completions. See description of rl_complete (). */
3602 rl_possible_completions ()
3603 {
3604 rl_complete_internal ('?');
3605 }
3606
3607 /* The user must press "y" or "n". Non-zero return means "y" pressed. */
3608 get_y_or_n ()
3609 {
3610 int c;
3611 loop:
3612 c = rl_read_key ();
3613 if (c == 'y' || c == 'Y') return (1);
3614 if (c == 'n' || c == 'N') return (0);
3615 if (c == ABORT_CHAR) rl_abort ();
3616 ding (); goto loop;
3617 }
3618
3619 /* Up to this many items will be displayed in response to a
3620 possible-completions call. After that, we ask the user if
3621 she is sure she wants to see them all. */
3622 int rl_completion_query_items = 100;
3623
3624 /* The basic list of characters that signal a break between words for the
3625 completer routine. The contents of this variable is what breaks words
3626 in the shell, i.e. " \t\n\"\\'`@$><=" */
3627 char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
3628
3629 /* The list of characters that signal a break between words for
3630 rl_complete_internal. The default list is the contents of
3631 rl_basic_word_break_characters. */
3632 char *rl_completer_word_break_characters = (char *)NULL;
3633
3634 /* The list of characters which are used to quote a substring of the command
3635 line. Command completion occurs on the entire substring, and within the
3636 substring rl_completer_word_break_characters are treated as any other
3637 character, unless they also appear within this list. */
3638 char *rl_completer_quote_characters = (char *)NULL;
3639
3640 /* List of characters that are word break characters, but should be left
3641 in TEXT when it is passed to the completion function. The shell uses
3642 this to help determine what kind of completing to do. */
3643 char *rl_special_prefixes = (char *)NULL;
3644
3645 /* If non-zero, then disallow duplicates in the matches. */
3646 int rl_ignore_completion_duplicates = 1;
3647
3648 /* Non-zero means that the results of the matches are to be treated
3649 as filenames. This is ALWAYS zero on entry, and can only be changed
3650 within a completion entry finder function. */
3651 int rl_filename_completion_desired = 0;
3652
3653 /* This function, if defined, is called by the completer when real
3654 filename completion is done, after all the matching names have been
3655 generated. It is passed a (char**) known as matches in the code below.
3656 It consists of a NULL-terminated array of pointers to potential
3657 matching strings. The 1st element (matches[0]) is the maximal
3658 substring that is common to all matches. This function can re-arrange
3659 the list of matches as required, but all elements of the array must be
3660 free()'d if they are deleted. The main intent of this function is
3661 to implement FIGNORE a la SunOS csh. */
3662 Function *rl_ignore_some_completions_function = (Function *)NULL;
3663
3664 /* Complete the word at or before point.
3665 WHAT_TO_DO says what to do with the completion.
3666 `?' means list the possible completions.
3667 TAB means do standard completion.
3668 `*' means insert all of the possible completions. */
3669 rl_complete_internal (what_to_do)
3670 int what_to_do;
3671 {
3672 char *filename_completion_function ();
3673 char **completion_matches (), **matches;
3674 Function *our_func;
3675 int start, scan, end, delimiter = 0;
3676 char *text, *saved_line_buffer;
3677 char quote_char = '\0';
3678 char *replacement;
3679
3680 if (the_line)
3681 saved_line_buffer = savestring (the_line);
3682 else
3683 saved_line_buffer = (char *)NULL;
3684
3685 if (rl_completion_entry_function)
3686 our_func = rl_completion_entry_function;
3687 else
3688 our_func = (int (*)())filename_completion_function;
3689
3690 /* Only the completion entry function can change this. */
3691 rl_filename_completion_desired = 0;
3692
3693 /* We now look backwards for the start of a filename/variable word. */
3694 end = rl_point;
3695
3696 if (rl_point)
3697 {
3698 if (rl_completer_quote_characters)
3699 {
3700 /* We have a list of characters which can be used in pairs to quote
3701 substrings for completion. Try to find the start of an unclosed
3702 quoted substring.
3703 FIXME: Doesn't yet handle '\' escapes to hid embedded quotes */
3704 for (scan = 0; scan < end; scan++)
3705 {
3706 if (quote_char != '\0')
3707 {
3708 /* Ignore everything until the matching close quote char */
3709 if (the_line[scan] == quote_char)
3710 {
3711 /* Found matching close quote. Abandon this substring. */
3712 quote_char = '\0';
3713 rl_point = end;
3714 }
3715 }
3716 else if (rindex (rl_completer_quote_characters, the_line[scan]))
3717 {
3718 /* Found start of a quoted substring. */
3719 quote_char = the_line[scan];
3720 rl_point = scan + 1;
3721 }
3722 }
3723 }
3724 if (rl_point == end)
3725 {
3726 /* We didn't find an unclosed quoted substring upon which to do
3727 completion, so use the word break characters to find the
3728 substring on which to do completion. */
3729 while (--rl_point &&
3730 !rindex (rl_completer_word_break_characters,
3731 the_line[rl_point])) {;}
3732 }
3733
3734 /* If we are at a word break, then advance past it. */
3735 if (rindex (rl_completer_word_break_characters, the_line[rl_point]))
3736 {
3737 /* If the character that caused the word break was a quoting
3738 character, then remember it as the delimiter. */
3739 if (rindex ("\"'", the_line[rl_point]) && (end - rl_point) > 1)
3740 delimiter = the_line[rl_point];
3741
3742 /* If the character isn't needed to determine something special
3743 about what kind of completion to perform, then advance past it. */
3744
3745 if (!rl_special_prefixes ||
3746 !rindex (rl_special_prefixes, the_line[rl_point]))
3747 rl_point++;
3748 }
3749 }
3750
3751 start = rl_point;
3752 rl_point = end;
3753 text = rl_copy (start, end);
3754
3755 /* If the user wants to TRY to complete, but then wants to give
3756 up and use the default completion function, they set the
3757 variable rl_attempted_completion_function. */
3758 if (rl_attempted_completion_function)
3759 {
3760 matches =
3761 (char **)(*rl_attempted_completion_function) (text, start, end);
3762
3763 if (matches)
3764 {
3765 our_func = (Function *)NULL;
3766 goto after_usual_completion;
3767 }
3768 }
3769
3770 matches = completion_matches (text, our_func);
3771
3772 after_usual_completion:
3773 free (text);
3774
3775 if (!matches)
3776 ding ();
3777 else
3778 {
3779 register int i;
3780
3781 some_matches:
3782
3783 /* It seems to me that in all the cases we handle we would like
3784 to ignore duplicate possibilities. Scan for the text to
3785 insert being identical to the other completions. */
3786 if (rl_ignore_completion_duplicates)
3787 {
3788 char *lowest_common;
3789 int j, newlen = 0;
3790
3791 /* Sort the items. */
3792 /* It is safe to sort this array, because the lowest common
3793 denominator found in matches[0] will remain in place. */
3794 for (i = 0; matches[i]; i++);
3795 qsort (matches, i, sizeof (char *), compare_strings);
3796
3797 /* Remember the lowest common denominator for it may be unique. */
3798 lowest_common = savestring (matches[0]);
3799
3800 for (i = 0; matches[i + 1]; i++)
3801 {
3802 if (strcmp (matches[i], matches[i + 1]) == 0)
3803 {
3804 free (matches[i]);
3805 matches[i] = (char *)-1;
3806 }
3807 else
3808 newlen++;
3809 }
3810
3811 /* We have marked all the dead slots with (char *)-1.
3812 Copy all the non-dead entries into a new array. */
3813 {
3814 char **temp_array =
3815 (char **)malloc ((3 + newlen) * sizeof (char *));
3816
3817 for (i = 1, j = 1; matches[i]; i++)
3818 {
3819 if (matches[i] != (char *)-1)
3820 temp_array[j++] = matches[i];
3821 }
3822
3823 temp_array[j] = (char *)NULL;
3824
3825 if (matches[0] != (char *)-1)
3826 free (matches[0]);
3827
3828 free (matches);
3829
3830 matches = temp_array;
3831 }
3832
3833 /* Place the lowest common denominator back in [0]. */
3834 matches[0] = lowest_common;
3835
3836 /* If there is one string left, and it is identical to the
3837 lowest common denominator, then the LCD is the string to
3838 insert. */
3839 if (j == 2 && strcmp (matches[0], matches[1]) == 0)
3840 {
3841 free (matches[1]);
3842 matches[1] = (char *)NULL;
3843 }
3844 }
3845
3846 switch (what_to_do)
3847 {
3848 case TAB:
3849 /* If we are matching filenames, then here is our chance to
3850 do clever processing by re-examining the list. Call the
3851 ignore function with the array as a parameter. It can
3852 munge the array, deleting matches as it desires. */
3853 if (rl_ignore_some_completions_function &&
3854 our_func == (int (*)())filename_completion_function)
3855 (void)(*rl_ignore_some_completions_function)(matches);
3856
3857 /* If we are doing completions on quoted substrings, and any matches
3858 contain any of the completer word break characters, then auto-
3859 matically prepend the substring with a quote character (just
3860 pick the first one from the list of such) if it does not already
3861 begin with a quote string. FIXME: Need to remove any such
3862 automatically inserted quote character when it no longer is
3863 necessary, such as if we change the string we are completing on
3864 and the new set of matches don't require a quoted substring? */
3865
3866 replacement = matches[0];
3867 if (matches[0] != NULL
3868 && rl_completer_quote_characters != NULL
3869 && (quote_char == '\0'))
3870 {
3871 for (i = 1; matches[i] != NULL; i++)
3872 {
3873 if (strpbrk (matches[i], rl_completer_word_break_characters))
3874 {
3875 /* Found an embedded word break character in a potential
3876 match, so need to prepend a quote character if we are
3877 replacing the completion string. */
3878 replacement = alloca (strlen (matches[0]) + 2);
3879 quote_char = *rl_completer_quote_characters;
3880 *replacement = quote_char;
3881 strcpy (replacement + 1, matches[0]);
3882 break;
3883 }
3884 }
3885 }
3886 if (replacement)
3887 {
3888 rl_delete_text (start, rl_point);
3889 rl_point = start;
3890 rl_insert_text (replacement);
3891 }
3892
3893 /* If there are more matches, ring the bell to indicate.
3894 If this was the only match, and we are hacking files,
3895 check the file to see if it was a directory. If so,
3896 add a '/' to the name. If not, and we are at the end
3897 of the line, then add a space. */
3898 if (matches[1])
3899 {
3900 ding (); /* There are other matches remaining. */
3901 }
3902 else
3903 {
3904 char temp_string[16];
3905 int temp_index = 0;
3906
3907 if (quote_char)
3908 {
3909 temp_string[temp_index++] = quote_char;
3910 }
3911 temp_string[temp_index++] = delimiter ? delimiter : ' ';
3912 temp_string[temp_index++] = '\0';
3913
3914 if (rl_filename_completion_desired)
3915 {
3916 struct stat finfo;
3917 char *filename = tilde_expand (matches[0]);
3918
3919 if ((stat (filename, &finfo) == 0) &&
3920 S_ISDIR (finfo.st_mode))
3921 {
3922 if (the_line[rl_point] != '/')
3923 rl_insert_text ("/");
3924 }
3925 else
3926 {
3927 if (rl_point == rl_end)
3928 rl_insert_text (temp_string);
3929 }
3930 free (filename);
3931 }
3932 else
3933 {
3934 if (rl_point == rl_end)
3935 rl_insert_text (temp_string);
3936 }
3937 }
3938 break;
3939
3940 case '*':
3941 {
3942 int i = 1;
3943
3944 rl_delete_text (start, rl_point);
3945 rl_point = start;
3946 rl_begin_undo_group ();
3947 if (matches[1])
3948 {
3949 while (matches[i])
3950 {
3951 rl_insert_text (matches[i++]);
3952 rl_insert_text (" ");
3953 }
3954 }
3955 else
3956 {
3957 rl_insert_text (matches[0]);
3958 rl_insert_text (" ");
3959 }
3960 rl_end_undo_group ();
3961 }
3962 break;
3963
3964 case '?':
3965 {
3966 int len, count, limit, max = 0;
3967 int j, k, l;
3968
3969 /* Handle simple case first. What if there is only one answer? */
3970 if (!matches[1])
3971 {
3972 char *temp;
3973
3974 if (rl_filename_completion_desired)
3975 temp = rindex (matches[0], '/');
3976 else
3977 temp = (char *)NULL;
3978
3979 if (!temp)
3980 temp = matches[0];
3981 else
3982 temp++;
3983
3984 crlf ();
3985 fprintf (out_stream, "%s", temp);
3986 crlf ();
3987 goto restart;
3988 }
3989
3990 /* There is more than one answer. Find out how many there are,
3991 and find out what the maximum printed length of a single entry
3992 is. */
3993 for (i = 1; matches[i]; i++)
3994 {
3995 char *temp = (char *)NULL;
3996
3997 /* If we are hacking filenames, then only count the characters
3998 after the last slash in the pathname. */
3999 if (rl_filename_completion_desired)
4000 temp = rindex (matches[i], '/');
4001 else
4002 temp = (char *)NULL;
4003
4004 if (!temp)
4005 temp = matches[i];
4006 else
4007 temp++;
4008
4009 if (strlen (temp) > max)
4010 max = strlen (temp);
4011 }
4012
4013 len = i;
4014
4015 /* If there are many items, then ask the user if she
4016 really wants to see them all. */
4017 if (len >= rl_completion_query_items)
4018 {
4019 crlf ();
4020 fprintf (out_stream,
4021 "There are %d possibilities. Do you really", len);
4022 crlf ();
4023 fprintf (out_stream, "wish to see them all? (y or n)");
4024 fflush (out_stream);
4025 if (!get_y_or_n ())
4026 {
4027 crlf ();
4028 goto restart;
4029 }
4030 }
4031 /* How many items of MAX length can we fit in the screen window? */
4032 max += 2;
4033 limit = screenwidth / max;
4034 if (limit != 1 && (limit * max == screenwidth))
4035 limit--;
4036
4037 /* Avoid a possible floating exception. If max > screenwidth,
4038 limit will be 0 and a divide-by-zero fault will result. */
4039 if (limit == 0)
4040 limit = 1;
4041
4042 /* How many iterations of the printing loop? */
4043 count = (len + (limit - 1)) / limit;
4044
4045 /* Watch out for special case. If LEN is less than LIMIT, then
4046 just do the inner printing loop. */
4047 if (len < limit) count = 1;
4048
4049 /* Sort the items if they are not already sorted. */
4050 if (!rl_ignore_completion_duplicates)
4051 qsort (matches, len, sizeof (char *), compare_strings);
4052
4053 /* Print the sorted items, up-and-down alphabetically, like
4054 ls might. */
4055 crlf ();
4056
4057 for (i = 1; i < count + 1; i++)
4058 {
4059 for (j = 0, l = i; j < limit; j++)
4060 {
4061 if (l > len || !matches[l])
4062 {
4063 break;
4064 }
4065 else
4066 {
4067 char *temp = (char *)NULL;
4068
4069 if (rl_filename_completion_desired)
4070 temp = rindex (matches[l], '/');
4071 else
4072 temp = (char *)NULL;
4073
4074 if (!temp)
4075 temp = matches[l];
4076 else
4077 temp++;
4078
4079 fprintf (out_stream, "%s", temp);
4080 for (k = 0; k < max - strlen (temp); k++)
4081 putc (' ', out_stream);
4082 }
4083 l += count;
4084 }
4085 crlf ();
4086 }
4087 restart:
4088
4089 rl_on_new_line ();
4090 }
4091 break;
4092
4093 default:
4094 abort ();
4095 }
4096
4097 for (i = 0; matches[i]; i++)
4098 free (matches[i]);
4099 free (matches);
4100 }
4101
4102 /* Check to see if the line has changed through all of this manipulation. */
4103 if (saved_line_buffer)
4104 {
4105 if (strcmp (the_line, saved_line_buffer) != 0)
4106 completion_changed_buffer = 1;
4107 else
4108 completion_changed_buffer = 0;
4109
4110 free (saved_line_buffer);
4111 }
4112 }
4113
4114 /* Stupid comparison routine for qsort () ing strings. */
4115 static int
4116 compare_strings (s1, s2)
4117 char **s1, **s2;
4118 {
4119 return (strcmp (*s1, *s2));
4120 }
4121
4122 /* A completion function for usernames.
4123 TEXT contains a partial username preceded by a random
4124 character (usually `~'). */
4125 char *
4126 username_completion_function (text, state)
4127 int state;
4128 char *text;
4129 {
4130 #ifdef __GO32__
4131 return (char *)NULL;
4132 #else /* !__GO32__ */
4133 static char *username = (char *)NULL;
4134 static struct passwd *entry;
4135 static int namelen, first_char, first_char_loc;
4136
4137 if (!state)
4138 {
4139 if (username)
4140 free (username);
4141
4142 first_char = *text;
4143
4144 if (first_char == '~')
4145 first_char_loc = 1;
4146 else
4147 first_char_loc = 0;
4148
4149 username = savestring (&text[first_char_loc]);
4150 namelen = strlen (username);
4151 setpwent ();
4152 }
4153
4154 while (entry = getpwent ())
4155 {
4156 if (strncmp (username, entry->pw_name, namelen) == 0)
4157 break;
4158 }
4159
4160 if (!entry)
4161 {
4162 endpwent ();
4163 return ((char *)NULL);
4164 }
4165 else
4166 {
4167 char *value = (char *)xmalloc (2 + strlen (entry->pw_name));
4168
4169 *value = *text;
4170
4171 strcpy (value + first_char_loc, entry->pw_name);
4172
4173 if (first_char == '~')
4174 rl_filename_completion_desired = 1;
4175
4176 return (value);
4177 }
4178 #endif /* !__GO32__ */
4179 }
4180 \f
4181 /* **************************************************************** */
4182 /* */
4183 /* Undo, and Undoing */
4184 /* */
4185 /* **************************************************************** */
4186
4187 /* Non-zero tells rl_delete_text and rl_insert_text to not add to
4188 the undo list. */
4189 int doing_an_undo = 0;
4190
4191 /* The current undo list for THE_LINE. */
4192 UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
4193
4194 /* Remember how to undo something. Concatenate some undos if that
4195 seems right. */
4196 rl_add_undo (what, start, end, text)
4197 enum undo_code what;
4198 int start, end;
4199 char *text;
4200 {
4201 UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
4202 temp->what = what;
4203 temp->start = start;
4204 temp->end = end;
4205 temp->text = text;
4206 temp->next = rl_undo_list;
4207 rl_undo_list = temp;
4208 }
4209
4210 /* Free the existing undo list. */
4211 free_undo_list ()
4212 {
4213 while (rl_undo_list) {
4214 UNDO_LIST *release = rl_undo_list;
4215 rl_undo_list = rl_undo_list->next;
4216
4217 if (release->what == UNDO_DELETE)
4218 free (release->text);
4219
4220 free (release);
4221 }
4222 }
4223
4224 /* Undo the next thing in the list. Return 0 if there
4225 is nothing to undo, or non-zero if there was. */
4226 int
4227 rl_do_undo ()
4228 {
4229 UNDO_LIST *release;
4230 int waiting_for_begin = 0;
4231
4232 undo_thing:
4233 if (!rl_undo_list)
4234 return (0);
4235
4236 doing_an_undo = 1;
4237
4238 switch (rl_undo_list->what) {
4239
4240 /* Undoing deletes means inserting some text. */
4241 case UNDO_DELETE:
4242 rl_point = rl_undo_list->start;
4243 rl_insert_text (rl_undo_list->text);
4244 free (rl_undo_list->text);
4245 break;
4246
4247 /* Undoing inserts means deleting some text. */
4248 case UNDO_INSERT:
4249 rl_delete_text (rl_undo_list->start, rl_undo_list->end);
4250 rl_point = rl_undo_list->start;
4251 break;
4252
4253 /* Undoing an END means undoing everything 'til we get to
4254 a BEGIN. */
4255 case UNDO_END:
4256 waiting_for_begin++;
4257 break;
4258
4259 /* Undoing a BEGIN means that we are done with this group. */
4260 case UNDO_BEGIN:
4261 if (waiting_for_begin)
4262 waiting_for_begin--;
4263 else
4264 abort ();
4265 break;
4266 }
4267
4268 doing_an_undo = 0;
4269
4270 release = rl_undo_list;
4271 rl_undo_list = rl_undo_list->next;
4272 free (release);
4273
4274 if (waiting_for_begin)
4275 goto undo_thing;
4276
4277 return (1);
4278 }
4279
4280 /* Begin a group. Subsequent undos are undone as an atomic operation. */
4281 rl_begin_undo_group ()
4282 {
4283 rl_add_undo (UNDO_BEGIN, 0, 0, 0);
4284 }
4285
4286 /* End an undo group started with rl_begin_undo_group (). */
4287 rl_end_undo_group ()
4288 {
4289 rl_add_undo (UNDO_END, 0, 0, 0);
4290 }
4291
4292 /* Save an undo entry for the text from START to END. */
4293 rl_modifying (start, end)
4294 int start, end;
4295 {
4296 if (start > end)
4297 {
4298 int t = start;
4299 start = end;
4300 end = t;
4301 }
4302
4303 if (start != end)
4304 {
4305 char *temp = rl_copy (start, end);
4306 rl_begin_undo_group ();
4307 rl_add_undo (UNDO_DELETE, start, end, temp);
4308 rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
4309 rl_end_undo_group ();
4310 }
4311 }
4312
4313 /* Revert the current line to its previous state. */
4314 rl_revert_line ()
4315 {
4316 if (!rl_undo_list) ding ();
4317 else {
4318 while (rl_undo_list)
4319 rl_do_undo ();
4320 }
4321 }
4322
4323 /* Do some undoing of things that were done. */
4324 rl_undo_command (count)
4325 {
4326 if (count < 0) return; /* Nothing to do. */
4327
4328 while (count)
4329 {
4330 if (rl_do_undo ())
4331 {
4332 count--;
4333 }
4334 else
4335 {
4336 ding ();
4337 break;
4338 }
4339 }
4340 }
4341 \f
4342 /* **************************************************************** */
4343 /* */
4344 /* History Utilities */
4345 /* */
4346 /* **************************************************************** */
4347
4348 /* We already have a history library, and that is what we use to control
4349 the history features of readline. However, this is our local interface
4350 to the history mechanism. */
4351
4352 /* While we are editing the history, this is the saved
4353 version of the original line. */
4354 HIST_ENTRY *saved_line_for_history = (HIST_ENTRY *)NULL;
4355
4356 /* Set the history pointer back to the last entry in the history. */
4357 start_using_history ()
4358 {
4359 using_history ();
4360 if (saved_line_for_history)
4361 free_history_entry (saved_line_for_history);
4362
4363 saved_line_for_history = (HIST_ENTRY *)NULL;
4364 }
4365
4366 /* Free the contents (and containing structure) of a HIST_ENTRY. */
4367 free_history_entry (entry)
4368 HIST_ENTRY *entry;
4369 {
4370 if (!entry) return;
4371 if (entry->line)
4372 free (entry->line);
4373 free (entry);
4374 }
4375
4376 /* Perhaps put back the current line if it has changed. */
4377 maybe_replace_line ()
4378 {
4379 HIST_ENTRY *temp = current_history ();
4380
4381 /* If the current line has changed, save the changes. */
4382 if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
4383 {
4384 temp = replace_history_entry (where_history (), the_line, rl_undo_list);
4385 free (temp->line);
4386 free (temp);
4387 }
4388 }
4389
4390 /* Put back the saved_line_for_history if there is one. */
4391 maybe_unsave_line ()
4392 {
4393 if (saved_line_for_history)
4394 {
4395 int line_len;
4396
4397 line_len = strlen (saved_line_for_history->line);
4398
4399 if (line_len >= rl_line_buffer_len)
4400 rl_extend_line_buffer (line_len);
4401
4402 strcpy (the_line, saved_line_for_history->line);
4403 rl_undo_list = (UNDO_LIST *)saved_line_for_history->data;
4404 free_history_entry (saved_line_for_history);
4405 saved_line_for_history = (HIST_ENTRY *)NULL;
4406 rl_end = rl_point = strlen (the_line);
4407 }
4408 else
4409 ding ();
4410 }
4411
4412 /* Save the current line in saved_line_for_history. */
4413 maybe_save_line ()
4414 {
4415 if (!saved_line_for_history)
4416 {
4417 saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
4418 saved_line_for_history->line = savestring (the_line);
4419 saved_line_for_history->data = (char *)rl_undo_list;
4420 }
4421 }
4422 \f
4423 /* **************************************************************** */
4424 /* */
4425 /* History Commands */
4426 /* */
4427 /* **************************************************************** */
4428
4429 /* Meta-< goes to the start of the history. */
4430 rl_beginning_of_history ()
4431 {
4432 rl_get_previous_history (1 + where_history ());
4433 }
4434
4435 /* Meta-> goes to the end of the history. (The current line). */
4436 rl_end_of_history ()
4437 {
4438 maybe_replace_line ();
4439 using_history ();
4440 maybe_unsave_line ();
4441 }
4442
4443 /* Move down to the next history line. */
4444 rl_get_next_history (count)
4445 int count;
4446 {
4447 HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
4448
4449 if (count < 0)
4450 {
4451 rl_get_previous_history (-count);
4452 return;
4453 }
4454
4455 if (!count)
4456 return;
4457
4458 maybe_replace_line ();
4459
4460 while (count)
4461 {
4462 temp = next_history ();
4463 if (!temp)
4464 break;
4465 --count;
4466 }
4467
4468 if (!temp)
4469 maybe_unsave_line ();
4470 else
4471 {
4472 int line_len;
4473
4474 line_len = strlen (temp->line);
4475
4476 if (line_len >= rl_line_buffer_len)
4477 rl_extend_line_buffer (line_len);
4478
4479 strcpy (the_line, temp->line);
4480 rl_undo_list = (UNDO_LIST *)temp->data;
4481 rl_end = rl_point = strlen (the_line);
4482 #if defined (VI_MODE)
4483 if (rl_editing_mode == vi_mode)
4484 rl_point = 0;
4485 #endif /* VI_MODE */
4486 }
4487 }
4488
4489 /* Get the previous item out of our interactive history, making it the current
4490 line. If there is no previous history, just ding. */
4491 rl_get_previous_history (count)
4492 int count;
4493 {
4494 HIST_ENTRY *old_temp = (HIST_ENTRY *)NULL;
4495 HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
4496
4497 if (count < 0)
4498 {
4499 rl_get_next_history (-count);
4500 return;
4501 }
4502
4503 if (!count)
4504 return;
4505
4506 /* If we don't have a line saved, then save this one. */
4507 maybe_save_line ();
4508
4509 /* If the current line has changed, save the changes. */
4510 maybe_replace_line ();
4511
4512 while (count)
4513 {
4514 temp = previous_history ();
4515 if (!temp)
4516 break;
4517 else
4518 old_temp = temp;
4519 --count;
4520 }
4521
4522 /* If there was a large argument, and we moved back to the start of the
4523 history, that is not an error. So use the last value found. */
4524 if (!temp && old_temp)
4525 temp = old_temp;
4526
4527 if (!temp)
4528 ding ();
4529 else
4530 {
4531 int line_len;
4532
4533 line_len = strlen (temp->line);
4534
4535 if (line_len >= rl_line_buffer_len)
4536 rl_extend_line_buffer (line_len);
4537
4538 strcpy (the_line, temp->line);
4539 rl_undo_list = (UNDO_LIST *)temp->data;
4540 rl_end = rl_point = line_len;
4541
4542 #if defined (VI_MODE)
4543 if (rl_editing_mode == vi_mode)
4544 rl_point = 0;
4545 #endif /* VI_MODE */
4546 }
4547 }
4548
4549 \f
4550 /* **************************************************************** */
4551 /* */
4552 /* I-Search and Searching */
4553 /* */
4554 /* **************************************************************** */
4555
4556 /* Search backwards through the history looking for a string which is typed
4557 interactively. Start with the current line. */
4558 rl_reverse_search_history (sign, key)
4559 int sign;
4560 int key;
4561 {
4562 rl_search_history (-sign, key);
4563 }
4564
4565 /* Search forwards through the history looking for a string which is typed
4566 interactively. Start with the current line. */
4567 rl_forward_search_history (sign, key)
4568 int sign;
4569 int key;
4570 {
4571 rl_search_history (sign, key);
4572 }
4573
4574 /* Display the current state of the search in the echo-area.
4575 SEARCH_STRING contains the string that is being searched for,
4576 DIRECTION is zero for forward, or 1 for reverse,
4577 WHERE is the history list number of the current line. If it is
4578 -1, then this line is the starting one. */
4579 rl_display_search (search_string, reverse_p, where)
4580 char *search_string;
4581 int reverse_p, where;
4582 {
4583 char *message = (char *)NULL;
4584
4585 message =
4586 (char *)alloca (1 + (search_string ? strlen (search_string) : 0) + 30);
4587
4588 *message = '\0';
4589
4590 #if defined (NOTDEF)
4591 if (where != -1)
4592 sprintf (message, "[%d]", where + history_base);
4593 #endif /* NOTDEF */
4594
4595 strcat (message, "(");
4596
4597 if (reverse_p)
4598 strcat (message, "reverse-");
4599
4600 strcat (message, "i-search)`");
4601
4602 if (search_string)
4603 strcat (message, search_string);
4604
4605 strcat (message, "': ");
4606 rl_message (message, 0, 0);
4607 rl_redisplay ();
4608 }
4609
4610 /* Search through the history looking for an interactively typed string.
4611 This is analogous to i-search. We start the search in the current line.
4612 DIRECTION is which direction to search; >= 0 means forward, < 0 means
4613 backwards. */
4614 rl_search_history (direction, invoking_key)
4615 int direction;
4616 int invoking_key;
4617 {
4618 /* The string that the user types in to search for. */
4619 char *search_string = (char *)alloca (128);
4620
4621 /* The current length of SEARCH_STRING. */
4622 int search_string_index;
4623
4624 /* The list of lines to search through. */
4625 char **lines;
4626
4627 /* The length of LINES. */
4628 int hlen;
4629
4630 /* Where we get LINES from. */
4631 HIST_ENTRY **hlist = history_list ();
4632
4633 register int i = 0;
4634 int orig_point = rl_point;
4635 int orig_line = where_history ();
4636 int last_found_line = orig_line;
4637 int c, done = 0;
4638
4639 /* The line currently being searched. */
4640 char *sline;
4641
4642 /* Offset in that line. */
4643 int index;
4644
4645 /* Non-zero if we are doing a reverse search. */
4646 int reverse = (direction < 0);
4647
4648 /* Create an arrary of pointers to the lines that we want to search. */
4649 maybe_replace_line ();
4650 if (hlist)
4651 for (i = 0; hlist[i]; i++);
4652
4653 /* Allocate space for this many lines, +1 for the current input line,
4654 and remember those lines. */
4655 lines = (char **)alloca ((1 + (hlen = i)) * sizeof (char *));
4656 for (i = 0; i < hlen; i++)
4657 lines[i] = hlist[i]->line;
4658
4659 if (saved_line_for_history)
4660 lines[i] = saved_line_for_history->line;
4661 else
4662 /* So I have to type it in this way instead. */
4663 {
4664 char *alloced_line;
4665
4666 /* Keep that mips alloca happy. */
4667 alloced_line = (char *)alloca (1 + strlen (the_line));
4668 lines[i] = alloced_line;
4669 strcpy (lines[i], &the_line[0]);
4670 }
4671
4672 hlen++;
4673
4674 /* The line where we start the search. */
4675 i = orig_line;
4676
4677 /* Initialize search parameters. */
4678 *search_string = '\0';
4679 search_string_index = 0;
4680
4681 /* Normalize DIRECTION into 1 or -1. */
4682 if (direction >= 0)
4683 direction = 1;
4684 else
4685 direction = -1;
4686
4687 rl_display_search (search_string, reverse, -1);
4688
4689 sline = the_line;
4690 index = rl_point;
4691
4692 while (!done)
4693 {
4694 c = rl_read_key ();
4695
4696 /* Hack C to Do What I Mean. */
4697 {
4698 Function *f = (Function *)NULL;
4699
4700 if (keymap[c].type == ISFUNC)
4701 {
4702 f = keymap[c].function;
4703
4704 if (f == rl_reverse_search_history)
4705 c = reverse ? -1 : -2;
4706 else if (f == rl_forward_search_history)
4707 c = !reverse ? -1 : -2;
4708 }
4709 }
4710
4711 switch (c)
4712 {
4713 case ESC:
4714 done = 1;
4715 continue;
4716
4717 /* case invoking_key: */
4718 case -1:
4719 goto search_again;
4720
4721 /* switch directions */
4722 case -2:
4723 direction = -direction;
4724 reverse = (direction < 0);
4725
4726 goto do_search;
4727
4728 case CTRL ('G'):
4729 strcpy (the_line, lines[orig_line]);
4730 rl_point = orig_point;
4731 rl_end = strlen (the_line);
4732 rl_clear_message ();
4733 return;
4734
4735 default:
4736 if (c < 32 || c > 126)
4737 {
4738 rl_execute_next (c);
4739 done = 1;
4740 continue;
4741 }
4742 else
4743 {
4744 search_string[search_string_index++] = c;
4745 search_string[search_string_index] = '\0';
4746 goto do_search;
4747
4748 search_again:
4749
4750 if (!search_string_index)
4751 continue;
4752 else
4753 {
4754 if (reverse)
4755 --index;
4756 else
4757 if (index != strlen (sline))
4758 ++index;
4759 else
4760 ding ();
4761 }
4762 do_search:
4763
4764 while (1)
4765 {
4766 if (reverse)
4767 {
4768 while (index >= 0)
4769 if (strncmp
4770 (search_string, sline + index, search_string_index)
4771 == 0)
4772 goto string_found;
4773 else
4774 index--;
4775 }
4776 else
4777 {
4778 register int limit =
4779 (strlen (sline) - search_string_index) + 1;
4780
4781 while (index < limit)
4782 {
4783 if (strncmp (search_string,
4784 sline + index,
4785 search_string_index) == 0)
4786 goto string_found;
4787 index++;
4788 }
4789 }
4790
4791 next_line:
4792 i += direction;
4793
4794 /* At limit for direction? */
4795 if ((reverse && i < 0) ||
4796 (!reverse && i == hlen))
4797 goto search_failed;
4798
4799 sline = lines[i];
4800 if (reverse)
4801 index = strlen (sline);
4802 else
4803 index = 0;
4804
4805 /* If the search string is longer than the current
4806 line, no match. */
4807 if (search_string_index > strlen (sline))
4808 goto next_line;
4809
4810 /* Start actually searching. */
4811 if (reverse)
4812 index -= search_string_index;
4813 }
4814
4815 search_failed:
4816 /* We cannot find the search string. Ding the bell. */
4817 ding ();
4818 i = last_found_line;
4819 break;
4820
4821 string_found:
4822 /* We have found the search string. Just display it. But don't
4823 actually move there in the history list until the user accepts
4824 the location. */
4825 {
4826 int line_len;
4827
4828 line_len = strlen (lines[i]);
4829
4830 if (line_len >= rl_line_buffer_len)
4831 rl_extend_line_buffer (line_len);
4832
4833 strcpy (the_line, lines[i]);
4834 rl_point = index;
4835 rl_end = line_len;
4836 last_found_line = i;
4837 rl_display_search
4838 (search_string, reverse, (i == orig_line) ? -1 : i);
4839 }
4840 }
4841 }
4842 continue;
4843 }
4844
4845 /* The searching is over. The user may have found the string that she
4846 was looking for, or else she may have exited a failing search. If
4847 INDEX is -1, then that shows that the string searched for was not
4848 found. We use this to determine where to place rl_point. */
4849 {
4850 int now = last_found_line;
4851
4852 /* First put back the original state. */
4853 strcpy (the_line, lines[orig_line]);
4854
4855 if (now < orig_line)
4856 rl_get_previous_history (orig_line - now);
4857 else
4858 rl_get_next_history (now - orig_line);
4859
4860 /* If the index of the "matched" string is less than zero, then the
4861 final search string was never matched, so put point somewhere
4862 reasonable. */
4863 if (index < 0)
4864 index = strlen (the_line);
4865
4866 rl_point = index;
4867 rl_clear_message ();
4868 }
4869 }
4870
4871 /* Make C be the next command to be executed. */
4872 rl_execute_next (c)
4873 int c;
4874 {
4875 rl_pending_input = c;
4876 }
4877 \f
4878 /* **************************************************************** */
4879 /* */
4880 /* Killing Mechanism */
4881 /* */
4882 /* **************************************************************** */
4883
4884 /* What we assume for a max number of kills. */
4885 #define DEFAULT_MAX_KILLS 10
4886
4887 /* The real variable to look at to find out when to flush kills. */
4888 int rl_max_kills = DEFAULT_MAX_KILLS;
4889
4890 /* Where to store killed text. */
4891 char **rl_kill_ring = (char **)NULL;
4892
4893 /* Where we are in the kill ring. */
4894 int rl_kill_index = 0;
4895
4896 /* How many slots we have in the kill ring. */
4897 int rl_kill_ring_length = 0;
4898
4899 /* How to say that you only want to save a certain amount
4900 of kill material. */
4901 rl_set_retained_kills (num)
4902 int num;
4903 {}
4904
4905 /* The way to kill something. This appends or prepends to the last
4906 kill, if the last command was a kill command. if FROM is less
4907 than TO, then the text is appended, otherwise prepended. If the
4908 last command was not a kill command, then a new slot is made for
4909 this kill. */
4910 rl_kill_text (from, to)
4911 int from, to;
4912 {
4913 int slot;
4914 char *text = rl_copy (from, to);
4915
4916 /* Is there anything to kill? */
4917 if (from == to)
4918 {
4919 free (text);
4920 last_command_was_kill++;
4921 return;
4922 }
4923
4924 /* Delete the copied text from the line. */
4925 rl_delete_text (from, to);
4926
4927 /* First, find the slot to work with. */
4928 if (!last_command_was_kill)
4929 {
4930 /* Get a new slot. */
4931 if (!rl_kill_ring)
4932 {
4933 /* If we don't have any defined, then make one. */
4934 rl_kill_ring = (char **)
4935 xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
4936 slot = 1;
4937 }
4938 else
4939 {
4940 /* We have to add a new slot on the end, unless we have
4941 exceeded the max limit for remembering kills. */
4942 slot = rl_kill_ring_length;
4943 if (slot == rl_max_kills)
4944 {
4945 register int i;
4946 free (rl_kill_ring[0]);
4947 for (i = 0; i < slot; i++)
4948 rl_kill_ring[i] = rl_kill_ring[i + 1];
4949 }
4950 else
4951 {
4952 rl_kill_ring =
4953 (char **)
4954 xrealloc (rl_kill_ring,
4955 ((slot = (rl_kill_ring_length += 1)) + 1)
4956 * sizeof (char *));
4957 }
4958 }
4959 slot--;
4960 }
4961 else
4962 {
4963 slot = rl_kill_ring_length - 1;
4964 }
4965
4966 /* If the last command was a kill, prepend or append. */
4967 if (last_command_was_kill && rl_editing_mode != vi_mode)
4968 {
4969 char *old = rl_kill_ring[slot];
4970 char *new = (char *)xmalloc (1 + strlen (old) + strlen (text));
4971
4972 if (from < to)
4973 {
4974 strcpy (new, old);
4975 strcat (new, text);
4976 }
4977 else
4978 {
4979 strcpy (new, text);
4980 strcat (new, old);
4981 }
4982 free (old);
4983 free (text);
4984 rl_kill_ring[slot] = new;
4985 }
4986 else
4987 {
4988 rl_kill_ring[slot] = text;
4989 }
4990 rl_kill_index = slot;
4991 last_command_was_kill++;
4992 }
4993
4994 /* Now REMEMBER! In order to do prepending or appending correctly, kill
4995 commands always make rl_point's original position be the FROM argument,
4996 and rl_point's extent be the TO argument. */
4997
4998 /* **************************************************************** */
4999 /* */
5000 /* Killing Commands */
5001 /* */
5002 /* **************************************************************** */
5003
5004 /* Delete the word at point, saving the text in the kill ring. */
5005 rl_kill_word (count)
5006 int count;
5007 {
5008 int orig_point = rl_point;
5009
5010 if (count < 0)
5011 rl_backward_kill_word (-count);
5012 else
5013 {
5014 rl_forward_word (count);
5015
5016 if (rl_point != orig_point)
5017 rl_kill_text (orig_point, rl_point);
5018
5019 rl_point = orig_point;
5020 }
5021 }
5022
5023 /* Rubout the word before point, placing it on the kill ring. */
5024 rl_backward_kill_word (count)
5025 int count;
5026 {
5027 int orig_point = rl_point;
5028
5029 if (count < 0)
5030 rl_kill_word (-count);
5031 else
5032 {
5033 rl_backward_word (count);
5034
5035 if (rl_point != orig_point)
5036 rl_kill_text (orig_point, rl_point);
5037 }
5038 }
5039
5040 /* Kill from here to the end of the line. If DIRECTION is negative, kill
5041 back to the line start instead. */
5042 rl_kill_line (direction)
5043 int direction;
5044 {
5045 int orig_point = rl_point;
5046
5047 if (direction < 0)
5048 rl_backward_kill_line (1);
5049 else
5050 {
5051 rl_end_of_line ();
5052 if (orig_point != rl_point)
5053 rl_kill_text (orig_point, rl_point);
5054 rl_point = orig_point;
5055 }
5056 }
5057
5058 /* Kill backwards to the start of the line. If DIRECTION is negative, kill
5059 forwards to the line end instead. */
5060 rl_backward_kill_line (direction)
5061 int direction;
5062 {
5063 int orig_point = rl_point;
5064
5065 if (direction < 0)
5066 rl_kill_line (1);
5067 else
5068 {
5069 if (!rl_point)
5070 ding ();
5071 else
5072 {
5073 rl_beg_of_line ();
5074 rl_kill_text (orig_point, rl_point);
5075 }
5076 }
5077 }
5078
5079 /* Yank back the last killed text. This ignores arguments. */
5080 rl_yank ()
5081 {
5082 if (!rl_kill_ring) rl_abort ();
5083 rl_insert_text (rl_kill_ring[rl_kill_index]);
5084 }
5085
5086 /* If the last command was yank, or yank_pop, and the text just
5087 before point is identical to the current kill item, then
5088 delete that text from the line, rotate the index down, and
5089 yank back some other text. */
5090 rl_yank_pop ()
5091 {
5092 int l;
5093
5094 if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
5095 !rl_kill_ring)
5096 {
5097 rl_abort ();
5098 }
5099
5100 l = strlen (rl_kill_ring[rl_kill_index]);
5101 if (((rl_point - l) >= 0) &&
5102 (strncmp (the_line + (rl_point - l),
5103 rl_kill_ring[rl_kill_index], l) == 0))
5104 {
5105 rl_delete_text ((rl_point - l), rl_point);
5106 rl_point -= l;
5107 rl_kill_index--;
5108 if (rl_kill_index < 0)
5109 rl_kill_index = rl_kill_ring_length - 1;
5110 rl_yank ();
5111 }
5112 else
5113 rl_abort ();
5114
5115 }
5116
5117 /* Yank the COUNTth argument from the previous history line. */
5118 rl_yank_nth_arg (count, ignore)
5119 int count;
5120 {
5121 register HIST_ENTRY *entry = previous_history ();
5122 char *arg;
5123
5124 if (entry)
5125 next_history ();
5126 else
5127 {
5128 ding ();
5129 return;
5130 }
5131
5132 arg = history_arg_extract (count, count, entry->line);
5133 if (!arg || !*arg)
5134 {
5135 ding ();
5136 return;
5137 }
5138
5139 rl_begin_undo_group ();
5140
5141 #if defined (VI_MODE)
5142 /* Vi mode always inserts a space befoe yanking the argument, and it
5143 inserts it right *after* rl_point. */
5144 if (rl_editing_mode == vi_mode)
5145 rl_point++;
5146 #endif /* VI_MODE */
5147
5148 if (rl_point && the_line[rl_point - 1] != ' ')
5149 rl_insert_text (" ");
5150
5151 rl_insert_text (arg);
5152 free (arg);
5153
5154 rl_end_undo_group ();
5155 }
5156
5157 /* How to toggle back and forth between editing modes. */
5158 rl_vi_editing_mode ()
5159 {
5160 #if defined (VI_MODE)
5161 rl_editing_mode = vi_mode;
5162 rl_vi_insertion_mode ();
5163 #endif /* VI_MODE */
5164 }
5165
5166 rl_emacs_editing_mode ()
5167 {
5168 rl_editing_mode = emacs_mode;
5169 keymap = emacs_standard_keymap;
5170 }
5171
5172 \f
5173 /* **************************************************************** */
5174 /* */
5175 /* Completion */
5176 /* */
5177 /* **************************************************************** */
5178
5179 /* Non-zero means that case is not significant in completion. */
5180 int completion_case_fold = 0;
5181
5182 /* Return an array of (char *) which is a list of completions for TEXT.
5183 If there are no completions, return a NULL pointer.
5184 The first entry in the returned array is the substitution for TEXT.
5185 The remaining entries are the possible completions.
5186 The array is terminated with a NULL pointer.
5187
5188 ENTRY_FUNCTION is a function of two args, and returns a (char *).
5189 The first argument is TEXT.
5190 The second is a state argument; it should be zero on the first call, and
5191 non-zero on subsequent calls. It returns a NULL pointer to the caller
5192 when there are no more matches.
5193 */
5194 char **
5195 completion_matches (text, entry_function)
5196 char *text;
5197 char *(*entry_function) ();
5198 {
5199 /* Number of slots in match_list. */
5200 int match_list_size;
5201
5202 /* The list of matches. */
5203 char **match_list =
5204 (char **)xmalloc (((match_list_size = 10) + 1) * sizeof (char *));
5205
5206 /* Number of matches actually found. */
5207 int matches = 0;
5208
5209 /* Temporary string binder. */
5210 char *string;
5211
5212 match_list[1] = (char *)NULL;
5213
5214 while (string = (*entry_function) (text, matches))
5215 {
5216 if (matches + 1 == match_list_size)
5217 match_list = (char **)xrealloc
5218 (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
5219
5220 match_list[++matches] = string;
5221 match_list[matches + 1] = (char *)NULL;
5222 }
5223
5224 /* If there were any matches, then look through them finding out the
5225 lowest common denominator. That then becomes match_list[0]. */
5226 if (matches)
5227 {
5228 register int i = 1;
5229 int low = 100000; /* Count of max-matched characters. */
5230
5231 /* If only one match, just use that. */
5232 if (matches == 1)
5233 {
5234 match_list[0] = match_list[1];
5235 match_list[1] = (char *)NULL;
5236 }
5237 else
5238 {
5239 /* Otherwise, compare each member of the list with
5240 the next, finding out where they stop matching. */
5241
5242 while (i < matches)
5243 {
5244 register int c1, c2, si;
5245
5246 if (completion_case_fold)
5247 {
5248 for (si = 0;
5249 (c1 = to_lower(match_list[i][si])) &&
5250 (c2 = to_lower(match_list[i + 1][si]));
5251 si++)
5252 if (c1 != c2) break;
5253 }
5254 else
5255 {
5256 for (si = 0;
5257 (c1 = match_list[i][si]) &&
5258 (c2 = match_list[i + 1][si]);
5259 si++)
5260 if (c1 != c2) break;
5261 }
5262
5263 if (low > si) low = si;
5264 i++;
5265 }
5266 match_list[0] = (char *)xmalloc (low + 1);
5267 strncpy (match_list[0], match_list[1], low);
5268 match_list[0][low] = '\0';
5269 }
5270 }
5271 else /* There were no matches. */
5272 {
5273 free (match_list);
5274 match_list = (char **)NULL;
5275 }
5276 return (match_list);
5277 }
5278
5279 /* Okay, now we write the entry_function for filename completion. In the
5280 general case. Note that completion in the shell is a little different
5281 because of all the pathnames that must be followed when looking up the
5282 completion for a command. */
5283 char *
5284 filename_completion_function (text, state)
5285 int state;
5286 char *text;
5287 {
5288 static DIR *directory;
5289 static char *filename = (char *)NULL;
5290 static char *dirname = (char *)NULL;
5291 static char *users_dirname = (char *)NULL;
5292 static int filename_len;
5293
5294 dirent *entry = (dirent *)NULL;
5295
5296 /* If we don't have any state, then do some initialization. */
5297 if (!state)
5298 {
5299 char *temp;
5300
5301 if (dirname) free (dirname);
5302 if (filename) free (filename);
5303 if (users_dirname) free (users_dirname);
5304
5305 filename = savestring (text);
5306 if (!*text) text = ".";
5307 dirname = savestring (text);
5308
5309 temp = rindex (dirname, '/');
5310
5311 if (temp)
5312 {
5313 strcpy (filename, ++temp);
5314 *temp = '\0';
5315 }
5316 else
5317 strcpy (dirname, ".");
5318
5319 /* We aren't done yet. We also support the "~user" syntax. */
5320
5321 /* Save the version of the directory that the user typed. */
5322 users_dirname = savestring (dirname);
5323 {
5324 char *temp_dirname;
5325
5326 temp_dirname = tilde_expand (dirname);
5327 free (dirname);
5328 dirname = temp_dirname;
5329
5330 if (rl_symbolic_link_hook)
5331 (*rl_symbolic_link_hook) (&dirname);
5332 }
5333 directory = opendir (dirname);
5334 filename_len = strlen (filename);
5335
5336 rl_filename_completion_desired = 1;
5337 }
5338
5339 /* At this point we should entertain the possibility of hacking wildcarded
5340 filenames, like /usr/man/man<WILD>/te<TAB>. If the directory name
5341 contains globbing characters, then build an array of directories to
5342 glob on, and glob on the first one. */
5343
5344 /* Now that we have some state, we can read the directory. */
5345
5346 while (directory && (entry = readdir (directory)))
5347 {
5348 /* Special case for no filename.
5349 All entries except "." and ".." match. */
5350 if (!filename_len)
5351 {
5352 if ((strcmp (entry->d_name, ".") != 0) &&
5353 (strcmp (entry->d_name, "..") != 0))
5354 break;
5355 }
5356 else
5357 {
5358 /* Otherwise, if these match upto the length of filename, then
5359 it is a match. */
5360 if (entry->d_name[0] == filename[0] && /* Quick test */
5361 (strncmp (filename, entry->d_name, filename_len) == 0))
5362 {
5363 break;
5364 }
5365 }
5366 }
5367
5368 if (!entry)
5369 {
5370 if (directory)
5371 {
5372 closedir (directory);
5373 directory = (DIR *)NULL;
5374 }
5375 return (char *)NULL;
5376 }
5377 else
5378 {
5379 char *temp;
5380
5381 if (dirname && (strcmp (dirname, ".") != 0))
5382 {
5383 temp = (char *)
5384 xmalloc (1 + strlen (users_dirname) + strlen (entry->d_name));
5385 strcpy (temp, users_dirname);
5386 strcat (temp, entry->d_name);
5387 }
5388 else
5389 {
5390 temp = (savestring (entry->d_name));
5391 }
5392 return (temp);
5393 }
5394 }
5395
5396 \f
5397 /* **************************************************************** */
5398 /* */
5399 /* Binding keys */
5400 /* */
5401 /* **************************************************************** */
5402
5403 /* rl_add_defun (char *name, Function *function, int key)
5404 Add NAME to the list of named functions. Make FUNCTION
5405 be the function that gets called.
5406 If KEY is not -1, then bind it. */
5407 rl_add_defun (name, function, key)
5408 char *name;
5409 Function *function;
5410 int key;
5411 {
5412 if (key != -1)
5413 rl_bind_key (key, function);
5414 rl_add_funmap_entry (name, function);
5415 }
5416
5417 /* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */
5418 int
5419 rl_bind_key (key, function)
5420 int key;
5421 Function *function;
5422 {
5423 if (key < 0)
5424 return (key);
5425
5426 if (key > 127 && key < 256)
5427 {
5428 if (keymap[ESC].type == ISKMAP)
5429 {
5430 Keymap escmap = (Keymap)keymap[ESC].function;
5431
5432 key -= 128;
5433 escmap[key].type = ISFUNC;
5434 escmap[key].function = function;
5435 return (0);
5436 }
5437 return (key);
5438 }
5439
5440 keymap[key].type = ISFUNC;
5441 keymap[key].function = function;
5442 return (0);
5443 }
5444
5445 /* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid
5446 KEY. */
5447 int
5448 rl_bind_key_in_map (key, function, map)
5449 int key;
5450 Function *function;
5451 Keymap map;
5452 {
5453 int result;
5454 Keymap oldmap = keymap;
5455
5456 keymap = map;
5457 result = rl_bind_key (key, function);
5458 keymap = oldmap;
5459 return (result);
5460 }
5461
5462 /* Make KEY do nothing in the currently selected keymap.
5463 Returns non-zero in case of error. */
5464 int
5465 rl_unbind_key (key)
5466 int key;
5467 {
5468 return (rl_bind_key (key, (Function *)NULL));
5469 }
5470
5471 /* Make KEY do nothing in MAP.
5472 Returns non-zero in case of error. */
5473 int
5474 rl_unbind_key_in_map (key, map)
5475 int key;
5476 Keymap map;
5477 {
5478 return (rl_bind_key_in_map (key, (Function *)NULL, map));
5479 }
5480
5481 /* Bind the key sequence represented by the string KEYSEQ to
5482 FUNCTION. This makes new keymaps as necessary. The initial
5483 place to do bindings is in MAP. */
5484 rl_set_key (keyseq, function, map)
5485 char *keyseq;
5486 Function *function;
5487 Keymap map;
5488 {
5489 rl_generic_bind (ISFUNC, keyseq, function, map);
5490 }
5491
5492 /* Bind the key sequence represented by the string KEYSEQ to
5493 the string of characters MACRO. This makes new keymaps as
5494 necessary. The initial place to do bindings is in MAP. */
5495 rl_macro_bind (keyseq, macro, map)
5496 char *keyseq, *macro;
5497 Keymap map;
5498 {
5499 char *macro_keys;
5500 int macro_keys_len;
5501
5502 macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1);
5503
5504 if (rl_translate_keyseq (macro, macro_keys, &macro_keys_len))
5505 {
5506 free (macro_keys);
5507 return;
5508 }
5509 rl_generic_bind (ISMACR, keyseq, macro_keys, map);
5510 }
5511
5512 /* Bind the key sequence represented by the string KEYSEQ to
5513 the arbitrary pointer DATA. TYPE says what kind of data is
5514 pointed to by DATA, right now this can be a function (ISFUNC),
5515 a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps
5516 as necessary. The initial place to do bindings is in MAP. */
5517 rl_generic_bind (type, keyseq, data, map)
5518 int type;
5519 char *keyseq, *data;
5520 Keymap map;
5521 {
5522 char *keys;
5523 int keys_len;
5524 register int i;
5525
5526 /* If no keys to bind to, exit right away. */
5527 if (!keyseq || !*keyseq)
5528 {
5529 if (type == ISMACR)
5530 free (data);
5531 return;
5532 }
5533
5534 keys = (char *)alloca (1 + (2 * strlen (keyseq)));
5535
5536 /* Translate the ASCII representation of KEYSEQ into an array
5537 of characters. Stuff the characters into ARRAY, and the
5538 length of ARRAY into LENGTH. */
5539 if (rl_translate_keyseq (keyseq, keys, &keys_len))
5540 return;
5541
5542 /* Bind keys, making new keymaps as necessary. */
5543 for (i = 0; i < keys_len; i++)
5544 {
5545 if (i + 1 < keys_len)
5546 {
5547 if (map[keys[i]].type != ISKMAP)
5548 {
5549 if (map[i].type == ISMACR)
5550 free ((char *)map[i].function);
5551
5552 map[keys[i]].type = ISKMAP;
5553 map[keys[i]].function = (Function *)rl_make_bare_keymap ();
5554 }
5555 map = (Keymap)map[keys[i]].function;
5556 }
5557 else
5558 {
5559 if (map[keys[i]].type == ISMACR)
5560 free ((char *)map[keys[i]].function);
5561
5562 map[keys[i]].function = (Function *)data;
5563 map[keys[i]].type = type;
5564 }
5565 }
5566 }
5567
5568 /* Translate the ASCII representation of SEQ, stuffing the
5569 values into ARRAY, an array of characters. LEN gets the
5570 final length of ARRAY. Return non-zero if there was an
5571 error parsing SEQ. */
5572 rl_translate_keyseq (seq, array, len)
5573 char *seq, *array;
5574 int *len;
5575 {
5576 register int i, c, l = 0;
5577
5578 for (i = 0; c = seq[i]; i++)
5579 {
5580 if (c == '\\')
5581 {
5582 c = seq[++i];
5583
5584 if (!c)
5585 break;
5586
5587 if (((c == 'C' || c == 'M') && seq[i + 1] == '-') ||
5588 (c == 'e'))
5589 {
5590 /* Handle special case of backwards define. */
5591 if (strncmp (&seq[i], "C-\\M-", 5) == 0)
5592 {
5593 array[l++] = ESC;
5594 i += 5;
5595 array[l++] = CTRL (to_upper (seq[i]));
5596 if (!seq[i])
5597 i--;
5598 continue;
5599 }
5600
5601 switch (c)
5602 {
5603 case 'M':
5604 i++;
5605 array[l++] = ESC;
5606 break;
5607
5608 case 'C':
5609 i += 2;
5610 /* Special hack for C-?... */
5611 if (seq[i] == '?')
5612 array[l++] = RUBOUT;
5613 else
5614 array[l++] = CTRL (to_upper (seq[i]));
5615 break;
5616
5617 case 'e':
5618 array[l++] = ESC;
5619 }
5620
5621 continue;
5622 }
5623 }
5624 array[l++] = c;
5625 }
5626
5627 *len = l;
5628 array[l] = '\0';
5629 return (0);
5630 }
5631
5632 /* Return a pointer to the function that STRING represents.
5633 If STRING doesn't have a matching function, then a NULL pointer
5634 is returned. */
5635 Function *
5636 rl_named_function (string)
5637 char *string;
5638 {
5639 register int i;
5640
5641 for (i = 0; funmap[i]; i++)
5642 if (stricmp (funmap[i]->name, string) == 0)
5643 return (funmap[i]->function);
5644 return ((Function *)NULL);
5645 }
5646
5647 /* The last key bindings file read. */
5648 #ifdef __MSDOS__
5649 /* Don't know what to do, but this is a guess */
5650 static char *last_readline_init_file = "/INPUTRC";
5651 #else
5652 static char *last_readline_init_file = "~/inputrc";
5653 #endif
5654
5655 /* Re-read the current keybindings file. */
5656 rl_re_read_init_file (count, ignore)
5657 int count, ignore;
5658 {
5659 rl_read_init_file ((char *)NULL);
5660 }
5661
5662 /* Do key bindings from a file. If FILENAME is NULL it defaults
5663 to `~/.inputrc'. If the file existed and could be opened and
5664 read, 0 is returned, otherwise errno is returned. */
5665 int
5666 rl_read_init_file (filename)
5667 char *filename;
5668 {
5669 register int i;
5670 char *buffer, *openname, *line, *end;
5671 struct stat finfo;
5672 int file;
5673
5674 /* Default the filename. */
5675 if (!filename)
5676 filename = last_readline_init_file;
5677
5678 openname = tilde_expand (filename);
5679
5680 if (!openname || *openname == '\000')
5681 return ENOENT;
5682
5683 if ((stat (openname, &finfo) < 0) ||
5684 (file = open (openname, O_RDONLY, 0666)) < 0)
5685 {
5686 free (openname);
5687 return (errno);
5688 }
5689 else
5690 free (openname);
5691
5692 last_readline_init_file = filename;
5693
5694 /* Read the file into BUFFER. */
5695 buffer = (char *)xmalloc (finfo.st_size + 1);
5696 i = read (file, buffer, finfo.st_size);
5697 close (file);
5698
5699 if (i != finfo.st_size)
5700 return (errno);
5701
5702 /* Loop over the lines in the file. Lines that start with `#' are
5703 comments; all other lines are commands for readline initialization. */
5704 line = buffer;
5705 end = buffer + finfo.st_size;
5706 while (line < end)
5707 {
5708 /* Find the end of this line. */
5709 for (i = 0; line + i != end && line[i] != '\n'; i++);
5710
5711 /* Mark end of line. */
5712 line[i] = '\0';
5713
5714 /* If the line is not a comment, then parse it. */
5715 if (*line != '#')
5716 rl_parse_and_bind (line);
5717
5718 /* Move to the next line. */
5719 line += i + 1;
5720 }
5721 return (0);
5722 }
5723
5724 /* **************************************************************** */
5725 /* */
5726 /* Parser Directives */
5727 /* */
5728 /* **************************************************************** */
5729
5730 /* Conditionals. */
5731
5732 /* Calling programs set this to have their argv[0]. */
5733 char *rl_readline_name = "other";
5734
5735 /* Stack of previous values of parsing_conditionalized_out. */
5736 static unsigned char *if_stack = (unsigned char *)NULL;
5737 static int if_stack_depth = 0;
5738 static int if_stack_size = 0;
5739
5740 /* Push parsing_conditionalized_out, and set parser state based on ARGS. */
5741 parser_if (args)
5742 char *args;
5743 {
5744 register int i;
5745
5746 /* Push parser state. */
5747 if (if_stack_depth + 1 >= if_stack_size)
5748 {
5749 if (!if_stack)
5750 if_stack = (unsigned char *)xmalloc (if_stack_size = 20);
5751 else
5752 if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20);
5753 }
5754 if_stack[if_stack_depth++] = parsing_conditionalized_out;
5755
5756 /* If parsing is turned off, then nothing can turn it back on except
5757 for finding the matching endif. In that case, return right now. */
5758 if (parsing_conditionalized_out)
5759 return;
5760
5761 /* Isolate first argument. */
5762 for (i = 0; args[i] && !whitespace (args[i]); i++);
5763
5764 if (args[i])
5765 args[i++] = '\0';
5766
5767 /* Handle "if term=foo" and "if mode=emacs" constructs. If this
5768 isn't term=foo, or mode=emacs, then check to see if the first
5769 word in ARGS is the same as the value stored in rl_readline_name. */
5770 if (rl_terminal_name && strnicmp (args, "term=", 5) == 0)
5771 {
5772 char *tem, *tname;
5773
5774 /* Terminals like "aaa-60" are equivalent to "aaa". */
5775 tname = savestring (rl_terminal_name);
5776 tem = rindex (tname, '-');
5777 if (tem)
5778 *tem = '\0';
5779
5780 if (stricmp (args + 5, tname) == 0)
5781 parsing_conditionalized_out = 0;
5782 else
5783 parsing_conditionalized_out = 1;
5784 }
5785 #if defined (VI_MODE)
5786 else if (strnicmp (args, "mode=", 5) == 0)
5787 {
5788 int mode;
5789
5790 if (stricmp (args + 5, "emacs") == 0)
5791 mode = emacs_mode;
5792 else if (stricmp (args + 5, "vi") == 0)
5793 mode = vi_mode;
5794 else
5795 mode = no_mode;
5796
5797 if (mode == rl_editing_mode)
5798 parsing_conditionalized_out = 0;
5799 else
5800 parsing_conditionalized_out = 1;
5801 }
5802 #endif /* VI_MODE */
5803 /* Check to see if the first word in ARGS is the same as the
5804 value stored in rl_readline_name. */
5805 else if (stricmp (args, rl_readline_name) == 0)
5806 parsing_conditionalized_out = 0;
5807 else
5808 parsing_conditionalized_out = 1;
5809 }
5810
5811 /* Invert the current parser state if there is anything on the stack. */
5812 parser_else (args)
5813 char *args;
5814 {
5815 register int i;
5816
5817 if (!if_stack_depth)
5818 {
5819 /* Error message? */
5820 return;
5821 }
5822
5823 /* Check the previous (n - 1) levels of the stack to make sure that
5824 we haven't previously turned off parsing. */
5825 for (i = 0; i < if_stack_depth - 1; i++)
5826 if (if_stack[i] == 1)
5827 return;
5828
5829 /* Invert the state of parsing if at top level. */
5830 parsing_conditionalized_out = !parsing_conditionalized_out;
5831 }
5832
5833 /* Terminate a conditional, popping the value of
5834 parsing_conditionalized_out from the stack. */
5835 parser_endif (args)
5836 char *args;
5837 {
5838 if (if_stack_depth)
5839 parsing_conditionalized_out = if_stack[--if_stack_depth];
5840 else
5841 {
5842 /* *** What, no error message? *** */
5843 }
5844 }
5845
5846 /* Associate textual names with actual functions. */
5847 static struct {
5848 char *name;
5849 Function *function;
5850 } parser_directives [] = {
5851 { "if", parser_if },
5852 { "endif", parser_endif },
5853 { "else", parser_else },
5854 { (char *)0x0, (Function *)0x0 }
5855 };
5856
5857 /* Handle a parser directive. STATEMENT is the line of the directive
5858 without any leading `$'. */
5859 static int
5860 handle_parser_directive (statement)
5861 char *statement;
5862 {
5863 register int i;
5864 char *directive, *args;
5865
5866 /* Isolate the actual directive. */
5867
5868 /* Skip whitespace. */
5869 for (i = 0; whitespace (statement[i]); i++);
5870
5871 directive = &statement[i];
5872
5873 for (; statement[i] && !whitespace (statement[i]); i++);
5874
5875 if (statement[i])
5876 statement[i++] = '\0';
5877
5878 for (; statement[i] && whitespace (statement[i]); i++);
5879
5880 args = &statement[i];
5881
5882 /* Lookup the command, and act on it. */
5883 for (i = 0; parser_directives[i].name; i++)
5884 if (stricmp (directive, parser_directives[i].name) == 0)
5885 {
5886 (*parser_directives[i].function) (args);
5887 return (0);
5888 }
5889
5890 /* *** Should an error message be output? */
5891 return (1);
5892 }
5893
5894 /* Ugly but working hack for binding prefix meta. */
5895 #define PREFIX_META_HACK
5896
5897 static int substring_member_of_array ();
5898
5899 /* Read the binding command from STRING and perform it.
5900 A key binding command looks like: Keyname: function-name\0,
5901 a variable binding command looks like: set variable value.
5902 A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
5903 rl_parse_and_bind (string)
5904 char *string;
5905 {
5906 extern char *possible_control_prefixes[], *possible_meta_prefixes[];
5907 char *funname, *kname;
5908 register int c;
5909 int key, i;
5910
5911 while (string && whitespace (*string))
5912 string++;
5913
5914 if (!string || !*string || *string == '#')
5915 return;
5916
5917 /* If this is a parser directive, act on it. */
5918 if (*string == '$')
5919 {
5920 handle_parser_directive (&string[1]);
5921 return;
5922 }
5923
5924 /* If we are supposed to be skipping parsing right now, then do it. */
5925 if (parsing_conditionalized_out)
5926 return;
5927
5928 i = 0;
5929 /* If this keyname is a complex key expression surrounded by quotes,
5930 advance to after the matching close quote. */
5931 if (*string == '"')
5932 {
5933 for (i = 1; c = string[i]; i++)
5934 {
5935 if (c == '"' && string[i - 1] != '\\')
5936 break;
5937 }
5938 }
5939
5940 /* Advance to the colon (:) or whitespace which separates the two objects. */
5941 for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ );
5942
5943 /* Mark the end of the command (or keyname). */
5944 if (string[i])
5945 string[i++] = '\0';
5946
5947 /* If this is a command to set a variable, then do that. */
5948 if (stricmp (string, "set") == 0)
5949 {
5950 char *var = string + i;
5951 char *value;
5952
5953 /* Make VAR point to start of variable name. */
5954 while (*var && whitespace (*var)) var++;
5955
5956 /* Make value point to start of value string. */
5957 value = var;
5958 while (*value && !whitespace (*value)) value++;
5959 if (*value)
5960 *value++ = '\0';
5961 while (*value && whitespace (*value)) value++;
5962
5963 rl_variable_bind (var, value);
5964 return;
5965 }
5966
5967 /* Skip any whitespace between keyname and funname. */
5968 for (; string[i] && whitespace (string[i]); i++);
5969 funname = &string[i];
5970
5971 /* Now isolate funname.
5972 For straight function names just look for whitespace, since
5973 that will signify the end of the string. But this could be a
5974 macro definition. In that case, the string is quoted, so skip
5975 to the matching delimiter. */
5976 if (*funname == '\'' || *funname == '"')
5977 {
5978 int delimiter = string[i++];
5979
5980 for (; c = string[i]; i++)
5981 {
5982 if (c == delimiter && string[i - 1] != '\\')
5983 break;
5984 }
5985 if (c)
5986 i++;
5987 }
5988
5989 /* Advance to the end of the string. */
5990 for (; string[i] && !whitespace (string[i]); i++);
5991
5992 /* No extra whitespace at the end of the string. */
5993 string[i] = '\0';
5994
5995 /* If this is a new-style key-binding, then do the binding with
5996 rl_set_key (). Otherwise, let the older code deal with it. */
5997 if (*string == '"')
5998 {
5999 char *seq = (char *)alloca (1 + strlen (string));
6000 register int j, k = 0;
6001
6002 for (j = 1; string[j]; j++)
6003 {
6004 if (string[j] == '"' && string[j - 1] != '\\')
6005 break;
6006
6007 seq[k++] = string[j];
6008 }
6009 seq[k] = '\0';
6010
6011 /* Binding macro? */
6012 if (*funname == '\'' || *funname == '"')
6013 {
6014 j = strlen (funname);
6015
6016 if (j && funname[j - 1] == *funname)
6017 funname[j - 1] = '\0';
6018
6019 rl_macro_bind (seq, &funname[1], keymap);
6020 }
6021 else
6022 rl_set_key (seq, rl_named_function (funname), keymap);
6023
6024 return;
6025 }
6026
6027 /* Get the actual character we want to deal with. */
6028 kname = rindex (string, '-');
6029 if (!kname)
6030 kname = string;
6031 else
6032 kname++;
6033
6034 key = glean_key_from_name (kname);
6035
6036 /* Add in control and meta bits. */
6037 if (substring_member_of_array (string, possible_control_prefixes))
6038 key = CTRL (to_upper (key));
6039
6040 if (substring_member_of_array (string, possible_meta_prefixes))
6041 key = META (key);
6042
6043 /* Temporary. Handle old-style keyname with macro-binding. */
6044 if (*funname == '\'' || *funname == '"')
6045 {
6046 char seq[2];
6047 int fl = strlen (funname);
6048
6049 seq[0] = key; seq[1] = '\0';
6050 if (fl && funname[fl - 1] == *funname)
6051 funname[fl - 1] = '\0';
6052
6053 rl_macro_bind (seq, &funname[1], keymap);
6054 }
6055 #if defined (PREFIX_META_HACK)
6056 /* Ugly, but working hack to keep prefix-meta around. */
6057 else if (stricmp (funname, "prefix-meta") == 0)
6058 {
6059 char seq[2];
6060
6061 seq[0] = key;
6062 seq[1] = '\0';
6063 rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, keymap);
6064 }
6065 #endif /* PREFIX_META_HACK */
6066 else
6067 rl_bind_key (key, rl_named_function (funname));
6068 }
6069
6070 rl_variable_bind (name, value)
6071 char *name, *value;
6072 {
6073 if (stricmp (name, "editing-mode") == 0)
6074 {
6075 if (strnicmp (value, "vi", 2) == 0)
6076 {
6077 #if defined (VI_MODE)
6078 keymap = vi_insertion_keymap;
6079 rl_editing_mode = vi_mode;
6080 #else
6081 #if defined (NOTDEF)
6082 /* What state is the terminal in? I'll tell you:
6083 non-determinate! That means we cannot do any output. */
6084 ding ();
6085 #endif /* NOTDEF */
6086 #endif /* VI_MODE */
6087 }
6088 else if (strnicmp (value, "emacs", 5) == 0)
6089 {
6090 keymap = emacs_standard_keymap;
6091 rl_editing_mode = emacs_mode;
6092 }
6093 }
6094 else if (stricmp (name, "horizontal-scroll-mode") == 0)
6095 {
6096 if (!*value || stricmp (value, "On") == 0)
6097 horizontal_scroll_mode = 1;
6098 else
6099 horizontal_scroll_mode = 0;
6100 }
6101 else if (stricmp (name, "mark-modified-lines") == 0)
6102 {
6103 if (!*value || stricmp (value, "On") == 0)
6104 mark_modified_lines = 1;
6105 else
6106 mark_modified_lines = 0;
6107 }
6108 else if (stricmp (name, "prefer-visible-bell") == 0)
6109 {
6110 if (!*value || stricmp (value, "On") == 0)
6111 prefer_visible_bell = 1;
6112 else
6113 prefer_visible_bell = 0;
6114 }
6115 else if (stricmp (name, "comment-begin") == 0)
6116 {
6117 #if defined (VI_MODE)
6118 extern char *rl_vi_comment_begin;
6119
6120 if (*value)
6121 {
6122 if (rl_vi_comment_begin)
6123 free (rl_vi_comment_begin);
6124
6125 rl_vi_comment_begin = savestring (value);
6126 }
6127 #endif /* VI_MODE */
6128 }
6129 }
6130
6131 /* Return the character which matches NAME.
6132 For example, `Space' returns ' '. */
6133
6134 typedef struct {
6135 char *name;
6136 int value;
6137 } assoc_list;
6138
6139 assoc_list name_key_alist[] = {
6140 { "DEL", 0x7f },
6141 { "ESC", '\033' },
6142 { "Escape", '\033' },
6143 { "LFD", '\n' },
6144 { "Newline", '\n' },
6145 { "RET", '\r' },
6146 { "Return", '\r' },
6147 { "Rubout", 0x7f },
6148 { "SPC", ' ' },
6149 { "Space", ' ' },
6150 { "Tab", 0x09 },
6151 { (char *)0x0, 0 }
6152 };
6153
6154 int
6155 glean_key_from_name (name)
6156 char *name;
6157 {
6158 register int i;
6159
6160 for (i = 0; name_key_alist[i].name; i++)
6161 if (stricmp (name, name_key_alist[i].name) == 0)
6162 return (name_key_alist[i].value);
6163
6164 return (*name);
6165 }
6166
6167 \f
6168 /* **************************************************************** */
6169 /* */
6170 /* Key Binding and Function Information */
6171 /* */
6172 /* **************************************************************** */
6173
6174 /* Each of the following functions produces information about the
6175 state of keybindings and functions known to Readline. The info
6176 is always printed to rl_outstream, and in such a way that it can
6177 be read back in (i.e., passed to rl_parse_and_bind (). */
6178
6179 /* Print the names of functions known to Readline. */
6180 void
6181 rl_list_funmap_names (ignore)
6182 int ignore;
6183 {
6184 register int i;
6185 char **funmap_names;
6186 extern char **rl_funmap_names ();
6187
6188 funmap_names = rl_funmap_names ();
6189
6190 if (!funmap_names)
6191 return;
6192
6193 for (i = 0; funmap_names[i]; i++)
6194 fprintf (rl_outstream, "%s\n", funmap_names[i]);
6195
6196 free (funmap_names);
6197 }
6198
6199 /* Return a NULL terminated array of strings which represent the key
6200 sequences that are used to invoke FUNCTION in MAP. */
6201 static char **
6202 invoking_keyseqs_in_map (function, map)
6203 Function *function;
6204 Keymap map;
6205 {
6206 register int key;
6207 char **result;
6208 int result_index, result_size;
6209
6210 result = (char **)NULL;
6211 result_index = result_size = 0;
6212
6213 for (key = 0; key < 128; key++)
6214 {
6215 switch (map[key].type)
6216 {
6217 case ISMACR:
6218 /* Macros match, if, and only if, the pointers are identical.
6219 Thus, they are treated exactly like functions in here. */
6220 case ISFUNC:
6221 /* If the function in the keymap is the one we are looking for,
6222 then add the current KEY to the list of invoking keys. */
6223 if (map[key].function == function)
6224 {
6225 char *keyname = (char *)xmalloc (5);
6226
6227 if (CTRL_P (key))
6228 sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
6229 else if (key == RUBOUT)
6230 sprintf (keyname, "\\C-?");
6231 else
6232 sprintf (keyname, "%c", key);
6233
6234 if (result_index + 2 > result_size)
6235 {
6236 if (!result)
6237 result = (char **) xmalloc
6238 ((result_size = 10) * sizeof (char *));
6239 else
6240 result = (char **) xrealloc
6241 (result, (result_size += 10) * sizeof (char *));
6242 }
6243
6244 result[result_index++] = keyname;
6245 result[result_index] = (char *)NULL;
6246 }
6247 break;
6248
6249 case ISKMAP:
6250 {
6251 char **seqs = (char **)NULL;
6252
6253 /* Find the list of keyseqs in this map which have FUNCTION as
6254 their target. Add the key sequences found to RESULT. */
6255 if (map[key].function)
6256 seqs =
6257 invoking_keyseqs_in_map (function, (Keymap)map[key].function);
6258
6259 if (seqs)
6260 {
6261 register int i;
6262
6263 for (i = 0; seqs[i]; i++)
6264 {
6265 char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
6266
6267 if (key == ESC)
6268 sprintf (keyname, "\\e");
6269 else if (CTRL_P (key))
6270 sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
6271 else if (key == RUBOUT)
6272 sprintf (keyname, "\\C-?");
6273 else
6274 sprintf (keyname, "%c", key);
6275
6276 strcat (keyname, seqs[i]);
6277
6278 if (result_index + 2 > result_size)
6279 {
6280 if (!result)
6281 result = (char **)
6282 xmalloc ((result_size = 10) * sizeof (char *));
6283 else
6284 result = (char **)
6285 xrealloc (result,
6286 (result_size += 10) * sizeof (char *));
6287 }
6288
6289 result[result_index++] = keyname;
6290 result[result_index] = (char *)NULL;
6291 }
6292 }
6293 }
6294 break;
6295 }
6296 }
6297 return (result);
6298 }
6299
6300 /* Return a NULL terminated array of strings which represent the key
6301 sequences that can be used to invoke FUNCTION using the current keymap. */
6302 char **
6303 rl_invoking_keyseqs (function)
6304 Function *function;
6305 {
6306 return (invoking_keyseqs_in_map (function, keymap));
6307 }
6308
6309 /* Print all of the current functions and their bindings to
6310 rl_outstream. If an explicit argument is given, then print
6311 the output in such a way that it can be read back in. */
6312 int
6313 rl_dump_functions (count)
6314 int count;
6315 {
6316 void rl_function_dumper ();
6317
6318 rl_function_dumper (rl_explicit_arg);
6319 rl_on_new_line ();
6320 return (0);
6321 }
6322
6323 /* Print all of the functions and their bindings to rl_outstream. If
6324 PRINT_READABLY is non-zero, then print the output in such a way
6325 that it can be read back in. */
6326 void
6327 rl_function_dumper (print_readably)
6328 int print_readably;
6329 {
6330 register int i;
6331 char **rl_funmap_names (), **names;
6332 char *name;
6333
6334 names = rl_funmap_names ();
6335
6336 fprintf (rl_outstream, "\n");
6337
6338 for (i = 0; name = names[i]; i++)
6339 {
6340 Function *function;
6341 char **invokers;
6342
6343 function = rl_named_function (name);
6344 invokers = invoking_keyseqs_in_map (function, keymap);
6345
6346 if (print_readably)
6347 {
6348 if (!invokers)
6349 fprintf (rl_outstream, "# %s (not bound)\n", name);
6350 else
6351 {
6352 register int j;
6353
6354 for (j = 0; invokers[j]; j++)
6355 {
6356 fprintf (rl_outstream, "\"%s\": %s\n",
6357 invokers[j], name);
6358 free (invokers[j]);
6359 }
6360
6361 free (invokers);
6362 }
6363 }
6364 else
6365 {
6366 if (!invokers)
6367 fprintf (rl_outstream, "%s is not bound to any keys\n",
6368 name);
6369 else
6370 {
6371 register int j;
6372
6373 fprintf (rl_outstream, "%s can be found on ", name);
6374
6375 for (j = 0; invokers[j] && j < 5; j++)
6376 {
6377 fprintf (rl_outstream, "\"%s\"%s", invokers[j],
6378 invokers[j + 1] ? ", " : ".\n");
6379 }
6380
6381 if (j == 5 && invokers[j])
6382 fprintf (rl_outstream, "...\n");
6383
6384 for (j = 0; invokers[j]; j++)
6385 free (invokers[j]);
6386
6387 free (invokers);
6388 }
6389 }
6390 }
6391 }
6392
6393 \f
6394 /* **************************************************************** */
6395 /* */
6396 /* String Utility Functions */
6397 /* */
6398 /* **************************************************************** */
6399
6400 static char *strindex ();
6401
6402 /* Return pointer to first occurance in STRING1 of any character from STRING2,
6403 or NULL if no occurance found. */
6404 static char *
6405 strpbrk (string1, string2)
6406 char *string1, *string2;
6407 {
6408 register char *scan;
6409
6410 for (; *string1 != '\0'; string1++)
6411 {
6412 for (scan = string2; *scan != '\0'; scan++)
6413 {
6414 if (*string1 == *scan)
6415 {
6416 return (string1);
6417 }
6418 }
6419 }
6420 return (NULL);
6421 }
6422
6423 /* Return non-zero if any members of ARRAY are a substring in STRING. */
6424 static int
6425 substring_member_of_array (string, array)
6426 char *string, **array;
6427 {
6428 while (*array)
6429 {
6430 if (strindex (string, *array))
6431 return (1);
6432 array++;
6433 }
6434 return (0);
6435 }
6436
6437 /* Whoops, Unix doesn't have strnicmp. */
6438
6439 /* Compare at most COUNT characters from string1 to string2. Case
6440 doesn't matter. */
6441 static int
6442 strnicmp (string1, string2, count)
6443 char *string1, *string2;
6444 {
6445 register char ch1, ch2;
6446
6447 while (count)
6448 {
6449 ch1 = *string1++;
6450 ch2 = *string2++;
6451 if (to_upper(ch1) == to_upper(ch2))
6452 count--;
6453 else break;
6454 }
6455 return (count);
6456 }
6457
6458 /* strcmp (), but caseless. */
6459 static int
6460 stricmp (string1, string2)
6461 char *string1, *string2;
6462 {
6463 register char ch1, ch2;
6464
6465 while (*string1 && *string2)
6466 {
6467 ch1 = *string1++;
6468 ch2 = *string2++;
6469 if (to_upper(ch1) != to_upper(ch2))
6470 return (1);
6471 }
6472 return (*string1 | *string2);
6473 }
6474
6475 /* Determine if s2 occurs in s1. If so, return a pointer to the
6476 match in s1. The compare is case insensitive. */
6477 static char *
6478 strindex (s1, s2)
6479 register char *s1, *s2;
6480 {
6481 register int i, l = strlen (s2);
6482 register int len = strlen (s1);
6483
6484 for (i = 0; (len - i) >= l; i++)
6485 if (strnicmp (&s1[i], s2, l) == 0)
6486 return (s1 + i);
6487 return ((char *)NULL);
6488 }
6489
6490 \f
6491 /* **************************************************************** */
6492 /* */
6493 /* USG (System V) Support */
6494 /* */
6495 /* **************************************************************** */
6496
6497 /* When compiling and running in the `Posix' environment, Ultrix does
6498 not restart system calls, so this needs to do it. */
6499 int
6500 rl_getc (stream)
6501 FILE *stream;
6502 {
6503 int result;
6504 unsigned char c;
6505
6506 #ifdef __GO32__
6507 if (isatty(0))
6508 return getkey();
6509 #endif /* __GO32__ */
6510
6511 while (1)
6512 {
6513 result = read (fileno (stream), &c, sizeof (char));
6514
6515 if (result == sizeof (char))
6516 return (c);
6517
6518 /* If zero characters are returned, then the file that we are
6519 reading from is empty! Return EOF in that case. */
6520 if (result == 0)
6521 return (EOF);
6522
6523 #ifndef __GO32__
6524 /* If the error that we received was SIGINT, then try again,
6525 this is simply an interrupted system call to read ().
6526 Otherwise, some error ocurred, also signifying EOF. */
6527 if (errno != EINTR)
6528 return (EOF);
6529 #endif /* !__GO32__ */
6530 }
6531 }
6532
6533 #if defined (STATIC_MALLOC)
6534 \f
6535 /* **************************************************************** */
6536 /* */
6537 /* xmalloc and xrealloc () */
6538 /* */
6539 /* **************************************************************** */
6540
6541 static void memory_error_and_abort ();
6542
6543 static char *
6544 xmalloc (bytes)
6545 int bytes;
6546 {
6547 char *temp = (char *)malloc (bytes);
6548
6549 if (!temp)
6550 memory_error_and_abort ();
6551 return (temp);
6552 }
6553
6554 static char *
6555 xrealloc (pointer, bytes)
6556 char *pointer;
6557 int bytes;
6558 {
6559 char *temp;
6560
6561 if (!pointer)
6562 temp = (char *)malloc (bytes);
6563 else
6564 temp = (char *)realloc (pointer, bytes);
6565
6566 if (!temp)
6567 memory_error_and_abort ();
6568
6569 return (temp);
6570 }
6571
6572 static void
6573 memory_error_and_abort ()
6574 {
6575 fprintf (stderr, "readline: Out of virtual memory!\n");
6576 abort ();
6577 }
6578 #endif /* STATIC_MALLOC */
6579
6580 \f
6581 /* **************************************************************** */
6582 /* */
6583 /* Testing Readline */
6584 /* */
6585 /* **************************************************************** */
6586
6587 #if defined (TEST)
6588
6589 main ()
6590 {
6591 HIST_ENTRY **history_list ();
6592 char *temp = (char *)NULL;
6593 char *prompt = "readline% ";
6594 int done = 0;
6595
6596 while (!done)
6597 {
6598 temp = readline (prompt);
6599
6600 /* Test for EOF. */
6601 if (!temp)
6602 exit (1);
6603
6604 /* If there is anything on the line, print it and remember it. */
6605 if (*temp)
6606 {
6607 fprintf (stderr, "%s\r\n", temp);
6608 add_history (temp);
6609 }
6610
6611 /* Check for `command' that we handle. */
6612 if (strcmp (temp, "quit") == 0)
6613 done = 1;
6614
6615 if (strcmp (temp, "list") == 0)
6616 {
6617 HIST_ENTRY **list = history_list ();
6618 register int i;
6619 if (list)
6620 {
6621 for (i = 0; list[i]; i++)
6622 {
6623 fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
6624 free (list[i]->line);
6625 }
6626 free (list);
6627 }
6628 }
6629 free (temp);
6630 }
6631 }
6632
6633 #endif /* TEST */
6634
6635 \f
6636 /*
6637 * Local variables:
6638 * compile-command: "gcc -g -traditional -I. -I.. -DTEST -o readline readline.c keymaps.o funmap.o history.o -ltermcap"
6639 * end:
6640 */
This page took 0.178242 seconds and 4 git commands to generate.