1b725ae77Skettenis /* Manages interpreters for GDB, the GNU debugger.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 2000, 2002, 2003 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis Written by Jim Ingham <jingham@apple.com> of Apple Computer, Inc.
6b725ae77Skettenis
7b725ae77Skettenis This file is part of GDB.
8b725ae77Skettenis
9b725ae77Skettenis This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis it under the terms of the GNU General Public License as published by
11b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis (at your option) any later version.
13b725ae77Skettenis
14b725ae77Skettenis This program is distributed in the hope that it will be useful,
15b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17b725ae77Skettenis GNU General Public License for more details.
18b725ae77Skettenis
19b725ae77Skettenis You should have received a copy of the GNU General Public License
20b725ae77Skettenis along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23b725ae77Skettenis
24b725ae77Skettenis /* This is just a first cut at separating out the "interpreter"
25b725ae77Skettenis functions of gdb into self-contained modules. There are a couple
26b725ae77Skettenis of open areas that need to be sorted out:
27b725ae77Skettenis
28b725ae77Skettenis 1) The interpreter explicitly contains a UI_OUT, and can insert itself
29b725ae77Skettenis into the event loop, but it doesn't explicitly contain hooks for readline.
30b725ae77Skettenis I did this because it seems to me many interpreters won't want to use
31b725ae77Skettenis the readline command interface, and it is probably simpler to just let
32b725ae77Skettenis them take over the input in their resume proc. */
33b725ae77Skettenis
34b725ae77Skettenis #include "defs.h"
35b725ae77Skettenis #include "gdbcmd.h"
36b725ae77Skettenis #include "ui-out.h"
37b725ae77Skettenis #include "event-loop.h"
38b725ae77Skettenis #include "event-top.h"
39b725ae77Skettenis #include "interps.h"
40b725ae77Skettenis #include "completer.h"
41b725ae77Skettenis #include "gdb_string.h"
42b725ae77Skettenis #include "gdb-events.h"
43b725ae77Skettenis #include "gdb_assert.h"
44b725ae77Skettenis #include "top.h" /* For command_loop. */
45b725ae77Skettenis
46b725ae77Skettenis struct interp
47b725ae77Skettenis {
48b725ae77Skettenis /* This is the name in "-i=" and set interpreter. */
49b725ae77Skettenis const char *name;
50b725ae77Skettenis
51b725ae77Skettenis /* Interpreters are stored in a linked list, this is the next
52b725ae77Skettenis one... */
53b725ae77Skettenis struct interp *next;
54b725ae77Skettenis
55b725ae77Skettenis /* This is a cookie that an instance of the interpreter can use.
56b725ae77Skettenis This is a bit confused right now as the exact initialization
57b725ae77Skettenis sequence for it, and how it relates to the interpreter's uiout
58b725ae77Skettenis object is a bit confused. */
59b725ae77Skettenis void *data;
60b725ae77Skettenis
61b725ae77Skettenis /* Has the init_proc been run? */
62b725ae77Skettenis int inited;
63b725ae77Skettenis
64b725ae77Skettenis /* This is the ui_out used to collect results for this interpreter.
65b725ae77Skettenis It can be a formatter for stdout, as is the case for the console
66b725ae77Skettenis & mi outputs, or it might be a result formatter. */
67b725ae77Skettenis struct ui_out *interpreter_out;
68b725ae77Skettenis
69b725ae77Skettenis const struct interp_procs *procs;
70b725ae77Skettenis int quiet_p;
71b725ae77Skettenis };
72b725ae77Skettenis
73b725ae77Skettenis /* Functions local to this file. */
74b725ae77Skettenis static void initialize_interps (void);
75b725ae77Skettenis static char **interpreter_completer (char *text, char *word);
76b725ae77Skettenis
77b725ae77Skettenis /* The magic initialization routine for this module. */
78b725ae77Skettenis
79b725ae77Skettenis void _initialize_interpreter (void);
80b725ae77Skettenis
81b725ae77Skettenis /* Variables local to this file: */
82b725ae77Skettenis
83b725ae77Skettenis static struct interp *interp_list = NULL;
84b725ae77Skettenis static struct interp *current_interpreter = NULL;
85b725ae77Skettenis
86b725ae77Skettenis static int interpreter_initialized = 0;
87b725ae77Skettenis
88b725ae77Skettenis /* interp_new - This allocates space for a new interpreter,
89b725ae77Skettenis fills the fields from the inputs, and returns a pointer to the
90b725ae77Skettenis interpreter. */
91b725ae77Skettenis struct interp *
interp_new(const char * name,void * data,struct ui_out * uiout,const struct interp_procs * procs)92b725ae77Skettenis interp_new (const char *name, void *data, struct ui_out *uiout,
93b725ae77Skettenis const struct interp_procs *procs)
94b725ae77Skettenis {
95b725ae77Skettenis struct interp *new_interp;
96b725ae77Skettenis
97b725ae77Skettenis new_interp = XMALLOC (struct interp);
98b725ae77Skettenis
99b725ae77Skettenis new_interp->name = xstrdup (name);
100b725ae77Skettenis new_interp->data = data;
101b725ae77Skettenis new_interp->interpreter_out = uiout;
102b725ae77Skettenis new_interp->quiet_p = 0;
103b725ae77Skettenis new_interp->procs = procs;
104b725ae77Skettenis new_interp->inited = 0;
105b725ae77Skettenis
106b725ae77Skettenis return new_interp;
107b725ae77Skettenis }
108b725ae77Skettenis
109b725ae77Skettenis /* Add interpreter INTERP to the gdb interpreter list. The
110b725ae77Skettenis interpreter must not have previously been added. */
111b725ae77Skettenis void
interp_add(struct interp * interp)112b725ae77Skettenis interp_add (struct interp *interp)
113b725ae77Skettenis {
114b725ae77Skettenis if (!interpreter_initialized)
115b725ae77Skettenis initialize_interps ();
116b725ae77Skettenis
117b725ae77Skettenis gdb_assert (interp_lookup (interp->name) == NULL);
118b725ae77Skettenis
119b725ae77Skettenis interp->next = interp_list;
120b725ae77Skettenis interp_list = interp;
121b725ae77Skettenis }
122b725ae77Skettenis
123b725ae77Skettenis /* This sets the current interpreter to be INTERP. If INTERP has not
124b725ae77Skettenis been initialized, then this will also run the init proc. If the
125b725ae77Skettenis init proc is successful, return 1, if it fails, set the old
126b725ae77Skettenis interpreter back in place and return 0. If we can't restore the
127b725ae77Skettenis old interpreter, then raise an internal error, since we are in
128b725ae77Skettenis pretty bad shape at this point. */
129b725ae77Skettenis int
interp_set(struct interp * interp)130b725ae77Skettenis interp_set (struct interp *interp)
131b725ae77Skettenis {
132b725ae77Skettenis struct interp *old_interp = current_interpreter;
133b725ae77Skettenis int first_time = 0;
134b725ae77Skettenis
135b725ae77Skettenis
136b725ae77Skettenis char buffer[64];
137b725ae77Skettenis
138b725ae77Skettenis if (current_interpreter != NULL)
139b725ae77Skettenis {
140b725ae77Skettenis do_all_continuations ();
141b725ae77Skettenis ui_out_flush (uiout);
142b725ae77Skettenis if (current_interpreter->procs->suspend_proc
143b725ae77Skettenis && !current_interpreter->procs->suspend_proc (current_interpreter->
144b725ae77Skettenis data))
145b725ae77Skettenis {
146b725ae77Skettenis error ("Could not suspend interpreter \"%s\"\n",
147b725ae77Skettenis current_interpreter->name);
148b725ae77Skettenis }
149b725ae77Skettenis }
150b725ae77Skettenis else
151b725ae77Skettenis {
152b725ae77Skettenis first_time = 1;
153b725ae77Skettenis }
154b725ae77Skettenis
155b725ae77Skettenis current_interpreter = interp;
156b725ae77Skettenis
157b725ae77Skettenis /* We use interpreter_p for the "set interpreter" variable, so we need
158b725ae77Skettenis to make sure we have a malloc'ed copy for the set command to free. */
159b725ae77Skettenis if (interpreter_p != NULL
160b725ae77Skettenis && strcmp (current_interpreter->name, interpreter_p) != 0)
161b725ae77Skettenis {
162b725ae77Skettenis xfree (interpreter_p);
163b725ae77Skettenis
164b725ae77Skettenis interpreter_p = xstrdup (current_interpreter->name);
165b725ae77Skettenis }
166b725ae77Skettenis
167b725ae77Skettenis uiout = interp->interpreter_out;
168b725ae77Skettenis
169b725ae77Skettenis /* Run the init proc. If it fails, try to restore the old interp. */
170b725ae77Skettenis
171b725ae77Skettenis if (!interp->inited)
172b725ae77Skettenis {
173b725ae77Skettenis if (interp->procs->init_proc != NULL)
174b725ae77Skettenis {
175b725ae77Skettenis interp->data = interp->procs->init_proc ();
176b725ae77Skettenis }
177b725ae77Skettenis interp->inited = 1;
178b725ae77Skettenis }
179b725ae77Skettenis
180b725ae77Skettenis /* Clear out any installed interpreter hooks/event handlers. */
181b725ae77Skettenis clear_interpreter_hooks ();
182b725ae77Skettenis
183b725ae77Skettenis if (interp->procs->resume_proc != NULL
184b725ae77Skettenis && (!interp->procs->resume_proc (interp->data)))
185b725ae77Skettenis {
186b725ae77Skettenis if (old_interp == NULL || !interp_set (old_interp))
187b725ae77Skettenis internal_error (__FILE__, __LINE__,
188b725ae77Skettenis "Failed to initialize new interp \"%s\" %s",
189b725ae77Skettenis interp->name, "and could not restore old interp!\n");
190b725ae77Skettenis return 0;
191b725ae77Skettenis }
192b725ae77Skettenis
193b725ae77Skettenis /* Finally, put up the new prompt to show that we are indeed here.
194b725ae77Skettenis Also, display_gdb_prompt for the console does some readline magic
195b725ae77Skettenis which is needed for the console interpreter, at least... */
196b725ae77Skettenis
197b725ae77Skettenis if (!first_time)
198b725ae77Skettenis {
199b725ae77Skettenis if (!interp_quiet_p (interp))
200b725ae77Skettenis {
201b725ae77Skettenis sprintf (buffer, "Switching to interpreter \"%.24s\".\n",
202b725ae77Skettenis interp->name);
203b725ae77Skettenis ui_out_text (uiout, buffer);
204b725ae77Skettenis }
205b725ae77Skettenis display_gdb_prompt (NULL);
206b725ae77Skettenis }
207b725ae77Skettenis
208b725ae77Skettenis return 1;
209b725ae77Skettenis }
210b725ae77Skettenis
211b725ae77Skettenis /* interp_lookup - Looks up the interpreter for NAME. If no such
212b725ae77Skettenis interpreter exists, return NULL, otherwise return a pointer to the
213b725ae77Skettenis interpreter. */
214b725ae77Skettenis struct interp *
interp_lookup(const char * name)215b725ae77Skettenis interp_lookup (const char *name)
216b725ae77Skettenis {
217b725ae77Skettenis struct interp *interp;
218b725ae77Skettenis
219b725ae77Skettenis if (name == NULL || strlen (name) == 0)
220b725ae77Skettenis return NULL;
221b725ae77Skettenis
222b725ae77Skettenis for (interp = interp_list; interp != NULL; interp = interp->next)
223b725ae77Skettenis {
224b725ae77Skettenis if (strcmp (interp->name, name) == 0)
225b725ae77Skettenis return interp;
226b725ae77Skettenis }
227b725ae77Skettenis
228b725ae77Skettenis return NULL;
229b725ae77Skettenis }
230b725ae77Skettenis
231b725ae77Skettenis /* Returns the current interpreter. */
232b725ae77Skettenis
233b725ae77Skettenis struct ui_out *
interp_ui_out(struct interp * interp)234b725ae77Skettenis interp_ui_out (struct interp *interp)
235b725ae77Skettenis {
236b725ae77Skettenis if (interp != NULL)
237b725ae77Skettenis return interp->interpreter_out;
238b725ae77Skettenis
239b725ae77Skettenis return current_interpreter->interpreter_out;
240b725ae77Skettenis }
241b725ae77Skettenis
242b725ae77Skettenis /* Returns true if the current interp is the passed in name. */
243b725ae77Skettenis int
current_interp_named_p(const char * interp_name)244b725ae77Skettenis current_interp_named_p (const char *interp_name)
245b725ae77Skettenis {
246b725ae77Skettenis if (current_interpreter)
247b725ae77Skettenis return (strcmp (current_interpreter->name, interp_name) == 0);
248b725ae77Skettenis
249b725ae77Skettenis return 0;
250b725ae77Skettenis }
251b725ae77Skettenis
252b725ae77Skettenis /* This is called in display_gdb_prompt. If the proc returns a zero
253b725ae77Skettenis value, display_gdb_prompt will return without displaying the
254b725ae77Skettenis prompt. */
255b725ae77Skettenis int
current_interp_display_prompt_p(void)256b725ae77Skettenis current_interp_display_prompt_p (void)
257b725ae77Skettenis {
258b725ae77Skettenis if (current_interpreter == NULL
259b725ae77Skettenis || current_interpreter->procs->prompt_proc_p == NULL)
260b725ae77Skettenis return 0;
261b725ae77Skettenis else
262b725ae77Skettenis return current_interpreter->procs->prompt_proc_p (current_interpreter->
263b725ae77Skettenis data);
264b725ae77Skettenis }
265b725ae77Skettenis
266b725ae77Skettenis /* Run the current command interpreter's main loop. */
267b725ae77Skettenis void
current_interp_command_loop(void)268b725ae77Skettenis current_interp_command_loop (void)
269b725ae77Skettenis {
270b725ae77Skettenis /* Somewhat messy. For the moment prop up all the old ways of
271*11efff7fSkettenis selecting the command loop. `deprecated_command_loop_hook'
272*11efff7fSkettenis should be deprecated. */
273*11efff7fSkettenis if (deprecated_command_loop_hook != NULL)
274*11efff7fSkettenis deprecated_command_loop_hook ();
275b725ae77Skettenis else if (current_interpreter != NULL
276b725ae77Skettenis && current_interpreter->procs->command_loop_proc != NULL)
277b725ae77Skettenis current_interpreter->procs->command_loop_proc (current_interpreter->data);
278b725ae77Skettenis else
279*11efff7fSkettenis cli_command_loop ();
280b725ae77Skettenis }
281b725ae77Skettenis
282b725ae77Skettenis int
interp_quiet_p(struct interp * interp)283b725ae77Skettenis interp_quiet_p (struct interp *interp)
284b725ae77Skettenis {
285b725ae77Skettenis if (interp != NULL)
286b725ae77Skettenis return interp->quiet_p;
287b725ae77Skettenis else
288b725ae77Skettenis return current_interpreter->quiet_p;
289b725ae77Skettenis }
290b725ae77Skettenis
291b725ae77Skettenis static int
interp_set_quiet(struct interp * interp,int quiet)292b725ae77Skettenis interp_set_quiet (struct interp *interp, int quiet)
293b725ae77Skettenis {
294b725ae77Skettenis int old_val = interp->quiet_p;
295b725ae77Skettenis interp->quiet_p = quiet;
296b725ae77Skettenis return old_val;
297b725ae77Skettenis }
298b725ae77Skettenis
299b725ae77Skettenis /* interp_exec - This executes COMMAND_STR in the current
300b725ae77Skettenis interpreter. */
301b725ae77Skettenis int
interp_exec_p(struct interp * interp)302b725ae77Skettenis interp_exec_p (struct interp *interp)
303b725ae77Skettenis {
304b725ae77Skettenis return interp->procs->exec_proc != NULL;
305b725ae77Skettenis }
306b725ae77Skettenis
307b725ae77Skettenis int
interp_exec(struct interp * interp,const char * command_str)308b725ae77Skettenis interp_exec (struct interp *interp, const char *command_str)
309b725ae77Skettenis {
310b725ae77Skettenis if (interp->procs->exec_proc != NULL)
311b725ae77Skettenis {
312b725ae77Skettenis return interp->procs->exec_proc (interp->data, command_str);
313b725ae77Skettenis }
314b725ae77Skettenis return 0;
315b725ae77Skettenis }
316b725ae77Skettenis
317b725ae77Skettenis /* A convenience routine that nulls out all the
318b725ae77Skettenis common command hooks. Use it when removing your interpreter in its
319b725ae77Skettenis suspend proc. */
320b725ae77Skettenis void
clear_interpreter_hooks(void)321b725ae77Skettenis clear_interpreter_hooks (void)
322b725ae77Skettenis {
323*11efff7fSkettenis deprecated_init_ui_hook = 0;
324*11efff7fSkettenis deprecated_print_frame_info_listing_hook = 0;
325b725ae77Skettenis /*print_frame_more_info_hook = 0; */
326*11efff7fSkettenis deprecated_query_hook = 0;
327*11efff7fSkettenis deprecated_warning_hook = 0;
328*11efff7fSkettenis deprecated_create_breakpoint_hook = 0;
329*11efff7fSkettenis deprecated_delete_breakpoint_hook = 0;
330*11efff7fSkettenis deprecated_modify_breakpoint_hook = 0;
331*11efff7fSkettenis deprecated_interactive_hook = 0;
332*11efff7fSkettenis deprecated_registers_changed_hook = 0;
333*11efff7fSkettenis deprecated_readline_begin_hook = 0;
334*11efff7fSkettenis deprecated_readline_hook = 0;
335*11efff7fSkettenis deprecated_readline_end_hook = 0;
336*11efff7fSkettenis deprecated_register_changed_hook = 0;
337*11efff7fSkettenis deprecated_memory_changed_hook = 0;
338*11efff7fSkettenis deprecated_context_hook = 0;
339*11efff7fSkettenis deprecated_target_wait_hook = 0;
340*11efff7fSkettenis deprecated_call_command_hook = 0;
341*11efff7fSkettenis deprecated_error_hook = 0;
342*11efff7fSkettenis deprecated_error_begin_hook = 0;
343*11efff7fSkettenis deprecated_command_loop_hook = 0;
344b725ae77Skettenis clear_gdb_event_hooks ();
345b725ae77Skettenis }
346b725ae77Skettenis
347b725ae77Skettenis /* This is a lazy init routine, called the first time
348b725ae77Skettenis the interpreter module is used. I put it here just in case, but I haven't
349b725ae77Skettenis thought of a use for it yet. I will probably bag it soon, since I don't
350b725ae77Skettenis think it will be necessary. */
351b725ae77Skettenis static void
initialize_interps(void)352b725ae77Skettenis initialize_interps (void)
353b725ae77Skettenis {
354b725ae77Skettenis interpreter_initialized = 1;
355b725ae77Skettenis /* Don't know if anything needs to be done here... */
356b725ae77Skettenis }
357b725ae77Skettenis
358b725ae77Skettenis static void
interpreter_exec_cmd(char * args,int from_tty)359b725ae77Skettenis interpreter_exec_cmd (char *args, int from_tty)
360b725ae77Skettenis {
361b725ae77Skettenis struct interp *old_interp, *interp_to_use;
362b725ae77Skettenis char **prules = NULL;
363b725ae77Skettenis char **trule = NULL;
364b725ae77Skettenis unsigned int nrules;
365b725ae77Skettenis unsigned int i;
366b725ae77Skettenis int old_quiet, use_quiet;
367b725ae77Skettenis
368b725ae77Skettenis prules = buildargv (args);
369b725ae77Skettenis if (prules == NULL)
370b725ae77Skettenis {
371b725ae77Skettenis error ("unable to parse arguments");
372b725ae77Skettenis }
373b725ae77Skettenis
374b725ae77Skettenis nrules = 0;
375b725ae77Skettenis if (prules != NULL)
376b725ae77Skettenis {
377b725ae77Skettenis for (trule = prules; *trule != NULL; trule++)
378b725ae77Skettenis {
379b725ae77Skettenis nrules++;
380b725ae77Skettenis }
381b725ae77Skettenis }
382b725ae77Skettenis
383b725ae77Skettenis if (nrules < 2)
384b725ae77Skettenis error ("usage: interpreter-exec <interpreter> [ <command> ... ]");
385b725ae77Skettenis
386b725ae77Skettenis old_interp = current_interpreter;
387b725ae77Skettenis
388b725ae77Skettenis interp_to_use = interp_lookup (prules[0]);
389b725ae77Skettenis if (interp_to_use == NULL)
390b725ae77Skettenis error ("Could not find interpreter \"%s\".", prules[0]);
391b725ae77Skettenis
392b725ae77Skettenis /* Temporarily set interpreters quiet */
393b725ae77Skettenis old_quiet = interp_set_quiet (old_interp, 1);
394b725ae77Skettenis use_quiet = interp_set_quiet (interp_to_use, 1);
395b725ae77Skettenis
396b725ae77Skettenis if (!interp_set (interp_to_use))
397b725ae77Skettenis error ("Could not switch to interpreter \"%s\".", prules[0]);
398b725ae77Skettenis
399b725ae77Skettenis for (i = 1; i < nrules; i++)
400b725ae77Skettenis {
401b725ae77Skettenis if (!interp_exec (interp_to_use, prules[i]))
402b725ae77Skettenis {
403b725ae77Skettenis interp_set (old_interp);
404b725ae77Skettenis interp_set_quiet (interp_to_use, old_quiet);
405b725ae77Skettenis error ("error in command: \"%s\".", prules[i]);
406b725ae77Skettenis break;
407b725ae77Skettenis }
408b725ae77Skettenis }
409b725ae77Skettenis
410b725ae77Skettenis interp_set (old_interp);
411b725ae77Skettenis interp_set_quiet (interp_to_use, use_quiet);
412b725ae77Skettenis interp_set_quiet (old_interp, old_quiet);
413b725ae77Skettenis }
414b725ae77Skettenis
415b725ae77Skettenis /* List the possible interpreters which could complete the given text. */
416b725ae77Skettenis static char **
interpreter_completer(char * text,char * word)417b725ae77Skettenis interpreter_completer (char *text, char *word)
418b725ae77Skettenis {
419b725ae77Skettenis int alloced = 0;
420b725ae77Skettenis int textlen;
421b725ae77Skettenis int num_matches;
422b725ae77Skettenis char **matches;
423b725ae77Skettenis struct interp *interp;
424b725ae77Skettenis
425b725ae77Skettenis /* We expect only a very limited number of interpreters, so just
426b725ae77Skettenis allocate room for all of them. */
427b725ae77Skettenis for (interp = interp_list; interp != NULL; interp = interp->next)
428b725ae77Skettenis ++alloced;
429b725ae77Skettenis matches = (char **) xmalloc (alloced * sizeof (char *));
430b725ae77Skettenis
431b725ae77Skettenis num_matches = 0;
432b725ae77Skettenis textlen = strlen (text);
433b725ae77Skettenis for (interp = interp_list; interp != NULL; interp = interp->next)
434b725ae77Skettenis {
435b725ae77Skettenis if (strncmp (interp->name, text, textlen) == 0)
436b725ae77Skettenis {
437b725ae77Skettenis matches[num_matches] =
438b725ae77Skettenis (char *) xmalloc (strlen (word) + strlen (interp->name) + 1);
439b725ae77Skettenis if (word == text)
440b725ae77Skettenis strcpy (matches[num_matches], interp->name);
441b725ae77Skettenis else if (word > text)
442b725ae77Skettenis {
443b725ae77Skettenis /* Return some portion of interp->name */
444b725ae77Skettenis strcpy (matches[num_matches], interp->name + (word - text));
445b725ae77Skettenis }
446b725ae77Skettenis else
447b725ae77Skettenis {
448b725ae77Skettenis /* Return some of text plus interp->name */
449b725ae77Skettenis strncpy (matches[num_matches], word, text - word);
450b725ae77Skettenis matches[num_matches][text - word] = '\0';
451b725ae77Skettenis strcat (matches[num_matches], interp->name);
452b725ae77Skettenis }
453b725ae77Skettenis ++num_matches;
454b725ae77Skettenis }
455b725ae77Skettenis }
456b725ae77Skettenis
457b725ae77Skettenis if (num_matches == 0)
458b725ae77Skettenis {
459b725ae77Skettenis xfree (matches);
460b725ae77Skettenis matches = NULL;
461b725ae77Skettenis }
462b725ae77Skettenis else if (num_matches < alloced)
463b725ae77Skettenis {
464b725ae77Skettenis matches = (char **) xrealloc ((char *) matches, ((num_matches + 1)
465b725ae77Skettenis * sizeof (char *)));
466b725ae77Skettenis matches[num_matches] = NULL;
467b725ae77Skettenis }
468b725ae77Skettenis
469b725ae77Skettenis return matches;
470b725ae77Skettenis }
471b725ae77Skettenis
472b725ae77Skettenis /* This just adds the "interpreter-exec" command. */
473b725ae77Skettenis void
_initialize_interpreter(void)474b725ae77Skettenis _initialize_interpreter (void)
475b725ae77Skettenis {
476b725ae77Skettenis struct cmd_list_element *c;
477b725ae77Skettenis
478b725ae77Skettenis c = add_cmd ("interpreter-exec", class_support,
479b725ae77Skettenis interpreter_exec_cmd,
480b725ae77Skettenis "Execute a command in an interpreter. It takes two arguments:\n\
481b725ae77Skettenis The first argument is the name of the interpreter to use.\n\
482b725ae77Skettenis The second argument is the command to execute.\n", &cmdlist);
483b725ae77Skettenis set_cmd_completer (c, interpreter_completer);
484b725ae77Skettenis }
485