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