OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [osdata.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Routines for handling XML generic OS data provided by target.
/* Routines for handling XML generic OS data provided by target.
 
 
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include "target.h"
#include "target.h"
#include "vec.h"
#include "vec.h"
#include "xml-support.h"
#include "xml-support.h"
#include "osdata.h"
#include "osdata.h"
#include "gdb_string.h"
#include "gdb_string.h"
#include "ui-out.h"
#include "ui-out.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
 
 
#if !defined(HAVE_LIBEXPAT)
#if !defined(HAVE_LIBEXPAT)
 
 
struct osdata *
struct osdata *
osdata_parse (const char *xml)
osdata_parse (const char *xml)
{
{
  static int have_warned;
  static int have_warned;
 
 
  if (!have_warned)
  if (!have_warned)
    {
    {
      have_warned = 1;
      have_warned = 1;
      warning (_("Can not parse XML OS data; XML support was disabled "
      warning (_("Can not parse XML OS data; XML support was disabled "
                "at compile time"));
                "at compile time"));
    }
    }
 
 
  return NULL;
  return NULL;
}
}
 
 
#else /* HAVE_LIBEXPAT */
#else /* HAVE_LIBEXPAT */
 
 
#include "xml-support.h"
#include "xml-support.h"
 
 
/* Internal parsing data passed to all XML callbacks.  */
/* Internal parsing data passed to all XML callbacks.  */
struct osdata_parsing_data
struct osdata_parsing_data
  {
  {
    struct osdata *osdata;
    struct osdata *osdata;
    char *property_name;
    char *property_name;
  };
  };
 
 
/* Handle the start of a <osdata> element.  */
/* Handle the start of a <osdata> element.  */
 
 
static void
static void
osdata_start_osdata (struct gdb_xml_parser *parser,
osdata_start_osdata (struct gdb_xml_parser *parser,
                        const struct gdb_xml_element *element,
                        const struct gdb_xml_element *element,
                        void *user_data, VEC(gdb_xml_value_s) *attributes)
                        void *user_data, VEC(gdb_xml_value_s) *attributes)
{
{
  struct osdata_parsing_data *data = user_data;
  struct osdata_parsing_data *data = user_data;
  char *type;
  char *type;
  struct osdata *osdata;
  struct osdata *osdata;
 
 
  if (data->osdata)
  if (data->osdata)
    gdb_xml_error (parser, _("Seen more than on osdata element"));
    gdb_xml_error (parser, _("Seen more than on osdata element"));
 
 
  type = VEC_index (gdb_xml_value_s, attributes, 0)->value;
  type = VEC_index (gdb_xml_value_s, attributes, 0)->value;
  osdata = XZALLOC (struct osdata);
  osdata = XZALLOC (struct osdata);
  osdata->type = xstrdup (type);
  osdata->type = xstrdup (type);
  data->osdata = osdata;
  data->osdata = osdata;
}
}
 
 
/* Handle the start of a <item> element.  */
/* Handle the start of a <item> element.  */
 
 
static void
static void
osdata_start_item (struct gdb_xml_parser *parser,
osdata_start_item (struct gdb_xml_parser *parser,
                  const struct gdb_xml_element *element,
                  const struct gdb_xml_element *element,
                  void *user_data, VEC(gdb_xml_value_s) *attributes)
                  void *user_data, VEC(gdb_xml_value_s) *attributes)
{
{
  struct osdata_parsing_data *data = user_data;
  struct osdata_parsing_data *data = user_data;
  struct osdata_item item = { NULL };
  struct osdata_item item = { NULL };
  VEC_safe_push (osdata_item_s, data->osdata->items, &item);
  VEC_safe_push (osdata_item_s, data->osdata->items, &item);
}
}
 
 
/* Handle the start of a <column> element.  */
/* Handle the start of a <column> element.  */
 
 
static void
static void
osdata_start_column (struct gdb_xml_parser *parser,
osdata_start_column (struct gdb_xml_parser *parser,
                    const struct gdb_xml_element *element,
                    const struct gdb_xml_element *element,
                    void *user_data, VEC(gdb_xml_value_s) *attributes)
                    void *user_data, VEC(gdb_xml_value_s) *attributes)
{
{
  struct osdata_parsing_data *data = user_data;
  struct osdata_parsing_data *data = user_data;
  const char *name = VEC_index (gdb_xml_value_s, attributes, 0)->value;
  const char *name = VEC_index (gdb_xml_value_s, attributes, 0)->value;
  data->property_name = xstrdup (name);
  data->property_name = xstrdup (name);
}
}
 
 
/* Handle the end of a <column> element.  */
/* Handle the end of a <column> element.  */
 
 
static void
static void
osdata_end_column (struct gdb_xml_parser *parser,
osdata_end_column (struct gdb_xml_parser *parser,
                  const struct gdb_xml_element *element,
                  const struct gdb_xml_element *element,
                  void *user_data, const char *body_text)
                  void *user_data, const char *body_text)
{
{
  struct osdata_parsing_data *data = user_data;
  struct osdata_parsing_data *data = user_data;
  struct osdata *osdata = data->osdata;
  struct osdata *osdata = data->osdata;
  struct osdata_item *item = VEC_last (osdata_item_s, osdata->items);
  struct osdata_item *item = VEC_last (osdata_item_s, osdata->items);
  struct osdata_column *col = VEC_safe_push (osdata_column_s,
  struct osdata_column *col = VEC_safe_push (osdata_column_s,
                                            item->columns, NULL);
                                            item->columns, NULL);
 
 
  /* Transfer memory ownership.  NAME was already strdup'ed.  */
  /* Transfer memory ownership.  NAME was already strdup'ed.  */
  col->name = data->property_name;
  col->name = data->property_name;
  col->value = xstrdup (body_text);
  col->value = xstrdup (body_text);
  data->property_name = NULL;
  data->property_name = NULL;
}
}
 
 
/* Discard the constructed osdata (if an error occurs).  */
/* Discard the constructed osdata (if an error occurs).  */
 
 
static void
static void
clear_parsing_data (void *p)
clear_parsing_data (void *p)
{
{
  struct osdata_parsing_data *data = p;
  struct osdata_parsing_data *data = p;
  osdata_free (data->osdata);
  osdata_free (data->osdata);
  data->osdata = NULL;
  data->osdata = NULL;
  xfree (data->property_name);
  xfree (data->property_name);
  data->property_name = NULL;
  data->property_name = NULL;
}
}
 
 
/* The allowed elements and attributes for OS data object.
/* The allowed elements and attributes for OS data object.
   The root element is a <osdata>.  */
   The root element is a <osdata>.  */
 
 
const struct gdb_xml_attribute column_attributes[] = {
const struct gdb_xml_attribute column_attributes[] = {
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { "name", GDB_XML_AF_NONE, NULL, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};
};
 
 
const struct gdb_xml_element item_children[] = {
const struct gdb_xml_element item_children[] = {
  { "column", column_attributes, NULL,
  { "column", column_attributes, NULL,
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
    osdata_start_column, osdata_end_column },
    osdata_start_column, osdata_end_column },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};
};
 
 
const struct gdb_xml_attribute osdata_attributes[] = {
const struct gdb_xml_attribute osdata_attributes[] = {
  { "type", GDB_XML_AF_NONE, NULL, NULL },
  { "type", GDB_XML_AF_NONE, NULL, NULL },
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
};
};
 
 
const struct gdb_xml_element osdata_children[] = {
const struct gdb_xml_element osdata_children[] = {
  { "item", NULL, item_children,
  { "item", NULL, item_children,
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
    osdata_start_item, NULL },
    osdata_start_item, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};
};
 
 
const struct gdb_xml_element osdata_elements[] = {
const struct gdb_xml_element osdata_elements[] = {
  { "osdata", osdata_attributes, osdata_children,
  { "osdata", osdata_attributes, osdata_children,
    GDB_XML_EF_NONE, osdata_start_osdata, NULL },
    GDB_XML_EF_NONE, osdata_start_osdata, NULL },
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
};
};
 
 
struct osdata *
struct osdata *
osdata_parse (const char *xml)
osdata_parse (const char *xml)
{
{
  struct gdb_xml_parser *parser;
  struct gdb_xml_parser *parser;
  struct cleanup *before_deleting_result, *back_to;
  struct cleanup *before_deleting_result, *back_to;
  struct osdata_parsing_data data = { NULL };
  struct osdata_parsing_data data = { NULL };
 
 
  back_to = make_cleanup (null_cleanup, NULL);
  back_to = make_cleanup (null_cleanup, NULL);
  parser = gdb_xml_create_parser_and_cleanup (_("osdata"),
  parser = gdb_xml_create_parser_and_cleanup (_("osdata"),
                                             osdata_elements, &data);
                                             osdata_elements, &data);
  gdb_xml_use_dtd (parser, "osdata.dtd");
  gdb_xml_use_dtd (parser, "osdata.dtd");
 
 
  before_deleting_result = make_cleanup (clear_parsing_data, &data);
  before_deleting_result = make_cleanup (clear_parsing_data, &data);
 
 
  if (gdb_xml_parse (parser, xml) == 0)
  if (gdb_xml_parse (parser, xml) == 0)
    /* Parsed successfully, don't need to delete the result.  */
    /* Parsed successfully, don't need to delete the result.  */
    discard_cleanups (before_deleting_result);
    discard_cleanups (before_deleting_result);
 
 
  do_cleanups (back_to);
  do_cleanups (back_to);
  return data.osdata;
  return data.osdata;
}
}
#endif
#endif
 
 
static void
static void
osdata_item_clear (struct osdata_item *item)
osdata_item_clear (struct osdata_item *item)
{
{
  if (item->columns != NULL)
  if (item->columns != NULL)
    {
    {
      struct osdata_column *col;
      struct osdata_column *col;
      int ix;
      int ix;
      for (ix = 0;
      for (ix = 0;
           VEC_iterate (osdata_column_s, item->columns,
           VEC_iterate (osdata_column_s, item->columns,
                        ix, col);
                        ix, col);
           ix++)
           ix++)
       {
       {
         xfree (col->name);
         xfree (col->name);
         xfree (col->value);
         xfree (col->value);
       }
       }
      VEC_free (osdata_column_s, item->columns);
      VEC_free (osdata_column_s, item->columns);
      item->columns = NULL;
      item->columns = NULL;
    }
    }
}
}
 
 
void
void
osdata_free (struct osdata *osdata)
osdata_free (struct osdata *osdata)
{
{
  if (osdata == NULL)
  if (osdata == NULL)
    return;
    return;
 
 
  if (osdata->items != NULL)
  if (osdata->items != NULL)
    {
    {
      struct osdata_item *item;
      struct osdata_item *item;
      int ix;
      int ix;
      for (ix = 0;
      for (ix = 0;
          VEC_iterate (osdata_item_s, osdata->items,
          VEC_iterate (osdata_item_s, osdata->items,
                       ix, item);
                       ix, item);
          ix++)
          ix++)
       osdata_item_clear (item);
       osdata_item_clear (item);
      VEC_free (osdata_item_s, osdata->items);
      VEC_free (osdata_item_s, osdata->items);
    }
    }
 
 
  xfree (osdata);
  xfree (osdata);
}
}
 
 
static void
static void
osdata_free_cleanup (void *arg)
osdata_free_cleanup (void *arg)
{
{
  struct osdata *osdata = arg;
  struct osdata *osdata = arg;
  osdata_free (osdata);
  osdata_free (osdata);
}
}
 
 
struct cleanup *
struct cleanup *
make_cleanup_osdata_free (struct osdata *data)
make_cleanup_osdata_free (struct osdata *data)
{
{
  return make_cleanup (osdata_free_cleanup, data);
  return make_cleanup (osdata_free_cleanup, data);
}
}
 
 
struct osdata *
struct osdata *
get_osdata (const char *type)
get_osdata (const char *type)
{
{
  struct osdata *osdata = NULL;
  struct osdata *osdata = NULL;
  char *xml = target_get_osdata (type);
  char *xml = target_get_osdata (type);
  if (xml)
  if (xml)
    {
    {
      struct cleanup *old_chain = make_cleanup (xfree, xml);
      struct cleanup *old_chain = make_cleanup (xfree, xml);
 
 
      if (xml[0] == '\0')
      if (xml[0] == '\0')
        warning (_("Empty data returned by target.  Wrong osdata type?"));
        warning (_("Empty data returned by target.  Wrong osdata type?"));
      else
      else
        osdata = osdata_parse (xml);
        osdata = osdata_parse (xml);
 
 
      do_cleanups (old_chain);
      do_cleanups (old_chain);
    }
    }
 
 
  if (!osdata)
  if (!osdata)
    error (_("Can not fetch data now.\n"));
    error (_("Can not fetch data now.\n"));
 
 
  return osdata;
  return osdata;
}
}
 
 
const char *
const char *
get_osdata_column (struct osdata_item *item, const char *name)
get_osdata_column (struct osdata_item *item, const char *name)
{
{
  struct osdata_column *col;
  struct osdata_column *col;
  int ix_cols;
  int ix_cols;
 
 
  for (ix_cols = 0;
  for (ix_cols = 0;
       VEC_iterate (osdata_column_s, item->columns,
       VEC_iterate (osdata_column_s, item->columns,
                    ix_cols, col);
                    ix_cols, col);
       ix_cols++)
       ix_cols++)
    if (strcmp (col->name, name) == 0)
    if (strcmp (col->name, name) == 0)
      return col->value;
      return col->value;
 
 
  return NULL;
  return NULL;
}
}
 
 
static void
static void
info_osdata_command (char *type, int from_tty)
info_osdata_command (char *type, int from_tty)
{
{
  struct osdata *osdata = NULL;
  struct osdata *osdata = NULL;
  struct osdata_item *last;
  struct osdata_item *last;
  struct cleanup *old_chain;
  struct cleanup *old_chain;
  int ncols;
  int ncols;
  int nprocs;
  int nprocs;
 
 
  if (type == 0)
  if (type == 0)
    /* TODO: No type could mean "list availables types".  */
    /* TODO: No type could mean "list availables types".  */
    error (_("Argument required."));
    error (_("Argument required."));
 
 
  osdata = get_osdata (type);
  osdata = get_osdata (type);
  old_chain = make_cleanup_osdata_free (osdata);
  old_chain = make_cleanup_osdata_free (osdata);
 
 
  nprocs = VEC_length (osdata_item_s, osdata->items);
  nprocs = VEC_length (osdata_item_s, osdata->items);
 
 
  last = VEC_last (osdata_item_s, osdata->items);
  last = VEC_last (osdata_item_s, osdata->items);
  if (last && last->columns)
  if (last && last->columns)
    ncols = VEC_length (osdata_column_s, last->columns);
    ncols = VEC_length (osdata_column_s, last->columns);
  else
  else
    ncols = 0;
    ncols = 0;
 
 
  make_cleanup_ui_out_table_begin_end (uiout, ncols, nprocs,
  make_cleanup_ui_out_table_begin_end (uiout, ncols, nprocs,
                                       "OSDataTable");
                                       "OSDataTable");
 
 
  if (last && last->columns)
  if (last && last->columns)
    {
    {
      struct osdata_column *col;
      struct osdata_column *col;
      int ix;
      int ix;
      for (ix = 0;
      for (ix = 0;
          VEC_iterate (osdata_column_s, last->columns,
          VEC_iterate (osdata_column_s, last->columns,
                       ix, col);
                       ix, col);
          ix++)
          ix++)
       ui_out_table_header (uiout, 10, ui_left,
       ui_out_table_header (uiout, 10, ui_left,
                            col->name, col->name);
                            col->name, col->name);
    }
    }
 
 
  ui_out_table_body (uiout);
  ui_out_table_body (uiout);
 
 
  if (nprocs != 0)
  if (nprocs != 0)
    {
    {
      struct osdata_item *item;
      struct osdata_item *item;
      int ix_items;
      int ix_items;
      for (ix_items = 0;
      for (ix_items = 0;
          VEC_iterate (osdata_item_s, osdata->items,
          VEC_iterate (osdata_item_s, osdata->items,
                       ix_items, item);
                       ix_items, item);
          ix_items++)
          ix_items++)
       {
       {
         struct cleanup *old_chain;
         struct cleanup *old_chain;
         struct ui_stream *stb;
         struct ui_stream *stb;
         int ix_cols;
         int ix_cols;
         struct osdata_column *col;
         struct osdata_column *col;
 
 
         stb = ui_out_stream_new (uiout);
         stb = ui_out_stream_new (uiout);
         old_chain = make_cleanup_ui_out_stream_delete (stb);
         old_chain = make_cleanup_ui_out_stream_delete (stb);
         make_cleanup_ui_out_tuple_begin_end (uiout, "item");
         make_cleanup_ui_out_tuple_begin_end (uiout, "item");
 
 
         for (ix_cols = 0;
         for (ix_cols = 0;
              VEC_iterate (osdata_column_s, item->columns,
              VEC_iterate (osdata_column_s, item->columns,
                           ix_cols, col);
                           ix_cols, col);
              ix_cols++)
              ix_cols++)
           ui_out_field_string (uiout, col->name, col->value);
           ui_out_field_string (uiout, col->name, col->value);
 
 
         do_cleanups (old_chain);
         do_cleanups (old_chain);
 
 
         ui_out_text (uiout, "\n");
         ui_out_text (uiout, "\n");
       }
       }
    }
    }
 
 
  do_cleanups (old_chain);
  do_cleanups (old_chain);
}
}
 
 
extern initialize_file_ftype _initialize_osdata; /* -Wmissing-prototypes */
extern initialize_file_ftype _initialize_osdata; /* -Wmissing-prototypes */
 
 
void
void
_initialize_osdata (void)
_initialize_osdata (void)
{
{
  add_info ("os", info_osdata_command,
  add_info ("os", info_osdata_command,
           _("Show OS data ARG."));
           _("Show OS data ARG."));
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.