OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gdb/] [gdb-6.8/] [gdb/] [tui/] [tui-hooks.c] - Blame information for rev 25

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 jlechner
/* GDB hooks for TUI.
2
 
3
   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include "defs.h"
22
#include "symtab.h"
23
#include "inferior.h"
24
#include "command.h"
25
#include "bfd.h"
26
#include "symfile.h"
27
#include "objfiles.h"
28
#include "target.h"
29
#include "gdbcore.h"
30
#include "event-loop.h"
31
#include "event-top.h"
32
#include "frame.h"
33
#include "breakpoint.h"
34
#include "gdb-events.h"
35
#include "ui-out.h"
36
#include "top.h"
37
#include "observer.h"
38
#include <unistd.h>
39
#include <fcntl.h>
40
 
41
#include "tui/tui.h"
42
#include "tui/tui-hooks.h"
43
#include "tui/tui-data.h"
44
#include "tui/tui-layout.h"
45
#include "tui/tui-io.h"
46
#include "tui/tui-regs.h"
47
#include "tui/tui-win.h"
48
#include "tui/tui-stack.h"
49
#include "tui/tui-windata.h"
50
#include "tui/tui-winsource.h"
51
 
52
#include "gdb_curses.h"
53
 
54
/* This redefines CTRL if it is not already defined, so it must come
55
   after terminal state releated include files like <term.h> and
56
   "gdb_curses.h".  */
57
#include "readline/readline.h"
58
 
59
int tui_target_has_run = 0;
60
 
61
static void
62
tui_new_objfile_hook (struct objfile* objfile)
63
{
64
  if (tui_active)
65
    tui_display_main ();
66
}
67
 
68
static int ATTR_FORMAT (printf, 1, 0)
69
tui_query_hook (const char *msg, va_list argp)
70
{
71
  int retval;
72
  int ans2;
73
  int answer;
74
 
75
  echo ();
76
  while (1)
77
    {
78
      wrap_here ("");           /* Flush any buffered output.  */
79
      gdb_flush (gdb_stdout);
80
 
81
      vfprintf_filtered (gdb_stdout, msg, argp);
82
      printf_filtered (_("(y or n) "));
83
 
84
      wrap_here ("");
85
      gdb_flush (gdb_stdout);
86
 
87
      answer = tui_getc (stdin);
88
      clearerr (stdin);         /* in case of C-d */
89
      if (answer == EOF)        /* C-d */
90
        {
91
          retval = 1;
92
          break;
93
        }
94
      /* Eat rest of input line, to EOF or newline.  */
95
      if (answer != '\n')
96
        do
97
          {
98
            ans2 = tui_getc (stdin);
99
            clearerr (stdin);
100
          }
101
        while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
102
 
103
      if (answer >= 'a')
104
        answer -= 040;
105
      if (answer == 'Y')
106
        {
107
          retval = 1;
108
          break;
109
        }
110
      if (answer == 'N')
111
        {
112
          retval = 0;
113
          break;
114
        }
115
      printf_filtered (_("Please answer y or n.\n"));
116
    }
117
  noecho ();
118
  return retval;
119
}
120
 
121
/* Prevent recursion of deprecated_register_changed_hook().  */
122
static int tui_refreshing_registers = 0;
123
 
124
static void
125
tui_register_changed_hook (int regno)
126
{
127
  struct frame_info *fi;
128
 
129
  fi = get_selected_frame (NULL);
130
  if (tui_refreshing_registers == 0)
131
    {
132
      tui_refreshing_registers = 1;
133
      tui_check_data_values (fi);
134
      tui_refreshing_registers = 0;
135
    }
136
}
137
 
138
/* Breakpoint creation hook.
139
   Update the screen to show the new breakpoint.  */
140
static void
141
tui_event_create_breakpoint (int number)
142
{
143
  tui_update_all_breakpoint_info ();
144
}
145
 
146
/* Breakpoint deletion hook.
147
   Refresh the screen to update the breakpoint marks.  */
148
static void
149
tui_event_delete_breakpoint (int number)
150
{
151
  tui_update_all_breakpoint_info ();
152
}
153
 
154
static void
155
tui_event_modify_breakpoint (int number)
156
{
157
  tui_update_all_breakpoint_info ();
158
}
159
 
160
static void
161
tui_event_default (int number)
162
{
163
  ;
164
}
165
 
166
static struct gdb_events *tui_old_event_hooks;
167
 
168
static struct gdb_events tui_event_hooks = {
169
  tui_event_create_breakpoint,
170
  tui_event_delete_breakpoint,
171
  tui_event_modify_breakpoint,
172
  tui_event_default,
173
  tui_event_default,
174
  tui_event_default
175
};
176
 
177
/* Called when going to wait for the target.
178
   Leave curses mode and setup program mode.  */
179
static ptid_t
180
tui_target_wait_hook (ptid_t pid,
181
                      struct target_waitstatus *status)
182
{
183
  ptid_t res;
184
 
185
  /* Leave tui mode (optional).  */
186
#if 0
187
  if (tui_active)
188
    {
189
      target_terminal_ours ();
190
      endwin ();
191
      target_terminal_inferior ();
192
    }
193
#endif
194
  tui_target_has_run = 1;
195
  res = target_wait (pid, status);
196
 
197
  if (tui_active)
198
    {
199
      /* TODO: need to refresh (optional).  */
200
    }
201
  return res;
202
}
203
 
204
/* The selected frame has changed.  This is happens after a target
205
   stop or when the user explicitly changes the frame
206
   (up/down/thread/...).  */
207
static void
208
tui_selected_frame_level_changed_hook (int level)
209
{
210
  struct frame_info *fi;
211
 
212
  /* Negative level means that the selected frame was cleared.  */
213
  if (level < 0)
214
    return;
215
 
216
  fi = get_selected_frame (NULL);
217
  /* Ensure that symbols for this frame are read in.  Also, determine
218
     the source language of this frame, and switch to it if
219
     desired.  */
220
  if (fi)
221
    {
222
      struct symtab *s;
223
 
224
      s = find_pc_symtab (get_frame_pc (fi));
225
      /* elz: This if here fixes the problem with the pc not being
226
         displayed in the tui asm layout, with no debug symbols.  The
227
         value of s would be 0 here, and select_source_symtab would
228
         abort the command by calling the 'error' function.  */
229
      if (s)
230
        select_source_symtab (s);
231
 
232
      /* Display the frame position (even if there is no symbols).  */
233
      tui_show_frame_info (fi);
234
 
235
      /* Refresh the register window if it's visible.  */
236
      if (tui_is_window_visible (DATA_WIN))
237
        {
238
          tui_refreshing_registers = 1;
239
          tui_check_data_values (fi);
240
          tui_refreshing_registers = 0;
241
        }
242
    }
243
}
244
 
245
/* Called from print_frame_info to list the line we stopped in.  */
246
static void
247
tui_print_frame_info_listing_hook (struct symtab *s,
248
                                   int line,
249
                                   int stopline,
250
                                   int noerror)
251
{
252
  select_source_symtab (s);
253
  tui_show_frame_info (get_selected_frame (NULL));
254
}
255
 
256
/* Called when the target process died or is detached.
257
   Update the status line.  */
258
static void
259
tui_detach_hook (void)
260
{
261
  tui_show_frame_info (0);
262
  tui_display_main ();
263
}
264
 
265
/* Install the TUI specific hooks.  */
266
void
267
tui_install_hooks (void)
268
{
269
  deprecated_target_wait_hook = tui_target_wait_hook;
270
  deprecated_selected_frame_level_changed_hook = tui_selected_frame_level_changed_hook;
271
  deprecated_print_frame_info_listing_hook = tui_print_frame_info_listing_hook;
272
 
273
  deprecated_query_hook = tui_query_hook;
274
 
275
  /* Install the event hooks.  */
276
  tui_old_event_hooks = deprecated_set_gdb_event_hooks (&tui_event_hooks);
277
 
278
  deprecated_register_changed_hook = tui_register_changed_hook;
279
  deprecated_detach_hook = tui_detach_hook;
280
}
281
 
282
/* Remove the TUI specific hooks.  */
283
void
284
tui_remove_hooks (void)
285
{
286
  deprecated_target_wait_hook = 0;
287
  deprecated_selected_frame_level_changed_hook = 0;
288
  deprecated_print_frame_info_listing_hook = 0;
289
  deprecated_query_hook = 0;
290
  deprecated_register_changed_hook = 0;
291
  deprecated_detach_hook = 0;
292
 
293
  /* Restore the previous event hooks.  */
294
  deprecated_set_gdb_event_hooks (tui_old_event_hooks);
295
}
296
 
297
void _initialize_tui_hooks (void);
298
 
299
void
300
_initialize_tui_hooks (void)
301
{
302
  /* Install the permanent hooks.  */
303
  observer_attach_new_objfile (tui_new_objfile_hook);
304
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.