macro.c revision 165671
1156772Sdeischen/* macro.c -- keyboard macros for readline. */ 2156772Sdeischen 3156772Sdeischen/* Copyright (C) 1994 Free Software Foundation, Inc. 4156772Sdeischen 5156772Sdeischen This file is part of the GNU Readline Library, a library for 6156772Sdeischen reading lines of text with interactive input and history editing. 7156772Sdeischen 8156772Sdeischen The GNU Readline Library is free software; you can redistribute it 9156772Sdeischen and/or modify it under the terms of the GNU General Public License 10156772Sdeischen as published by the Free Software Foundation; either version 2, or 11156772Sdeischen (at your option) any later version. 12156772Sdeischen 13156772Sdeischen The GNU Readline Library is distributed in the hope that it will be 14156772Sdeischen useful, but WITHOUT ANY WARRANTY; without even the implied warranty 15156772Sdeischen of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16156772Sdeischen GNU General Public License for more details. 17156772Sdeischen 18156772Sdeischen The GNU General Public License is often shipped with GNU software, and 19156772Sdeischen is generally kept in a file called COPYING or LICENSE. If you do not 20156772Sdeischen have a copy of the license, write to the Free Software Foundation, 21156772Sdeischen 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ 22156772Sdeischen#define READLINE_LIBRARY 23156772Sdeischen 24156772Sdeischen#if defined (HAVE_CONFIG_H) 25156772Sdeischen# include <config.h> 26156772Sdeischen#endif 27156772Sdeischen 28156772Sdeischen#include <sys/types.h> 29156772Sdeischen 30156772Sdeischen#if defined (HAVE_UNISTD_H) 31156772Sdeischen# include <unistd.h> /* for _POSIX_VERSION */ 32156772Sdeischen#endif /* HAVE_UNISTD_H */ 33156772Sdeischen 34156772Sdeischen#if defined (HAVE_STDLIB_H) 35156772Sdeischen# include <stdlib.h> 36156772Sdeischen#else 37156772Sdeischen# include "ansi_stdlib.h" 38156772Sdeischen#endif /* HAVE_STDLIB_H */ 39156772Sdeischen 40156772Sdeischen#include <stdio.h> 41156772Sdeischen 42156772Sdeischen/* System-specific feature definitions and include files. */ 43156772Sdeischen#include "rldefs.h" 44156772Sdeischen 45156772Sdeischen/* Some standard library routines. */ 46156772Sdeischen#include "readline.h" 47156772Sdeischen#include "history.h" 48156772Sdeischen 49156772Sdeischen#include "rlprivate.h" 50156772Sdeischen#include "xmalloc.h" 51156772Sdeischen 52156772Sdeischen/* **************************************************************** */ 53156772Sdeischen/* */ 54156772Sdeischen/* Hacking Keyboard Macros */ 55156772Sdeischen/* */ 56168963Sdeischen/* **************************************************************** */ 57156772Sdeischen 58156772Sdeischen/* The currently executing macro string. If this is non-zero, 59156772Sdeischen then it is a malloc ()'ed string where input is coming from. */ 60156772Sdeischenchar *rl_executing_macro = (char *)NULL; 61156772Sdeischen 62156772Sdeischen/* The offset in the above string to the next character to be read. */ 63156772Sdeischenstatic int executing_macro_index; 64156772Sdeischen 65156772Sdeischen/* The current macro string being built. Characters get stuffed 66156772Sdeischen in here by add_macro_char (). */ 67156772Sdeischenstatic char *current_macro = (char *)NULL; 68156772Sdeischen 69156772Sdeischen/* The size of the buffer allocated to current_macro. */ 70156772Sdeischenstatic int current_macro_size; 71156772Sdeischen 72156772Sdeischen/* The index at which characters are being added to current_macro. */ 73156772Sdeischenstatic int current_macro_index; 74156772Sdeischen 75156772Sdeischen/* A structure used to save nested macro strings. 76156772Sdeischen It is a linked list of string/index for each saved macro. */ 77156772Sdeischenstruct saved_macro { 78156772Sdeischen struct saved_macro *next; 79156772Sdeischen char *string; 80156772Sdeischen int sindex; 81156772Sdeischen}; 82156772Sdeischen 83156772Sdeischen/* The list of saved macros. */ 84156772Sdeischenstatic struct saved_macro *macro_list = (struct saved_macro *)NULL; 85156772Sdeischen 86156772Sdeischen/* Set up to read subsequent input from STRING. 87156772Sdeischen STRING is free ()'ed when we are done with it. */ 88156772Sdeischenvoid 89156772Sdeischen_rl_with_macro_input (string) 90156772Sdeischen char *string; 91156772Sdeischen{ 92156772Sdeischen _rl_push_executing_macro (); 93156772Sdeischen rl_executing_macro = string; 94156772Sdeischen executing_macro_index = 0; 95156772Sdeischen RL_SETSTATE(RL_STATE_MACROINPUT); 96156772Sdeischen} 97156772Sdeischen 98156772Sdeischen/* Return the next character available from a macro, or 0 if 99156772Sdeischen there are no macro characters. */ 100156772Sdeischenint 101156772Sdeischen_rl_next_macro_key () 102156772Sdeischen{ 103156772Sdeischen int c; 104156772Sdeischen 105156772Sdeischen if (rl_executing_macro == 0) 106156772Sdeischen return (0); 107156772Sdeischen 108156772Sdeischen if (rl_executing_macro[executing_macro_index] == 0) 109156772Sdeischen { 110156772Sdeischen _rl_pop_executing_macro (); 111156772Sdeischen return (_rl_next_macro_key ()); 112156772Sdeischen } 113156772Sdeischen 114156772Sdeischen#if defined (READLINE_CALLBACKS) 115156772Sdeischen c = rl_executing_macro[executing_macro_index++]; 116156772Sdeischen if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) 117156772Sdeischen _rl_pop_executing_macro (); 118156772Sdeischen return c; 119156772Sdeischen#else 120156772Sdeischen return (rl_executing_macro[executing_macro_index++]); 121156772Sdeischen#endif 122156772Sdeischen} 123156772Sdeischen 124156772Sdeischen/* Save the currently executing macro on a stack of saved macros. */ 125156772Sdeischenvoid 126156772Sdeischen_rl_push_executing_macro () 127156772Sdeischen{ 128156772Sdeischen struct saved_macro *saver; 129156772Sdeischen 130156772Sdeischen saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); 131156772Sdeischen saver->next = macro_list; 132156772Sdeischen saver->sindex = executing_macro_index; 133156772Sdeischen saver->string = rl_executing_macro; 134156772Sdeischen 135156772Sdeischen macro_list = saver; 136156772Sdeischen} 137156772Sdeischen 138156772Sdeischen/* Discard the current macro, replacing it with the one 139156772Sdeischen on the top of the stack of saved macros. */ 140156772Sdeischenvoid 141156772Sdeischen_rl_pop_executing_macro () 142156772Sdeischen{ 143156772Sdeischen struct saved_macro *macro; 144156772Sdeischen 145168963Sdeischen FREE (rl_executing_macro); 146168963Sdeischen rl_executing_macro = (char *)NULL; 147168963Sdeischen executing_macro_index = 0; 148168963Sdeischen 149168963Sdeischen if (macro_list) 150168963Sdeischen { 151168963Sdeischen macro = macro_list; 152168963Sdeischen rl_executing_macro = macro_list->string; 153168963Sdeischen executing_macro_index = macro_list->sindex; 154168963Sdeischen macro_list = macro_list->next; 155168963Sdeischen free (macro); 156168963Sdeischen } 157168963Sdeischen 158168963Sdeischen if (rl_executing_macro == 0) 159168963Sdeischen RL_UNSETSTATE(RL_STATE_MACROINPUT); 160168963Sdeischen} 161168963Sdeischen 162168963Sdeischen/* Add a character to the macro being built. */ 163168963Sdeischenvoid 164168963Sdeischen_rl_add_macro_char (c) 165168963Sdeischen int c; 166168963Sdeischen{ 167168963Sdeischen if (current_macro_index + 1 >= current_macro_size) 168168963Sdeischen { 169168963Sdeischen if (current_macro == 0) 170168963Sdeischen current_macro = (char *)xmalloc (current_macro_size = 25); 171168963Sdeischen else 172168963Sdeischen current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); 173168963Sdeischen } 174168963Sdeischen 175168963Sdeischen current_macro[current_macro_index++] = c; 176168963Sdeischen current_macro[current_macro_index] = '\0'; 177168963Sdeischen} 178168963Sdeischen 179156772Sdeischenvoid 180156772Sdeischen_rl_kill_kbd_macro () 181168963Sdeischen{ 182156772Sdeischen if (current_macro) 183156772Sdeischen { 184 free (current_macro); 185 current_macro = (char *) NULL; 186 } 187 current_macro_size = current_macro_index = 0; 188 189 FREE (rl_executing_macro); 190 rl_executing_macro = (char *) NULL; 191 executing_macro_index = 0; 192 193 RL_UNSETSTATE(RL_STATE_MACRODEF); 194} 195 196/* Begin defining a keyboard macro. 197 Keystrokes are recorded as they are executed. 198 End the definition with rl_end_kbd_macro (). 199 If a numeric argument was explicitly typed, then append this 200 definition to the end of the existing macro, and start by 201 re-executing the existing macro. */ 202int 203rl_start_kbd_macro (ignore1, ignore2) 204 int ignore1, ignore2; 205{ 206 if (RL_ISSTATE (RL_STATE_MACRODEF)) 207 { 208 _rl_abort_internal (); 209 return -1; 210 } 211 212 if (rl_explicit_arg) 213 { 214 if (current_macro) 215 _rl_with_macro_input (savestring (current_macro)); 216 } 217 else 218 current_macro_index = 0; 219 220 RL_SETSTATE(RL_STATE_MACRODEF); 221 return 0; 222} 223 224/* Stop defining a keyboard macro. 225 A numeric argument says to execute the macro right now, 226 that many times, counting the definition as the first time. */ 227int 228rl_end_kbd_macro (count, ignore) 229 int count, ignore; 230{ 231 if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) 232 { 233 _rl_abort_internal (); 234 return -1; 235 } 236 237 current_macro_index -= rl_key_sequence_length - 1; 238 current_macro[current_macro_index] = '\0'; 239 240 RL_UNSETSTATE(RL_STATE_MACRODEF); 241 242 return (rl_call_last_kbd_macro (--count, 0)); 243} 244 245/* Execute the most recently defined keyboard macro. 246 COUNT says how many times to execute it. */ 247int 248rl_call_last_kbd_macro (count, ignore) 249 int count, ignore; 250{ 251 if (current_macro == 0) 252 _rl_abort_internal (); 253 254 if (RL_ISSTATE (RL_STATE_MACRODEF)) 255 { 256 rl_ding (); /* no recursive macros */ 257 current_macro[--current_macro_index] = '\0'; /* erase this char */ 258 return 0; 259 } 260 261 while (count--) 262 _rl_with_macro_input (savestring (current_macro)); 263 return 0; 264} 265 266void 267rl_push_macro_input (macro) 268 char *macro; 269{ 270 _rl_with_macro_input (macro); 271} 272