xref: /dflybsd-src/contrib/gdb-7/readline/macro.c (revision 16003dcfd2baa152f5dd24794ec9f36e139eaeb8)
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
_rl_with_macro_input(string)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
_rl_next_macro_key()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
_rl_push_executing_macro()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
_rl_pop_executing_macro()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
_rl_add_macro_char(c)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
_rl_kill_kbd_macro()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
rl_start_kbd_macro(ignore1,ignore2)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
rl_end_kbd_macro(count,ignore)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
rl_call_last_kbd_macro(count,ignore)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
rl_push_macro_input(macro)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