1*6b445a62SJohn Marino /* macro.c -- keyboard macros for readline. */ 2*6b445a62SJohn Marino 3*6b445a62SJohn Marino /* Copyright (C) 1994-2009 Free Software Foundation, Inc. 4*6b445a62SJohn Marino 5*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library 6*6b445a62SJohn Marino for reading lines of text with interactive input and history editing. 7*6b445a62SJohn Marino 8*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify 9*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by 10*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or 11*6b445a62SJohn Marino (at your option) any later version. 12*6b445a62SJohn Marino 13*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful, 14*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 15*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*6b445a62SJohn Marino GNU General Public License for more details. 17*6b445a62SJohn Marino 18*6b445a62SJohn Marino You should have received a copy of the GNU General Public License 19*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>. 20*6b445a62SJohn Marino */ 21*6b445a62SJohn Marino 22*6b445a62SJohn Marino #define READLINE_LIBRARY 23*6b445a62SJohn Marino 24*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H) 25*6b445a62SJohn Marino # include <config.h> 26*6b445a62SJohn Marino #endif 27*6b445a62SJohn Marino 28*6b445a62SJohn Marino #include <sys/types.h> 29*6b445a62SJohn Marino 30*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H) 31*6b445a62SJohn Marino # include <unistd.h> /* for _POSIX_VERSION */ 32*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */ 33*6b445a62SJohn Marino 34*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H) 35*6b445a62SJohn Marino # include <stdlib.h> 36*6b445a62SJohn Marino #else 37*6b445a62SJohn Marino # include "ansi_stdlib.h" 38*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */ 39*6b445a62SJohn Marino 40*6b445a62SJohn Marino #include <stdio.h> 41*6b445a62SJohn Marino 42*6b445a62SJohn Marino /* System-specific feature definitions and include files. */ 43*6b445a62SJohn Marino #include "rldefs.h" 44*6b445a62SJohn Marino 45*6b445a62SJohn Marino /* Some standard library routines. */ 46*6b445a62SJohn Marino #include "readline.h" 47*6b445a62SJohn Marino #include "history.h" 48*6b445a62SJohn Marino 49*6b445a62SJohn Marino #include "rlprivate.h" 50*6b445a62SJohn Marino #include "xmalloc.h" 51*6b445a62SJohn Marino 52*6b445a62SJohn Marino /* **************************************************************** */ 53*6b445a62SJohn Marino /* */ 54*6b445a62SJohn Marino /* Hacking Keyboard Macros */ 55*6b445a62SJohn Marino /* */ 56*6b445a62SJohn Marino /* **************************************************************** */ 57*6b445a62SJohn Marino 58*6b445a62SJohn Marino /* The currently executing macro string. If this is non-zero, 59*6b445a62SJohn Marino then it is a malloc ()'ed string where input is coming from. */ 60*6b445a62SJohn Marino char *rl_executing_macro = (char *)NULL; 61*6b445a62SJohn Marino 62*6b445a62SJohn Marino /* The offset in the above string to the next character to be read. */ 63*6b445a62SJohn Marino static int executing_macro_index; 64*6b445a62SJohn Marino 65*6b445a62SJohn Marino /* The current macro string being built. Characters get stuffed 66*6b445a62SJohn Marino in here by add_macro_char (). */ 67*6b445a62SJohn Marino static char *current_macro = (char *)NULL; 68*6b445a62SJohn Marino 69*6b445a62SJohn Marino /* The size of the buffer allocated to current_macro. */ 70*6b445a62SJohn Marino static int current_macro_size; 71*6b445a62SJohn Marino 72*6b445a62SJohn Marino /* The index at which characters are being added to current_macro. */ 73*6b445a62SJohn Marino static int current_macro_index; 74*6b445a62SJohn Marino 75*6b445a62SJohn Marino /* A structure used to save nested macro strings. 76*6b445a62SJohn Marino It is a linked list of string/index for each saved macro. */ 77*6b445a62SJohn Marino struct saved_macro { 78*6b445a62SJohn Marino struct saved_macro *next; 79*6b445a62SJohn Marino char *string; 80*6b445a62SJohn Marino int sindex; 81*6b445a62SJohn Marino }; 82*6b445a62SJohn Marino 83*6b445a62SJohn Marino /* The list of saved macros. */ 84*6b445a62SJohn Marino static struct saved_macro *macro_list = (struct saved_macro *)NULL; 85*6b445a62SJohn Marino 86*6b445a62SJohn Marino /* Set up to read subsequent input from STRING. 87*6b445a62SJohn Marino STRING is free ()'ed when we are done with it. */ 88*6b445a62SJohn Marino void 89*6b445a62SJohn Marino _rl_with_macro_input (string) 90*6b445a62SJohn Marino char *string; 91*6b445a62SJohn Marino { 92*6b445a62SJohn Marino _rl_push_executing_macro (); 93*6b445a62SJohn Marino rl_executing_macro = string; 94*6b445a62SJohn Marino executing_macro_index = 0; 95*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MACROINPUT); 96*6b445a62SJohn Marino } 97*6b445a62SJohn Marino 98*6b445a62SJohn Marino /* Return the next character available from a macro, or 0 if 99*6b445a62SJohn Marino there are no macro characters. */ 100*6b445a62SJohn Marino int 101*6b445a62SJohn Marino _rl_next_macro_key () 102*6b445a62SJohn Marino { 103*6b445a62SJohn Marino int c; 104*6b445a62SJohn Marino 105*6b445a62SJohn Marino if (rl_executing_macro == 0) 106*6b445a62SJohn Marino return (0); 107*6b445a62SJohn Marino 108*6b445a62SJohn Marino if (rl_executing_macro[executing_macro_index] == 0) 109*6b445a62SJohn Marino { 110*6b445a62SJohn Marino _rl_pop_executing_macro (); 111*6b445a62SJohn Marino return (_rl_next_macro_key ()); 112*6b445a62SJohn Marino } 113*6b445a62SJohn Marino 114*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS) 115*6b445a62SJohn Marino c = rl_executing_macro[executing_macro_index++]; 116*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) 117*6b445a62SJohn Marino _rl_pop_executing_macro (); 118*6b445a62SJohn Marino return c; 119*6b445a62SJohn Marino #else 120*6b445a62SJohn Marino return (rl_executing_macro[executing_macro_index++]); 121*6b445a62SJohn Marino #endif 122*6b445a62SJohn Marino } 123*6b445a62SJohn Marino 124*6b445a62SJohn Marino /* Save the currently executing macro on a stack of saved macros. */ 125*6b445a62SJohn Marino void 126*6b445a62SJohn Marino _rl_push_executing_macro () 127*6b445a62SJohn Marino { 128*6b445a62SJohn Marino struct saved_macro *saver; 129*6b445a62SJohn Marino 130*6b445a62SJohn Marino saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); 131*6b445a62SJohn Marino saver->next = macro_list; 132*6b445a62SJohn Marino saver->sindex = executing_macro_index; 133*6b445a62SJohn Marino saver->string = rl_executing_macro; 134*6b445a62SJohn Marino 135*6b445a62SJohn Marino macro_list = saver; 136*6b445a62SJohn Marino } 137*6b445a62SJohn Marino 138*6b445a62SJohn Marino /* Discard the current macro, replacing it with the one 139*6b445a62SJohn Marino on the top of the stack of saved macros. */ 140*6b445a62SJohn Marino void 141*6b445a62SJohn Marino _rl_pop_executing_macro () 142*6b445a62SJohn Marino { 143*6b445a62SJohn Marino struct saved_macro *macro; 144*6b445a62SJohn Marino 145*6b445a62SJohn Marino FREE (rl_executing_macro); 146*6b445a62SJohn Marino rl_executing_macro = (char *)NULL; 147*6b445a62SJohn Marino executing_macro_index = 0; 148*6b445a62SJohn Marino 149*6b445a62SJohn Marino if (macro_list) 150*6b445a62SJohn Marino { 151*6b445a62SJohn Marino macro = macro_list; 152*6b445a62SJohn Marino rl_executing_macro = macro_list->string; 153*6b445a62SJohn Marino executing_macro_index = macro_list->sindex; 154*6b445a62SJohn Marino macro_list = macro_list->next; 155*6b445a62SJohn Marino xfree (macro); 156*6b445a62SJohn Marino } 157*6b445a62SJohn Marino 158*6b445a62SJohn Marino if (rl_executing_macro == 0) 159*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MACROINPUT); 160*6b445a62SJohn Marino } 161*6b445a62SJohn Marino 162*6b445a62SJohn Marino /* Add a character to the macro being built. */ 163*6b445a62SJohn Marino void 164*6b445a62SJohn Marino _rl_add_macro_char (c) 165*6b445a62SJohn Marino int c; 166*6b445a62SJohn Marino { 167*6b445a62SJohn Marino if (current_macro_index + 1 >= current_macro_size) 168*6b445a62SJohn Marino { 169*6b445a62SJohn Marino if (current_macro == 0) 170*6b445a62SJohn Marino current_macro = (char *)xmalloc (current_macro_size = 25); 171*6b445a62SJohn Marino else 172*6b445a62SJohn Marino current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); 173*6b445a62SJohn Marino } 174*6b445a62SJohn Marino 175*6b445a62SJohn Marino current_macro[current_macro_index++] = c; 176*6b445a62SJohn Marino current_macro[current_macro_index] = '\0'; 177*6b445a62SJohn Marino } 178*6b445a62SJohn Marino 179*6b445a62SJohn Marino void 180*6b445a62SJohn Marino _rl_kill_kbd_macro () 181*6b445a62SJohn Marino { 182*6b445a62SJohn Marino if (current_macro) 183*6b445a62SJohn Marino { 184*6b445a62SJohn Marino xfree (current_macro); 185*6b445a62SJohn Marino current_macro = (char *) NULL; 186*6b445a62SJohn Marino } 187*6b445a62SJohn Marino current_macro_size = current_macro_index = 0; 188*6b445a62SJohn Marino 189*6b445a62SJohn Marino FREE (rl_executing_macro); 190*6b445a62SJohn Marino rl_executing_macro = (char *) NULL; 191*6b445a62SJohn Marino executing_macro_index = 0; 192*6b445a62SJohn Marino 193*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MACRODEF); 194*6b445a62SJohn Marino } 195*6b445a62SJohn Marino 196*6b445a62SJohn Marino /* Begin defining a keyboard macro. 197*6b445a62SJohn Marino Keystrokes are recorded as they are executed. 198*6b445a62SJohn Marino End the definition with rl_end_kbd_macro (). 199*6b445a62SJohn Marino If a numeric argument was explicitly typed, then append this 200*6b445a62SJohn Marino definition to the end of the existing macro, and start by 201*6b445a62SJohn Marino re-executing the existing macro. */ 202*6b445a62SJohn Marino int 203*6b445a62SJohn Marino rl_start_kbd_macro (ignore1, ignore2) 204*6b445a62SJohn Marino int ignore1, ignore2; 205*6b445a62SJohn Marino { 206*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_MACRODEF)) 207*6b445a62SJohn Marino { 208*6b445a62SJohn Marino _rl_abort_internal (); 209*6b445a62SJohn Marino return -1; 210*6b445a62SJohn Marino } 211*6b445a62SJohn Marino 212*6b445a62SJohn Marino if (rl_explicit_arg) 213*6b445a62SJohn Marino { 214*6b445a62SJohn Marino if (current_macro) 215*6b445a62SJohn Marino _rl_with_macro_input (savestring (current_macro)); 216*6b445a62SJohn Marino } 217*6b445a62SJohn Marino else 218*6b445a62SJohn Marino current_macro_index = 0; 219*6b445a62SJohn Marino 220*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MACRODEF); 221*6b445a62SJohn Marino return 0; 222*6b445a62SJohn Marino } 223*6b445a62SJohn Marino 224*6b445a62SJohn Marino /* Stop defining a keyboard macro. 225*6b445a62SJohn Marino A numeric argument says to execute the macro right now, 226*6b445a62SJohn Marino that many times, counting the definition as the first time. */ 227*6b445a62SJohn Marino int 228*6b445a62SJohn Marino rl_end_kbd_macro (count, ignore) 229*6b445a62SJohn Marino int count, ignore; 230*6b445a62SJohn Marino { 231*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) 232*6b445a62SJohn Marino { 233*6b445a62SJohn Marino _rl_abort_internal (); 234*6b445a62SJohn Marino return -1; 235*6b445a62SJohn Marino } 236*6b445a62SJohn Marino 237*6b445a62SJohn Marino current_macro_index -= rl_key_sequence_length - 1; 238*6b445a62SJohn Marino current_macro[current_macro_index] = '\0'; 239*6b445a62SJohn Marino 240*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MACRODEF); 241*6b445a62SJohn Marino 242*6b445a62SJohn Marino return (rl_call_last_kbd_macro (--count, 0)); 243*6b445a62SJohn Marino } 244*6b445a62SJohn Marino 245*6b445a62SJohn Marino /* Execute the most recently defined keyboard macro. 246*6b445a62SJohn Marino COUNT says how many times to execute it. */ 247*6b445a62SJohn Marino int 248*6b445a62SJohn Marino rl_call_last_kbd_macro (count, ignore) 249*6b445a62SJohn Marino int count, ignore; 250*6b445a62SJohn Marino { 251*6b445a62SJohn Marino if (current_macro == 0) 252*6b445a62SJohn Marino _rl_abort_internal (); 253*6b445a62SJohn Marino 254*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_MACRODEF)) 255*6b445a62SJohn Marino { 256*6b445a62SJohn Marino rl_ding (); /* no recursive macros */ 257*6b445a62SJohn Marino current_macro[--current_macro_index] = '\0'; /* erase this char */ 258*6b445a62SJohn Marino return 0; 259*6b445a62SJohn Marino } 260*6b445a62SJohn Marino 261*6b445a62SJohn Marino while (count--) 262*6b445a62SJohn Marino _rl_with_macro_input (savestring (current_macro)); 263*6b445a62SJohn Marino return 0; 264*6b445a62SJohn Marino } 265*6b445a62SJohn Marino 266*6b445a62SJohn Marino void 267*6b445a62SJohn Marino rl_push_macro_input (macro) 268*6b445a62SJohn Marino char *macro; 269*6b445a62SJohn Marino { 270*6b445a62SJohn Marino _rl_with_macro_input (macro); 271*6b445a62SJohn Marino } 272