Merge in changes from bash-1.13. The most obvious one is
[deliverable/binutils-gdb.git] / readline / readline.c
1 /* readline.c -- a general facility for reading lines of input
2 with emacs style editing and completion. */
3
4 /* Copyright 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 1, or
12 (at your option) any later version.
13
14 The GNU Readline Library is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
22 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24 #include "sysdep.h"
25 #include <stdio.h>
26 #include <fcntl.h>
27 #ifndef NO_SYS_FILE
28 #include <sys/file.h>
29 #endif
30 #include <signal.h>
31
32 /* This is needed to include support for TIOCGWINSZ and window resizing. */
33 #if defined (OSF1) || defined (BSD386) || defined (_386BSD) || defined (AIX)
34 # include <sys/ioctl.h>
35 #endif /* OSF1 */
36
37 #if defined (HAVE_UNISTD_H)
38 # include <unistd.h>
39 #endif
40 \f
41 #include <errno.h>
42 /* Not all systems declare ERRNO in errno.h... and some systems #define it! */
43 #if !defined (errno)
44 extern int errno;
45 #endif /* !errno */
46
47 extern char * getenv ();
48
49 #include <setjmp.h>
50 #include <sys/stat.h>
51
52 /* System-specific feature definitions and include files. */
53 #include "rldefs.h"
54
55 /* Some standard library routines. */
56 #include "readline.h"
57 #include "history.h"
58
59 /* NOTE: Functions and variables prefixed with `_rl_' are
60 pseudo-global: they are global so they can be shared
61 between files in the readline library, but are not intended
62 to be visible to readline callers. */
63
64 /* Functions imported from other files in the library. */
65 extern char *tgetstr ();
66 extern void rl_prep_terminal (), rl_deprep_terminal ();
67 extern Function *rl_function_of_keyseq ();
68 extern char *tilde_expand ();
69
70 /* External redisplay functions and variables from display.c */
71 extern void rl_redisplay ();
72 extern void _rl_move_vert ();
73
74 extern void _rl_erase_at_end_of_line ();
75 extern void _rl_move_cursor_relative ();
76
77 extern int _rl_vis_botlin;
78 extern int _rl_last_c_pos;
79 extern int rl_display_fixed;
80
81 /* Variables imported from complete.c. */
82 extern char *rl_completer_word_break_characters;
83 extern char *rl_basic_word_break_characters;
84 extern Function *rl_symbolic_link_hook;
85 extern int rl_completion_query_items;
86 extern int rl_complete_with_tilde_expansion;
87
88 /* Forward declarations used in this file. */
89 void rl_dispatch ();
90 void free_history_entry ();
91 void _rl_output_character_function ();
92 void _rl_set_screen_size ();
93
94 #if !defined (_GO32_)
95 static void readline_default_bindings ();
96 #endif /* !_GO32_ */
97
98 #if defined (_GO32_)
99 # include <sys/pc.h>
100 # undef HANDLE_SIGNALS
101 #endif /* _GO32_ */
102
103 \f
104 /* **************************************************************** */
105 /* */
106 /* Line editing input utility */
107 /* */
108 /* **************************************************************** */
109
110 static char *LibraryVersion = "2.0 (Cygnus)";
111
112 /* A pointer to the keymap that is currently in use.
113 By default, it is the standard emacs keymap. */
114 Keymap _rl_keymap = emacs_standard_keymap;
115
116 /* The current style of editing. */
117 int rl_editing_mode = emacs_mode;
118
119 /* Non-zero if the previous command was a kill command. */
120 static int last_command_was_kill = 0;
121
122 /* The current value of the numeric argument specified by the user. */
123 int rl_numeric_arg = 1;
124
125 /* Non-zero if an argument was typed. */
126 int rl_explicit_arg = 0;
127
128 /* Temporary value used while generating the argument. */
129 int rl_arg_sign = 1;
130
131 /* Non-zero means we have been called at least once before. */
132 static int rl_initialized = 0;
133
134 /* If non-zero, this program is running in an EMACS buffer. */
135 static char *running_in_emacs = (char *)NULL;
136
137 /* The current offset in the current input line. */
138 int rl_point;
139
140 /* Mark in the current input line. */
141 int rl_mark;
142
143 /* Length of the current input line. */
144 int rl_end;
145
146 /* Make this non-zero to return the current input_line. */
147 int rl_done;
148
149 /* The last function executed by readline. */
150 Function *rl_last_func = (Function *)NULL;
151
152 /* Top level environment for readline_internal (). */
153 static jmp_buf readline_top_level;
154
155 /* The streams we interact with. */
156 static FILE *in_stream, *out_stream;
157
158 /* The names of the streams that we do input and output to. */
159 FILE *rl_instream = (FILE *)NULL;
160 FILE *rl_outstream = (FILE *)NULL;
161
162 /* Non-zero means echo characters as they are read. */
163 int readline_echoing_p = 1;
164
165 /* Current prompt. */
166 char *rl_prompt;
167
168 /* The number of characters read in order to type this complete command. */
169 int rl_key_sequence_length = 0;
170
171 /* If non-zero, then this is the address of a function to call just
172 before readline_internal () prints the first prompt. */
173 Function *rl_startup_hook = (Function *)NULL;
174
175 /* What we use internally. You should always refer to RL_LINE_BUFFER. */
176 static char *the_line;
177
178 /* The character that can generate an EOF. Really read from
179 the terminal driver... just defaulted here. */
180 int _rl_eof_char = CTRL ('D');
181
182 /* Non-zero makes this the next keystroke to read. */
183 int rl_pending_input = 0;
184
185 /* Pointer to a useful terminal name. */
186 char *rl_terminal_name = (char *)NULL;
187
188 /* Non-zero means to always use horizontal scrolling in line display. */
189 int _rl_horizontal_scroll_mode = 0;
190
191 /* Non-zero means to display an asterisk at the starts of history lines
192 which have been modified. */
193 int _rl_mark_modified_lines = 0;
194
195 /* Non-zero means to use a visible bell if one is available rather than
196 simply ringing the terminal bell. */
197 int _rl_prefer_visible_bell = 0;
198
199 /* Line buffer and maintenence. */
200 char *rl_line_buffer = (char *)NULL;
201 int rl_line_buffer_len = 0;
202 #define DEFAULT_BUFFER_SIZE 256
203
204 #if defined (VISIBLE_STATS)
205 int rl_visible_stats = 0;
206 #endif /* VISIBLE_STATS */
207
208 \f
209 /* **************************************************************** */
210 /* */
211 /* `Forward' declarations */
212 /* */
213 /* **************************************************************** */
214
215 /* Non-zero means do not parse any lines other than comments and
216 parser directives. */
217 unsigned char _rl_parsing_conditionalized_out = 0;
218
219 /* Non-zero means to save keys that we dispatch on in a kbd macro. */
220 static int defining_kbd_macro = 0;
221
222 /* Non-zero means to convert characters with the meta bit set to
223 escape-prefixed characters so we can indirect through
224 emacs_meta_keymap or vi_escape_keymap. */
225 int _rl_convert_meta_chars_to_ascii = 1;
226
227 static int doing_an_undo;
228 \f
229 /* **************************************************************** */
230 /* */
231 /* Top Level Functions */
232 /* */
233 /* **************************************************************** */
234
235 /* Non-zero means treat 0200 bit in terminal input as Meta bit. */
236 int _rl_meta_flag = 0; /* Forward declaration */
237
238 /* Read a line of input. Prompt with PROMPT. A NULL PROMPT means
239 none. A return value of NULL means that EOF was encountered. */
240 char *
241 readline (prompt)
242 char *prompt;
243 {
244 char *readline_internal ();
245 char *value;
246
247 rl_prompt = prompt;
248
249 /* If we are at EOF return a NULL string. */
250 if (rl_pending_input == EOF)
251 {
252 rl_pending_input = 0;
253 return ((char *)NULL);
254 }
255
256 rl_initialize ();
257 rl_prep_terminal (_rl_meta_flag);
258
259 #if defined (HANDLE_SIGNALS)
260 rl_set_signals ();
261 #endif
262
263 value = readline_internal ();
264 rl_deprep_terminal ();
265
266 #if defined (HANDLE_SIGNALS)
267 rl_clear_signals ();
268 #endif
269
270 return (value);
271 }
272
273 /* Read a line of input from the global rl_instream, doing output on
274 the global rl_outstream.
275 If rl_prompt is non-null, then that is our prompt. */
276 char *
277 readline_internal ()
278 {
279 int lastc, c, eof_found;
280
281 in_stream = rl_instream;
282 out_stream = rl_outstream;
283
284 lastc = -1;
285 eof_found = 0;
286
287 if (rl_startup_hook)
288 (*rl_startup_hook) ();
289
290 if (!readline_echoing_p)
291 {
292 if (rl_prompt)
293 {
294 fprintf (out_stream, "%s", rl_prompt);
295 fflush (out_stream);
296 }
297 }
298 else
299 {
300 rl_on_new_line ();
301 rl_redisplay ();
302 #if defined (VI_MODE)
303 if (rl_editing_mode == vi_mode)
304 rl_vi_insertion_mode ();
305 #endif /* VI_MODE */
306 }
307
308 while (!rl_done)
309 {
310 int lk = last_command_was_kill;
311 int code;
312
313 code = setjmp (readline_top_level);
314
315 if (code)
316 rl_redisplay ();
317
318 if (!rl_pending_input)
319 {
320 /* Then initialize the argument and number of keys read. */
321 rl_init_argument ();
322 rl_key_sequence_length = 0;
323 }
324
325 c = rl_read_key ();
326
327 /* EOF typed to a non-blank line is a <NL>. */
328 if (c == EOF && rl_end)
329 c = NEWLINE;
330
331 /* The character _rl_eof_char typed to blank line, and not as the
332 previous character is interpreted as EOF. */
333 if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
334 {
335 eof_found = 1;
336 break;
337 }
338
339 lastc = c;
340 rl_dispatch (c, _rl_keymap);
341
342 /* If there was no change in last_command_was_kill, then no kill
343 has taken place. Note that if input is pending we are reading
344 a prefix command, so nothing has changed yet. */
345 if (!rl_pending_input)
346 {
347 if (lk == last_command_was_kill)
348 last_command_was_kill = 0;
349 }
350
351 #if defined (VI_MODE)
352 /* In vi mode, when you exit insert mode, the cursor moves back
353 over the previous character. We explicitly check for that here. */
354 if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
355 rl_vi_check ();
356 #endif /* VI_MODE */
357
358 if (!rl_done)
359 rl_redisplay ();
360 }
361
362 /* Restore the original of this history line, iff the line that we
363 are editing was originally in the history, AND the line has changed. */
364 {
365 HIST_ENTRY *entry = current_history ();
366
367 if (entry && rl_undo_list)
368 {
369 char *temp = savestring (the_line);
370 rl_revert_line ();
371 entry = replace_history_entry (where_history (), the_line,
372 (HIST_ENTRY *)NULL);
373 free_history_entry (entry);
374
375 strcpy (the_line, temp);
376 free (temp);
377 }
378 }
379
380 /* At any rate, it is highly likely that this line has an undo list. Get
381 rid of it now. */
382 if (rl_undo_list)
383 free_undo_list ();
384
385 if (eof_found)
386 return (char *)NULL;
387 else
388 return (savestring (the_line));
389 }
390
391 \f
392 /* **************************************************************** */
393 /* */
394 /* Character Input Buffering */
395 /* */
396 /* **************************************************************** */
397
398 static int pop_index = 0, push_index = 0, ibuffer_len = 511;
399 static unsigned char ibuffer[512];
400
401 /* Non-null means it is a pointer to a function to run while waiting for
402 character input. */
403 Function *rl_event_hook = (Function *)NULL;
404
405 #define any_typein (push_index != pop_index)
406
407 /* Add KEY to the buffer of characters to be read. */
408 rl_stuff_char (key)
409 int key;
410 {
411 if (key == EOF)
412 {
413 key = NEWLINE;
414 rl_pending_input = EOF;
415 }
416 ibuffer[push_index++] = key;
417 if (push_index >= ibuffer_len)
418 push_index = 0;
419 }
420
421 /* Return the amount of space available in the
422 buffer for stuffing characters. */
423 int
424 ibuffer_space ()
425 {
426 if (pop_index > push_index)
427 return (pop_index - push_index);
428 else
429 return (ibuffer_len - (push_index - pop_index));
430 }
431
432 /* Get a key from the buffer of characters to be read.
433 Return the key in KEY.
434 Result is KEY if there was a key, or 0 if there wasn't. */
435 int
436 rl_get_char (key)
437 int *key;
438 {
439 if (push_index == pop_index)
440 return (0);
441
442 *key = ibuffer[pop_index++];
443
444 if (pop_index >= ibuffer_len)
445 pop_index = 0;
446
447 return (1);
448 }
449
450 /* Stuff KEY into the *front* of the input buffer.
451 Returns non-zero if successful, zero if there is
452 no space left in the buffer. */
453 int
454 rl_unget_char (key)
455 int key;
456 {
457 if (ibuffer_space ())
458 {
459 pop_index--;
460 if (pop_index < 0)
461 pop_index = ibuffer_len - 1;
462 ibuffer[pop_index] = key;
463 return (1);
464 }
465 return (0);
466 }
467
468 /* If a character is available to be read, then read it
469 and stuff it into IBUFFER. Otherwise, just return. */
470 void
471 rl_gather_tyi ()
472 {
473 #ifdef __GO32__
474 char input;
475 if (isatty (0))
476 {
477 int i = rl_getc ();
478 if (i != EOF)
479 rl_stuff_char (i);
480 }
481 else if (kbhit () && ibuffer_space ())
482 rl_stuff_char (getkey ());
483 #else
484
485 int tty = fileno (in_stream);
486 register int tem, result = -1;
487 int chars_avail;
488 char input;
489
490 #if defined (FIONREAD)
491 result = ioctl (tty, FIONREAD, &chars_avail);
492 #endif
493
494 #if defined (O_NDELAY)
495 if (result == -1)
496 {
497 int flags;
498
499 flags = fcntl (tty, F_GETFL, 0);
500
501 fcntl (tty, F_SETFL, (flags | O_NDELAY));
502 chars_avail = read (tty, &input, 1);
503
504 fcntl (tty, F_SETFL, flags);
505 if (chars_avail == -1 && errno == EAGAIN)
506 return;
507 }
508 #endif /* O_NDELAY */
509
510 /* If there's nothing available, don't waste time trying to read
511 something. */
512 if (chars_avail == 0)
513 return;
514
515 tem = ibuffer_space ();
516
517 if (chars_avail > tem)
518 chars_avail = tem;
519
520 /* One cannot read all of the available input. I can only read a single
521 character at a time, or else programs which require input can be
522 thwarted. If the buffer is larger than one character, I lose.
523 Damn! */
524 if (tem < ibuffer_len)
525 chars_avail = 0;
526
527 if (result != -1)
528 {
529 while (chars_avail--)
530 rl_stuff_char (rl_getc (in_stream));
531 }
532 else
533 {
534 if (chars_avail)
535 rl_stuff_char (input);
536 }
537 #endif /* def __GO32__/else */
538 }
539
540 static int next_macro_key ();
541 /* Read a key, including pending input. */
542 int
543 rl_read_key ()
544 {
545 int c;
546
547 rl_key_sequence_length++;
548
549 if (rl_pending_input)
550 {
551 c = rl_pending_input;
552 rl_pending_input = 0;
553 }
554 else
555 {
556 /* If input is coming from a macro, then use that. */
557 if (c = next_macro_key ())
558 return (c);
559
560 /* If the user has an event function, then call it periodically. */
561 if (rl_event_hook)
562 {
563 while (rl_event_hook && !rl_get_char (&c))
564 {
565 (*rl_event_hook) ();
566 rl_gather_tyi ();
567 }
568 }
569 else
570 {
571 if (!rl_get_char (&c))
572 c = rl_getc (in_stream);
573 }
574 }
575
576 return (c);
577 }
578
579 /* Found later in this file. */
580 static void add_macro_char (), with_macro_input ();
581
582 /* Do the command associated with KEY in MAP.
583 If the associated command is really a keymap, then read
584 another key, and dispatch into that map. */
585 void
586 rl_dispatch (key, map)
587 register int key;
588 Keymap map;
589 {
590 #if defined (VI_MODE)
591 extern int _rl_vi_last_command, _rl_vi_last_repeat, _rl_vi_last_arg_sign;
592 #endif
593
594 if (defining_kbd_macro)
595 add_macro_char (key);
596
597 if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
598 {
599 if (map[ESC].type == ISKMAP)
600 {
601 map = (Keymap)map[ESC].function;
602 key = UNMETA (key);
603 rl_key_sequence_length += 2;
604 rl_dispatch (key, map);
605 }
606 else
607 ding ();
608 return;
609 }
610
611 switch (map[key].type)
612 {
613 case ISFUNC:
614 {
615 Function *func = map[key].function;
616
617 if (func != (Function *)NULL)
618 {
619 /* Special case rl_do_lowercase_version (). */
620 if (func == rl_do_lowercase_version)
621 {
622 rl_dispatch (to_lower (key), map);
623 return;
624 }
625
626 (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
627
628 /* If we have input pending, then the last command was a prefix
629 command. Don't change the state of rl_last_func. Otherwise,
630 remember the last command executed in this variable. */
631 if (!rl_pending_input)
632 rl_last_func = map[key].function;
633 }
634 else
635 {
636 rl_abort ();
637 return;
638 }
639 }
640 break;
641
642 case ISKMAP:
643 if (map[key].function != (Function *)NULL)
644 {
645 int newkey;
646
647 rl_key_sequence_length++;
648 newkey = rl_read_key ();
649 rl_dispatch (newkey, (Keymap)map[key].function);
650 }
651 else
652 {
653 rl_abort ();
654 return;
655 }
656 break;
657
658 case ISMACR:
659 if (map[key].function != (Function *)NULL)
660 {
661 char *macro;
662
663 macro = savestring ((char *)map[key].function);
664 with_macro_input (macro);
665 return;
666 }
667 break;
668 }
669 #if defined (VI_MODE)
670 if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
671 rl_vi_textmod_command (key))
672 {
673 _rl_vi_last_command = key;
674 _rl_vi_last_repeat = rl_numeric_arg;
675 _rl_vi_last_arg_sign = rl_arg_sign;
676 }
677 #endif
678 }
679
680 \f
681 /* **************************************************************** */
682 /* */
683 /* Hacking Keyboard Macros */
684 /* */
685 /* **************************************************************** */
686
687 /* The currently executing macro string. If this is non-zero,
688 then it is a malloc ()'ed string where input is coming from. */
689 static char *executing_macro = (char *)NULL;
690
691 /* The offset in the above string to the next character to be read. */
692 static int executing_macro_index = 0;
693
694 /* The current macro string being built. Characters get stuffed
695 in here by add_macro_char (). */
696 static char *current_macro = (char *)NULL;
697
698 /* The size of the buffer allocated to current_macro. */
699 static int current_macro_size = 0;
700
701 /* The index at which characters are being added to current_macro. */
702 static int current_macro_index = 0;
703
704 /* A structure used to save nested macro strings.
705 It is a linked list of string/index for each saved macro. */
706 struct saved_macro {
707 struct saved_macro *next;
708 char *string;
709 int index;
710 };
711
712 /* The list of saved macros. */
713 struct saved_macro *macro_list = (struct saved_macro *)NULL;
714
715 /* Forward declarations of static functions. Thank you C. */
716 static void push_executing_macro (), pop_executing_macro ();
717
718 /* This one has to be declared earlier in the file. */
719 /* static void add_macro_char (); */
720
721 /* Set up to read subsequent input from STRING.
722 STRING is free ()'ed when we are done with it. */
723 static void
724 with_macro_input (string)
725 char *string;
726 {
727 push_executing_macro ();
728 executing_macro = string;
729 executing_macro_index = 0;
730 }
731
732 /* Return the next character available from a macro, or 0 if
733 there are no macro characters. */
734 static int
735 next_macro_key ()
736 {
737 if (!executing_macro)
738 return (0);
739
740 if (!executing_macro[executing_macro_index])
741 {
742 pop_executing_macro ();
743 return (next_macro_key ());
744 }
745
746 return (executing_macro[executing_macro_index++]);
747 }
748
749 /* Save the currently executing macro on a stack of saved macros. */
750 static void
751 push_executing_macro ()
752 {
753 struct saved_macro *saver;
754
755 saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
756 saver->next = macro_list;
757 saver->index = executing_macro_index;
758 saver->string = executing_macro;
759
760 macro_list = saver;
761 }
762
763 /* Discard the current macro, replacing it with the one
764 on the top of the stack of saved macros. */
765 static void
766 pop_executing_macro ()
767 {
768 if (executing_macro)
769 free (executing_macro);
770
771 executing_macro = (char *)NULL;
772 executing_macro_index = 0;
773
774 if (macro_list)
775 {
776 struct saved_macro *disposer = macro_list;
777 executing_macro = macro_list->string;
778 executing_macro_index = macro_list->index;
779 macro_list = macro_list->next;
780 free (disposer);
781 }
782 }
783
784 /* Add a character to the macro being built. */
785 static void
786 add_macro_char (c)
787 int c;
788 {
789 if (current_macro_index + 1 >= current_macro_size)
790 {
791 if (!current_macro)
792 current_macro = (char *)xmalloc (current_macro_size = 25);
793 else
794 current_macro =
795 (char *)xrealloc (current_macro, current_macro_size += 25);
796 }
797
798 current_macro[current_macro_index++] = c;
799 current_macro[current_macro_index] = '\0';
800 }
801
802 /* Begin defining a keyboard macro.
803 Keystrokes are recorded as they are executed.
804 End the definition with rl_end_kbd_macro ().
805 If a numeric argument was explicitly typed, then append this
806 definition to the end of the existing macro, and start by
807 re-executing the existing macro. */
808 rl_start_kbd_macro (ignore1, ignore2)
809 int ignore1, ignore2;
810 {
811 if (defining_kbd_macro)
812 rl_abort ();
813
814 if (rl_explicit_arg)
815 {
816 if (current_macro)
817 with_macro_input (savestring (current_macro));
818 }
819 else
820 current_macro_index = 0;
821
822 defining_kbd_macro = 1;
823 }
824
825 /* Stop defining a keyboard macro.
826 A numeric argument says to execute the macro right now,
827 that many times, counting the definition as the first time. */
828 rl_end_kbd_macro (count, ignore)
829 int count, ignore;
830 {
831 if (!defining_kbd_macro)
832 rl_abort ();
833
834 current_macro_index -= (rl_key_sequence_length - 1);
835 current_macro[current_macro_index] = '\0';
836
837 defining_kbd_macro = 0;
838
839 rl_call_last_kbd_macro (--count, 0);
840 }
841
842 /* Execute the most recently defined keyboard macro.
843 COUNT says how many times to execute it. */
844 rl_call_last_kbd_macro (count, ignore)
845 int count, ignore;
846 {
847 if (!current_macro)
848 rl_abort ();
849
850 while (count--)
851 with_macro_input (savestring (current_macro));
852 }
853
854 \f
855 /* **************************************************************** */
856 /* */
857 /* Initializations */
858 /* */
859 /* **************************************************************** */
860
861 /* Initliaze readline (and terminal if not already). */
862 rl_initialize ()
863 {
864 /* If we have never been called before, initialize the
865 terminal and data structures. */
866 if (!rl_initialized)
867 {
868 readline_initialize_everything ();
869 rl_initialized++;
870 }
871
872 /* Initalize the current line information. */
873 rl_point = rl_end = 0;
874 the_line = rl_line_buffer;
875 the_line[0] = 0;
876
877 /* We aren't done yet. We haven't even gotten started yet! */
878 rl_done = 0;
879
880 /* Tell the history routines what is going on. */
881 start_using_history ();
882
883 /* Make the display buffer match the state of the line. */
884 rl_reset_line_state ();
885
886 /* No such function typed yet. */
887 rl_last_func = (Function *)NULL;
888
889 /* Parsing of key-bindings begins in an enabled state. */
890 _rl_parsing_conditionalized_out = 0;
891 }
892
893 /* Initialize the entire state of the world. */
894 readline_initialize_everything ()
895 {
896 /* Find out if we are running in Emacs. */
897 running_in_emacs = getenv ("EMACS");
898
899 /* Set up input and output if they are not already set up. */
900 if (!rl_instream)
901 rl_instream = stdin;
902
903 if (!rl_outstream)
904 rl_outstream = stdout;
905
906 /* Bind in_stream and out_stream immediately. These values may change,
907 but they may also be used before readline_internal () is called. */
908 in_stream = rl_instream;
909 out_stream = rl_outstream;
910
911 /* Allocate data structures. */
912 if (!rl_line_buffer)
913 rl_line_buffer =
914 (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
915
916 /* Initialize the terminal interface. */
917 init_terminal_io ((char *)NULL);
918
919 /* Bind tty characters to readline functions. */
920 readline_default_bindings ();
921
922 /* Initialize the function names. */
923 rl_initialize_funmap ();
924
925 /* Read in the init file. */
926 rl_read_init_file ((char *)NULL);
927
928 /* If the completion parser's default word break characters haven't
929 been set yet, then do so now. */
930 {
931 if (rl_completer_word_break_characters == (char *)NULL)
932 rl_completer_word_break_characters = rl_basic_word_break_characters;
933 }
934 }
935
936 /* If this system allows us to look at the values of the regular
937 input editing characters, then bind them to their readline
938 equivalents, iff the characters are not bound to keymaps. */
939 static void
940 readline_default_bindings ()
941 {
942 rltty_set_default_bindings (_rl_keymap);
943 }
944
945 \f
946 /* **************************************************************** */
947 /* */
948 /* Numeric Arguments */
949 /* */
950 /* **************************************************************** */
951
952 /* Handle C-u style numeric args, as well as M--, and M-digits. */
953
954 /* Add the current digit to the argument in progress. */
955 rl_digit_argument (ignore, key)
956 int ignore, key;
957 {
958 rl_pending_input = key;
959 rl_digit_loop ();
960 }
961
962 /* What to do when you abort reading an argument. */
963 rl_discard_argument ()
964 {
965 ding ();
966 rl_clear_message ();
967 rl_init_argument ();
968 }
969
970 /* Create a default argument. */
971 rl_init_argument ()
972 {
973 rl_numeric_arg = rl_arg_sign = 1;
974 rl_explicit_arg = 0;
975 }
976
977 /* C-u, universal argument. Multiply the current argument by 4.
978 Read a key. If the key has nothing to do with arguments, then
979 dispatch on it. If the key is the abort character then abort. */
980 rl_universal_argument ()
981 {
982 rl_numeric_arg *= 4;
983 rl_digit_loop ();
984 }
985
986 rl_digit_loop ()
987 {
988 int key, c;
989 while (1)
990 {
991 rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
992 key = c = rl_read_key ();
993
994 if (_rl_keymap[c].type == ISFUNC &&
995 _rl_keymap[c].function == rl_universal_argument)
996 {
997 rl_numeric_arg *= 4;
998 continue;
999 }
1000 c = UNMETA (c);
1001 if (numeric (c))
1002 {
1003 if (rl_explicit_arg)
1004 rl_numeric_arg = (rl_numeric_arg * 10) + (c - '0');
1005 else
1006 rl_numeric_arg = (c - '0');
1007 rl_explicit_arg = 1;
1008 }
1009 else
1010 {
1011 if (c == '-' && !rl_explicit_arg)
1012 {
1013 rl_numeric_arg = 1;
1014 rl_arg_sign = -1;
1015 }
1016 else
1017 {
1018 rl_clear_message ();
1019 rl_dispatch (key, _rl_keymap);
1020 return;
1021 }
1022 }
1023 }
1024 }
1025 \f
1026 /* **************************************************************** */
1027 /* */
1028 /* Terminal and Termcap */
1029 /* */
1030 /* **************************************************************** */
1031
1032 static char *term_buffer = (char *)NULL;
1033 static char *term_string_buffer = (char *)NULL;
1034
1035 /* Non-zero means this terminal can't really do anything. */
1036 int dumb_term = 0;
1037 /* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
1038 Unfortunately, PC is a global variable used by the termcap library. */
1039 #undef PC
1040
1041 #if !defined (__linux__)
1042 char PC;
1043 char *BC, *UP;
1044 #endif /* __linux__ */
1045
1046 /* Some strings to control terminal actions. These are output by tputs (). */
1047 char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;
1048
1049 int screenwidth, screenheight;
1050
1051 /* Non-zero if we determine that the terminal can do character insertion. */
1052 int terminal_can_insert = 0;
1053
1054 /* How to insert characters. */
1055 char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;
1056
1057 /* How to delete characters. */
1058 char *term_dc, *term_DC;
1059
1060 #if defined (HACK_TERMCAP_MOTION)
1061 char *term_forward_char;
1062 #endif /* HACK_TERMCAP_MOTION */
1063
1064 /* How to go up a line. */
1065 char *term_up;
1066
1067 /* A visible bell, if the terminal can be made to flash the screen. */
1068 char *visible_bell;
1069
1070 /* Non-zero means that this terminal has a meta key. */
1071 int term_has_meta;
1072
1073 /* The string to write to turn on the meta key, if this term has one. */
1074 char *term_mm;
1075
1076 /* The string to write to turn off the meta key, if this term has one. */
1077 char *term_mo;
1078
1079 /* The key sequences output by the arrow keys, if this terminal has any. */
1080 char *term_ku, *term_kd, *term_kr, *term_kl;
1081
1082 /* Re-initialize the terminal considering that the TERM/TERMCAP variable
1083 has changed. */
1084 rl_reset_terminal (terminal_name)
1085 char *terminal_name;
1086 {
1087 init_terminal_io (terminal_name);
1088 }
1089
1090 /* Set readline's idea of the screen size. TTY is a file descriptor open
1091 to the terminal. If IGNORE_ENV is true, we do not pay attention to the
1092 values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being
1093 non-null serve to check whether or not we have initialized termcap. */
1094 void
1095 _rl_set_screen_size (tty, ignore_env)
1096 int tty, ignore_env;
1097 {
1098 #if defined (TIOCGWINSZ)
1099 struct winsize window_size;
1100 #endif /* TIOCGWINSZ */
1101
1102 #if defined (TIOCGWINSZ)
1103 if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
1104 {
1105 screenwidth = (int) window_size.ws_col;
1106 screenheight = (int) window_size.ws_row;
1107 }
1108 #endif /* TIOCGWINSZ */
1109
1110 /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
1111 is unset. */
1112 if (screenwidth <= 0)
1113 {
1114 char *sw;
1115
1116 if (!ignore_env && (sw = getenv ("COLUMNS")))
1117 screenwidth = atoi (sw);
1118
1119 if (screenwidth <= 0 && term_string_buffer)
1120 screenwidth = tgetnum ("co");
1121 }
1122
1123 /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
1124 is unset. */
1125 if (screenheight <= 0)
1126 {
1127 char *sh;
1128
1129 if (!ignore_env && (sh = getenv ("LINES")))
1130 screenheight = atoi (sh);
1131
1132 if (screenheight <= 0 && term_string_buffer)
1133 screenheight = tgetnum ("li");
1134 }
1135
1136 /* If all else fails, default to 80x24 terminal. */
1137 if (screenwidth <= 0)
1138 screenwidth = 80;
1139
1140 if (screenheight <= 0)
1141 screenheight = 24;
1142
1143 #if defined (SHELL)
1144 /* If we're being compiled as part of bash, set the environment
1145 variables $LINES and $COLUMNS to new values. */
1146 set_lines_and_columns (screenheight, screenwidth);
1147 #endif
1148
1149 screenwidth--;
1150 }
1151
1152 init_terminal_io (terminal_name)
1153 char *terminal_name;
1154 {
1155 #ifdef __GO32__
1156 screenwidth = ScreenCols ();
1157 screenheight = ScreenRows ();
1158 term_cr = "\r";
1159 term_im = term_ei = term_ic = term_IC = (char *)NULL;
1160 term_up = term_dc = term_DC = visible_bell = (char *)NULL;
1161
1162 /* Does the _GO32_ have a meta key? I don't know. */
1163 term_has_meta = 0;
1164 term_mm = term_mo = (char *)NULL;
1165
1166 /* It probably has arrow keys, but I don't know what they are. */
1167 term_ku = term_kd = term_kr = term_kl = (char *)NULL;
1168
1169 #if defined (HACK_TERMCAP_MOTION)
1170 term_forward_char = (char *)NULL;
1171 #endif
1172 terminal_can_insert = 0;
1173 return;
1174 #else /* !__GO32__ */
1175 char *term, *buffer;
1176 int tty;
1177
1178 term = terminal_name ? terminal_name : getenv ("TERM");
1179
1180 if (!term_string_buffer)
1181 term_string_buffer = (char *)xmalloc (2048);
1182
1183 if (!term_buffer)
1184 term_buffer = (char *)xmalloc (2048);
1185
1186 buffer = term_string_buffer;
1187
1188 term_clrpag = term_cr = term_clreol = (char *)NULL;
1189
1190 if (!term)
1191 term = "dumb";
1192
1193 if (tgetent (term_buffer, term) <= 0)
1194 {
1195 dumb_term = 1;
1196 screenwidth = 79;
1197 screenheight = 24;
1198 term_cr = "\r";
1199 term_im = term_ei = term_ic = term_IC = (char *)NULL;
1200 term_up = term_dc = term_DC = visible_bell = (char *)NULL;
1201 term_ku = term_kd = term_kl = term_kr = (char *)NULL;
1202 #if defined (HACK_TERMCAP_MOTION)
1203 term_forward_char = (char *)NULL;
1204 #endif
1205 terminal_can_insert = 0;
1206 return;
1207 }
1208
1209 BC = tgetstr ("pc", &buffer);
1210 PC = buffer ? *buffer : 0;
1211
1212 term_backspace = tgetstr ("le", &buffer);
1213
1214 term_cr = tgetstr ("cr", &buffer);
1215 term_clreol = tgetstr ("ce", &buffer);
1216 term_clrpag = tgetstr ("cl", &buffer);
1217
1218 if (!term_cr)
1219 term_cr = "\r";
1220
1221 #if defined (HACK_TERMCAP_MOTION)
1222 term_forward_char = tgetstr ("nd", &buffer);
1223 #endif /* HACK_TERMCAP_MOTION */
1224
1225 if (rl_instream)
1226 tty = fileno (rl_instream);
1227 else
1228 tty = 0;
1229
1230 screenwidth = screenheight = 0;
1231
1232 _rl_set_screen_size (tty, 0);
1233
1234 term_im = tgetstr ("im", &buffer);
1235 term_ei = tgetstr ("ei", &buffer);
1236 term_IC = tgetstr ("IC", &buffer);
1237 term_ic = tgetstr ("ic", &buffer);
1238
1239 /* "An application program can assume that the terminal can do
1240 character insertion if *any one of* the capabilities `IC',
1241 `im', `ic' or `ip' is provided." But we can't do anything if
1242 only `ip' is provided, so... */
1243 terminal_can_insert = (term_IC || term_im || term_ic);
1244
1245 term_up = tgetstr ("up", &buffer);
1246 term_dc = tgetstr ("dc", &buffer);
1247 term_DC = tgetstr ("DC", &buffer);
1248
1249 visible_bell = tgetstr ("vb", &buffer);
1250
1251 /* Check to see if this terminal has a meta key. */
1252 term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
1253 if (term_has_meta)
1254 {
1255 term_mm = tgetstr ("mm", &buffer);
1256 term_mo = tgetstr ("mo", &buffer);
1257 }
1258 else
1259 {
1260 term_mm = (char *)NULL;
1261 term_mo = (char *)NULL;
1262 }
1263
1264 /* Attempt to find and bind the arrow keys. Do not override already
1265 bound keys in an overzealous attempt, however. */
1266 term_ku = tgetstr ("ku", &buffer);
1267 term_kd = tgetstr ("kd", &buffer);
1268 term_kr = tgetstr ("kr", &buffer);
1269 term_kl = tgetstr ("kl", &buffer);
1270
1271 if (term_ku)
1272 {
1273 Function *func;
1274
1275 func = rl_function_of_keyseq (term_ku, _rl_keymap, (int *)NULL);
1276
1277 if (!func || func == rl_do_lowercase_version)
1278 rl_set_key (term_ku, rl_get_previous_history, _rl_keymap);
1279 }
1280
1281 if (term_kd)
1282 {
1283 Function *func;
1284
1285 func = rl_function_of_keyseq (term_kd, _rl_keymap, (int *)NULL);
1286
1287 if (!func || func == rl_do_lowercase_version)
1288 rl_set_key (term_kd, rl_get_next_history, _rl_keymap);
1289 }
1290
1291 if (term_kr)
1292 {
1293 Function *func;
1294
1295 func = rl_function_of_keyseq (term_kr, _rl_keymap, (int *)NULL);
1296
1297 if (!func || func == rl_do_lowercase_version)
1298 rl_set_key (term_kr, rl_forward, _rl_keymap);
1299 }
1300
1301 if (term_kl)
1302 {
1303 Function *func;
1304
1305 func = rl_function_of_keyseq (term_kl, _rl_keymap, (int *)NULL);
1306
1307 if (!func || func == rl_do_lowercase_version)
1308 rl_set_key (term_kl, rl_backward, _rl_keymap);
1309 }
1310 #endif /* !__GO32__ */
1311 }
1312
1313 /* A function for the use of tputs () */
1314 void
1315 _rl_output_character_function (c)
1316 int c;
1317 {
1318 putc (c, out_stream);
1319 }
1320
1321 /* Write COUNT characters from STRING to the output stream. */
1322 void
1323 _rl_output_some_chars (string, count)
1324 char *string;
1325 int count;
1326 {
1327 fwrite (string, 1, count, out_stream);
1328 }
1329
1330
1331
1332 /* Move the cursor back. */
1333 backspace (count)
1334 int count;
1335 {
1336 register int i;
1337
1338 #ifndef __GO32__
1339 if (term_backspace)
1340 for (i = 0; i < count; i++)
1341 tputs (term_backspace, 1, _rl_output_character_function);
1342 else
1343 #endif /* !__GO32__ */
1344 for (i = 0; i < count; i++)
1345 putc ('\b', out_stream);
1346 }
1347
1348 /* Move to the start of the next line. */
1349 crlf ()
1350 {
1351 #if defined (NEW_TTY_DRIVER)
1352 tputs (term_cr, 1, _rl_output_character_function);
1353 #endif /* NEW_TTY_DRIVER */
1354 putc ('\n', out_stream);
1355 }
1356
1357 \f
1358 /* **************************************************************** */
1359 /* */
1360 /* Utility Functions */
1361 /* */
1362 /* **************************************************************** */
1363
1364 /* Return 0 if C is not a member of the class of characters that belong
1365 in words, or 1 if it is. */
1366
1367 int allow_pathname_alphabetic_chars = 0;
1368 char *pathname_alphabetic_chars = "/-_=~.#$";
1369
1370 int
1371 alphabetic (c)
1372 int c;
1373 {
1374 if (pure_alphabetic (c) || (numeric (c)))
1375 return (1);
1376
1377 if (allow_pathname_alphabetic_chars)
1378 return ((int) strchr (pathname_alphabetic_chars, c));
1379 else
1380 return (0);
1381 }
1382
1383 /* Return non-zero if C is a numeric character. */
1384 int
1385 numeric (c)
1386 int c;
1387 {
1388 return (c >= '0' && c <= '9');
1389 }
1390
1391 /* Ring the terminal bell. */
1392 int
1393 ding ()
1394 {
1395 if (readline_echoing_p)
1396 {
1397 #ifndef __GO32__
1398 if (_rl_prefer_visible_bell && visible_bell)
1399 tputs (visible_bell, 1, _rl_output_character_function);
1400 else
1401 #endif /* !__GO32__ */
1402 {
1403 fprintf (stderr, "\007");
1404 fflush (stderr);
1405 }
1406 }
1407 return (-1);
1408 }
1409
1410 /* How to abort things. */
1411 rl_abort ()
1412 {
1413 ding ();
1414 rl_clear_message ();
1415 rl_init_argument ();
1416 rl_pending_input = 0;
1417
1418 defining_kbd_macro = 0;
1419 while (executing_macro)
1420 pop_executing_macro ();
1421
1422 rl_last_func = (Function *)NULL;
1423 longjmp (readline_top_level, 1);
1424 }
1425
1426 /* Return a copy of the string between FROM and TO.
1427 FROM is inclusive, TO is not. */
1428 char *
1429 rl_copy_text (from, to)
1430 int from, to;
1431 {
1432 register int length;
1433 char *copy;
1434
1435 /* Fix it if the caller is confused. */
1436 if (from > to)
1437 {
1438 int t = from;
1439 from = to;
1440 to = t;
1441 }
1442
1443 length = to - from;
1444 copy = (char *)xmalloc (1 + length);
1445 strncpy (copy, the_line + from, length);
1446 copy[length] = '\0';
1447 return (copy);
1448 }
1449
1450 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
1451 LEN characters. */
1452 void
1453 rl_extend_line_buffer (len)
1454 int len;
1455 {
1456 while (len >= rl_line_buffer_len)
1457 rl_line_buffer =
1458 (char *)xrealloc
1459 (rl_line_buffer, rl_line_buffer_len += DEFAULT_BUFFER_SIZE);
1460
1461 the_line = rl_line_buffer;
1462 }
1463
1464 \f
1465 /* **************************************************************** */
1466 /* */
1467 /* Insert and Delete */
1468 /* */
1469 /* **************************************************************** */
1470
1471 /* Insert a string of text into the line at point. This is the only
1472 way that you should do insertion. rl_insert () calls this
1473 function. */
1474 rl_insert_text (string)
1475 char *string;
1476 {
1477 register int i, l = strlen (string);
1478
1479 if (rl_end + l >= rl_line_buffer_len)
1480 rl_extend_line_buffer (rl_end + l);
1481
1482 for (i = rl_end; i >= rl_point; i--)
1483 the_line[i + l] = the_line[i];
1484 strncpy (the_line + rl_point, string, l);
1485
1486 /* Remember how to undo this if we aren't undoing something. */
1487 if (!doing_an_undo)
1488 {
1489 /* If possible and desirable, concatenate the undos. */
1490 if ((strlen (string) == 1) &&
1491 rl_undo_list &&
1492 (rl_undo_list->what == UNDO_INSERT) &&
1493 (rl_undo_list->end == rl_point) &&
1494 (rl_undo_list->end - rl_undo_list->start < 20))
1495 rl_undo_list->end++;
1496 else
1497 rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
1498 }
1499 rl_point += l;
1500 rl_end += l;
1501 the_line[rl_end] = '\0';
1502 }
1503
1504 /* Delete the string between FROM and TO. FROM is
1505 inclusive, TO is not. */
1506 rl_delete_text (from, to)
1507 int from, to;
1508 {
1509 register char *text;
1510
1511 /* Fix it if the caller is confused. */
1512 if (from > to)
1513 {
1514 int t = from;
1515 from = to;
1516 to = t;
1517 }
1518 text = rl_copy_text (from, to);
1519 strncpy (the_line + from, the_line + to, rl_end - to);
1520
1521 /* Remember how to undo this delete. */
1522 if (!doing_an_undo)
1523 rl_add_undo (UNDO_DELETE, from, to, text);
1524 else
1525 free (text);
1526
1527 rl_end -= (to - from);
1528 the_line[rl_end] = '\0';
1529 }
1530
1531 \f
1532 /* **************************************************************** */
1533 /* */
1534 /* Readline character functions */
1535 /* */
1536 /* **************************************************************** */
1537
1538 /* This is not a gap editor, just a stupid line input routine. No hair
1539 is involved in writing any of the functions, and none should be. */
1540
1541 /* Note that:
1542
1543 rl_end is the place in the string that we would place '\0';
1544 i.e., it is always safe to place '\0' there.
1545
1546 rl_point is the place in the string where the cursor is. Sometimes
1547 this is the same as rl_end.
1548
1549 Any command that is called interactively receives two arguments.
1550 The first is a count: the numeric arg pased to this command.
1551 The second is the key which invoked this command.
1552 */
1553
1554 \f
1555 /* **************************************************************** */
1556 /* */
1557 /* Movement Commands */
1558 /* */
1559 /* **************************************************************** */
1560
1561 /* Note that if you `optimize' the display for these functions, you cannot
1562 use said functions in other functions which do not do optimizing display.
1563 I.e., you will have to update the data base for rl_redisplay, and you
1564 might as well let rl_redisplay do that job. */
1565
1566 /* Move forward COUNT characters. */
1567 rl_forward (count)
1568 int count;
1569 {
1570 if (count < 0)
1571 rl_backward (-count);
1572 else
1573 while (count)
1574 {
1575 #if defined (VI_MODE)
1576 if (rl_point >= (rl_end - (rl_editing_mode == vi_mode)))
1577 #else
1578 if (rl_point == rl_end)
1579 #endif /* VI_MODE */
1580 {
1581 ding ();
1582 return;
1583 }
1584 else
1585 rl_point++;
1586 --count;
1587 }
1588 }
1589
1590 /* Move backward COUNT characters. */
1591 rl_backward (count)
1592 int count;
1593 {
1594 if (count < 0)
1595 rl_forward (-count);
1596 else
1597 while (count)
1598 {
1599 if (!rl_point)
1600 {
1601 ding ();
1602 return;
1603 }
1604 else
1605 --rl_point;
1606 --count;
1607 }
1608 }
1609
1610 /* Move to the beginning of the line. */
1611 rl_beg_of_line ()
1612 {
1613 rl_point = 0;
1614 }
1615
1616 /* Move to the end of the line. */
1617 rl_end_of_line ()
1618 {
1619 rl_point = rl_end;
1620 }
1621
1622 /* Move forward a word. We do what Emacs does. */
1623 rl_forward_word (count)
1624 int count;
1625 {
1626 int c;
1627
1628 if (count < 0)
1629 {
1630 rl_backward_word (-count);
1631 return;
1632 }
1633
1634 while (count)
1635 {
1636 if (rl_point == rl_end)
1637 return;
1638
1639 /* If we are not in a word, move forward until we are in one.
1640 Then, move forward until we hit a non-alphabetic character. */
1641 c = the_line[rl_point];
1642 if (!alphabetic (c))
1643 {
1644 while (++rl_point < rl_end)
1645 {
1646 c = the_line[rl_point];
1647 if (alphabetic (c)) break;
1648 }
1649 }
1650 if (rl_point == rl_end) return;
1651 while (++rl_point < rl_end)
1652 {
1653 c = the_line[rl_point];
1654 if (!alphabetic (c)) break;
1655 }
1656 --count;
1657 }
1658 }
1659
1660 /* Move backward a word. We do what Emacs does. */
1661 rl_backward_word (count)
1662 int count;
1663 {
1664 int c;
1665
1666 if (count < 0)
1667 {
1668 rl_forward_word (-count);
1669 return;
1670 }
1671
1672 while (count)
1673 {
1674 if (!rl_point)
1675 return;
1676
1677 /* Like rl_forward_word (), except that we look at the characters
1678 just before point. */
1679
1680 c = the_line[rl_point - 1];
1681 if (!alphabetic (c))
1682 {
1683 while (--rl_point)
1684 {
1685 c = the_line[rl_point - 1];
1686 if (alphabetic (c)) break;
1687 }
1688 }
1689
1690 while (rl_point)
1691 {
1692 c = the_line[rl_point - 1];
1693 if (!alphabetic (c))
1694 break;
1695 else --rl_point;
1696 }
1697 --count;
1698 }
1699 }
1700
1701 /* Clear the current line. Numeric argument to C-l does this. */
1702 rl_refresh_line ()
1703 {
1704 int curr_line = _rl_last_c_pos / screenwidth;
1705
1706 _rl_move_vert (curr_line);
1707 _rl_move_cursor_relative (0, the_line); /* XXX is this right */
1708
1709 #ifdef __GO32__
1710 {
1711 int row, col, width, row_start;
1712
1713 ScreenGetCursor (&row, &col);
1714 width = ScreenCols ();
1715 row_start = ScreenPrimary + (row * width);
1716 memset (row_start + col, 0, (width - col) * 2);
1717 }
1718 #else /* __GO32__ */
1719 if (term_clreol)
1720 tputs (term_clreol, 1, _rl_output_character_function);
1721 #endif /* __GO32__/else */
1722
1723 rl_forced_update_display ();
1724 rl_display_fixed = 1;
1725 }
1726
1727 /* C-l typed to a line without quoting clears the screen, and then reprints
1728 the prompt and the current input line. Given a numeric arg, redraw only
1729 the current line. */
1730 rl_clear_screen ()
1731 {
1732 if (rl_explicit_arg)
1733 {
1734 rl_refresh_line ();
1735 return;
1736 }
1737
1738 #ifndef __GO32__
1739 if (term_clrpag)
1740 tputs (term_clrpag, 1, _rl_output_character_function);
1741 else
1742 #endif /* !__GO32__ */
1743 crlf ();
1744
1745 rl_forced_update_display ();
1746 rl_display_fixed = 1;
1747 }
1748
1749 rl_arrow_keys (count, c)
1750 int count, c;
1751 {
1752 int ch;
1753
1754 ch = rl_read_key ();
1755
1756 switch (to_upper (ch))
1757 {
1758 case 'A':
1759 rl_get_previous_history (count);
1760 break;
1761
1762 case 'B':
1763 rl_get_next_history (count);
1764 break;
1765
1766 case 'C':
1767 rl_forward (count);
1768 break;
1769
1770 case 'D':
1771 rl_backward (count);
1772 break;
1773
1774 default:
1775 ding ();
1776 }
1777 }
1778
1779 \f
1780 /* **************************************************************** */
1781 /* */
1782 /* Text commands */
1783 /* */
1784 /* **************************************************************** */
1785
1786 /* Insert the character C at the current location, moving point forward. */
1787 rl_insert (count, c)
1788 int count, c;
1789 {
1790 register int i;
1791 char *string;
1792
1793 if (count <= 0)
1794 return;
1795
1796 /* If we can optimize, then do it. But don't let people crash
1797 readline because of extra large arguments. */
1798 if (count > 1 && count < 1024)
1799 {
1800 string = (char *)alloca (1 + count);
1801
1802 for (i = 0; i < count; i++)
1803 string[i] = c;
1804
1805 string[i] = '\0';
1806 rl_insert_text (string);
1807 return;
1808 }
1809
1810 if (count > 1024)
1811 {
1812 int decreaser;
1813
1814 string = (char *)alloca (1024 + 1);
1815
1816 for (i = 0; i < 1024; i++)
1817 string[i] = c;
1818
1819 while (count)
1820 {
1821 decreaser = (count > 1024 ? 1024 : count);
1822 string[decreaser] = '\0';
1823 rl_insert_text (string);
1824 count -= decreaser;
1825 }
1826 return;
1827 }
1828
1829 /* We are inserting a single character.
1830 If there is pending input, then make a string of all of the
1831 pending characters that are bound to rl_insert, and insert
1832 them all. */
1833 if (any_typein)
1834 {
1835 int key = 0, t;
1836
1837 i = 0;
1838 string = (char *)alloca (ibuffer_len + 1);
1839 string[i++] = c;
1840
1841 while ((t = rl_get_char (&key)) &&
1842 (_rl_keymap[key].type == ISFUNC &&
1843 _rl_keymap[key].function == rl_insert))
1844 string[i++] = key;
1845
1846 if (t)
1847 rl_unget_char (key);
1848
1849 string[i] = '\0';
1850 rl_insert_text (string);
1851 return;
1852 }
1853 else
1854 {
1855 /* Inserting a single character. */
1856 string = (char *)alloca (2);
1857
1858 string[1] = '\0';
1859 string[0] = c;
1860 rl_insert_text (string);
1861 }
1862 }
1863
1864 /* Insert the next typed character verbatim. */
1865 rl_quoted_insert (count)
1866 int count;
1867 {
1868 int c;
1869
1870 c = rl_read_key ();
1871 rl_insert (count, c);
1872 }
1873
1874 /* Insert a tab character. */
1875 rl_tab_insert (count)
1876 int count;
1877 {
1878 rl_insert (count, '\t');
1879 }
1880
1881 /* What to do when a NEWLINE is pressed. We accept the whole line.
1882 KEY is the key that invoked this command. I guess it could have
1883 meaning in the future. */
1884 rl_newline (count, key)
1885 int count, key;
1886 {
1887
1888 rl_done = 1;
1889
1890 #if defined (VI_MODE)
1891 {
1892 extern int _rl_vi_doing_insert;
1893 if (_rl_vi_doing_insert)
1894 {
1895 rl_end_undo_group ();
1896 _rl_vi_doing_insert = 0;
1897 }
1898 }
1899 rl_vi_set_last ();
1900
1901 #endif /* VI_MODE */
1902
1903 if (readline_echoing_p)
1904 {
1905 _rl_move_vert (_rl_vis_botlin);
1906 _rl_vis_botlin = 0;
1907 crlf ();
1908 fflush (out_stream);
1909 rl_display_fixed++;
1910 }
1911 }
1912
1913 rl_clean_up_for_exit ()
1914 {
1915 if (readline_echoing_p)
1916 {
1917 _rl_move_vert (_rl_vis_botlin);
1918 _rl_vis_botlin = 0;
1919 fflush (out_stream);
1920 rl_restart_output ();
1921 }
1922 }
1923
1924 /* What to do for some uppercase characters, like meta characters,
1925 and some characters appearing in emacs_ctlx_keymap. This function
1926 is just a stub, you bind keys to it and the code in rl_dispatch ()
1927 is special cased. */
1928 rl_do_lowercase_version (ignore1, ignore2)
1929 int ignore1, ignore2;
1930 {
1931 }
1932
1933 /* Rubout the character behind point. */
1934 rl_rubout (count)
1935 int count;
1936 {
1937 if (count < 0)
1938 {
1939 rl_delete (-count);
1940 return;
1941 }
1942
1943 if (!rl_point)
1944 {
1945 ding ();
1946 return;
1947 }
1948
1949 if (count > 1 || rl_explicit_arg)
1950 {
1951 int orig_point = rl_point;
1952 rl_backward (count);
1953 rl_kill_text (orig_point, rl_point);
1954 }
1955 else
1956 {
1957 int c = the_line[--rl_point];
1958 rl_delete_text (rl_point, rl_point + 1);
1959
1960 if (rl_point == rl_end && isprint (c) && _rl_last_c_pos)
1961 {
1962 int l;
1963 l = rl_character_len (c, rl_point);
1964 _rl_erase_at_end_of_line (l);
1965 }
1966 }
1967 }
1968
1969 /* Delete the character under the cursor. Given a numeric argument,
1970 kill that many characters instead. */
1971 rl_delete (count, invoking_key)
1972 int count, invoking_key;
1973 {
1974 if (count < 0)
1975 {
1976 rl_rubout (-count);
1977 return;
1978 }
1979
1980 if (rl_point == rl_end)
1981 {
1982 ding ();
1983 return;
1984 }
1985
1986 if (count > 1 || rl_explicit_arg)
1987 {
1988 int orig_point = rl_point;
1989 rl_forward (count);
1990 rl_kill_text (orig_point, rl_point);
1991 rl_point = orig_point;
1992 }
1993 else
1994 rl_delete_text (rl_point, rl_point + 1);
1995 }
1996
1997 /* Delete all spaces and tabs around point. */
1998 rl_delete_horizontal_space (count, ignore)
1999 int count, ignore;
2000 {
2001 int start = rl_point;
2002
2003 while (rl_point && whitespace (the_line[rl_point - 1]))
2004 rl_point--;
2005
2006 start = rl_point;
2007
2008 while (rl_point < rl_end && whitespace (the_line[rl_point]))
2009 rl_point++;
2010
2011 if (start == rl_point)
2012 return;
2013 else
2014 {
2015 rl_delete_text (start, rl_point);
2016 rl_point = start;
2017 }
2018 }
2019 \f
2020 /* **************************************************************** */
2021 /* */
2022 /* Kill commands */
2023 /* */
2024 /* **************************************************************** */
2025
2026 /* The next two functions mimic unix line editing behaviour, except they
2027 save the deleted text on the kill ring. This is safer than not saving
2028 it, and since we have a ring, nobody should get screwed. */
2029
2030 /* This does what C-w does in Unix. We can't prevent people from
2031 using behaviour that they expect. */
2032 rl_unix_word_rubout ()
2033 {
2034 if (!rl_point)
2035 ding ();
2036 else
2037 {
2038 int orig_point = rl_point;
2039
2040 while (rl_point && whitespace (the_line[rl_point - 1]))
2041 rl_point--;
2042
2043 while (rl_point && !whitespace (the_line[rl_point - 1]))
2044 rl_point--;
2045
2046 rl_kill_text (rl_point, orig_point);
2047 }
2048 }
2049
2050 /* Here is C-u doing what Unix does. You don't *have* to use these
2051 key-bindings. We have a choice of killing the entire line, or
2052 killing from where we are to the start of the line. We choose the
2053 latter, because if you are a Unix weenie, then you haven't backspaced
2054 into the line at all, and if you aren't, then you know what you are
2055 doing. */
2056 rl_unix_line_discard ()
2057 {
2058 if (!rl_point)
2059 ding ();
2060 else
2061 {
2062 rl_kill_text (rl_point, 0);
2063 rl_point = 0;
2064 }
2065 }
2066
2067 \f
2068 /* **************************************************************** */
2069 /* */
2070 /* Commands For Typos */
2071 /* */
2072 /* **************************************************************** */
2073
2074 /* Random and interesting things in here. */
2075
2076 /* **************************************************************** */
2077 /* */
2078 /* Changing Case */
2079 /* */
2080 /* **************************************************************** */
2081
2082 /* The three kinds of things that we know how to do. */
2083 #define UpCase 1
2084 #define DownCase 2
2085 #define CapCase 3
2086
2087 /* Uppercase the word at point. */
2088 rl_upcase_word (count)
2089 int count;
2090 {
2091 rl_change_case (count, UpCase);
2092 }
2093
2094 /* Lowercase the word at point. */
2095 rl_downcase_word (count)
2096 int count;
2097 {
2098 rl_change_case (count, DownCase);
2099 }
2100
2101 /* Upcase the first letter, downcase the rest. */
2102 rl_capitalize_word (count)
2103 int count;
2104 {
2105 rl_change_case (count, CapCase);
2106 }
2107
2108 /* The meaty function.
2109 Change the case of COUNT words, performing OP on them.
2110 OP is one of UpCase, DownCase, or CapCase.
2111 If a negative argument is given, leave point where it started,
2112 otherwise, leave it where it moves to. */
2113 rl_change_case (count, op)
2114 int count, op;
2115 {
2116 register int start = rl_point, end;
2117 int state = 0;
2118
2119 rl_forward_word (count);
2120 end = rl_point;
2121
2122 if (count < 0)
2123 {
2124 int temp = start;
2125 start = end;
2126 end = temp;
2127 }
2128
2129 /* We are going to modify some text, so let's prepare to undo it. */
2130 rl_modifying (start, end);
2131
2132 for (; start < end; start++)
2133 {
2134 switch (op)
2135 {
2136 case UpCase:
2137 the_line[start] = to_upper (the_line[start]);
2138 break;
2139
2140 case DownCase:
2141 the_line[start] = to_lower (the_line[start]);
2142 break;
2143
2144 case CapCase:
2145 if (state == 0)
2146 {
2147 the_line[start] = to_upper (the_line[start]);
2148 state = 1;
2149 }
2150 else
2151 {
2152 the_line[start] = to_lower (the_line[start]);
2153 }
2154 if (!pure_alphabetic (the_line[start]))
2155 state = 0;
2156 break;
2157
2158 default:
2159 abort ();
2160 }
2161 }
2162 rl_point = end;
2163 }
2164
2165 /* **************************************************************** */
2166 /* */
2167 /* Transposition */
2168 /* */
2169 /* **************************************************************** */
2170
2171 /* Transpose the words at point. */
2172 rl_transpose_words (count)
2173 int count;
2174 {
2175 char *word1, *word2;
2176 int w1_beg, w1_end, w2_beg, w2_end;
2177 int orig_point = rl_point;
2178
2179 if (!count) return;
2180
2181 /* Find the two words. */
2182 rl_forward_word (count);
2183 w2_end = rl_point;
2184 rl_backward_word (1);
2185 w2_beg = rl_point;
2186 rl_backward_word (count);
2187 w1_beg = rl_point;
2188 rl_forward_word (1);
2189 w1_end = rl_point;
2190
2191 /* Do some check to make sure that there really are two words. */
2192 if ((w1_beg == w2_beg) || (w2_beg < w1_end))
2193 {
2194 ding ();
2195 rl_point = orig_point;
2196 return;
2197 }
2198
2199 /* Get the text of the words. */
2200 word1 = rl_copy_text (w1_beg, w1_end);
2201 word2 = rl_copy_text (w2_beg, w2_end);
2202
2203 /* We are about to do many insertions and deletions. Remember them
2204 as one operation. */
2205 rl_begin_undo_group ();
2206
2207 /* Do the stuff at word2 first, so that we don't have to worry
2208 about word1 moving. */
2209 rl_point = w2_beg;
2210 rl_delete_text (w2_beg, w2_end);
2211 rl_insert_text (word1);
2212
2213 rl_point = w1_beg;
2214 rl_delete_text (w1_beg, w1_end);
2215 rl_insert_text (word2);
2216
2217 /* This is exactly correct since the text before this point has not
2218 changed in length. */
2219 rl_point = w2_end;
2220
2221 /* I think that does it. */
2222 rl_end_undo_group ();
2223 free (word1); free (word2);
2224 }
2225
2226 /* Transpose the characters at point. If point is at the end of the line,
2227 then transpose the characters before point. */
2228 rl_transpose_chars (count)
2229 int count;
2230 {
2231 char dummy[2];
2232
2233 if (!count)
2234 return;
2235
2236 if (!rl_point || rl_end < 2)
2237 {
2238 ding ();
2239 return;
2240 }
2241
2242 rl_begin_undo_group ();
2243
2244 if (rl_point == rl_end)
2245 {
2246 --rl_point;
2247 count = 1;
2248 }
2249 rl_point--;
2250
2251 dummy[0] = the_line[rl_point];
2252 dummy[1] = '\0';
2253
2254 rl_delete_text (rl_point, rl_point + 1);
2255
2256 rl_point += count;
2257 if (rl_point > rl_end)
2258 rl_point = rl_end;
2259 else if (rl_point < 0)
2260 rl_point = 0;
2261 rl_insert_text (dummy);
2262
2263 rl_end_undo_group ();
2264 }
2265 \f
2266 /* **************************************************************** */
2267 /* */
2268 /* Undo, and Undoing */
2269 /* */
2270 /* **************************************************************** */
2271
2272 /* Non-zero tells rl_delete_text and rl_insert_text to not add to
2273 the undo list. */
2274 static int doing_an_undo = 0;
2275
2276 /* The current undo list for THE_LINE. */
2277 UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
2278
2279 /* Remember how to undo something. Concatenate some undos if that
2280 seems right. */
2281 rl_add_undo (what, start, end, text)
2282 enum undo_code what;
2283 int start, end;
2284 char *text;
2285 {
2286 UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
2287 temp->what = what;
2288 temp->start = start;
2289 temp->end = end;
2290 temp->text = text;
2291 temp->next = rl_undo_list;
2292 rl_undo_list = temp;
2293 }
2294
2295 /* Free the existing undo list. */
2296 free_undo_list ()
2297 {
2298 while (rl_undo_list)
2299 {
2300 UNDO_LIST *release = rl_undo_list;
2301 rl_undo_list = rl_undo_list->next;
2302
2303 if (release->what == UNDO_DELETE)
2304 free (release->text);
2305
2306 free (release);
2307 }
2308 rl_undo_list = (UNDO_LIST *)NULL;
2309 }
2310
2311 /* Undo the next thing in the list. Return 0 if there
2312 is nothing to undo, or non-zero if there was. */
2313 int
2314 rl_do_undo ()
2315 {
2316 UNDO_LIST *release;
2317 int waiting_for_begin = 0;
2318
2319 undo_thing:
2320 if (!rl_undo_list)
2321 return (0);
2322
2323 doing_an_undo = 1;
2324
2325 switch (rl_undo_list->what) {
2326
2327 /* Undoing deletes means inserting some text. */
2328 case UNDO_DELETE:
2329 rl_point = rl_undo_list->start;
2330 rl_insert_text (rl_undo_list->text);
2331 free (rl_undo_list->text);
2332 break;
2333
2334 /* Undoing inserts means deleting some text. */
2335 case UNDO_INSERT:
2336 rl_delete_text (rl_undo_list->start, rl_undo_list->end);
2337 rl_point = rl_undo_list->start;
2338 break;
2339
2340 /* Undoing an END means undoing everything 'til we get to
2341 a BEGIN. */
2342 case UNDO_END:
2343 waiting_for_begin++;
2344 break;
2345
2346 /* Undoing a BEGIN means that we are done with this group. */
2347 case UNDO_BEGIN:
2348 if (waiting_for_begin)
2349 waiting_for_begin--;
2350 else
2351 #if 0
2352 abort ();
2353 #else
2354 ding ();
2355 #endif
2356 break;
2357 }
2358
2359 doing_an_undo = 0;
2360
2361 release = rl_undo_list;
2362 rl_undo_list = rl_undo_list->next;
2363 free (release);
2364
2365 if (waiting_for_begin)
2366 goto undo_thing;
2367
2368 return (1);
2369 }
2370
2371 /* Begin a group. Subsequent undos are undone as an atomic operation. */
2372 rl_begin_undo_group ()
2373 {
2374 rl_add_undo (UNDO_BEGIN, 0, 0, 0);
2375 }
2376
2377 /* End an undo group started with rl_begin_undo_group (). */
2378 rl_end_undo_group ()
2379 {
2380 rl_add_undo (UNDO_END, 0, 0, 0);
2381 }
2382
2383 /* Save an undo entry for the text from START to END. */
2384 rl_modifying (start, end)
2385 int start, end;
2386 {
2387 if (start > end)
2388 {
2389 int t = start;
2390 start = end;
2391 end = t;
2392 }
2393
2394 if (start != end)
2395 {
2396 char *temp = rl_copy_text (start, end);
2397 rl_begin_undo_group ();
2398 rl_add_undo (UNDO_DELETE, start, end, temp);
2399 rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
2400 rl_end_undo_group ();
2401 }
2402 }
2403
2404 /* Revert the current line to its previous state. */
2405 rl_revert_line ()
2406 {
2407 if (!rl_undo_list)
2408 ding ();
2409 else
2410 {
2411 while (rl_undo_list)
2412 rl_do_undo ();
2413 }
2414 }
2415
2416 /* Do some undoing of things that were done. */
2417 rl_undo_command (count)
2418 {
2419 if (count < 0) return; /* Nothing to do. */
2420
2421 while (count)
2422 {
2423 if (rl_do_undo ())
2424 {
2425 count--;
2426 }
2427 else
2428 {
2429 ding ();
2430 break;
2431 }
2432 }
2433 }
2434 \f
2435 /* **************************************************************** */
2436 /* */
2437 /* History Utilities */
2438 /* */
2439 /* **************************************************************** */
2440
2441 /* We already have a history library, and that is what we use to control
2442 the history features of readline. However, this is our local interface
2443 to the history mechanism. */
2444
2445 /* While we are editing the history, this is the saved
2446 version of the original line. */
2447 HIST_ENTRY *saved_line_for_history = (HIST_ENTRY *)NULL;
2448
2449 /* Set the history pointer back to the last entry in the history. */
2450 start_using_history ()
2451 {
2452 using_history ();
2453 if (saved_line_for_history)
2454 free_history_entry (saved_line_for_history);
2455
2456 saved_line_for_history = (HIST_ENTRY *)NULL;
2457 }
2458
2459 /* Free the contents (and containing structure) of a HIST_ENTRY. */
2460 void
2461 free_history_entry (entry)
2462 HIST_ENTRY *entry;
2463 {
2464 if (!entry) return;
2465 if (entry->line)
2466 free (entry->line);
2467 free (entry);
2468 }
2469
2470 /* Perhaps put back the current line if it has changed. */
2471 maybe_replace_line ()
2472 {
2473 HIST_ENTRY *temp = current_history ();
2474
2475 /* If the current line has changed, save the changes. */
2476 if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
2477 {
2478 temp = replace_history_entry (where_history (), the_line, rl_undo_list);
2479 free (temp->line);
2480 free (temp);
2481 }
2482 }
2483
2484 /* Put back the saved_line_for_history if there is one. */
2485 maybe_unsave_line ()
2486 {
2487 if (saved_line_for_history)
2488 {
2489 int line_len;
2490
2491 line_len = strlen (saved_line_for_history->line);
2492
2493 if (line_len >= rl_line_buffer_len)
2494 rl_extend_line_buffer (line_len);
2495
2496 strcpy (the_line, saved_line_for_history->line);
2497 rl_undo_list = (UNDO_LIST *)saved_line_for_history->data;
2498 free_history_entry (saved_line_for_history);
2499 saved_line_for_history = (HIST_ENTRY *)NULL;
2500 rl_end = rl_point = strlen (the_line);
2501 }
2502 else
2503 ding ();
2504 }
2505
2506 /* Save the current line in saved_line_for_history. */
2507 maybe_save_line ()
2508 {
2509 if (!saved_line_for_history)
2510 {
2511 saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
2512 saved_line_for_history->line = savestring (the_line);
2513 saved_line_for_history->data = (char *)rl_undo_list;
2514 }
2515 }
2516 \f
2517 /* **************************************************************** */
2518 /* */
2519 /* History Commands */
2520 /* */
2521 /* **************************************************************** */
2522
2523 /* Meta-< goes to the start of the history. */
2524 rl_beginning_of_history ()
2525 {
2526 rl_get_previous_history (1 + where_history ());
2527 }
2528
2529 /* Meta-> goes to the end of the history. (The current line). */
2530 rl_end_of_history ()
2531 {
2532 maybe_replace_line ();
2533 using_history ();
2534 maybe_unsave_line ();
2535 }
2536
2537 /* Move down to the next history line. */
2538 rl_get_next_history (count)
2539 int count;
2540 {
2541 HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
2542
2543 if (count < 0)
2544 {
2545 rl_get_previous_history (-count);
2546 return;
2547 }
2548
2549 if (!count)
2550 return;
2551
2552 maybe_replace_line ();
2553
2554 while (count)
2555 {
2556 temp = next_history ();
2557 if (!temp)
2558 break;
2559 --count;
2560 }
2561
2562 if (!temp)
2563 maybe_unsave_line ();
2564 else
2565 {
2566 int line_len;
2567
2568 line_len = strlen (temp->line);
2569
2570 if (line_len >= rl_line_buffer_len)
2571 rl_extend_line_buffer (line_len);
2572
2573 strcpy (the_line, temp->line);
2574 rl_undo_list = (UNDO_LIST *)temp->data;
2575 rl_end = rl_point = strlen (the_line);
2576 #if defined (VI_MODE)
2577 if (rl_editing_mode == vi_mode)
2578 rl_point = 0;
2579 #endif /* VI_MODE */
2580 }
2581 }
2582
2583 /* Get the previous item out of our interactive history, making it the current
2584 line. If there is no previous history, just ding. */
2585 rl_get_previous_history (count)
2586 int count;
2587 {
2588 HIST_ENTRY *old_temp = (HIST_ENTRY *)NULL;
2589 HIST_ENTRY *temp = (HIST_ENTRY *)NULL;
2590
2591 if (count < 0)
2592 {
2593 rl_get_next_history (-count);
2594 return;
2595 }
2596
2597 if (!count)
2598 return;
2599
2600 /* If we don't have a line saved, then save this one. */
2601 maybe_save_line ();
2602
2603 /* If the current line has changed, save the changes. */
2604 maybe_replace_line ();
2605
2606 while (count)
2607 {
2608 temp = previous_history ();
2609 if (!temp)
2610 break;
2611 else
2612 old_temp = temp;
2613 --count;
2614 }
2615
2616 /* If there was a large argument, and we moved back to the start of the
2617 history, that is not an error. So use the last value found. */
2618 if (!temp && old_temp)
2619 temp = old_temp;
2620
2621 if (!temp)
2622 ding ();
2623 else
2624 {
2625 int line_len;
2626
2627 line_len = strlen (temp->line);
2628
2629 if (line_len >= rl_line_buffer_len)
2630 rl_extend_line_buffer (line_len);
2631
2632 strcpy (the_line, temp->line);
2633 rl_undo_list = (UNDO_LIST *)temp->data;
2634 rl_end = rl_point = line_len;
2635
2636 #if defined (VI_MODE)
2637 if (rl_editing_mode == vi_mode)
2638 rl_point = 0;
2639 #endif /* VI_MODE */
2640 }
2641 }
2642
2643 /* Make C be the next command to be executed. */
2644 rl_execute_next (c)
2645 int c;
2646 {
2647 rl_pending_input = c;
2648 }
2649
2650 /* **************************************************************** */
2651 /* */
2652 /* The Mark and the Region. */
2653 /* */
2654 /* **************************************************************** */
2655
2656 /* Set the mark at POSITION. */
2657 rl_set_mark (position)
2658 int position;
2659 {
2660 if (position > rl_end)
2661 return;
2662
2663 rl_mark = position;
2664 }
2665
2666 /* Exchange the position of mark and point. */
2667 rl_exchange_mark_and_point ()
2668 {
2669 if (rl_mark > rl_end)
2670 rl_mark = -1;
2671
2672 if (rl_mark == -1)
2673 {
2674 ding ();
2675 return;
2676 }
2677 else
2678 {
2679 int temp = rl_point;
2680
2681 rl_point = rl_mark;
2682 rl_mark = temp;
2683 }
2684 }
2685
2686 \f
2687 /* **************************************************************** */
2688 /* */
2689 /* Killing Mechanism */
2690 /* */
2691 /* **************************************************************** */
2692
2693 /* What we assume for a max number of kills. */
2694 #define DEFAULT_MAX_KILLS 10
2695
2696 /* The real variable to look at to find out when to flush kills. */
2697 int rl_max_kills = DEFAULT_MAX_KILLS;
2698
2699 /* Where to store killed text. */
2700 char **rl_kill_ring = (char **)NULL;
2701
2702 /* Where we are in the kill ring. */
2703 int rl_kill_index = 0;
2704
2705 /* How many slots we have in the kill ring. */
2706 int rl_kill_ring_length = 0;
2707
2708 /* How to say that you only want to save a certain amount
2709 of kill material. */
2710 rl_set_retained_kills (num)
2711 int num;
2712 {}
2713
2714 /* The way to kill something. This appends or prepends to the last
2715 kill, if the last command was a kill command. if FROM is less
2716 than TO, then the text is appended, otherwise prepended. If the
2717 last command was not a kill command, then a new slot is made for
2718 this kill. */
2719 rl_kill_text (from, to)
2720 int from, to;
2721 {
2722 int slot;
2723 char *text = rl_copy_text (from, to);
2724
2725 /* Is there anything to kill? */
2726 if (from == to)
2727 {
2728 free (text);
2729 last_command_was_kill++;
2730 return;
2731 }
2732
2733 /* Delete the copied text from the line. */
2734 rl_delete_text (from, to);
2735
2736 /* First, find the slot to work with. */
2737 if (!last_command_was_kill)
2738 {
2739 /* Get a new slot. */
2740 if (!rl_kill_ring)
2741 {
2742 /* If we don't have any defined, then make one. */
2743 rl_kill_ring = (char **)
2744 xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
2745 slot = 1;
2746 }
2747 else
2748 {
2749 /* We have to add a new slot on the end, unless we have
2750 exceeded the max limit for remembering kills. */
2751 slot = rl_kill_ring_length;
2752 if (slot == rl_max_kills)
2753 {
2754 register int i;
2755 free (rl_kill_ring[0]);
2756 for (i = 0; i < slot; i++)
2757 rl_kill_ring[i] = rl_kill_ring[i + 1];
2758 }
2759 else
2760 {
2761 rl_kill_ring =
2762 (char **)
2763 xrealloc (rl_kill_ring,
2764 ((slot = (rl_kill_ring_length += 1)) + 1)
2765 * sizeof (char *));
2766 }
2767 }
2768 slot--;
2769 }
2770 else
2771 {
2772 slot = rl_kill_ring_length - 1;
2773 }
2774
2775 /* If the last command was a kill, prepend or append. */
2776 if (last_command_was_kill && rl_editing_mode != vi_mode)
2777 {
2778 char *old = rl_kill_ring[slot];
2779 char *new = (char *)xmalloc (1 + strlen (old) + strlen (text));
2780
2781 if (from < to)
2782 {
2783 strcpy (new, old);
2784 strcat (new, text);
2785 }
2786 else
2787 {
2788 strcpy (new, text);
2789 strcat (new, old);
2790 }
2791 free (old);
2792 free (text);
2793 rl_kill_ring[slot] = new;
2794 }
2795 else
2796 {
2797 rl_kill_ring[slot] = text;
2798 }
2799 rl_kill_index = slot;
2800 last_command_was_kill++;
2801 }
2802
2803 /* Now REMEMBER! In order to do prepending or appending correctly, kill
2804 commands always make rl_point's original position be the FROM argument,
2805 and rl_point's extent be the TO argument. */
2806
2807 /* **************************************************************** */
2808 /* */
2809 /* Killing Commands */
2810 /* */
2811 /* **************************************************************** */
2812
2813 /* Delete the word at point, saving the text in the kill ring. */
2814 rl_kill_word (count)
2815 int count;
2816 {
2817 int orig_point = rl_point;
2818
2819 if (count < 0)
2820 rl_backward_kill_word (-count);
2821 else
2822 {
2823 rl_forward_word (count);
2824
2825 if (rl_point != orig_point)
2826 rl_kill_text (orig_point, rl_point);
2827
2828 rl_point = orig_point;
2829 }
2830 }
2831
2832 /* Rubout the word before point, placing it on the kill ring. */
2833 rl_backward_kill_word (count)
2834 int count;
2835 {
2836 int orig_point = rl_point;
2837
2838 if (count < 0)
2839 rl_kill_word (-count);
2840 else
2841 {
2842 rl_backward_word (count);
2843
2844 if (rl_point != orig_point)
2845 rl_kill_text (orig_point, rl_point);
2846 }
2847 }
2848
2849 /* Kill from here to the end of the line. If DIRECTION is negative, kill
2850 back to the line start instead. */
2851 rl_kill_line (direction)
2852 int direction;
2853 {
2854 int orig_point = rl_point;
2855
2856 if (direction < 0)
2857 rl_backward_kill_line (1);
2858 else
2859 {
2860 rl_end_of_line ();
2861 if (orig_point != rl_point)
2862 rl_kill_text (orig_point, rl_point);
2863 rl_point = orig_point;
2864 }
2865 }
2866
2867 /* Kill backwards to the start of the line. If DIRECTION is negative, kill
2868 forwards to the line end instead. */
2869 rl_backward_kill_line (direction)
2870 int direction;
2871 {
2872 int orig_point = rl_point;
2873
2874 if (direction < 0)
2875 rl_kill_line (1);
2876 else
2877 {
2878 if (!rl_point)
2879 ding ();
2880 else
2881 {
2882 rl_beg_of_line ();
2883 rl_kill_text (orig_point, rl_point);
2884 }
2885 }
2886 }
2887
2888 /* Yank back the last killed text. This ignores arguments. */
2889 rl_yank ()
2890 {
2891 if (!rl_kill_ring)
2892 rl_abort ();
2893
2894 rl_set_mark (rl_point);
2895 rl_insert_text (rl_kill_ring[rl_kill_index]);
2896 }
2897
2898 /* If the last command was yank, or yank_pop, and the text just
2899 before point is identical to the current kill item, then
2900 delete that text from the line, rotate the index down, and
2901 yank back some other text. */
2902 rl_yank_pop ()
2903 {
2904 int l;
2905
2906 if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
2907 !rl_kill_ring)
2908 {
2909 rl_abort ();
2910 }
2911
2912 l = strlen (rl_kill_ring[rl_kill_index]);
2913 if (((rl_point - l) >= 0) &&
2914 (strncmp (the_line + (rl_point - l),
2915 rl_kill_ring[rl_kill_index], l) == 0))
2916 {
2917 rl_delete_text ((rl_point - l), rl_point);
2918 rl_point -= l;
2919 rl_kill_index--;
2920 if (rl_kill_index < 0)
2921 rl_kill_index = rl_kill_ring_length - 1;
2922 rl_yank ();
2923 }
2924 else
2925 rl_abort ();
2926
2927 }
2928
2929 /* Yank the COUNTth argument from the previous history line. */
2930 rl_yank_nth_arg (count, ignore)
2931 int count;
2932 {
2933 register HIST_ENTRY *entry = previous_history ();
2934 char *arg;
2935
2936 if (entry)
2937 next_history ();
2938 else
2939 {
2940 ding ();
2941 return;
2942 }
2943
2944 arg = history_arg_extract (count, count, entry->line);
2945 if (!arg || !*arg)
2946 {
2947 ding ();
2948 return;
2949 }
2950
2951 rl_begin_undo_group ();
2952
2953 #if defined (VI_MODE)
2954 /* Vi mode always inserts a space before yanking the argument, and it
2955 inserts it right *after* rl_point. */
2956 if (rl_editing_mode == vi_mode)
2957 rl_point++;
2958 #endif /* VI_MODE */
2959
2960 if (rl_point && the_line[rl_point - 1] != ' ')
2961 rl_insert_text (" ");
2962
2963 rl_insert_text (arg);
2964 free (arg);
2965
2966 rl_end_undo_group ();
2967 }
2968
2969 /* How to toggle back and forth between editing modes. */
2970 rl_vi_editing_mode ()
2971 {
2972 #if defined (VI_MODE)
2973 rl_editing_mode = vi_mode;
2974 rl_vi_insertion_mode ();
2975 #endif /* VI_MODE */
2976 }
2977
2978 rl_emacs_editing_mode ()
2979 {
2980 rl_editing_mode = emacs_mode;
2981 _rl_keymap = emacs_standard_keymap;
2982 }
2983
2984 \f
2985 /* **************************************************************** */
2986 /* */
2987 /* USG (System V) Support */
2988 /* */
2989 /* **************************************************************** */
2990
2991 int
2992 rl_getc (stream)
2993 FILE *stream;
2994 {
2995 int result;
2996 unsigned char c;
2997
2998 #ifdef __GO32__
2999 if (isatty (0))
3000 return (getkey () & 0x7f);
3001 #endif /* __GO32__ */
3002
3003 while (1)
3004 {
3005 result = read (fileno (stream), &c, sizeof (unsigned char));
3006
3007 if (result == sizeof (unsigned char))
3008 return (c);
3009
3010 /* If zero characters are returned, then the file that we are
3011 reading from is empty! Return EOF in that case. */
3012 if (result == 0)
3013 return (EOF);
3014
3015 #if defined (EWOULDBLOCK)
3016 if (errno == EWOULDBLOCK)
3017 {
3018 int flags;
3019
3020 if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
3021 return (EOF);
3022 if (flags & O_NDELAY)
3023 {
3024 flags &= ~O_NDELAY;
3025 fcntl (fileno (stream), F_SETFL, flags);
3026 continue;
3027 }
3028 continue;
3029 }
3030 #endif /* EWOULDBLOCK */
3031
3032 #if defined (_POSIX_VERSION) && defined (EAGAIN) && defined (O_NONBLOCK)
3033 if (errno == EAGAIN)
3034 {
3035 int flags;
3036
3037 if ((flags = fcntl (fileno (stream), F_GETFL, 0)) < 0)
3038 return (EOF);
3039 if (flags & O_NONBLOCK)
3040 {
3041 flags &= ~O_NONBLOCK;
3042 fcntl (fileno (stream), F_SETFL, flags);
3043 continue;
3044 }
3045 }
3046 #endif /* _POSIX_VERSION && EAGAIN && O_NONBLOCK */
3047
3048 #ifndef __GO32__
3049 /* If the error that we received was SIGINT, then try again,
3050 this is simply an interrupted system call to read ().
3051 Otherwise, some error ocurred, also signifying EOF. */
3052 if (errno != EINTR)
3053 return (EOF);
3054 #endif /* !__GO32__ */
3055 }
3056 }
3057
3058 #if defined (STATIC_MALLOC)
3059 \f
3060 /* **************************************************************** */
3061 /* */
3062 /* xmalloc and xrealloc () */
3063 /* */
3064 /* **************************************************************** */
3065
3066 static void memory_error_and_abort ();
3067
3068 static char *
3069 xmalloc (bytes)
3070 int bytes;
3071 {
3072 char *temp = (char *)malloc (bytes);
3073
3074 if (!temp)
3075 memory_error_and_abort ();
3076 return (temp);
3077 }
3078
3079 static char *
3080 xrealloc (pointer, bytes)
3081 char *pointer;
3082 int bytes;
3083 {
3084 char *temp;
3085
3086 if (!pointer)
3087 temp = (char *)malloc (bytes);
3088 else
3089 temp = (char *)realloc (pointer, bytes);
3090
3091 if (!temp)
3092 memory_error_and_abort ();
3093
3094 return (temp);
3095 }
3096
3097 static void
3098 memory_error_and_abort ()
3099 {
3100 fprintf (stderr, "readline: Out of virtual memory!\n");
3101 abort ();
3102 }
3103 #endif /* STATIC_MALLOC */
3104
3105 \f
3106 /* **************************************************************** */
3107 /* */
3108 /* Testing Readline */
3109 /* */
3110 /* **************************************************************** */
3111
3112 #if defined (TEST)
3113
3114 main ()
3115 {
3116 HIST_ENTRY **history_list ();
3117 char *temp = (char *)NULL;
3118 char *prompt = "readline% ";
3119 int done = 0;
3120
3121 while (!done)
3122 {
3123 temp = readline (prompt);
3124
3125 /* Test for EOF. */
3126 if (!temp)
3127 exit (1);
3128
3129 /* If there is anything on the line, print it and remember it. */
3130 if (*temp)
3131 {
3132 fprintf (stderr, "%s\r\n", temp);
3133 add_history (temp);
3134 }
3135
3136 /* Check for `command' that we handle. */
3137 if (strcmp (temp, "quit") == 0)
3138 done = 1;
3139
3140 if (strcmp (temp, "list") == 0)
3141 {
3142 HIST_ENTRY **list = history_list ();
3143 register int i;
3144 if (list)
3145 {
3146 for (i = 0; list[i]; i++)
3147 {
3148 fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
3149 free (list[i]->line);
3150 }
3151 free (list);
3152 }
3153 }
3154 free (temp);
3155 }
3156 }
3157
3158 #endif /* TEST */
3159
3160 \f
3161 /*
3162 * Local variables:
3163 * compile-command: "gcc -g -traditional -I. -I.. -DTEST -o readline readline.c keymaps.o funmap.o history.o -ltermcap"
3164 * end:
3165 */
This page took 0.095266 seconds and 4 git commands to generate.