/* Routines for handling XML generic OS data provided by target.
- Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
This file is part of GDB.
if (data->osdata)
gdb_xml_error (parser, _("Seen more than on osdata element"));
- type = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+ type = xml_find_attribute (attributes, "type")->value;
osdata = XZALLOC (struct osdata);
osdata->type = xstrdup (type);
data->osdata = osdata;
{
struct osdata_parsing_data *data = user_data;
struct osdata_item item = { NULL };
+
VEC_safe_push (osdata_item_s, data->osdata->items, &item);
}
void *user_data, VEC(gdb_xml_value_s) *attributes)
{
struct osdata_parsing_data *data = user_data;
- const char *name = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+ const char *name = xml_find_attribute (attributes, "name")->value;
+
data->property_name = xstrdup (name);
}
clear_parsing_data (void *p)
{
struct osdata_parsing_data *data = p;
+
osdata_free (data->osdata);
data->osdata = NULL;
xfree (data->property_name);
struct osdata *
osdata_parse (const char *xml)
{
- struct gdb_xml_parser *parser;
- struct cleanup *before_deleting_result, *back_to;
+ struct cleanup *back_to;
struct osdata_parsing_data data = { NULL };
- back_to = make_cleanup (null_cleanup, NULL);
- parser = gdb_xml_create_parser_and_cleanup (_("osdata"),
- osdata_elements, &data);
- gdb_xml_use_dtd (parser, "osdata.dtd");
-
- before_deleting_result = make_cleanup (clear_parsing_data, &data);
+ back_to = make_cleanup (clear_parsing_data, &data);
- if (gdb_xml_parse (parser, xml) == 0)
- /* Parsed successfully, don't need to delete the result. */
- discard_cleanups (before_deleting_result);
+ if (gdb_xml_parse_quick (_("osdata"), "osdata.dtd",
+ osdata_elements, xml, &data) == 0)
+ {
+ /* Parsed successfully, don't need to delete the result. */
+ discard_cleanups (back_to);
+ return data.osdata;
+ }
do_cleanups (back_to);
- return data.osdata;
+ return NULL;
}
#endif
{
struct osdata_column *col;
int ix;
+
for (ix = 0;
VEC_iterate (osdata_column_s, item->columns,
ix, col);
{
struct osdata_item *item;
int ix;
+
for (ix = 0;
VEC_iterate (osdata_item_s, osdata->items,
ix, item);
osdata_free_cleanup (void *arg)
{
struct osdata *osdata = arg;
+
osdata_free (osdata);
}
{
struct osdata *osdata = NULL;
char *xml = target_get_osdata (type);
+
if (xml)
{
struct cleanup *old_chain = make_cleanup (xfree, xml);
if (xml[0] == '\0')
- warning (_("Empty data returned by target. Wrong osdata type?"));
+ {
+ if (type)
+ warning (_("Empty data returned by target. Wrong osdata type?"));
+ else
+ warning (_("Empty type list returned by target. No type data?"));
+ }
else
osdata = osdata_parse (xml);
}
if (!osdata)
- error (_("Can not fetch data now.\n"));
+ error (_("Can not fetch data now."));
return osdata;
}
static void
info_osdata_command (char *type, int from_tty)
{
+ struct ui_out *uiout = current_uiout;
struct osdata *osdata = NULL;
struct osdata_item *last;
struct cleanup *old_chain;
int ncols;
int nprocs;
- if (type == 0)
- /* TODO: No type could mean "list availables types". */
- error (_("Argument required."));
-
osdata = get_osdata (type);
old_chain = make_cleanup_osdata_free (osdata);
nprocs = VEC_length (osdata_item_s, osdata->items);
+ if (!type && nprocs == 0)
+ error (_("Available types of OS data not reported."));
+
last = VEC_last (osdata_item_s, osdata->items);
if (last && last->columns)
ncols = VEC_length (osdata_column_s, last->columns);
{
struct osdata_column *col;
int ix;
+
for (ix = 0;
VEC_iterate (osdata_column_s, last->columns,
ix, col);
{
struct osdata_item *item;
int ix_items;
+
for (ix_items = 0;
VEC_iterate (osdata_item_s, osdata->items,
ix_items, item);