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