1 /* MI Command Set - varobj commands.
2 Copyright (C) 2000, Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
30 /* Convenience macro for allocting typesafe memory. */
33 #define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
35 extern int varobjdebug
; /* defined in varobj.c */
37 static void varobj_update_one (struct varobj
*var
);
39 /* VAROBJ operations */
42 mi_cmd_var_create (char *command
, char **argv
, int argc
)
50 struct cleanup
*old_cleanups
;
54 /* asprintf (&mi_error_message,
55 "mi_cmd_var_create: Usage: .");
56 return MI_CMD_ERROR; */
57 error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
60 name
= xstrdup (argv
[0]);
61 /* Add cleanup for name. Must be free_current_contents as
62 name can be reallocated */
63 old_cleanups
= make_cleanup ((make_cleanup_func
) free_current_contents
,
66 frame
= xstrdup (argv
[1]);
67 old_cleanups
= make_cleanup (free
, frame
);
69 expr
= xstrdup (argv
[2]);
71 if (strcmp (name
, "-") == 0)
74 name
= varobj_gen_name ();
76 else if (!isalpha (*name
))
77 error ("mi_cmd_var_create: name of object must begin with a letter");
79 if (strcmp (frame
, "*") == 0)
82 frameaddr
= parse_and_eval_address (frame
);
85 fprintf_unfiltered (gdb_stdlog
,
86 "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
87 name
, frame
, paddr (frameaddr
), expr
);
89 var
= varobj_create (name
, expr
, frameaddr
);
92 error ("mi_cmd_var_create: unable to create variable object");
94 ui_out_field_string (uiout
, "name", name
);
95 ui_out_field_int (uiout
, "numchild", varobj_get_num_children (var
));
96 type
= varobj_get_type (var
);
98 ui_out_field_string (uiout
, "type", "");
101 ui_out_field_string (uiout
, "type", type
);
105 do_cleanups (old_cleanups
);
110 mi_cmd_var_delete (char *command
, char **argv
, int argc
)
116 int children_only_p
= 0;
117 struct cleanup
*old_cleanups
;
119 if (argc
< 1 || argc
> 2)
120 error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
122 name
= xstrdup (argv
[0]);
123 /* Add cleanup for name. Must be free_current_contents as
124 name can be reallocated */
125 old_cleanups
= make_cleanup ((make_cleanup_func
) free_current_contents
,
128 /* If we have one single argument it cannot be '-c' or any string
129 starting with '-'. */
132 if (strcmp (name
, "-c") == 0)
133 error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
135 error ("mi_cmd_var_delete: Illegal variable object name");
138 /* If we have 2 arguments they must be '-c' followed by a string
139 which would be the variable name. */
142 expr
= xstrdup (argv
[1]);
143 if (strcmp (name
, "-c") != 0)
144 error ("mi_cmd_var_delete: Invalid option.");
147 name
= xstrdup (expr
);
151 /* If we didn't error out, now NAME contains the name of the
154 var
= varobj_get_handle (name
);
157 error ("mi_cmd_var_delete: Variable object not found.");
159 numdel
= varobj_delete (var
, NULL
, children_only_p
);
161 ui_out_field_int (uiout
, "ndeleted", numdel
);
163 do_cleanups (old_cleanups
);
168 mi_cmd_var_set_format (char *command
, char **argv
, int argc
)
170 enum varobj_display_formats format
;
176 error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
178 /* Get varobj handle, if a valid var obj name was specified */
179 var
= varobj_get_handle (argv
[0]);
182 error ("mi_cmd_var_set_format: Variable object not found");
184 formspec
= xstrdup (argv
[1]);
185 if (formspec
== NULL
)
186 error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
188 len
= strlen (formspec
);
190 if (STREQN (formspec
, "natural", len
))
191 format
= FORMAT_NATURAL
;
192 else if (STREQN (formspec
, "binary", len
))
193 format
= FORMAT_BINARY
;
194 else if (STREQN (formspec
, "decimal", len
))
195 format
= FORMAT_DECIMAL
;
196 else if (STREQN (formspec
, "hexadecimal", len
))
197 format
= FORMAT_HEXADECIMAL
;
198 else if (STREQN (formspec
, "octal", len
))
199 format
= FORMAT_OCTAL
;
201 error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
203 /* Set the format of VAR to given format */
204 varobj_set_display_format (var
, format
);
206 /* Report the new current format */
207 ui_out_field_string (uiout
, "format", varobj_format_string
[(int) format
]);
212 mi_cmd_var_show_format (char *command
, char **argv
, int argc
)
214 enum varobj_display_formats format
;
218 error ("mi_cmd_var_show_format: Usage: NAME.");
220 /* Get varobj handle, if a valid var obj name was specified */
221 var
= varobj_get_handle (argv
[0]);
223 error ("mi_cmd_var_show_format: Variable object not found");
225 format
= varobj_get_display_format (var
);
227 /* Report the current format */
228 ui_out_field_string (uiout
, "format", varobj_format_string
[(int) format
]);
233 mi_cmd_var_info_num_children (char *command
, char **argv
, int argc
)
238 error ("mi_cmd_var_info_num_children: Usage: NAME.");
240 /* Get varobj handle, if a valid var obj name was specified */
241 var
= varobj_get_handle (argv
[0]);
243 error ("mi_cmd_var_info_num_children: Variable object not found");
245 ui_out_field_int (uiout
, "numchild", varobj_get_num_children (var
));
250 mi_cmd_var_list_children (char *command
, char **argv
, int argc
)
253 struct varobj
**childlist
;
259 error ("mi_cmd_var_list_children: Usage: NAME.");
261 /* Get varobj handle, if a valid var obj name was specified */
262 var
= varobj_get_handle (argv
[0]);
264 error ("mi_cmd_var_list_children: Variable object not found");
266 numchild
= varobj_list_children (var
, &childlist
);
267 ui_out_field_int (uiout
, "numchild", numchild
);
272 ui_out_list_begin (uiout
, "children");
276 ui_out_list_begin (uiout
, "child");
277 ui_out_field_string (uiout
, "name", varobj_get_objname (*cc
));
278 ui_out_field_string (uiout
, "exp", varobj_get_expression (*cc
));
279 ui_out_field_int (uiout
, "numchild", varobj_get_num_children (*cc
));
280 type
= varobj_get_type (*cc
);
281 /* C++ pseudo-variables (public, private, protected) do not have a type */
283 ui_out_field_string (uiout
, "type", varobj_get_type (*cc
));
284 ui_out_list_end (uiout
);
287 ui_out_list_end (uiout
);
293 mi_cmd_var_info_type (char *command
, char **argv
, int argc
)
298 error ("mi_cmd_var_info_type: Usage: NAME.");
300 /* Get varobj handle, if a valid var obj name was specified */
301 var
= varobj_get_handle (argv
[0]);
303 error ("mi_cmd_var_info_type: Variable object not found");
305 ui_out_field_string (uiout
, "type", varobj_get_type (var
));
310 mi_cmd_var_info_expression (char *command
, char **argv
, int argc
)
312 enum varobj_languages lang
;
316 error ("mi_cmd_var_info_expression: Usage: NAME.");
318 /* Get varobj handle, if a valid var obj name was specified */
319 var
= varobj_get_handle (argv
[0]);
321 error ("mi_cmd_var_info_expression: Variable object not found");
323 lang
= varobj_get_language (var
);
325 ui_out_field_string (uiout
, "lang", varobj_language_string
[(int) lang
]);
326 ui_out_field_string (uiout
, "exp", varobj_get_expression (var
));
331 mi_cmd_var_show_attributes (char *command
, char **argv
, int argc
)
338 error ("mi_cmd_var_show_attributes: Usage: NAME.");
340 /* Get varobj handle, if a valid var obj name was specified */
341 var
= varobj_get_handle (argv
[0]);
343 error ("mi_cmd_var_show_attributes: Variable object not found");
345 attr
= varobj_get_attributes (var
);
346 /* FIXME: define masks for attributes */
347 if (attr
& 0x00000001)
350 attstr
= "noneditable";
352 ui_out_field_string (uiout
, "attr", attstr
);
357 mi_cmd_var_evaluate_expression (char *command
, char **argv
, int argc
)
362 error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
364 /* Get varobj handle, if a valid var obj name was specified */
365 var
= varobj_get_handle (argv
[0]);
367 error ("mi_cmd_var_evaluate_expression: Variable object not found");
369 ui_out_field_string (uiout
, "value", varobj_get_value (var
));
374 mi_cmd_var_assign (char *command
, char **argv
, int argc
)
380 error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
382 /* Get varobj handle, if a valid var obj name was specified */
383 var
= varobj_get_handle (argv
[0]);
385 error ("mi_cmd_var_assign: Variable object not found");
387 /* FIXME: define masks for attributes */
388 if (!(varobj_get_attributes (var
) & 0x00000001))
389 error ("mi_cmd_var_assign: Variable object is not editable");
391 expression
= xstrdup (argv
[1]);
393 if (!varobj_set_value (var
, expression
))
394 error ("mi_cmd_var_assign: Could not assign expression to varible object");
396 ui_out_field_string (uiout
, "value", varobj_get_value (var
));
401 mi_cmd_var_update (char *command
, char **argv
, int argc
)
404 struct varobj
**rootlist
;
410 error ("mi_cmd_var_update: Usage: NAME.");
414 /* Check if the parameter is a "*" which means that we want
415 to update all variables */
417 if ((*name
== '*') && (*(name
+ 1) == '\0'))
419 nv
= varobj_list (&rootlist
);
420 ui_out_list_begin (uiout
, "changelist");
423 ui_out_list_end (uiout
);
429 varobj_update_one (*cr
);
433 ui_out_list_end (uiout
);
437 /* Get varobj handle, if a valid var obj name was specified */
438 var
= varobj_get_handle (name
);
440 error ("mi_cmd_var_update: Variable object not found");
442 ui_out_list_begin (uiout
, "changelist");
443 varobj_update_one (var
);
444 ui_out_list_end (uiout
);
449 /* Helper for mi_cmd_var_update() */
452 varobj_update_one (struct varobj
*var
)
454 struct varobj
**changelist
;
458 nc
= varobj_update (var
, &changelist
);
466 ui_out_field_string (uiout
, "name", varobj_get_objname (*cc
));
472 /* Local variables: */
473 /* change-log-default-name: "ChangeLog-mi" */