xref: /openbsd-src/gnu/usr.bin/binutils/gdb/mi/mi-cmd-var.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* MI Command Set - varobj commands.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 2000, 2002, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    Contributed by Cygnus Solutions (a Red Hat company).
6b725ae77Skettenis 
7b725ae77Skettenis    This file is part of GDB.
8b725ae77Skettenis 
9b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis    it under the terms of the GNU General Public License as published by
11b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis    (at your option) any later version.
13b725ae77Skettenis 
14b725ae77Skettenis    This program is distributed in the hope that it will be useful,
15b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17b725ae77Skettenis    GNU General Public License for more details.
18b725ae77Skettenis 
19b725ae77Skettenis    You should have received a copy of the GNU General Public License
20b725ae77Skettenis    along with this program; if not, write to the Free Software
21b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
23b725ae77Skettenis 
24b725ae77Skettenis #include "defs.h"
25b725ae77Skettenis #include "mi-cmds.h"
26b725ae77Skettenis #include "ui-out.h"
27b725ae77Skettenis #include "mi-out.h"
28b725ae77Skettenis #include "varobj.h"
29b725ae77Skettenis #include "value.h"
30b725ae77Skettenis #include <ctype.h>
31b725ae77Skettenis #include "gdb_string.h"
32b725ae77Skettenis 
33b725ae77Skettenis extern int varobjdebug;		/* defined in varobj.c */
34b725ae77Skettenis 
35b725ae77Skettenis static int varobj_update_one (struct varobj *var);
36b725ae77Skettenis 
37b725ae77Skettenis /* VAROBJ operations */
38b725ae77Skettenis 
39b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_create(char * command,char ** argv,int argc)40b725ae77Skettenis mi_cmd_var_create (char *command, char **argv, int argc)
41b725ae77Skettenis {
42b725ae77Skettenis   CORE_ADDR frameaddr = 0;
43b725ae77Skettenis   struct varobj *var;
44b725ae77Skettenis   char *name;
45b725ae77Skettenis   char *frame;
46b725ae77Skettenis   char *expr;
47b725ae77Skettenis   char *type;
48b725ae77Skettenis   struct cleanup *old_cleanups;
49b725ae77Skettenis   enum varobj_type var_type;
50b725ae77Skettenis 
51b725ae77Skettenis   if (argc != 3)
52b725ae77Skettenis     {
53*11efff7fSkettenis       /* mi_error_message = xstrprintf ("mi_cmd_var_create: Usage:
54*11efff7fSkettenis          ...."); return MI_CMD_ERROR; */
55b725ae77Skettenis       error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
56b725ae77Skettenis     }
57b725ae77Skettenis 
58b725ae77Skettenis   name = xstrdup (argv[0]);
59b725ae77Skettenis   /* Add cleanup for name. Must be free_current_contents as
60b725ae77Skettenis      name can be reallocated */
61b725ae77Skettenis   old_cleanups = make_cleanup (free_current_contents, &name);
62b725ae77Skettenis 
63b725ae77Skettenis   frame = xstrdup (argv[1]);
64b725ae77Skettenis   old_cleanups = make_cleanup (xfree, frame);
65b725ae77Skettenis 
66b725ae77Skettenis   expr = xstrdup (argv[2]);
67b725ae77Skettenis 
68b725ae77Skettenis   if (strcmp (name, "-") == 0)
69b725ae77Skettenis     {
70b725ae77Skettenis       xfree (name);
71b725ae77Skettenis       name = varobj_gen_name ();
72b725ae77Skettenis     }
73b725ae77Skettenis   else if (!isalpha (*name))
74b725ae77Skettenis     error ("mi_cmd_var_create: name of object must begin with a letter");
75b725ae77Skettenis 
76b725ae77Skettenis   if (strcmp (frame, "*") == 0)
77b725ae77Skettenis     var_type = USE_CURRENT_FRAME;
78b725ae77Skettenis   else if (strcmp (frame, "@") == 0)
79b725ae77Skettenis     var_type = USE_SELECTED_FRAME;
80b725ae77Skettenis   else
81b725ae77Skettenis     {
82b725ae77Skettenis       var_type = USE_SPECIFIED_FRAME;
83b725ae77Skettenis       frameaddr = string_to_core_addr (frame);
84b725ae77Skettenis     }
85b725ae77Skettenis 
86b725ae77Skettenis   if (varobjdebug)
87b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog,
88b725ae77Skettenis 		    "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
89b725ae77Skettenis 			name, frame, paddr (frameaddr), expr);
90b725ae77Skettenis 
91b725ae77Skettenis   var = varobj_create (name, expr, frameaddr, var_type);
92b725ae77Skettenis 
93b725ae77Skettenis   if (var == NULL)
94b725ae77Skettenis     error ("mi_cmd_var_create: unable to create variable object");
95b725ae77Skettenis 
96b725ae77Skettenis   ui_out_field_string (uiout, "name", name);
97b725ae77Skettenis   ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
98b725ae77Skettenis   type = varobj_get_type (var);
99b725ae77Skettenis   if (type == NULL)
100b725ae77Skettenis     ui_out_field_string (uiout, "type", "");
101b725ae77Skettenis   else
102b725ae77Skettenis     {
103b725ae77Skettenis       ui_out_field_string (uiout, "type", type);
104b725ae77Skettenis       xfree (type);
105b725ae77Skettenis     }
106b725ae77Skettenis 
107b725ae77Skettenis   do_cleanups (old_cleanups);
108b725ae77Skettenis   return MI_CMD_DONE;
109b725ae77Skettenis }
110b725ae77Skettenis 
111b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_delete(char * command,char ** argv,int argc)112b725ae77Skettenis mi_cmd_var_delete (char *command, char **argv, int argc)
113b725ae77Skettenis {
114b725ae77Skettenis   char *name;
115b725ae77Skettenis   char *expr;
116b725ae77Skettenis   struct varobj *var;
117b725ae77Skettenis   int numdel;
118b725ae77Skettenis   int children_only_p = 0;
119b725ae77Skettenis   struct cleanup *old_cleanups;
120b725ae77Skettenis 
121b725ae77Skettenis   if (argc < 1 || argc > 2)
122b725ae77Skettenis     error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
123b725ae77Skettenis 
124b725ae77Skettenis   name = xstrdup (argv[0]);
125b725ae77Skettenis   /* Add cleanup for name. Must be free_current_contents as
126b725ae77Skettenis      name can be reallocated */
127b725ae77Skettenis   old_cleanups = make_cleanup (free_current_contents, &name);
128b725ae77Skettenis 
129b725ae77Skettenis   /* If we have one single argument it cannot be '-c' or any string
130b725ae77Skettenis      starting with '-'. */
131b725ae77Skettenis   if (argc == 1)
132b725ae77Skettenis     {
133b725ae77Skettenis       if (strcmp (name, "-c") == 0)
134b725ae77Skettenis 	error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
135b725ae77Skettenis       if (*name == '-')
136b725ae77Skettenis 	error ("mi_cmd_var_delete: Illegal variable object name");
137b725ae77Skettenis     }
138b725ae77Skettenis 
139b725ae77Skettenis   /* If we have 2 arguments they must be '-c' followed by a string
140b725ae77Skettenis      which would be the variable name. */
141b725ae77Skettenis   if (argc == 2)
142b725ae77Skettenis     {
143b725ae77Skettenis       expr = xstrdup (argv[1]);
144b725ae77Skettenis       if (strcmp (name, "-c") != 0)
145b725ae77Skettenis 	error ("mi_cmd_var_delete: Invalid option.");
146b725ae77Skettenis       children_only_p = 1;
147b725ae77Skettenis       xfree (name);
148b725ae77Skettenis       name = xstrdup (expr);
149b725ae77Skettenis       xfree (expr);
150b725ae77Skettenis     }
151b725ae77Skettenis 
152b725ae77Skettenis   /* If we didn't error out, now NAME contains the name of the
153b725ae77Skettenis      variable. */
154b725ae77Skettenis 
155b725ae77Skettenis   var = varobj_get_handle (name);
156b725ae77Skettenis 
157b725ae77Skettenis   if (var == NULL)
158b725ae77Skettenis     error ("mi_cmd_var_delete: Variable object not found.");
159b725ae77Skettenis 
160b725ae77Skettenis   numdel = varobj_delete (var, NULL, children_only_p);
161b725ae77Skettenis 
162b725ae77Skettenis   ui_out_field_int (uiout, "ndeleted", numdel);
163b725ae77Skettenis 
164b725ae77Skettenis   do_cleanups (old_cleanups);
165b725ae77Skettenis   return MI_CMD_DONE;
166b725ae77Skettenis }
167b725ae77Skettenis 
168b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_set_format(char * command,char ** argv,int argc)169b725ae77Skettenis mi_cmd_var_set_format (char *command, char **argv, int argc)
170b725ae77Skettenis {
171b725ae77Skettenis   enum varobj_display_formats format;
172b725ae77Skettenis   int len;
173b725ae77Skettenis   struct varobj *var;
174b725ae77Skettenis   char *formspec;
175b725ae77Skettenis 
176b725ae77Skettenis   if (argc != 2)
177b725ae77Skettenis     error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
178b725ae77Skettenis 
179b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
180b725ae77Skettenis   var = varobj_get_handle (argv[0]);
181b725ae77Skettenis 
182b725ae77Skettenis   if (var == NULL)
183b725ae77Skettenis     error ("mi_cmd_var_set_format: Variable object not found");
184b725ae77Skettenis 
185b725ae77Skettenis   formspec = xstrdup (argv[1]);
186b725ae77Skettenis   if (formspec == NULL)
187b725ae77Skettenis     error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
188b725ae77Skettenis 
189b725ae77Skettenis   len = strlen (formspec);
190b725ae77Skettenis 
191b725ae77Skettenis   if (strncmp (formspec, "natural", len) == 0)
192b725ae77Skettenis     format = FORMAT_NATURAL;
193b725ae77Skettenis   else if (strncmp (formspec, "binary", len) == 0)
194b725ae77Skettenis     format = FORMAT_BINARY;
195b725ae77Skettenis   else if (strncmp (formspec, "decimal", len) == 0)
196b725ae77Skettenis     format = FORMAT_DECIMAL;
197b725ae77Skettenis   else if (strncmp (formspec, "hexadecimal", len) == 0)
198b725ae77Skettenis     format = FORMAT_HEXADECIMAL;
199b725ae77Skettenis   else if (strncmp (formspec, "octal", len) == 0)
200b725ae77Skettenis     format = FORMAT_OCTAL;
201b725ae77Skettenis   else
202b725ae77Skettenis     error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
203b725ae77Skettenis 
204b725ae77Skettenis   /* Set the format of VAR to given format */
205b725ae77Skettenis   varobj_set_display_format (var, format);
206b725ae77Skettenis 
207b725ae77Skettenis   /* Report the new current format */
208b725ae77Skettenis   ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
209b725ae77Skettenis   return MI_CMD_DONE;
210b725ae77Skettenis }
211b725ae77Skettenis 
212b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_show_format(char * command,char ** argv,int argc)213b725ae77Skettenis mi_cmd_var_show_format (char *command, char **argv, int argc)
214b725ae77Skettenis {
215b725ae77Skettenis   enum varobj_display_formats format;
216b725ae77Skettenis   struct varobj *var;
217b725ae77Skettenis 
218b725ae77Skettenis   if (argc != 1)
219b725ae77Skettenis     error ("mi_cmd_var_show_format: Usage: NAME.");
220b725ae77Skettenis 
221b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
222b725ae77Skettenis   var = varobj_get_handle (argv[0]);
223b725ae77Skettenis   if (var == NULL)
224b725ae77Skettenis     error ("mi_cmd_var_show_format: Variable object not found");
225b725ae77Skettenis 
226b725ae77Skettenis   format = varobj_get_display_format (var);
227b725ae77Skettenis 
228b725ae77Skettenis   /* Report the current format */
229b725ae77Skettenis   ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
230b725ae77Skettenis   return MI_CMD_DONE;
231b725ae77Skettenis }
232b725ae77Skettenis 
233b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_num_children(char * command,char ** argv,int argc)234b725ae77Skettenis mi_cmd_var_info_num_children (char *command, char **argv, int argc)
235b725ae77Skettenis {
236b725ae77Skettenis   struct varobj *var;
237b725ae77Skettenis 
238b725ae77Skettenis   if (argc != 1)
239b725ae77Skettenis     error ("mi_cmd_var_info_num_children: Usage: NAME.");
240b725ae77Skettenis 
241b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
242b725ae77Skettenis   var = varobj_get_handle (argv[0]);
243b725ae77Skettenis   if (var == NULL)
244b725ae77Skettenis     error ("mi_cmd_var_info_num_children: Variable object not found");
245b725ae77Skettenis 
246b725ae77Skettenis   ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
247b725ae77Skettenis   return MI_CMD_DONE;
248b725ae77Skettenis }
249b725ae77Skettenis 
250b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_list_children(char * command,char ** argv,int argc)251b725ae77Skettenis mi_cmd_var_list_children (char *command, char **argv, int argc)
252b725ae77Skettenis {
253b725ae77Skettenis   struct varobj *var;
254b725ae77Skettenis   struct varobj **childlist;
255b725ae77Skettenis   struct varobj **cc;
256b725ae77Skettenis   struct cleanup *cleanup_children;
257b725ae77Skettenis   int numchild;
258b725ae77Skettenis   char *type;
259b725ae77Skettenis   enum print_values print_values;
260b725ae77Skettenis 
261b725ae77Skettenis   if (argc != 1 && argc != 2)
262b725ae77Skettenis     error ("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME");
263b725ae77Skettenis 
264b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
265b725ae77Skettenis   if (argc == 1) var = varobj_get_handle (argv[0]);
266b725ae77Skettenis   else var = varobj_get_handle (argv[1]);
267b725ae77Skettenis   if (var == NULL)
268b725ae77Skettenis     error ("Variable object not found");
269b725ae77Skettenis 
270b725ae77Skettenis   numchild = varobj_list_children (var, &childlist);
271b725ae77Skettenis   ui_out_field_int (uiout, "numchild", numchild);
272b725ae77Skettenis   if (argc == 2)
273b725ae77Skettenis     if (strcmp (argv[0], "0") == 0
274b725ae77Skettenis 	|| strcmp (argv[0], "--no-values") == 0)
275b725ae77Skettenis       print_values = PRINT_NO_VALUES;
276b725ae77Skettenis     else if (strcmp (argv[0], "1") == 0
277b725ae77Skettenis 	     || strcmp (argv[0], "--all-values") == 0)
278b725ae77Skettenis       print_values = PRINT_ALL_VALUES;
279b725ae77Skettenis     else
280b725ae77Skettenis      error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\"");
281b725ae77Skettenis   else print_values = PRINT_NO_VALUES;
282b725ae77Skettenis 
283b725ae77Skettenis   if (numchild <= 0)
284b725ae77Skettenis     return MI_CMD_DONE;
285b725ae77Skettenis 
286b725ae77Skettenis   if (mi_version (uiout) == 1)
287b725ae77Skettenis     cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children");
288b725ae77Skettenis   else
289b725ae77Skettenis     cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children");
290b725ae77Skettenis   cc = childlist;
291b725ae77Skettenis   while (*cc != NULL)
292b725ae77Skettenis     {
293b725ae77Skettenis       struct cleanup *cleanup_child;
294b725ae77Skettenis       cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child");
295b725ae77Skettenis       ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
296b725ae77Skettenis       ui_out_field_string (uiout, "exp", varobj_get_expression (*cc));
297b725ae77Skettenis       ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc));
298b725ae77Skettenis       if (print_values)
299b725ae77Skettenis 	ui_out_field_string (uiout, "value", varobj_get_value (*cc));
300b725ae77Skettenis       type = varobj_get_type (*cc);
301b725ae77Skettenis       /* C++ pseudo-variables (public, private, protected) do not have a type */
302b725ae77Skettenis       if (type)
303b725ae77Skettenis 	ui_out_field_string (uiout, "type", varobj_get_type (*cc));
304b725ae77Skettenis       do_cleanups (cleanup_child);
305b725ae77Skettenis       cc++;
306b725ae77Skettenis     }
307b725ae77Skettenis   do_cleanups (cleanup_children);
308b725ae77Skettenis   xfree (childlist);
309b725ae77Skettenis   return MI_CMD_DONE;
310b725ae77Skettenis }
311b725ae77Skettenis 
312b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_type(char * command,char ** argv,int argc)313b725ae77Skettenis mi_cmd_var_info_type (char *command, char **argv, int argc)
314b725ae77Skettenis {
315b725ae77Skettenis   struct varobj *var;
316b725ae77Skettenis 
317b725ae77Skettenis   if (argc != 1)
318b725ae77Skettenis     error ("mi_cmd_var_info_type: Usage: NAME.");
319b725ae77Skettenis 
320b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
321b725ae77Skettenis   var = varobj_get_handle (argv[0]);
322b725ae77Skettenis   if (var == NULL)
323b725ae77Skettenis     error ("mi_cmd_var_info_type: Variable object not found");
324b725ae77Skettenis 
325b725ae77Skettenis   ui_out_field_string (uiout, "type", varobj_get_type (var));
326b725ae77Skettenis   return MI_CMD_DONE;
327b725ae77Skettenis }
328b725ae77Skettenis 
329b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_expression(char * command,char ** argv,int argc)330b725ae77Skettenis mi_cmd_var_info_expression (char *command, char **argv, int argc)
331b725ae77Skettenis {
332b725ae77Skettenis   enum varobj_languages lang;
333b725ae77Skettenis   struct varobj *var;
334b725ae77Skettenis 
335b725ae77Skettenis   if (argc != 1)
336b725ae77Skettenis     error ("mi_cmd_var_info_expression: Usage: NAME.");
337b725ae77Skettenis 
338b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
339b725ae77Skettenis   var = varobj_get_handle (argv[0]);
340b725ae77Skettenis   if (var == NULL)
341b725ae77Skettenis     error ("mi_cmd_var_info_expression: Variable object not found");
342b725ae77Skettenis 
343b725ae77Skettenis   lang = varobj_get_language (var);
344b725ae77Skettenis 
345b725ae77Skettenis   ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]);
346b725ae77Skettenis   ui_out_field_string (uiout, "exp", varobj_get_expression (var));
347b725ae77Skettenis   return MI_CMD_DONE;
348b725ae77Skettenis }
349b725ae77Skettenis 
350b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_show_attributes(char * command,char ** argv,int argc)351b725ae77Skettenis mi_cmd_var_show_attributes (char *command, char **argv, int argc)
352b725ae77Skettenis {
353b725ae77Skettenis   int attr;
354b725ae77Skettenis   char *attstr;
355b725ae77Skettenis   struct varobj *var;
356b725ae77Skettenis 
357b725ae77Skettenis   if (argc != 1)
358b725ae77Skettenis     error ("mi_cmd_var_show_attributes: Usage: NAME.");
359b725ae77Skettenis 
360b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
361b725ae77Skettenis   var = varobj_get_handle (argv[0]);
362b725ae77Skettenis   if (var == NULL)
363b725ae77Skettenis     error ("mi_cmd_var_show_attributes: Variable object not found");
364b725ae77Skettenis 
365b725ae77Skettenis   attr = varobj_get_attributes (var);
366b725ae77Skettenis   /* FIXME: define masks for attributes */
367b725ae77Skettenis   if (attr & 0x00000001)
368b725ae77Skettenis     attstr = "editable";
369b725ae77Skettenis   else
370b725ae77Skettenis     attstr = "noneditable";
371b725ae77Skettenis 
372b725ae77Skettenis   ui_out_field_string (uiout, "attr", attstr);
373b725ae77Skettenis   return MI_CMD_DONE;
374b725ae77Skettenis }
375b725ae77Skettenis 
376b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_evaluate_expression(char * command,char ** argv,int argc)377b725ae77Skettenis mi_cmd_var_evaluate_expression (char *command, char **argv, int argc)
378b725ae77Skettenis {
379b725ae77Skettenis   struct varobj *var;
380b725ae77Skettenis 
381b725ae77Skettenis   if (argc != 1)
382b725ae77Skettenis     error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
383b725ae77Skettenis 
384b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
385b725ae77Skettenis   var = varobj_get_handle (argv[0]);
386b725ae77Skettenis   if (var == NULL)
387b725ae77Skettenis     error ("mi_cmd_var_evaluate_expression: Variable object not found");
388b725ae77Skettenis 
389b725ae77Skettenis   ui_out_field_string (uiout, "value", varobj_get_value (var));
390b725ae77Skettenis   return MI_CMD_DONE;
391b725ae77Skettenis }
392b725ae77Skettenis 
393b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_assign(char * command,char ** argv,int argc)394b725ae77Skettenis mi_cmd_var_assign (char *command, char **argv, int argc)
395b725ae77Skettenis {
396b725ae77Skettenis   struct varobj *var;
397b725ae77Skettenis   char *expression;
398b725ae77Skettenis 
399b725ae77Skettenis   if (argc != 2)
400b725ae77Skettenis     error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
401b725ae77Skettenis 
402b725ae77Skettenis   /* Get varobj handle, if a valid var obj name was specified */
403b725ae77Skettenis   var = varobj_get_handle (argv[0]);
404b725ae77Skettenis   if (var == NULL)
405b725ae77Skettenis     error ("mi_cmd_var_assign: Variable object not found");
406b725ae77Skettenis 
407b725ae77Skettenis   /* FIXME: define masks for attributes */
408b725ae77Skettenis   if (!(varobj_get_attributes (var) & 0x00000001))
409b725ae77Skettenis     error ("mi_cmd_var_assign: Variable object is not editable");
410b725ae77Skettenis 
411b725ae77Skettenis   expression = xstrdup (argv[1]);
412b725ae77Skettenis 
413b725ae77Skettenis   if (!varobj_set_value (var, expression))
414b725ae77Skettenis     error ("mi_cmd_var_assign: Could not assign expression to varible object");
415b725ae77Skettenis 
416b725ae77Skettenis   ui_out_field_string (uiout, "value", varobj_get_value (var));
417b725ae77Skettenis   return MI_CMD_DONE;
418b725ae77Skettenis }
419b725ae77Skettenis 
420b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_update(char * command,char ** argv,int argc)421b725ae77Skettenis mi_cmd_var_update (char *command, char **argv, int argc)
422b725ae77Skettenis {
423b725ae77Skettenis   struct varobj *var;
424b725ae77Skettenis   struct varobj **rootlist;
425b725ae77Skettenis   struct varobj **cr;
426b725ae77Skettenis   struct cleanup *cleanup;
427b725ae77Skettenis   char *name;
428b725ae77Skettenis   int nv;
429b725ae77Skettenis 
430b725ae77Skettenis   if (argc != 1)
431b725ae77Skettenis     error ("mi_cmd_var_update: Usage: NAME.");
432b725ae77Skettenis 
433b725ae77Skettenis   name = argv[0];
434b725ae77Skettenis 
435b725ae77Skettenis   /* Check if the parameter is a "*" which means that we want
436b725ae77Skettenis      to update all variables */
437b725ae77Skettenis 
438b725ae77Skettenis   if ((*name == '*') && (*(name + 1) == '\0'))
439b725ae77Skettenis     {
440b725ae77Skettenis       nv = varobj_list (&rootlist);
441b725ae77Skettenis       if (mi_version (uiout) <= 1)
442b725ae77Skettenis         cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
443b725ae77Skettenis       else
444b725ae77Skettenis         cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
445b725ae77Skettenis       if (nv <= 0)
446b725ae77Skettenis 	{
447b725ae77Skettenis 	  do_cleanups (cleanup);
448b725ae77Skettenis 	  return MI_CMD_DONE;
449b725ae77Skettenis 	}
450b725ae77Skettenis       cr = rootlist;
451b725ae77Skettenis       while (*cr != NULL)
452b725ae77Skettenis 	{
453b725ae77Skettenis 	  varobj_update_one (*cr);
454b725ae77Skettenis 	  cr++;
455b725ae77Skettenis 	}
456b725ae77Skettenis       xfree (rootlist);
457b725ae77Skettenis       do_cleanups (cleanup);
458b725ae77Skettenis     }
459b725ae77Skettenis   else
460b725ae77Skettenis     {
461b725ae77Skettenis       /* Get varobj handle, if a valid var obj name was specified */
462b725ae77Skettenis       var = varobj_get_handle (name);
463b725ae77Skettenis       if (var == NULL)
464b725ae77Skettenis 	error ("mi_cmd_var_update: Variable object not found");
465b725ae77Skettenis 
466b725ae77Skettenis       if (mi_version (uiout) <= 1)
467b725ae77Skettenis         cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
468b725ae77Skettenis       else
469b725ae77Skettenis         cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
470b725ae77Skettenis       varobj_update_one (var);
471b725ae77Skettenis       do_cleanups (cleanup);
472b725ae77Skettenis     }
473b725ae77Skettenis     return MI_CMD_DONE;
474b725ae77Skettenis }
475b725ae77Skettenis 
476b725ae77Skettenis /* Helper for mi_cmd_var_update() Returns 0 if the update for
477b725ae77Skettenis    the variable fails (usually because the variable is out of
478b725ae77Skettenis    scope), and 1 if it succeeds. */
479b725ae77Skettenis 
480b725ae77Skettenis static int
varobj_update_one(struct varobj * var)481b725ae77Skettenis varobj_update_one (struct varobj *var)
482b725ae77Skettenis {
483b725ae77Skettenis   struct varobj **changelist;
484b725ae77Skettenis   struct varobj **cc;
485b725ae77Skettenis   struct cleanup *cleanup = NULL;
486b725ae77Skettenis   int nc;
487b725ae77Skettenis 
488b725ae77Skettenis   nc = varobj_update (&var, &changelist);
489b725ae77Skettenis 
490b725ae77Skettenis   /* nc == 0 means that nothing has changed.
491b725ae77Skettenis      nc == -1 means that an error occured in updating the variable.
492b725ae77Skettenis      nc == -2 means the variable has changed type. */
493b725ae77Skettenis 
494b725ae77Skettenis   if (nc == 0)
495b725ae77Skettenis     return 1;
496b725ae77Skettenis   else if (nc == -1)
497b725ae77Skettenis     {
498b725ae77Skettenis       if (mi_version (uiout) > 1)
499b725ae77Skettenis         cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
500b725ae77Skettenis       ui_out_field_string (uiout, "name", varobj_get_objname(var));
501b725ae77Skettenis       ui_out_field_string (uiout, "in_scope", "false");
502b725ae77Skettenis       if (mi_version (uiout) > 1)
503b725ae77Skettenis         do_cleanups (cleanup);
504b725ae77Skettenis       return -1;
505b725ae77Skettenis     }
506b725ae77Skettenis   else if (nc == -2)
507b725ae77Skettenis     {
508b725ae77Skettenis       if (mi_version (uiout) > 1)
509b725ae77Skettenis         cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
510b725ae77Skettenis       ui_out_field_string (uiout, "name", varobj_get_objname (var));
511b725ae77Skettenis       ui_out_field_string (uiout, "in_scope", "true");
512b725ae77Skettenis       ui_out_field_string (uiout, "new_type", varobj_get_type(var));
513b725ae77Skettenis       ui_out_field_int (uiout, "new_num_children",
514b725ae77Skettenis 			   varobj_get_num_children(var));
515b725ae77Skettenis       if (mi_version (uiout) > 1)
516b725ae77Skettenis         do_cleanups (cleanup);
517b725ae77Skettenis     }
518b725ae77Skettenis   else
519b725ae77Skettenis     {
520b725ae77Skettenis 
521b725ae77Skettenis       cc = changelist;
522b725ae77Skettenis       while (*cc != NULL)
523b725ae77Skettenis 	{
524b725ae77Skettenis 	  if (mi_version (uiout) > 1)
525b725ae77Skettenis 	    cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
526b725ae77Skettenis 	  ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
527b725ae77Skettenis 	  ui_out_field_string (uiout, "in_scope", "true");
528b725ae77Skettenis 	  ui_out_field_string (uiout, "type_changed", "false");
529b725ae77Skettenis 	  if (mi_version (uiout) > 1)
530b725ae77Skettenis 	    do_cleanups (cleanup);
531b725ae77Skettenis 	  cc++;
532b725ae77Skettenis 	}
533b725ae77Skettenis       xfree (changelist);
534b725ae77Skettenis       return 1;
535b725ae77Skettenis     }
536b725ae77Skettenis   return 1;
537b725ae77Skettenis }
538