1 /* MI Command Set - varobj commands.
2 Copyright (C) 2000, Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions (a Red Hat company).
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" */