1 /* kill.c -- kill ring management. */
2 
3 /* Copyright (C) 1994-2017 Free Software Foundation, Inc.
4 
5    This file is part of the GNU Readline Library (Readline), a library
6    for reading lines of text with interactive input and history editing.
7 
8    Readline is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation, either version 3 of the License, or
11    (at your option) any later version.
12 
13    Readline is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #define READLINE_LIBRARY
23 
24 #if defined (HAVE_CONFIG_H)
25 #  include <config.h>
26 #endif
27 
28 #include <sys/types.h>
29 
30 #if defined (HAVE_UNISTD_H)
31 #  include <unistd.h>           /* for _POSIX_VERSION */
32 #endif /* HAVE_UNISTD_H */
33 
34 #if defined (HAVE_STDLIB_H)
35 #  include <stdlib.h>
36 #else
37 #  include "ansi_stdlib.h"
38 #endif /* HAVE_STDLIB_H */
39 
40 #include <stdio.h>
41 
42 /* System-specific feature definitions and include files. */
43 #include "rldefs.h"
44 
45 /* Some standard library routines. */
46 #include "readline.h"
47 #include "history.h"
48 
49 #include "rlprivate.h"
50 #include "xmalloc.h"
51 
52 /* **************************************************************** */
53 /*								    */
54 /*			Killing Mechanism			    */
55 /*								    */
56 /* **************************************************************** */
57 
58 /* What we assume for a max number of kills. */
59 #define DEFAULT_MAX_KILLS 10
60 
61 /* The real variable to look at to find out when to flush kills. */
62 static int rl_max_kills =  DEFAULT_MAX_KILLS;
63 
64 /* Where to store killed text. */
65 static char **rl_kill_ring = (char **)NULL;
66 
67 /* Where we are in the kill ring. */
68 static int rl_kill_index;
69 
70 /* How many slots we have in the kill ring. */
71 static int rl_kill_ring_length;
72 
73 static int _rl_copy_to_kill_ring PARAMS((char *, int));
74 static int region_kill_internal PARAMS((int));
75 static int _rl_copy_word_as_kill PARAMS((int, int));
76 static int rl_yank_nth_arg_internal PARAMS((int, int, int));
77 
78 /* How to say that you only want to save a certain amount
79    of kill material. */
80 int
rl_set_retained_kills(int num)81 rl_set_retained_kills (int num)
82 {
83   return 0;
84 }
85 
86 /* Add TEXT to the kill ring, allocating a new kill ring slot as necessary.
87    This uses TEXT directly, so the caller must not free it.  If APPEND is
88    non-zero, and the last command was a kill, the text is appended to the
89    current kill ring slot, otherwise prepended. */
90 static int
_rl_copy_to_kill_ring(char * text,int append)91 _rl_copy_to_kill_ring (char *text, int append)
92 {
93   char *old, *new;
94   int slot;
95 
96   /* First, find the slot to work with. */
97   if (_rl_last_command_was_kill == 0 || rl_kill_ring == 0)
98     {
99       /* Get a new slot.  */
100       if (rl_kill_ring == 0)
101 	{
102 	  /* If we don't have any defined, then make one. */
103 	  rl_kill_ring = (char **)
104 	    xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
105 	  rl_kill_ring[slot = 0] = (char *)NULL;
106 	}
107       else
108 	{
109 	  /* We have to add a new slot on the end, unless we have
110 	     exceeded the max limit for remembering kills. */
111 	  slot = rl_kill_ring_length;
112 	  if (slot == rl_max_kills)
113 	    {
114 	      register int i;
115 	      xfree (rl_kill_ring[0]);
116 	      for (i = 0; i < slot; i++)
117 		rl_kill_ring[i] = rl_kill_ring[i + 1];
118 	    }
119 	  else
120 	    {
121 	      slot = rl_kill_ring_length += 1;
122 	      rl_kill_ring = (char **)xrealloc (rl_kill_ring, (slot + 1) * sizeof (char *));
123 	    }
124 	  rl_kill_ring[--slot] = (char *)NULL;
125 	}
126     }
127   else
128     slot = rl_kill_ring_length - 1;
129 
130   /* If the last command was a kill, prepend or append. */
131   if (_rl_last_command_was_kill && rl_kill_ring[slot] && rl_editing_mode != vi_mode)
132     {
133       old = rl_kill_ring[slot];
134       new = (char *)xmalloc (1 + strlen (old) + strlen (text));
135 
136       if (append)
137 	{
138 	  strcpy (new, old);
139 	  strcat (new, text);
140 	}
141       else
142 	{
143 	  strcpy (new, text);
144 	  strcat (new, old);
145 	}
146       xfree (old);
147       xfree (text);
148       rl_kill_ring[slot] = new;
149     }
150   else
151     rl_kill_ring[slot] = text;
152 
153   rl_kill_index = slot;
154   return 0;
155 }
156 
157 /* The way to kill something.  This appends or prepends to the last
158    kill, if the last command was a kill command.  if FROM is less
159    than TO, then the text is appended, otherwise prepended.  If the
160    last command was not a kill command, then a new slot is made for
161    this kill. */
162 int
rl_kill_text(int from,int to)163 rl_kill_text (int from, int to)
164 {
165   char *text;
166 
167   /* Is there anything to kill? */
168   if (from == to)
169     {
170       _rl_last_command_was_kill++;
171       return 0;
172     }
173 
174   text = rl_copy_text (from, to);
175 
176   /* Delete the copied text from the line. */
177   rl_delete_text (from, to);
178 
179   _rl_copy_to_kill_ring (text, from < to);
180 
181   _rl_last_command_was_kill++;
182   return 0;
183 }
184 
185 /* Now REMEMBER!  In order to do prepending or appending correctly, kill
186    commands always make rl_point's original position be the FROM argument,
187    and rl_point's extent be the TO argument. */
188 
189 /* **************************************************************** */
190 /*								    */
191 /*			Killing Commands			    */
192 /*								    */
193 /* **************************************************************** */
194 
195 /* Delete the word at point, saving the text in the kill ring. */
196 int
rl_kill_word(int count,int key)197 rl_kill_word (int count, int key)
198 {
199   int orig_point;
200 
201   if (count < 0)
202     return (rl_backward_kill_word (-count, key));
203   else
204     {
205       orig_point = rl_point;
206       rl_forward_word (count, key);
207 
208       if (rl_point != orig_point)
209 	rl_kill_text (orig_point, rl_point);
210 
211       rl_point = orig_point;
212       if (rl_editing_mode == emacs_mode)
213 	rl_mark = rl_point;
214     }
215   return 0;
216 }
217 
218 /* Rubout the word before point, placing it on the kill ring. */
219 int
rl_backward_kill_word(int count,int key)220 rl_backward_kill_word (int count, int key)
221 {
222   int orig_point;
223 
224   if (count < 0)
225     return (rl_kill_word (-count, key));
226   else
227     {
228       orig_point = rl_point;
229       rl_backward_word (count, key);
230 
231       if (rl_point != orig_point)
232 	rl_kill_text (orig_point, rl_point);
233 
234       if (rl_editing_mode == emacs_mode)
235 	rl_mark = rl_point;
236     }
237   return 0;
238 }
239 
240 /* Kill from here to the end of the line.  If DIRECTION is negative, kill
241    back to the line start instead. */
242 int
rl_kill_line(int direction,int key)243 rl_kill_line (int direction, int key)
244 {
245   int orig_point;
246 
247   if (direction < 0)
248     return (rl_backward_kill_line (1, key));
249   else
250     {
251       orig_point = rl_point;
252       rl_end_of_line (1, key);
253       if (orig_point != rl_point)
254 	rl_kill_text (orig_point, rl_point);
255       rl_point = orig_point;
256       if (rl_editing_mode == emacs_mode)
257 	rl_mark = rl_point;
258     }
259   return 0;
260 }
261 
262 /* Kill backwards to the start of the line.  If DIRECTION is negative, kill
263    forwards to the line end instead. */
264 int
rl_backward_kill_line(int direction,int key)265 rl_backward_kill_line (int direction, int key)
266 {
267   int orig_point;
268 
269   if (direction < 0)
270     return (rl_kill_line (1, key));
271   else
272     {
273       if (rl_point == 0)
274 	rl_ding ();
275       else
276 	{
277 	  orig_point = rl_point;
278 	  rl_beg_of_line (1, key);
279 	  if (rl_point != orig_point)
280 	    rl_kill_text (orig_point, rl_point);
281 	  if (rl_editing_mode == emacs_mode)
282 	    rl_mark = rl_point;
283 	}
284     }
285   return 0;
286 }
287 
288 /* Kill the whole line, no matter where point is. */
289 int
rl_kill_full_line(int count,int key)290 rl_kill_full_line (int count, int key)
291 {
292   rl_begin_undo_group ();
293   rl_point = 0;
294   rl_kill_text (rl_point, rl_end);
295   rl_mark = 0;
296   rl_end_undo_group ();
297   return 0;
298 }
299 
300 /* The next two functions mimic unix line editing behaviour, except they
301    save the deleted text on the kill ring.  This is safer than not saving
302    it, and since we have a ring, nobody should get screwed. */
303 
304 /* This does what C-w does in Unix.  We can't prevent people from
305    using behaviour that they expect. */
306 int
rl_unix_word_rubout(int count,int key)307 rl_unix_word_rubout (int count, int key)
308 {
309   int orig_point;
310 
311   if (rl_point == 0)
312     rl_ding ();
313   else
314     {
315       orig_point = rl_point;
316       if (count <= 0)
317 	count = 1;
318 
319       while (count--)
320 	{
321 	  while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
322 	    rl_point--;
323 
324 	  while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0))
325 	    rl_point--;		/* XXX - multibyte? */
326 	}
327 
328       rl_kill_text (orig_point, rl_point);
329       if (rl_editing_mode == emacs_mode)
330 	rl_mark = rl_point;
331     }
332 
333   return 0;
334 }
335 
336 /* This deletes one filename component in a Unix pathname.  That is, it
337    deletes backward to directory separator (`/') or whitespace.  */
338 int
rl_unix_filename_rubout(int count,int key)339 rl_unix_filename_rubout (int count, int key)
340 {
341   int orig_point, c;
342 
343   if (rl_point == 0)
344     rl_ding ();
345   else
346     {
347       orig_point = rl_point;
348       if (count <= 0)
349 	count = 1;
350 
351       while (count--)
352 	{
353 	  c = rl_line_buffer[rl_point - 1];
354 	  while (rl_point && (whitespace (c) || c == '/'))
355 	    {
356 	      rl_point--;
357 	      c = rl_line_buffer[rl_point - 1];
358 	    }
359 
360 	  while (rl_point && (whitespace (c) == 0) && c != '/')
361 	    {
362 	      rl_point--;	/* XXX - multibyte? */
363 	      c = rl_line_buffer[rl_point - 1];
364 	    }
365 	}
366 
367       rl_kill_text (orig_point, rl_point);
368       if (rl_editing_mode == emacs_mode)
369 	rl_mark = rl_point;
370     }
371 
372   return 0;
373 }
374 
375 /* Here is C-u doing what Unix does.  You don't *have* to use these
376    key-bindings.  We have a choice of killing the entire line, or
377    killing from where we are to the start of the line.  We choose the
378    latter, because if you are a Unix weenie, then you haven't backspaced
379    into the line at all, and if you aren't, then you know what you are
380    doing. */
381 int
rl_unix_line_discard(int count,int key)382 rl_unix_line_discard (int count, int key)
383 {
384   if (rl_point == 0)
385     rl_ding ();
386   else
387     {
388       rl_kill_text (rl_point, 0);
389       rl_point = 0;
390       if (rl_editing_mode == emacs_mode)
391 	rl_mark = rl_point;
392     }
393   return 0;
394 }
395 
396 /* Copy the text in the `region' to the kill ring.  If DELETE is non-zero,
397    delete the text from the line as well. */
398 static int
region_kill_internal(int delete)399 region_kill_internal (int delete)
400 {
401   char *text;
402 
403   if (rl_mark != rl_point)
404     {
405       text = rl_copy_text (rl_point, rl_mark);
406       if (delete)
407 	rl_delete_text (rl_point, rl_mark);
408       _rl_copy_to_kill_ring (text, rl_point < rl_mark);
409     }
410 
411   _rl_last_command_was_kill++;
412   return 0;
413 }
414 
415 /* Copy the text in the region to the kill ring. */
416 int
rl_copy_region_to_kill(int count,int key)417 rl_copy_region_to_kill (int count, int key)
418 {
419   return (region_kill_internal (0));
420 }
421 
422 /* Kill the text between the point and mark. */
423 int
rl_kill_region(int count,int key)424 rl_kill_region (int count, int key)
425 {
426   int r, npoint;
427 
428   npoint = (rl_point < rl_mark) ? rl_point : rl_mark;
429   r = region_kill_internal (1);
430   _rl_fix_point (1);
431   rl_point = npoint;
432   return r;
433 }
434 
435 /* Copy COUNT words to the kill ring.  DIR says which direction we look
436    to find the words. */
437 static int
_rl_copy_word_as_kill(int count,int dir)438 _rl_copy_word_as_kill (int count, int dir)
439 {
440   int om, op, r;
441 
442   om = rl_mark;
443   op = rl_point;
444 
445   if (dir > 0)
446     rl_forward_word (count, 0);
447   else
448     rl_backward_word (count, 0);
449 
450   rl_mark = rl_point;
451 
452   if (dir > 0)
453     rl_backward_word (count, 0);
454   else
455     rl_forward_word (count, 0);
456 
457   r = region_kill_internal (0);
458 
459   rl_mark = om;
460   rl_point = op;
461 
462   return r;
463 }
464 
465 int
rl_copy_forward_word(int count,int key)466 rl_copy_forward_word (int count, int key)
467 {
468   if (count < 0)
469     return (rl_copy_backward_word (-count, key));
470 
471   return (_rl_copy_word_as_kill (count, 1));
472 }
473 
474 int
rl_copy_backward_word(int count,int key)475 rl_copy_backward_word (int count, int key)
476 {
477   if (count < 0)
478     return (rl_copy_forward_word (-count, key));
479 
480   return (_rl_copy_word_as_kill (count, -1));
481 }
482 
483 /* Yank back the last killed text.  This ignores arguments. */
484 int
rl_yank(int count,int key)485 rl_yank (int count, int key)
486 {
487   if (rl_kill_ring == 0)
488     {
489       _rl_abort_internal ();
490       return 1;
491     }
492 
493   _rl_set_mark_at_pos (rl_point);
494   rl_insert_text (rl_kill_ring[rl_kill_index]);
495   return 0;
496 }
497 
498 /* If the last command was yank, or yank_pop, and the text just
499    before point is identical to the current kill item, then
500    delete that text from the line, rotate the index down, and
501    yank back some other text. */
502 int
rl_yank_pop(int count,int key)503 rl_yank_pop (int count, int key)
504 {
505   int l, n;
506 
507   if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
508       !rl_kill_ring)
509     {
510       _rl_abort_internal ();
511       return 1;
512     }
513 
514   l = strlen (rl_kill_ring[rl_kill_index]);
515   n = rl_point - l;
516   if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
517     {
518       rl_delete_text (n, rl_point);
519       rl_point = n;
520       rl_kill_index--;
521       if (rl_kill_index < 0)
522 	rl_kill_index = rl_kill_ring_length - 1;
523       rl_yank (1, 0);
524       return 0;
525     }
526   else
527     {
528       _rl_abort_internal ();
529       return 1;
530     }
531 }
532 
533 #if defined (VI_MODE)
534 int
rl_vi_yank_pop(int count,int key)535 rl_vi_yank_pop (int count, int key)
536 {
537   int l, n;
538 
539   if (((rl_last_func != rl_vi_yank_pop) && (rl_last_func != rl_vi_put)) ||
540       !rl_kill_ring)
541     {
542       _rl_abort_internal ();
543       return 1;
544     }
545 
546   l = strlen (rl_kill_ring[rl_kill_index]);
547   n = rl_point - l;
548   if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
549     {
550       rl_delete_text (n, rl_point);
551       rl_point = n;
552       rl_kill_index--;
553       if (rl_kill_index < 0)
554 	rl_kill_index = rl_kill_ring_length - 1;
555       rl_vi_put (1, 'p');
556       return 0;
557     }
558   else
559     {
560       _rl_abort_internal ();
561       return 1;
562     }
563 }
564 #endif /* VI_MODE */
565 
566 /* Yank the COUNTh argument from the previous history line, skipping
567    HISTORY_SKIP lines before looking for the `previous line'. */
568 static int
rl_yank_nth_arg_internal(int count,int key,int history_skip)569 rl_yank_nth_arg_internal (int count, int key, int history_skip)
570 {
571   register HIST_ENTRY *entry;
572   char *arg;
573   int i, pos;
574 
575   pos = where_history ();
576 
577   if (history_skip)
578     {
579       for (i = 0; i < history_skip; i++)
580 	entry = previous_history ();
581     }
582 
583   entry = previous_history ();
584 
585   history_set_pos (pos);
586 
587   if (entry == 0)
588     {
589       rl_ding ();
590       return 1;
591     }
592 
593   arg = history_arg_extract (count, count, entry->line);
594   if (!arg || !*arg)
595     {
596       rl_ding ();
597       FREE (arg);
598       return 1;
599     }
600 
601   rl_begin_undo_group ();
602 
603   _rl_set_mark_at_pos (rl_point);
604 
605 #if defined (VI_MODE)
606   /* Vi mode always inserts a space before yanking the argument, and it
607      inserts it right *after* rl_point. */
608   if (rl_editing_mode == vi_mode)
609     {
610       rl_vi_append_mode (1, key);
611       rl_insert_text (" ");
612     }
613 #endif /* VI_MODE */
614 
615   rl_insert_text (arg);
616   xfree (arg);
617 
618   rl_end_undo_group ();
619   return 0;
620 }
621 
622 /* Yank the COUNTth argument from the previous history line. */
623 int
rl_yank_nth_arg(int count,int key)624 rl_yank_nth_arg (int count, int key)
625 {
626   return (rl_yank_nth_arg_internal (count, key, 0));
627 }
628 
629 /* Yank the last argument from the previous history line.  This `knows'
630    how rl_yank_nth_arg treats a count of `$'.  With an argument, this
631    behaves the same as rl_yank_nth_arg. */
632 int
rl_yank_last_arg(int count,int key)633 rl_yank_last_arg (int count, int key)
634 {
635   static int history_skip = 0;
636   static int explicit_arg_p = 0;
637   static int count_passed = 1;
638   static int direction = 1;
639   static int undo_needed = 0;
640   int retval;
641 
642   if (rl_last_func != rl_yank_last_arg)
643     {
644       history_skip = 0;
645       explicit_arg_p = rl_explicit_arg;
646       count_passed = count;
647       direction = 1;
648     }
649   else
650     {
651       if (undo_needed)
652 	rl_do_undo ();
653       if (count < 0)		/* XXX - was < 1 */
654         direction = -direction;
655       history_skip += direction;
656       if (history_skip < 0)
657 	history_skip = 0;
658     }
659 
660   if (explicit_arg_p)
661     retval = rl_yank_nth_arg_internal (count_passed, key, history_skip);
662   else
663     retval = rl_yank_nth_arg_internal ('$', key, history_skip);
664 
665   undo_needed = retval == 0;
666   return retval;
667 }
668 
669 /* Having read the special escape sequence denoting the beginning of a
670    `bracketed paste' sequence, read the rest of the pasted input until the
671    closing sequence and insert the pasted text as a single unit without
672    interpretation. */
673 char *
_rl_bracketed_text(size_t * lenp)674 _rl_bracketed_text (size_t *lenp)
675 {
676   int c;
677   size_t len, cap;
678   char *buf;
679 
680   len = 0;
681   buf = xmalloc (cap = 64);
682   buf[0] = '\0';
683 
684   RL_SETSTATE (RL_STATE_MOREINPUT);
685   while ((c = rl_read_key ()) >= 0)
686     {
687       if (RL_ISSTATE (RL_STATE_MACRODEF))
688 	_rl_add_macro_char (c);
689 
690       if (c == '\r')		/* XXX */
691 	c = '\n';
692 
693       if (len == cap)
694 	buf = xrealloc (buf, cap *= 2);
695 
696       buf[len++] = c;
697       if (len >= BRACK_PASTE_SLEN && c == BRACK_PASTE_LAST &&
698 	  STREQN (buf + len - BRACK_PASTE_SLEN, BRACK_PASTE_SUFF, BRACK_PASTE_SLEN))
699 	{
700 	  len -= BRACK_PASTE_SLEN;
701 	  break;
702 	}
703     }
704   RL_UNSETSTATE (RL_STATE_MOREINPUT);
705 
706   if (c >= 0)
707     {
708       if (len == cap)
709 	buf = xrealloc (buf, cap + 1);
710       buf[len] = '\0';
711     }
712 
713   if (lenp)
714     *lenp = len;
715   return (buf);
716 }
717 
718 int
rl_bracketed_paste_begin(int count,int key)719 rl_bracketed_paste_begin (int count, int key)
720 {
721   int retval, c;
722   size_t len, cap;
723   char *buf;
724 
725   buf = _rl_bracketed_text (&len);
726   retval = rl_insert_text (buf) == len ? 0 : 1;
727 
728   xfree (buf);
729   return (retval);
730 }
731 
732 /* A special paste command for Windows users. */
733 #if defined (_WIN32)
734 #include <windows.h>
735 
736 int
rl_paste_from_clipboard(int count,int key)737 rl_paste_from_clipboard (int count, int key)
738 {
739   char *data, *ptr;
740   int len;
741 
742   if (OpenClipboard (NULL) == 0)
743     return (0);
744 
745   data = (char *)GetClipboardData (CF_TEXT);
746   if (data)
747     {
748       ptr = strchr (data, '\r');
749       if (ptr)
750 	{
751 	  len = ptr - data;
752 	  ptr = (char *)xmalloc (len + 1);
753 	  ptr[len] = '\0';
754 	  strncpy (ptr, data, len);
755 	}
756       else
757         ptr = data;
758       _rl_set_mark_at_pos (rl_point);
759       rl_insert_text (ptr);
760       if (ptr != data)
761 	xfree (ptr);
762       CloseClipboard ();
763     }
764   return (0);
765 }
766 #endif /* _WIN32 */
767