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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [osdata.c] - Blame information for rev 853

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Routines for handling XML generic OS data provided by target.
2
 
3
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
4
 
5
   This file is part of GDB.
6
 
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 3 of the License, or
10
   (at your option) any later version.
11
 
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.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
 
20
#include "defs.h"
21
#include "target.h"
22
#include "vec.h"
23
#include "xml-support.h"
24
#include "osdata.h"
25
#include "gdb_string.h"
26
#include "ui-out.h"
27
#include "gdbcmd.h"
28
 
29
#if !defined(HAVE_LIBEXPAT)
30
 
31
struct osdata *
32
osdata_parse (const char *xml)
33
{
34
  static int have_warned;
35
 
36
  if (!have_warned)
37
    {
38
      have_warned = 1;
39
      warning (_("Can not parse XML OS data; XML support was disabled "
40
                "at compile time"));
41
    }
42
 
43
  return NULL;
44
}
45
 
46
#else /* HAVE_LIBEXPAT */
47
 
48
#include "xml-support.h"
49
 
50
/* Internal parsing data passed to all XML callbacks.  */
51
struct osdata_parsing_data
52
  {
53
    struct osdata *osdata;
54
    char *property_name;
55
  };
56
 
57
/* Handle the start of a <osdata> element.  */
58
 
59
static void
60
osdata_start_osdata (struct gdb_xml_parser *parser,
61
                        const struct gdb_xml_element *element,
62
                        void *user_data, VEC(gdb_xml_value_s) *attributes)
63
{
64
  struct osdata_parsing_data *data = user_data;
65
  char *type;
66
  struct osdata *osdata;
67
 
68
  if (data->osdata)
69
    gdb_xml_error (parser, _("Seen more than on osdata element"));
70
 
71
  type = VEC_index (gdb_xml_value_s, attributes, 0)->value;
72
  osdata = XZALLOC (struct osdata);
73
  osdata->type = xstrdup (type);
74
  data->osdata = osdata;
75
}
76
 
77
/* Handle the start of a <item> element.  */
78
 
79
static void
80
osdata_start_item (struct gdb_xml_parser *parser,
81
                  const struct gdb_xml_element *element,
82
                  void *user_data, VEC(gdb_xml_value_s) *attributes)
83
{
84
  struct osdata_parsing_data *data = user_data;
85
  struct osdata_item item = { NULL };
86
 
87
  VEC_safe_push (osdata_item_s, data->osdata->items, &item);
88
}
89
 
90
/* Handle the start of a <column> element.  */
91
 
92
static void
93
osdata_start_column (struct gdb_xml_parser *parser,
94
                    const struct gdb_xml_element *element,
95
                    void *user_data, VEC(gdb_xml_value_s) *attributes)
96
{
97
  struct osdata_parsing_data *data = user_data;
98
  const char *name = VEC_index (gdb_xml_value_s, attributes, 0)->value;
99
 
100
  data->property_name = xstrdup (name);
101
}
102
 
103
/* Handle the end of a <column> element.  */
104
 
105
static void
106
osdata_end_column (struct gdb_xml_parser *parser,
107
                  const struct gdb_xml_element *element,
108
                  void *user_data, const char *body_text)
109
{
110
  struct osdata_parsing_data *data = user_data;
111
  struct osdata *osdata = data->osdata;
112
  struct osdata_item *item = VEC_last (osdata_item_s, osdata->items);
113
  struct osdata_column *col = VEC_safe_push (osdata_column_s,
114
                                            item->columns, NULL);
115
 
116
  /* Transfer memory ownership.  NAME was already strdup'ed.  */
117
  col->name = data->property_name;
118
  col->value = xstrdup (body_text);
119
  data->property_name = NULL;
120
}
121
 
122
/* Discard the constructed osdata (if an error occurs).  */
123
 
124
static void
125
clear_parsing_data (void *p)
126
{
127
  struct osdata_parsing_data *data = p;
128
 
129
  osdata_free (data->osdata);
130
  data->osdata = NULL;
131
  xfree (data->property_name);
132
  data->property_name = NULL;
133
}
134
 
135
/* The allowed elements and attributes for OS data object.
136
   The root element is a <osdata>.  */
137
 
138
const struct gdb_xml_attribute column_attributes[] = {
139
  { "name", GDB_XML_AF_NONE, NULL, NULL },
140
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
141
};
142
 
143
const struct gdb_xml_element item_children[] = {
144
  { "column", column_attributes, NULL,
145
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
146
    osdata_start_column, osdata_end_column },
147
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
148
};
149
 
150
const struct gdb_xml_attribute osdata_attributes[] = {
151
  { "type", GDB_XML_AF_NONE, NULL, NULL },
152
  { NULL, GDB_XML_AF_NONE, NULL, NULL }
153
};
154
 
155
const struct gdb_xml_element osdata_children[] = {
156
  { "item", NULL, item_children,
157
    GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
158
    osdata_start_item, NULL },
159
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
160
};
161
 
162
const struct gdb_xml_element osdata_elements[] = {
163
  { "osdata", osdata_attributes, osdata_children,
164
    GDB_XML_EF_NONE, osdata_start_osdata, NULL },
165
  { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
166
};
167
 
168
struct osdata *
169
osdata_parse (const char *xml)
170
{
171
  struct gdb_xml_parser *parser;
172
  struct cleanup *before_deleting_result, *back_to;
173
  struct osdata_parsing_data data = { NULL };
174
 
175
  back_to = make_cleanup (null_cleanup, NULL);
176
  parser = gdb_xml_create_parser_and_cleanup (_("osdata"),
177
                                             osdata_elements, &data);
178
  gdb_xml_use_dtd (parser, "osdata.dtd");
179
 
180
  before_deleting_result = make_cleanup (clear_parsing_data, &data);
181
 
182
  if (gdb_xml_parse (parser, xml) == 0)
183
    /* Parsed successfully, don't need to delete the result.  */
184
    discard_cleanups (before_deleting_result);
185
 
186
  do_cleanups (back_to);
187
  return data.osdata;
188
}
189
#endif
190
 
191
static void
192
osdata_item_clear (struct osdata_item *item)
193
{
194
  if (item->columns != NULL)
195
    {
196
      struct osdata_column *col;
197
      int ix;
198
 
199
      for (ix = 0;
200
           VEC_iterate (osdata_column_s, item->columns,
201
                        ix, col);
202
           ix++)
203
       {
204
         xfree (col->name);
205
         xfree (col->value);
206
       }
207
      VEC_free (osdata_column_s, item->columns);
208
      item->columns = NULL;
209
    }
210
}
211
 
212
void
213
osdata_free (struct osdata *osdata)
214
{
215
  if (osdata == NULL)
216
    return;
217
 
218
  if (osdata->items != NULL)
219
    {
220
      struct osdata_item *item;
221
      int ix;
222
 
223
      for (ix = 0;
224
          VEC_iterate (osdata_item_s, osdata->items,
225
                       ix, item);
226
          ix++)
227
       osdata_item_clear (item);
228
      VEC_free (osdata_item_s, osdata->items);
229
    }
230
 
231
  xfree (osdata);
232
}
233
 
234
static void
235
osdata_free_cleanup (void *arg)
236
{
237
  struct osdata *osdata = arg;
238
 
239
  osdata_free (osdata);
240
}
241
 
242
struct cleanup *
243
make_cleanup_osdata_free (struct osdata *data)
244
{
245
  return make_cleanup (osdata_free_cleanup, data);
246
}
247
 
248
struct osdata *
249
get_osdata (const char *type)
250
{
251
  struct osdata *osdata = NULL;
252
  char *xml = target_get_osdata (type);
253
 
254
  if (xml)
255
    {
256
      struct cleanup *old_chain = make_cleanup (xfree, xml);
257
 
258
      if (xml[0] == '\0')
259
        {
260
          if (type)
261
            warning (_("Empty data returned by target.  Wrong osdata type?"));
262
          else
263
            warning (_("Empty type list returned by target.  No type data?"));
264
        }
265
      else
266
        osdata = osdata_parse (xml);
267
 
268
      do_cleanups (old_chain);
269
    }
270
 
271
  if (!osdata)
272
    error (_("Can not fetch data now.\n"));
273
 
274
  return osdata;
275
}
276
 
277
const char *
278
get_osdata_column (struct osdata_item *item, const char *name)
279
{
280
  struct osdata_column *col;
281
  int ix_cols;
282
 
283
  for (ix_cols = 0;
284
       VEC_iterate (osdata_column_s, item->columns,
285
                    ix_cols, col);
286
       ix_cols++)
287
    if (strcmp (col->name, name) == 0)
288
      return col->value;
289
 
290
  return NULL;
291
}
292
 
293
static void
294
info_osdata_command (char *type, int from_tty)
295
{
296
  struct osdata *osdata = NULL;
297
  struct osdata_item *last;
298
  struct cleanup *old_chain;
299
  int ncols;
300
  int nprocs;
301
 
302
  osdata = get_osdata (type);
303
  old_chain = make_cleanup_osdata_free (osdata);
304
 
305
  nprocs = VEC_length (osdata_item_s, osdata->items);
306
 
307
  if (!type && nprocs == 0)
308
    error (_("Available types of OS data not reported."));
309
 
310
  last = VEC_last (osdata_item_s, osdata->items);
311
  if (last && last->columns)
312
    ncols = VEC_length (osdata_column_s, last->columns);
313
  else
314
    ncols = 0;
315
 
316
  make_cleanup_ui_out_table_begin_end (uiout, ncols, nprocs,
317
                                       "OSDataTable");
318
 
319
  if (last && last->columns)
320
    {
321
      struct osdata_column *col;
322
      int ix;
323
 
324
      for (ix = 0;
325
          VEC_iterate (osdata_column_s, last->columns,
326
                       ix, col);
327
          ix++)
328
       ui_out_table_header (uiout, 10, ui_left,
329
                            col->name, col->name);
330
    }
331
 
332
  ui_out_table_body (uiout);
333
 
334
  if (nprocs != 0)
335
    {
336
      struct osdata_item *item;
337
      int ix_items;
338
 
339
      for (ix_items = 0;
340
          VEC_iterate (osdata_item_s, osdata->items,
341
                       ix_items, item);
342
          ix_items++)
343
       {
344
         struct cleanup *old_chain;
345
         struct ui_stream *stb;
346
         int ix_cols;
347
         struct osdata_column *col;
348
 
349
         stb = ui_out_stream_new (uiout);
350
         old_chain = make_cleanup_ui_out_stream_delete (stb);
351
         make_cleanup_ui_out_tuple_begin_end (uiout, "item");
352
 
353
         for (ix_cols = 0;
354
              VEC_iterate (osdata_column_s, item->columns,
355
                           ix_cols, col);
356
              ix_cols++)
357
           ui_out_field_string (uiout, col->name, col->value);
358
 
359
         do_cleanups (old_chain);
360
 
361
         ui_out_text (uiout, "\n");
362
       }
363
    }
364
 
365
  do_cleanups (old_chain);
366
}
367
 
368
extern initialize_file_ftype _initialize_osdata; /* -Wmissing-prototypes */
369
 
370
void
371
_initialize_osdata (void)
372
{
373
  add_info ("os", info_osdata_command,
374
           _("Show OS data ARG."));
375
}

powered by: WebSVN 2.1.0

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