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