| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | /* macro.c -- keyboard macros for readline. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  | /* Copyright (C) 1994-2009 Free Software Foundation, Inc.
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    This file is part of the GNU Readline Library (Readline), a library | 
					
						
							|  |  |  |    for reading lines of text with interactive input and history editing.       | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    Readline is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |    it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |    the Free Software Foundation, either version 3 of the License, or | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |    (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    Readline is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |    GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | #define READLINE_LIBRARY
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (HAVE_CONFIG_H)
 | 
					
						
							|  |  |  | #  include <config.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (HAVE_UNISTD_H)
 | 
					
						
							|  |  |  | #  include <unistd.h>           /* for _POSIX_VERSION */
 | 
					
						
							|  |  |  | #endif /* HAVE_UNISTD_H */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (HAVE_STDLIB_H)
 | 
					
						
							|  |  |  | #  include <stdlib.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #  include "ansi_stdlib.h"
 | 
					
						
							|  |  |  | #endif /* HAVE_STDLIB_H */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* System-specific feature definitions and include files. */ | 
					
						
							|  |  |  | #include "rldefs.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Some standard library routines. */ | 
					
						
							|  |  |  | #include "readline.h"
 | 
					
						
							|  |  |  | #include "history.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | #include "rlprivate.h"
 | 
					
						
							|  |  |  | #include "xmalloc.h"
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* **************************************************************** */ | 
					
						
							|  |  |  | /*								    */ | 
					
						
							|  |  |  | /*			Hacking Keyboard Macros 		    */ | 
					
						
							|  |  |  | /*								    */ | 
					
						
							|  |  |  | /* **************************************************************** */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The currently executing macro string.  If this is non-zero,
 | 
					
						
							|  |  |  |    then it is a malloc ()'ed string where input is coming from. */ | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  | char *rl_executing_macro = (char *)NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | /* The offset in the above string to the next character to be read. */ | 
					
						
							|  |  |  | static int executing_macro_index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The current macro string being built.  Characters get stuffed
 | 
					
						
							|  |  |  |    in here by add_macro_char (). */ | 
					
						
							|  |  |  | static char *current_macro = (char *)NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The size of the buffer allocated to current_macro. */ | 
					
						
							|  |  |  | static int current_macro_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The index at which characters are being added to current_macro. */ | 
					
						
							|  |  |  | static int current_macro_index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* A structure used to save nested macro strings.
 | 
					
						
							|  |  |  |    It is a linked list of string/index for each saved macro. */ | 
					
						
							|  |  |  | struct saved_macro { | 
					
						
							|  |  |  |   struct saved_macro *next; | 
					
						
							|  |  |  |   char *string; | 
					
						
							|  |  |  |   int sindex; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The list of saved macros. */ | 
					
						
							|  |  |  | static struct saved_macro *macro_list = (struct saved_macro *)NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set up to read subsequent input from STRING.
 | 
					
						
							|  |  |  |    STRING is free ()'ed when we are done with it. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | _rl_with_macro_input (string) | 
					
						
							|  |  |  |      char *string; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   _rl_push_executing_macro (); | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   rl_executing_macro = string; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   executing_macro_index = 0; | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   RL_SETSTATE(RL_STATE_MACROINPUT); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return the next character available from a macro, or 0 if
 | 
					
						
							|  |  |  |    there are no macro characters. */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | _rl_next_macro_key () | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-12-07 14:08:12 +00:00
										 |  |  |   int c; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   if (rl_executing_macro == 0) | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     return (0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   if (rl_executing_macro[executing_macro_index] == 0) | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       _rl_pop_executing_macro (); | 
					
						
							|  |  |  |       return (_rl_next_macro_key ()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-07 14:08:12 +00:00
										 |  |  | #if defined (READLINE_CALLBACKS)
 | 
					
						
							|  |  |  |   c = rl_executing_macro[executing_macro_index++]; | 
					
						
							| 
									
										
										
										
											2006-10-10 14:15:34 +00:00
										 |  |  |   if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) | 
					
						
							| 
									
										
										
										
											2005-12-07 14:08:12 +00:00
										 |  |  |       _rl_pop_executing_macro (); | 
					
						
							|  |  |  |   return c; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   return (rl_executing_macro[executing_macro_index++]); | 
					
						
							| 
									
										
										
										
											2005-12-07 14:08:12 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-26 09:36:43 -05:00
										 |  |  | int | 
					
						
							|  |  |  | _rl_prev_macro_key () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (rl_executing_macro == 0) | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (executing_macro_index == 0) | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   executing_macro_index--; | 
					
						
							|  |  |  |   return (rl_executing_macro[executing_macro_index]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | /* Save the currently executing macro on a stack of saved macros. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | _rl_push_executing_macro () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct saved_macro *saver; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); | 
					
						
							|  |  |  |   saver->next = macro_list; | 
					
						
							|  |  |  |   saver->sindex = executing_macro_index; | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   saver->string = rl_executing_macro; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   macro_list = saver; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Discard the current macro, replacing it with the one
 | 
					
						
							|  |  |  |    on the top of the stack of saved macros. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | _rl_pop_executing_macro () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct saved_macro *macro; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   FREE (rl_executing_macro); | 
					
						
							|  |  |  |   rl_executing_macro = (char *)NULL; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   executing_macro_index = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (macro_list) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       macro = macro_list; | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |       rl_executing_macro = macro_list->string; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |       executing_macro_index = macro_list->sindex; | 
					
						
							|  |  |  |       macro_list = macro_list->next; | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |       xfree (macro); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (rl_executing_macro == 0) | 
					
						
							|  |  |  |     RL_UNSETSTATE(RL_STATE_MACROINPUT); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Add a character to the macro being built. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | _rl_add_macro_char (c) | 
					
						
							|  |  |  |      int c; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (current_macro_index + 1 >= current_macro_size) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (current_macro == 0) | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | 	current_macro = (char *)xmalloc (current_macro_size = 25); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2001-11-13 17:56:06 +00:00
										 |  |  | 	current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   current_macro[current_macro_index++] = c; | 
					
						
							|  |  |  |   current_macro[current_macro_index] = '\0'; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | _rl_kill_kbd_macro () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (current_macro) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |       xfree (current_macro); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |       current_macro = (char *) NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   current_macro_size = current_macro_index = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   FREE (rl_executing_macro); | 
					
						
							|  |  |  |   rl_executing_macro = (char *) NULL; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   executing_macro_index = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   RL_UNSETSTATE(RL_STATE_MACRODEF); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Begin defining a keyboard macro.
 | 
					
						
							|  |  |  |    Keystrokes are recorded as they are executed. | 
					
						
							|  |  |  |    End the definition with rl_end_kbd_macro (). | 
					
						
							|  |  |  |    If a numeric argument was explicitly typed, then append this | 
					
						
							|  |  |  |    definition to the end of the existing macro, and start by | 
					
						
							|  |  |  |    re-executing the existing macro. */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | rl_start_kbd_macro (ignore1, ignore2) | 
					
						
							|  |  |  |      int ignore1, ignore2; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-07-17 14:10:11 +00:00
										 |  |  |   if (RL_ISSTATE (RL_STATE_MACRODEF)) | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       _rl_abort_internal (); | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (rl_explicit_arg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (current_macro) | 
					
						
							|  |  |  | 	_rl_with_macro_input (savestring (current_macro)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     current_macro_index = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   RL_SETSTATE(RL_STATE_MACRODEF); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Stop defining a keyboard macro.
 | 
					
						
							|  |  |  |    A numeric argument says to execute the macro right now, | 
					
						
							|  |  |  |    that many times, counting the definition as the first time. */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | rl_end_kbd_macro (count, ignore) | 
					
						
							|  |  |  |      int count, ignore; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-07-17 14:10:11 +00:00
										 |  |  |   if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       _rl_abort_internal (); | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-26 09:36:43 -05:00
										 |  |  |   current_macro_index -= rl_key_sequence_length; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   current_macro[current_macro_index] = '\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |   RL_UNSETSTATE(RL_STATE_MACRODEF); | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return (rl_call_last_kbd_macro (--count, 0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Execute the most recently defined keyboard macro.
 | 
					
						
							|  |  |  |    COUNT says how many times to execute it. */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | rl_call_last_kbd_macro (count, ignore) | 
					
						
							|  |  |  |      int count, ignore; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (current_macro == 0) | 
					
						
							|  |  |  |     _rl_abort_internal (); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 14:10:11 +00:00
										 |  |  |   if (RL_ISSTATE (RL_STATE_MACRODEF)) | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |       rl_ding ();		/* no recursive macros */ | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |       current_macro[--current_macro_index] = '\0';	/* erase this char */ | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (count--) | 
					
						
							|  |  |  |     _rl_with_macro_input (savestring (current_macro)); | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-26 09:36:43 -05:00
										 |  |  | int | 
					
						
							|  |  |  | rl_print_last_kbd_macro (count, ignore) | 
					
						
							|  |  |  |      int count, ignore; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *m; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (current_macro == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       rl_ding (); | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   m = _rl_untranslate_macro_value (current_macro, 1); | 
					
						
							|  |  |  |   rl_crlf (); | 
					
						
							|  |  |  |   printf ("%s", m); | 
					
						
							|  |  |  |   fflush (stdout); | 
					
						
							|  |  |  |   rl_crlf (); | 
					
						
							|  |  |  |   FREE (m); | 
					
						
							|  |  |  |   rl_forced_update_display (); | 
					
						
							|  |  |  |   rl_display_fixed = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | void | 
					
						
							|  |  |  | rl_push_macro_input (macro) | 
					
						
							|  |  |  |      char *macro; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   _rl_with_macro_input (macro); | 
					
						
							|  |  |  | } |