645c274441a88e57af3e016ecf225fb24b4f8a8f
[gdbmicli.git] / src / breakpoint.c
1 /**[txh]********************************************************************
2
3   Copyright (c) 2004 by Salvador E. Tropea.
4   Covered by the GPL license.
5
6   Module: Breakpoint table commands.
7   Comments:
8   GDB/MI commands for the "Breakpoint Table Commands" section.@p
9
10 @<pre>
11 gdb command:          Implemented?
12
13 -break-after          Yes
14 -break-condition      Yes
15 -break-delete         Yes
16 -break-disable        Yes
17 -break-enable         Yes
18 -break-info           N.A. (info break NUMBER) (*)
19 -break-insert         Yes
20 -break-list           No (*)
21 -break-watch          Yes
22 @</pre>
23
24 (*) I think the program should keep track of the breakpoints, so it will
25 be implemented when I have more time.@p
26
27 ***************************************************************************/
28
29 #include "mi_gdb.h"
30
31 /* Low level versions. */
32
33 void mi_break_insert_fl(mi_h *h, const char *file, int line)
34 {
35  mi_send(h,"-break-insert %s:%d\n",file,line);
36 }
37
38 void mi_break_insert(mi_h *h, int temporary, int hard_assist,
39                      const char *cond, int count, int thread,
40                      const char *where)
41 {
42  char s_count[32];
43  char s_thread[32];
44
45  if (count>=0)
46     snprintf(s_count,32,"%d",count);
47  if (thread>=0)
48     snprintf(s_thread,32,"%d",thread);
49  if (cond)
50     // Conditions may contain spaces, in fact, if they don't gdb will add
51     // them after parsing. Enclosing the expression with "" solves the
52     // problem.
53     mi_send(h,"-break-insert %s %s -c \"%s\" %s %s %s %s %s\n",
54             temporary   ? "-t" : "",
55             hard_assist ? "-h" : "",
56             cond,
57             count>=0    ? "-i" : "", count>=0  ? s_count  : "",
58             thread>=0   ? "-p" : "", thread>=0 ? s_thread : "",
59             where);
60  else
61     mi_send(h,"-break-insert %s %s %s %s %s %s %s\n",
62             temporary   ? "-t" : "",
63             hard_assist ? "-h" : "",
64             count>=0    ? "-i" : "", count>=0  ? s_count  : "",
65             thread>=0   ? "-p" : "", thread>=0 ? s_thread : "",
66             where);
67 }
68
69 void mi_break_insert_flf(mi_h *h, const char *file, int line, int temporary,
70                          int hard_assist, const char *cond, int count,
71                          int thread)
72 {
73  char s_count[32];
74  char s_thread[32];
75
76  if (count>=0)
77     snprintf(s_count,32,"%d",count);
78  if (thread>=0)
79     snprintf(s_thread,32,"%d",thread);
80  mi_send(h,"-break-insert %s %s %s %s %s %s %s %s %s:%d\n",
81          temporary   ? "-t" : "",
82          hard_assist ? "-h" : "",
83          cond        ? "-c" : "", cond      ? cond     : "",
84          count>=0    ? "-i" : "", count>=0  ? s_count  : "",
85          thread>=0   ? "-p" : "", thread>=0 ? s_thread : "",
86          file,line);
87 }
88
89 void mi_break_delete(mi_h *h, int number)
90 {
91  mi_send(h,"-break-delete %d\n",number);
92 }
93
94 void mi_break_after(mi_h *h, int number, int count)
95 {
96  mi_send(h,"-break-after %d %d\n",number,count);
97 }
98
99 void mi_break_condition(mi_h *h, int number, const char *condition)
100 {
101  mi_send(h,"-break-condition %d %s\n",number,condition);
102 }
103
104 void mi_break_enable(mi_h *h, int number)
105 {
106  mi_send(h,"-break-enable %d\n",number);
107 }
108
109 void mi_break_disable(mi_h *h, int number)
110 {
111  mi_send(h,"-break-disable %d\n",number);
112 }
113
114 void mi_break_watch(mi_h *h, enum mi_wp_mode mode, const char *exp)
115 {
116  if (mode==wm_write)
117     mi_send(h,"-break-watch \"%s\"\n",exp);
118  else
119     mi_send(h,"-break-watch -%c \"%s\"\n",mode==wm_rw ? 'a' : 'r',exp);
120 }
121
122 /* High level versions. */
123
124 /**[txh]********************************************************************
125
126   Description:
127   Insert a breakpoint at file:line.
128
129   Command: -break-insert file:line
130   Return: A new mi_bkpt structure with info about the breakpoint. NULL on
131 error.
132   
133 ***************************************************************************/
134
135 mi_bkpt *gmi_break_insert(mi_h *h, const char *file, int line)
136 {
137  mi_break_insert_fl(h,file,line);
138  return mi_res_bkpt(h);
139 }
140
141 /**[txh]********************************************************************
142
143   Description:
144   Insert a breakpoint, all available options.
145   
146   Command: -break-insert
147   Return: A new mi_bkpt structure with info about the breakpoint. NULL on
148 error.
149   
150 ***************************************************************************/
151
152 mi_bkpt *gmi_break_insert_full(mi_h *h, int temporary, int hard_assist,
153                                const char *cond, int count, int thread,
154                                const char *where)
155 {
156  mi_break_insert(h,temporary,hard_assist,cond,count,thread,where);
157  return mi_res_bkpt(h);
158 }
159
160 /**[txh]********************************************************************
161
162   Description:
163   Insert a breakpoint, all available options.
164   
165   Command: -break-insert [ops] file:line
166   Return: A new mi_bkpt structure with info about the breakpoint. NULL on
167 error.
168   
169 ***************************************************************************/
170
171 mi_bkpt *gmi_break_insert_full_fl(mi_h *h, const char *file, int line,
172                                   int temporary, int hard_assist,
173                                   const char *cond, int count, int thread)
174 {
175  mi_break_insert_flf(h,file,line,temporary,hard_assist,cond,count,thread);
176  return mi_res_bkpt(h);
177 }
178
179 /**[txh]********************************************************************
180
181   Description:
182   Remove a breakpoint.
183
184   Command: -break-delete
185   Return: !=0 OK. Note that gdb always says OK, but errors can be sent to the
186 console.
187   
188 ***************************************************************************/
189
190 int gmi_break_delete(mi_h *h, int number)
191 {
192  mi_break_delete(h,number);
193  return mi_res_simple_done(h);
194 }
195
196 /**[txh]********************************************************************
197
198   Description:
199   Modify the "ignore" count for a breakpoint.
200
201   Command: -break-after
202   Return: !=0 OK. Note that gdb always says OK, but errors can be sent to the
203 console.
204   
205 ***************************************************************************/
206
207 int gmi_break_set_times(mi_h *h, int number, int count)
208 {
209  mi_break_after(h,number,count);
210  return mi_res_simple_done(h);
211 }
212
213 /**[txh]********************************************************************
214
215   Description:
216   Associate a condition with the breakpoint.
217
218   Command: -break-condition
219   Return: !=0 OK
220   
221 ***************************************************************************/
222
223 int gmi_break_set_condition(mi_h *h, int number, const char *condition)
224 {
225  mi_break_condition(h,number,condition);
226  return mi_res_simple_done(h);
227 }
228
229 /**[txh]********************************************************************
230
231   Description:
232   Enable or disable a breakpoint.
233
234   Command: -break-enable + -break-disable
235   Return: !=0 OK. Note that gdb always says OK, but errors can be sent to the
236 console.
237   
238 ***************************************************************************/
239
240 int gmi_break_state(mi_h *h, int number, int enable)
241 {
242  if (enable)
243     mi_break_enable(h,number);
244  else
245     mi_break_disable(h,number);
246  return mi_res_simple_done(h);
247 }
248
249 /**[txh]********************************************************************
250
251   Description:
252   Set a watchpoint. It doesn't work for remote targets!
253
254   Command: -break-watch
255   Return: A new mi_wp structure with info about the watchpoint. NULL on
256 error.
257   
258 ***************************************************************************/
259
260 mi_wp *gmi_break_watch(mi_h *h, enum mi_wp_mode mode, const char *exp)
261 {
262  mi_break_watch(h,mode,exp);
263  return mi_res_wp(h);
264 }
265