xref: /openbsd-src/gnu/usr.bin/binutils/gdb/interps.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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