static void * tui_init (struct interp *self, int top_level) { /* Install exit handler to leave the screen in a good shape. */ atexit (tui_exit); tui_initialize_static_data (); tui_initialize_io (); tui_initialize_win (); if (ui_file_isatty (gdb_stdout)) tui_initialize_readline (); /* If changing this, remember to update cli-interp.c as well. */ observer_attach_normal_stop (tui_on_normal_stop); observer_attach_signal_received (tui_on_signal_received); observer_attach_end_stepping_range (tui_on_end_stepping_range); observer_attach_signal_exited (tui_on_signal_exited); observer_attach_exited (tui_on_exited); observer_attach_no_history (tui_on_no_history); observer_attach_sync_execution_done (tui_on_sync_execution_done); observer_attach_command_error (tui_on_command_error); return NULL; }
static void * mi_interpreter_init (struct interp *interp, int top_level) { struct mi_interp *mi = XNEW (struct mi_interp); const char *name; int mi_version; /* Assign the output channel created at startup to its own global, so that we can create a console channel that encapsulates and prefixes all gdb_output-type bits coming from the rest of the debugger. */ raw_stdout = gdb_stdout; /* Create MI console channels, each with a different prefix so they can be distinguished. */ mi->out = mi_console_file_new (raw_stdout, "~", '"'); mi->err = mi_console_file_new (raw_stdout, "&", '"'); mi->log = mi->err; mi->targ = mi_console_file_new (raw_stdout, "@", '"'); mi->event_channel = mi_console_file_new (raw_stdout, "=", 0); name = interp_name (interp); /* INTERP_MI selects the most recent released version. "mi2" was released as part of GDB 6.0. */ if (strcmp (name, INTERP_MI) == 0) mi_version = 2; else if (strcmp (name, INTERP_MI1) == 0) mi_version = 1; else if (strcmp (name, INTERP_MI2) == 0) mi_version = 2; else if (strcmp (name, INTERP_MI3) == 0) mi_version = 3; else gdb_assert_not_reached ("unhandled MI version"); mi->mi_uiout = mi_out_new (mi_version); mi->cli_uiout = cli_out_new (mi->out); /* There are installed even if MI is not the top level interpreter. The callbacks themselves decide whether to be skipped. */ observer_attach_signal_received (mi_on_signal_received); observer_attach_end_stepping_range (mi_on_end_stepping_range); observer_attach_signal_exited (mi_on_signal_exited); observer_attach_exited (mi_on_exited); observer_attach_no_history (mi_on_no_history); if (top_level) { observer_attach_new_thread (mi_new_thread); observer_attach_thread_exit (mi_thread_exit); observer_attach_inferior_added (mi_inferior_added); observer_attach_inferior_appeared (mi_inferior_appeared); observer_attach_inferior_exit (mi_inferior_exit); observer_attach_inferior_removed (mi_inferior_removed); observer_attach_record_changed (mi_record_changed); observer_attach_normal_stop (mi_on_normal_stop); observer_attach_target_resumed (mi_on_resume); observer_attach_solib_loaded (mi_solib_loaded); observer_attach_solib_unloaded (mi_solib_unloaded); observer_attach_about_to_proceed (mi_about_to_proceed); observer_attach_traceframe_changed (mi_traceframe_changed); observer_attach_tsv_created (mi_tsv_created); observer_attach_tsv_deleted (mi_tsv_deleted); observer_attach_tsv_modified (mi_tsv_modified); observer_attach_breakpoint_created (mi_breakpoint_created); observer_attach_breakpoint_deleted (mi_breakpoint_deleted); observer_attach_breakpoint_modified (mi_breakpoint_modified); observer_attach_command_param_changed (mi_command_param_changed); observer_attach_memory_changed (mi_memory_changed); observer_attach_sync_execution_done (mi_on_sync_execution_done); /* The initial inferior is created before this function is called, so we need to report it explicitly. Use iteration in case future version of GDB creates more than one inferior up-front. */ iterate_over_inferiors (report_initial_inferior, mi); } return mi; }