/* MI Command Set - varobj commands.
- Copyright (C) 2000, Free Software Foundation, Inc.
+
+ Copyright 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
+
Contributed by Cygnus Solutions (a Red Hat company).
This file is part of GDB.
#include "varobj.h"
#include "value.h"
#include <ctype.h>
+#include "gdb_string.h"
-/* Convenience macro for allocting typesafe memory. */
-
-#undef XMALLOC
-#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
+const char mi_no_values[] = "--no-values";
+const char mi_simple_values[] = "--simple-values";
+const char mi_all_values[] = "--all-values";
extern int varobjdebug; /* defined in varobj.c */
-static int varobj_update_one (struct varobj *var);
+static int varobj_update_one (struct varobj *var,
+ enum print_values print_values);
/* VAROBJ operations */
if (argc != 3)
{
- /* asprintf (&mi_error_message,
- "mi_cmd_var_create: Usage: .");
- return MI_CMD_ERROR; */
- error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
+ /* mi_error_message = xstrprintf ("mi_cmd_var_create: Usage:
+ ...."); return MI_CMD_ERROR; */
+ error (_("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION."));
}
name = xstrdup (argv[0]);
old_cleanups = make_cleanup (free_current_contents, &name);
frame = xstrdup (argv[1]);
- old_cleanups = make_cleanup (free, frame);
+ old_cleanups = make_cleanup (xfree, frame);
expr = xstrdup (argv[2]);
if (strcmp (name, "-") == 0)
{
- free (name);
+ xfree (name);
name = varobj_gen_name ();
}
else if (!isalpha (*name))
- error ("mi_cmd_var_create: name of object must begin with a letter");
+ error (_("mi_cmd_var_create: name of object must begin with a letter"));
if (strcmp (frame, "*") == 0)
var_type = USE_CURRENT_FRAME;
else
{
var_type = USE_SPECIFIED_FRAME;
- frameaddr = parse_and_eval_address (frame);
+ frameaddr = string_to_core_addr (frame);
}
if (varobjdebug)
var = varobj_create (name, expr, frameaddr, var_type);
if (var == NULL)
- error ("mi_cmd_var_create: unable to create variable object");
+ error (_("mi_cmd_var_create: unable to create variable object"));
ui_out_field_string (uiout, "name", name);
ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
else
{
ui_out_field_string (uiout, "type", type);
- free (type);
+ xfree (type);
}
do_cleanups (old_cleanups);
struct cleanup *old_cleanups;
if (argc < 1 || argc > 2)
- error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
+ error (_("mi_cmd_var_delete: Usage: [-c] EXPRESSION."));
name = xstrdup (argv[0]);
/* Add cleanup for name. Must be free_current_contents as
if (argc == 1)
{
if (strcmp (name, "-c") == 0)
- error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
+ error (_("mi_cmd_var_delete: Missing required argument after '-c': variable object name"));
if (*name == '-')
- error ("mi_cmd_var_delete: Illegal variable object name");
+ error (_("mi_cmd_var_delete: Illegal variable object name"));
}
/* If we have 2 arguments they must be '-c' followed by a string
{
expr = xstrdup (argv[1]);
if (strcmp (name, "-c") != 0)
- error ("mi_cmd_var_delete: Invalid option.");
+ error (_("mi_cmd_var_delete: Invalid option."));
children_only_p = 1;
- free (name);
+ xfree (name);
name = xstrdup (expr);
- free (expr);
+ xfree (expr);
}
/* If we didn't error out, now NAME contains the name of the
var = varobj_get_handle (name);
if (var == NULL)
- error ("mi_cmd_var_delete: Variable object not found.");
+ error (_("mi_cmd_var_delete: Variable object not found."));
numdel = varobj_delete (var, NULL, children_only_p);
char *formspec;
if (argc != 2)
- error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
+ error (_("mi_cmd_var_set_format: Usage: NAME FORMAT."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_set_format: Variable object not found");
+ error (_("mi_cmd_var_set_format: Variable object not found"));
formspec = xstrdup (argv[1]);
if (formspec == NULL)
- error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
+ error (_("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""));
len = strlen (formspec);
- if (STREQN (formspec, "natural", len))
+ if (strncmp (formspec, "natural", len) == 0)
format = FORMAT_NATURAL;
- else if (STREQN (formspec, "binary", len))
+ else if (strncmp (formspec, "binary", len) == 0)
format = FORMAT_BINARY;
- else if (STREQN (formspec, "decimal", len))
+ else if (strncmp (formspec, "decimal", len) == 0)
format = FORMAT_DECIMAL;
- else if (STREQN (formspec, "hexadecimal", len))
+ else if (strncmp (formspec, "hexadecimal", len) == 0)
format = FORMAT_HEXADECIMAL;
- else if (STREQN (formspec, "octal", len))
+ else if (strncmp (formspec, "octal", len) == 0)
format = FORMAT_OCTAL;
else
- error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
+ error (_("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""));
/* Set the format of VAR to given format */
varobj_set_display_format (var, format);
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_show_format: Usage: NAME.");
+ error (_("mi_cmd_var_show_format: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_show_format: Variable object not found");
+ error (_("mi_cmd_var_show_format: Variable object not found"));
format = varobj_get_display_format (var);
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_info_num_children: Usage: NAME.");
+ error (_("mi_cmd_var_info_num_children: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_info_num_children: Variable object not found");
+ error (_("mi_cmd_var_info_num_children: Variable object not found"));
ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
return MI_CMD_DONE;
}
+/* Parse a string argument into a print_values value. */
+
+static enum print_values
+mi_parse_values_option (const char *arg)
+{
+ if (strcmp (arg, "0") == 0
+ || strcmp (arg, mi_no_values) == 0)
+ return PRINT_NO_VALUES;
+ else if (strcmp (arg, "1") == 0
+ || strcmp (arg, mi_all_values) == 0)
+ return PRINT_ALL_VALUES;
+ else if (strcmp (arg, "2") == 0
+ || strcmp (arg, mi_simple_values) == 0)
+ return PRINT_SIMPLE_VALUES;
+ else
+ error (_("Unknown value for PRINT_VALUES\n\
+Must be: 0 or \"%s\", 1 or \"%s\", 2 or \"%s\""),
+ mi_no_values, mi_simple_values, mi_all_values);
+}
+
+/* Return 1 if given the argument PRINT_VALUES we should display
+ a value of type TYPE. */
+
+static int
+mi_print_value_p (struct type *type, enum print_values print_values)
+{
+ if (type != NULL)
+ type = check_typedef (type);
+
+ if (print_values == PRINT_NO_VALUES)
+ return 0;
+
+ if (print_values == PRINT_ALL_VALUES)
+ return 1;
+
+ /* For PRINT_SIMPLE_VALUES, only print the value if it has a type
+ and that type is not a compound type. */
+
+ return (TYPE_CODE (type) != TYPE_CODE_ARRAY
+ && TYPE_CODE (type) != TYPE_CODE_STRUCT
+ && TYPE_CODE (type) != TYPE_CODE_UNION);
+}
+
enum mi_cmd_result
mi_cmd_var_list_children (char *command, char **argv, int argc)
{
struct varobj *var;
struct varobj **childlist;
struct varobj **cc;
+ struct cleanup *cleanup_children;
int numchild;
char *type;
+ enum print_values print_values;
- if (argc != 1)
- error ("mi_cmd_var_list_children: Usage: NAME.");
+ if (argc != 1 && argc != 2)
+ error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME"));
/* Get varobj handle, if a valid var obj name was specified */
- var = varobj_get_handle (argv[0]);
+ if (argc == 1)
+ var = varobj_get_handle (argv[0]);
+ else
+ var = varobj_get_handle (argv[1]);
if (var == NULL)
- error ("mi_cmd_var_list_children: Variable object not found");
+ error (_("Variable object not found"));
numchild = varobj_list_children (var, &childlist);
ui_out_field_int (uiout, "numchild", numchild);
+ if (argc == 2)
+ print_values = mi_parse_values_option (argv[0]);
+ else
+ print_values = PRINT_NO_VALUES;
if (numchild <= 0)
return MI_CMD_DONE;
- ui_out_list_begin (uiout, "children");
+ if (mi_version (uiout) == 1)
+ cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children");
+ else
+ cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children");
cc = childlist;
while (*cc != NULL)
{
- ui_out_list_begin (uiout, "child");
+ struct cleanup *cleanup_child;
+ cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child");
ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
ui_out_field_string (uiout, "exp", varobj_get_expression (*cc));
ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc));
+ if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values))
+ ui_out_field_string (uiout, "value", varobj_get_value (*cc));
type = varobj_get_type (*cc);
/* C++ pseudo-variables (public, private, protected) do not have a type */
if (type)
- ui_out_field_string (uiout, "type", varobj_get_type (*cc));
- ui_out_list_end (uiout);
+ ui_out_field_string (uiout, "type", type);
+ do_cleanups (cleanup_child);
cc++;
}
- ui_out_list_end (uiout);
- free (childlist);
+ do_cleanups (cleanup_children);
+ xfree (childlist);
return MI_CMD_DONE;
}
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_info_type: Usage: NAME.");
+ error (_("mi_cmd_var_info_type: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_info_type: Variable object not found");
+ error (_("mi_cmd_var_info_type: Variable object not found"));
ui_out_field_string (uiout, "type", varobj_get_type (var));
return MI_CMD_DONE;
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_info_expression: Usage: NAME.");
+ error (_("mi_cmd_var_info_expression: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_info_expression: Variable object not found");
+ error (_("mi_cmd_var_info_expression: Variable object not found"));
lang = varobj_get_language (var);
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_show_attributes: Usage: NAME.");
+ error (_("mi_cmd_var_show_attributes: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_show_attributes: Variable object not found");
+ error (_("mi_cmd_var_show_attributes: Variable object not found"));
attr = varobj_get_attributes (var);
/* FIXME: define masks for attributes */
struct varobj *var;
if (argc != 1)
- error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
+ error (_("mi_cmd_var_evaluate_expression: Usage: NAME."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_evaluate_expression: Variable object not found");
+ error (_("mi_cmd_var_evaluate_expression: Variable object not found"));
ui_out_field_string (uiout, "value", varobj_get_value (var));
return MI_CMD_DONE;
char *expression;
if (argc != 2)
- error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
+ error (_("mi_cmd_var_assign: Usage: NAME EXPRESSION."));
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (argv[0]);
if (var == NULL)
- error ("mi_cmd_var_assign: Variable object not found");
+ error (_("mi_cmd_var_assign: Variable object not found"));
/* FIXME: define masks for attributes */
if (!(varobj_get_attributes (var) & 0x00000001))
- error ("mi_cmd_var_assign: Variable object is not editable");
+ error (_("mi_cmd_var_assign: Variable object is not editable"));
expression = xstrdup (argv[1]);
if (!varobj_set_value (var, expression))
- error ("mi_cmd_var_assign: Could not assign expression to varible object");
+ error (_("mi_cmd_var_assign: Could not assign expression to varible object"));
ui_out_field_string (uiout, "value", varobj_get_value (var));
return MI_CMD_DONE;
struct varobj *var;
struct varobj **rootlist;
struct varobj **cr;
+ struct cleanup *cleanup;
char *name;
int nv;
+ enum print_values print_values;
- if (argc != 1)
- error ("mi_cmd_var_update: Usage: NAME.");
+ if (argc != 1 && argc != 2)
+ error (_("mi_cmd_var_update: Usage: [PRINT_VALUES] NAME."));
+
+ if (argc == 1)
+ name = argv[0];
+ else
+ name = (argv[1]);
- name = argv[0];
+ if (argc == 2)
+ print_values = mi_parse_values_option (argv[0]);
+ else
+ print_values = PRINT_NO_VALUES;
/* Check if the parameter is a "*" which means that we want
to update all variables */
if ((*name == '*') && (*(name + 1) == '\0'))
{
nv = varobj_list (&rootlist);
- ui_out_list_begin (uiout, "changelist");
+ if (mi_version (uiout) <= 1)
+ cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
+ else
+ cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
if (nv <= 0)
{
- ui_out_list_end (uiout);
+ do_cleanups (cleanup);
return MI_CMD_DONE;
}
cr = rootlist;
while (*cr != NULL)
{
- varobj_update_one (*cr);
+ varobj_update_one (*cr, print_values);
cr++;
}
- free (rootlist);
- ui_out_list_end (uiout);
+ xfree (rootlist);
+ do_cleanups (cleanup);
}
else
{
/* Get varobj handle, if a valid var obj name was specified */
var = varobj_get_handle (name);
if (var == NULL)
- error ("mi_cmd_var_update: Variable object not found");
-
- ui_out_list_begin (uiout, "changelist");
- varobj_update_one (var);
- ui_out_list_end (uiout);
+ error (_("mi_cmd_var_update: Variable object not found"));
+
+ if (mi_version (uiout) <= 1)
+ cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
+ else
+ cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
+ varobj_update_one (var, print_values);
+ do_cleanups (cleanup);
}
return MI_CMD_DONE;
}
scope), and 1 if it succeeds. */
static int
-varobj_update_one (struct varobj *var)
+varobj_update_one (struct varobj *var, enum print_values print_values)
{
struct varobj **changelist;
struct varobj **cc;
+ struct cleanup *cleanup = NULL;
int nc;
- nc = varobj_update (var, &changelist);
+ nc = varobj_update (&var, &changelist);
/* nc == 0 means that nothing has changed.
nc == -1 means that an error occured in updating the variable.
return 1;
else if (nc == -1)
{
+ if (mi_version (uiout) > 1)
+ cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
ui_out_field_string (uiout, "name", varobj_get_objname(var));
ui_out_field_string (uiout, "in_scope", "false");
+ if (mi_version (uiout) > 1)
+ do_cleanups (cleanup);
return -1;
}
else if (nc == -2)
{
+ if (mi_version (uiout) > 1)
+ cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
ui_out_field_string (uiout, "name", varobj_get_objname (var));
ui_out_field_string (uiout, "in_scope", "true");
ui_out_field_string (uiout, "new_type", varobj_get_type(var));
ui_out_field_int (uiout, "new_num_children",
varobj_get_num_children(var));
+ if (mi_version (uiout) > 1)
+ do_cleanups (cleanup);
}
else
{
cc = changelist;
while (*cc != NULL)
{
+ if (mi_version (uiout) > 1)
+ cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
+ if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values))
+ ui_out_field_string (uiout, "value", varobj_get_value (*cc));
ui_out_field_string (uiout, "in_scope", "true");
ui_out_field_string (uiout, "type_changed", "false");
+ if (mi_version (uiout) > 1)
+ do_cleanups (cleanup);
cc++;
}
- free (changelist);
+ xfree (changelist);
return 1;
}
return 1;