Get rid of deprecated_init_ui_hook
[deliverable/binutils-gdb.git] / gdb / interps.c
CommitLineData
4a8f6654
AC
1/* Manages interpreters for GDB, the GNU debugger.
2
32d0add0 3 Copyright (C) 2000-2015 Free Software Foundation, Inc.
4a8f6654
AC
4
5 Written by Jim Ingham <jingham@apple.com> of Apple Computer, Inc.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
4a8f6654
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
1777feb0 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4a8f6654
AC
21
22/* This is just a first cut at separating out the "interpreter"
23 functions of gdb into self-contained modules. There are a couple
24 of open areas that need to be sorted out:
25
26 1) The interpreter explicitly contains a UI_OUT, and can insert itself
27 into the event loop, but it doesn't explicitly contain hooks for readline.
28 I did this because it seems to me many interpreters won't want to use
29 the readline command interface, and it is probably simpler to just let
30 them take over the input in their resume proc. */
31
32#include "defs.h"
33#include "gdbcmd.h"
34#include "ui-out.h"
35#include "event-loop.h"
36#include "event-top.h"
37#include "interps.h"
38#include "completer.h"
4a8f6654 39#include "top.h" /* For command_loop. */
be34f849 40#include "continuations.h"
4a8f6654 41
b4a14fd0
PA
42/* True if the current interpreter in is async mode. See interps.h
43 for more details. This starts out disabled, until all the explicit
44 command line arguments (e.g., `gdb -ex "start" -ex "next"') are
45 processed. */
46int interpreter_async = 0;
47
4a8f6654
AC
48struct interp
49{
1777feb0 50 /* This is the name in "-i=" and set interpreter. */
4a8f6654
AC
51 const char *name;
52
53 /* Interpreters are stored in a linked list, this is the next
54 one... */
55 struct interp *next;
56
57 /* This is a cookie that an instance of the interpreter can use.
58 This is a bit confused right now as the exact initialization
59 sequence for it, and how it relates to the interpreter's uiout
60 object is a bit confused. */
61 void *data;
62
1777feb0 63 /* Has the init_proc been run? */
4a8f6654
AC
64 int inited;
65
4a8f6654
AC
66 const struct interp_procs *procs;
67 int quiet_p;
68};
69
1777feb0 70/* The magic initialization routine for this module. */
4a8f6654
AC
71
72void _initialize_interpreter (void);
73
74/* Variables local to this file: */
75
76static struct interp *interp_list = NULL;
77static struct interp *current_interpreter = NULL;
eb18d289 78static struct interp *top_level_interpreter_ptr = NULL;
4a8f6654 79
4a8f6654
AC
80/* interp_new - This allocates space for a new interpreter,
81 fills the fields from the inputs, and returns a pointer to the
1777feb0 82 interpreter. */
4a8f6654 83struct interp *
4801a9a3 84interp_new (const char *name, const struct interp_procs *procs)
4a8f6654
AC
85{
86 struct interp *new_interp;
87
70ba0933 88 new_interp = XNEW (struct interp);
4a8f6654
AC
89
90 new_interp->name = xstrdup (name);
4801a9a3 91 new_interp->data = NULL;
4a8f6654
AC
92 new_interp->quiet_p = 0;
93 new_interp->procs = procs;
94 new_interp->inited = 0;
95
4d09c5b4
AB
96 /* Check for required procs. */
97 gdb_assert (procs->command_loop_proc != NULL);
98
4a8f6654
AC
99 return new_interp;
100}
101
102/* Add interpreter INTERP to the gdb interpreter list. The
103 interpreter must not have previously been added. */
104void
105interp_add (struct interp *interp)
106{
4a8f6654
AC
107 gdb_assert (interp_lookup (interp->name) == NULL);
108
109 interp->next = interp_list;
110 interp_list = interp;
111}
112
113/* This sets the current interpreter to be INTERP. If INTERP has not
114 been initialized, then this will also run the init proc. If the
115 init proc is successful, return 1, if it fails, set the old
116 interpreter back in place and return 0. If we can't restore the
117 old interpreter, then raise an internal error, since we are in
1777feb0 118 pretty bad shape at this point.
683f2885
VP
119
120 The TOP_LEVEL parameter tells if this new interpreter is
121 the top-level one. The top-level is what is requested
122 on the command line, and is responsible for reporting general
123 notification about target state changes. For example, if
124 MI is the top-level interpreter, then it will always report
125 events such as target stops and new thread creation, even if they
126 are caused by CLI commands. */
4a8f6654 127int
683f2885 128interp_set (struct interp *interp, int top_level)
4a8f6654
AC
129{
130 struct interp *old_interp = current_interpreter;
131 int first_time = 0;
4a8f6654
AC
132 char buffer[64];
133
683f2885
VP
134 /* If we already have an interpreter, then trying to
135 set top level interpreter is kinda pointless. */
136 gdb_assert (!top_level || !current_interpreter);
eb18d289 137 gdb_assert (!top_level || !top_level_interpreter_ptr);
683f2885 138
4a8f6654
AC
139 if (current_interpreter != NULL)
140 {
79a45e25 141 ui_out_flush (current_uiout);
4a8f6654
AC
142 if (current_interpreter->procs->suspend_proc
143 && !current_interpreter->procs->suspend_proc (current_interpreter->
144 data))
145 {
8a3fe4f8 146 error (_("Could not suspend interpreter \"%s\"."),
4a8f6654
AC
147 current_interpreter->name);
148 }
149 }
150 else
151 {
152 first_time = 1;
153 }
154
155 current_interpreter = interp;
683f2885 156 if (top_level)
eb18d289 157 top_level_interpreter_ptr = interp;
4a8f6654
AC
158
159 /* We use interpreter_p for the "set interpreter" variable, so we need
1777feb0 160 to make sure we have a malloc'ed copy for the set command to free. */
4a8f6654
AC
161 if (interpreter_p != NULL
162 && strcmp (current_interpreter->name, interpreter_p) != 0)
163 {
164 xfree (interpreter_p);
165
166 interpreter_p = xstrdup (current_interpreter->name);
167 }
168
1777feb0 169 /* Run the init proc. If it fails, try to restore the old interp. */
4a8f6654
AC
170
171 if (!interp->inited)
172 {
173 if (interp->procs->init_proc != NULL)
174 {
4801a9a3 175 interp->data = interp->procs->init_proc (interp, top_level);
4a8f6654
AC
176 }
177 interp->inited = 1;
178 }
179
4801a9a3
PA
180 /* Do this only after the interpreter is initialized. */
181 current_uiout = interp->procs->ui_out_proc (interp);
182
907d819a 183 /* Clear out any installed interpreter hooks/event handlers. */
4a8f6654
AC
184 clear_interpreter_hooks ();
185
186 if (interp->procs->resume_proc != NULL
187 && (!interp->procs->resume_proc (interp->data)))
188 {
683f2885 189 if (old_interp == NULL || !interp_set (old_interp, 0))
4a8f6654 190 internal_error (__FILE__, __LINE__,
e2e0b3e5 191 _("Failed to initialize new interp \"%s\" %s"),
4a8f6654
AC
192 interp->name, "and could not restore old interp!\n");
193 return 0;
194 }
195
92bcb5f9 196 if (!first_time && !interp_quiet_p (interp))
4a8f6654 197 {
92bcb5f9
PA
198 xsnprintf (buffer, sizeof (buffer),
199 "Switching to interpreter \"%.24s\".\n", interp->name);
200 ui_out_text (current_uiout, buffer);
4a8f6654
AC
201 }
202
203 return 1;
204}
205
206/* interp_lookup - Looks up the interpreter for NAME. If no such
207 interpreter exists, return NULL, otherwise return a pointer to the
208 interpreter. */
209struct interp *
210interp_lookup (const char *name)
211{
212 struct interp *interp;
213
214 if (name == NULL || strlen (name) == 0)
215 return NULL;
216
217 for (interp = interp_list; interp != NULL; interp = interp->next)
218 {
219 if (strcmp (interp->name, name) == 0)
220 return interp;
221 }
222
223 return NULL;
224}
225
1777feb0 226/* Returns the current interpreter. */
4a8f6654
AC
227
228struct ui_out *
229interp_ui_out (struct interp *interp)
230{
231 if (interp != NULL)
4801a9a3
PA
232 return interp->procs->ui_out_proc (interp);
233
234 return current_interpreter->procs->ui_out_proc (current_interpreter);
235}
236
37ce89eb
SS
237int
238current_interp_set_logging (int start_log, struct ui_file *out,
239 struct ui_file *logfile)
240{
241 if (current_interpreter == NULL
242 || current_interpreter->procs->set_logging_proc == NULL)
243 return 0;
244
245 return current_interpreter->procs->set_logging_proc (current_interpreter,
246 start_log, out,
247 logfile);
248}
249
c41535fd
EZ
250/* Temporarily overrides the current interpreter. */
251struct interp *
252interp_set_temp (const char *name)
253{
254 struct interp *interp = interp_lookup (name);
255 struct interp *old_interp = current_interpreter;
256
257 if (interp)
258 current_interpreter = interp;
259 return old_interp;
260}
261
4801a9a3 262/* Returns the interpreter's cookie. */
4a8f6654 263
4801a9a3
PA
264void *
265interp_data (struct interp *interp)
266{
267 return interp->data;
268}
269
270/* Returns the interpreter's name. */
271
272const char *
273interp_name (struct interp *interp)
274{
275 return interp->name;
4a8f6654
AC
276}
277
1777feb0 278/* Returns true if the current interp is the passed in name. */
4a8f6654
AC
279int
280current_interp_named_p (const char *interp_name)
281{
282 if (current_interpreter)
283 return (strcmp (current_interpreter->name, interp_name) == 0);
284
285 return 0;
286}
287
17b2616c
PA
288/* The interpreter that is active while `interp_exec' is active, NULL
289 at all other times. */
290static struct interp *command_interpreter;
291
292/* The interpreter that was active when a command was executed.
293 Normally that'd always be CURRENT_INTERPRETER, except that MI's
294 -interpreter-exec command doesn't actually flip the current
295 interpreter when running its sub-command. The
296 `command_interpreter' global tracks when interp_exec is called
297 (IOW, when -interpreter-exec is called). If that is set, it is
298 INTERP in '-interpreter-exec INTERP "CMD"' or in 'interpreter-exec
299 INTERP "CMD". Otherwise, interp_exec isn't active, and so the
300 interpreter running the command is the current interpreter. */
301
302struct interp *
303command_interp (void)
304{
305 if (command_interpreter != NULL)
306 return command_interpreter;
307 else
308 return current_interpreter;
309}
310
4a8f6654
AC
311/* Run the current command interpreter's main loop. */
312void
313current_interp_command_loop (void)
314{
4d09c5b4
AB
315 gdb_assert (current_interpreter != NULL);
316
317 current_interpreter->procs->command_loop_proc (current_interpreter->data);
4a8f6654
AC
318}
319
320int
321interp_quiet_p (struct interp *interp)
322{
323 if (interp != NULL)
324 return interp->quiet_p;
325 else
326 return current_interpreter->quiet_p;
327}
328
b9362cc7 329static int
4a8f6654
AC
330interp_set_quiet (struct interp *interp, int quiet)
331{
332 int old_val = interp->quiet_p;
abbb1732 333
4a8f6654
AC
334 interp->quiet_p = quiet;
335 return old_val;
336}
337
338/* interp_exec - This executes COMMAND_STR in the current
1777feb0 339 interpreter. */
4a8f6654 340
71fff37b 341struct gdb_exception
4a8f6654
AC
342interp_exec (struct interp *interp, const char *command_str)
343{
17b2616c
PA
344 struct gdb_exception ex;
345 struct interp *save_command_interp;
346
34dc884e
DE
347 gdb_assert (interp->procs->exec_proc != NULL);
348
17b2616c
PA
349 /* See `command_interp' for why we do this. */
350 save_command_interp = command_interpreter;
351 command_interpreter = interp;
352
353 ex = interp->procs->exec_proc (interp->data, command_str);
354
355 command_interpreter = save_command_interp;
356
357 return ex;
4a8f6654
AC
358}
359
907d819a
MS
360/* A convenience routine that nulls out all the common command hooks.
361 Use it when removing your interpreter in its suspend proc. */
4a8f6654 362void
11308a41 363clear_interpreter_hooks (void)
4a8f6654 364{
9a4105ab 365 deprecated_print_frame_info_listing_hook = 0;
4a8f6654 366 /*print_frame_more_info_hook = 0; */
9a4105ab
AC
367 deprecated_query_hook = 0;
368 deprecated_warning_hook = 0;
9a4105ab 369 deprecated_interactive_hook = 0;
9a4105ab
AC
370 deprecated_readline_begin_hook = 0;
371 deprecated_readline_hook = 0;
372 deprecated_readline_end_hook = 0;
373 deprecated_register_changed_hook = 0;
9a4105ab
AC
374 deprecated_context_hook = 0;
375 deprecated_target_wait_hook = 0;
376 deprecated_call_command_hook = 0;
9a4105ab 377 deprecated_error_begin_hook = 0;
4a8f6654
AC
378}
379
b9362cc7 380static void
4a8f6654
AC
381interpreter_exec_cmd (char *args, int from_tty)
382{
383 struct interp *old_interp, *interp_to_use;
384 char **prules = NULL;
385 char **trule = NULL;
386 unsigned int nrules;
387 unsigned int i;
388 int old_quiet, use_quiet;
5b3fca71 389 struct cleanup *cleanup;
4a8f6654 390
d1a41061
PP
391 if (args == NULL)
392 error_no_arg (_("interpreter-exec command"));
393
394 prules = gdb_buildargv (args);
5b3fca71 395 cleanup = make_cleanup_freeargv (prules);
4a8f6654
AC
396
397 nrules = 0;
d1a41061
PP
398 for (trule = prules; *trule != NULL; trule++)
399 nrules++;
4a8f6654
AC
400
401 if (nrules < 2)
8a3fe4f8 402 error (_("usage: interpreter-exec <interpreter> [ <command> ... ]"));
4a8f6654
AC
403
404 old_interp = current_interpreter;
405
406 interp_to_use = interp_lookup (prules[0]);
407 if (interp_to_use == NULL)
8a3fe4f8 408 error (_("Could not find interpreter \"%s\"."), prules[0]);
4a8f6654 409
1777feb0 410 /* Temporarily set interpreters quiet. */
4a8f6654
AC
411 old_quiet = interp_set_quiet (old_interp, 1);
412 use_quiet = interp_set_quiet (interp_to_use, 1);
413
683f2885 414 if (!interp_set (interp_to_use, 0))
8a3fe4f8 415 error (_("Could not switch to interpreter \"%s\"."), prules[0]);
4a8f6654
AC
416
417 for (i = 1; i < nrules; i++)
418 {
71fff37b 419 struct gdb_exception e = interp_exec (interp_to_use, prules[i]);
abbb1732 420
a7479e7e 421 if (e.reason < 0)
4a8f6654 422 {
683f2885 423 interp_set (old_interp, 0);
04d1f770
DJ
424 interp_set_quiet (interp_to_use, use_quiet);
425 interp_set_quiet (old_interp, old_quiet);
8a3fe4f8 426 error (_("error in command: \"%s\"."), prules[i]);
4a8f6654
AC
427 }
428 }
429
683f2885 430 interp_set (old_interp, 0);
4a8f6654
AC
431 interp_set_quiet (interp_to_use, use_quiet);
432 interp_set_quiet (old_interp, old_quiet);
5b3fca71
TT
433
434 do_cleanups (cleanup);
4a8f6654
AC
435}
436
1777feb0 437/* List the possible interpreters which could complete the given text. */
49c4e619 438static VEC (char_ptr) *
6f937416
PA
439interpreter_completer (struct cmd_list_element *ignore,
440 const char *text, const char *word)
4a8f6654 441{
4a8f6654 442 int textlen;
49c4e619 443 VEC (char_ptr) *matches = NULL;
4a8f6654
AC
444 struct interp *interp;
445
4a8f6654
AC
446 textlen = strlen (text);
447 for (interp = interp_list; interp != NULL; interp = interp->next)
448 {
449 if (strncmp (interp->name, text, textlen) == 0)
450 {
49c4e619
TT
451 char *match;
452
453 match = (char *) xmalloc (strlen (word) + strlen (interp->name) + 1);
4a8f6654 454 if (word == text)
49c4e619 455 strcpy (match, interp->name);
4a8f6654
AC
456 else if (word > text)
457 {
1777feb0 458 /* Return some portion of interp->name. */
49c4e619 459 strcpy (match, interp->name + (word - text));
4a8f6654
AC
460 }
461 else
462 {
1777feb0 463 /* Return some of text plus interp->name. */
49c4e619
TT
464 strncpy (match, word, text - word);
465 match[text - word] = '\0';
466 strcat (match, interp->name);
4a8f6654 467 }
49c4e619 468 VEC_safe_push (char_ptr, matches, match);
4a8f6654
AC
469 }
470 }
471
4a8f6654
AC
472 return matches;
473}
474
eb18d289
NR
475struct interp *
476top_level_interpreter (void)
477{
478 return top_level_interpreter_ptr;
479}
480
481void *
683f2885
VP
482top_level_interpreter_data (void)
483{
eb18d289
NR
484 gdb_assert (top_level_interpreter_ptr);
485 return top_level_interpreter_ptr->data;
683f2885
VP
486}
487
4a8f6654
AC
488/* This just adds the "interpreter-exec" command. */
489void
490_initialize_interpreter (void)
491{
492 struct cmd_list_element *c;
493
494 c = add_cmd ("interpreter-exec", class_support,
1a966eab
AC
495 interpreter_exec_cmd, _("\
496Execute a command in an interpreter. It takes two arguments:\n\
4a8f6654 497The first argument is the name of the interpreter to use.\n\
1a966eab 498The second argument is the command to execute.\n"), &cmdlist);
4a8f6654
AC
499 set_cmd_completer (c, interpreter_completer);
500}
This page took 1.948944 seconds and 4 git commands to generate.