Support fusion for ELFv2 stubs
[deliverable/binutils-gdb.git] / gdb / xml-support.c
index ad20d3bf954f1838bd3b06b474633f34851674e5..5062bc155f841361d8aec16066b18ab04fc72977 100644 (file)
@@ -1,6 +1,6 @@
 /* Helper routines for parsing XML using Expat.
 
-   Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -21,8 +21,9 @@
 #include "gdbcmd.h"
 #include "exceptions.h"
 #include "xml-support.h"
+#include "filestuff.h"
 
-#include "gdb_string.h"
+#include <string.h>
 #include "safe-ctype.h"
 
 /* Debugging flag.  */
@@ -93,7 +94,7 @@ gdb_xml_body_text (void *data, const XML_Char *text, int length)
 
   if (scope->body == NULL)
     {
-      scope->body = XZALLOC (struct obstack);
+      scope->body = XCNEW (struct obstack);
       obstack_init (scope->body);
     }
 
@@ -137,6 +138,22 @@ gdb_xml_error (struct gdb_xml_parser *parser, const char *format, ...)
   throw_verror (XML_PARSE_ERROR, format, ap);
 }
 
+/* Find the attribute named NAME in the set of parsed attributes
+   ATTRIBUTES.  Returns NULL if not found.  */
+
+struct gdb_xml_value *
+xml_find_attribute (VEC(gdb_xml_value_s) *attributes, const char *name)
+{
+  struct gdb_xml_value *value;
+  int ix;
+
+  for (ix = 0; VEC_iterate (gdb_xml_value_s, attributes, ix, value); ix++)
+    if (strcmp (value->name, name) == 0)
+      return value;
+
+  return NULL;
+}
+
 /* Clean up a vector of parsed attribute values.  */
 
 static void
@@ -338,7 +355,7 @@ gdb_xml_end_element (void *data, const XML_Char *name)
       gdb_xml_error (parser, _("Required element <%s> is missing"),
                     element->name);
 
-  /* Call the element processor. */
+  /* Call the element processor.  */
   if (scope->element != NULL && scope->element->end_handler)
     {
       char *body;
@@ -423,24 +440,26 @@ gdb_xml_cleanup (void *arg)
   xfree (parser);
 }
 
-/* Initialize and return a parser.  Register a cleanup to destroy the
-   parser.  */
+/* Initialize a parser and store it to *PARSER_RESULT.  Register a
+   cleanup to destroy the parser.  */
 
-struct gdb_xml_parser *
+static struct cleanup *
 gdb_xml_create_parser_and_cleanup (const char *name,
                                   const struct gdb_xml_element *elements,
-                                  void *user_data)
+                                  void *user_data,
+                                  struct gdb_xml_parser **parser_result)
 {
   struct gdb_xml_parser *parser;
   struct scope_level start_scope;
+  struct cleanup *result;
 
   /* Initialize the parser.  */
-  parser = XZALLOC (struct gdb_xml_parser);
+  parser = XCNEW (struct gdb_xml_parser);
   parser->expat_parser = XML_ParserCreateNS (NULL, '!');
   if (parser->expat_parser == NULL)
     {
       xfree (parser);
-      nomem (0);
+      malloc_failure (0);
     }
 
   parser->name = name;
@@ -458,9 +477,8 @@ gdb_xml_create_parser_and_cleanup (const char *name,
   start_scope.elements = elements;
   VEC_safe_push (scope_level_s, parser->scopes, &start_scope);
 
-  make_cleanup (gdb_xml_cleanup, parser);
-
-  return parser;
+  *parser_result = parser;
+  return make_cleanup (gdb_xml_cleanup, parser);
 }
 
 /* External entity handler.  The only external entities we support
@@ -483,7 +501,8 @@ gdb_xml_fetch_external_entity (XML_Parser expat_parser,
     {
       text = fetch_xml_builtin (parser->dtd_name);
       if (text == NULL)
-       internal_error (__FILE__, __LINE__, "could not locate built-in DTD %s",
+       internal_error (__FILE__, __LINE__,
+                       _("could not locate built-in DTD %s"),
                        parser->dtd_name);
     }
   else
@@ -528,7 +547,8 @@ gdb_xml_use_dtd (struct gdb_xml_parser *parser, const char *dtd_name)
   err = XML_UseForeignDTD (parser->expat_parser, XML_TRUE);
   if (err != XML_ERROR_NONE)
     internal_error (__FILE__, __LINE__,
-                   "XML_UseForeignDTD failed: %s", XML_ErrorString (err));
+                   _("XML_UseForeignDTD failed: %s"),
+                   XML_ErrorString (err));
 }
 
 /* Invoke PARSER on BUFFER.  BUFFER is the data to parse, which
@@ -560,6 +580,7 @@ gdb_xml_parse (struct gdb_xml_parser *parser, const char *buffer)
   else if (status == XML_STATUS_ERROR)
     {
       enum XML_Error err = XML_GetErrorCode (parser->expat_parser);
+
       error_string = XML_ErrorString (err);
     }
   else
@@ -577,6 +598,26 @@ gdb_xml_parse (struct gdb_xml_parser *parser, const char *buffer)
   return -1;
 }
 
+int
+gdb_xml_parse_quick (const char *name, const char *dtd_name,
+                    const struct gdb_xml_element *elements,
+                    const char *document, void *user_data)
+{
+  struct gdb_xml_parser *parser;
+  struct cleanup *back_to;
+  int result;
+
+  back_to = gdb_xml_create_parser_and_cleanup (name, elements,
+                                              user_data, &parser);
+  if (dtd_name != NULL)
+    gdb_xml_use_dtd (parser, dtd_name);
+  result = gdb_xml_parse (parser, document);
+
+  do_cleanups (back_to);
+
+  return result;
+}
+
 /* Parse a field VALSTR that we expect to contain an integer value.
    The integer is returned in *VALP.  The string is parsed with an
    equivalent to strtoul.
@@ -717,10 +758,9 @@ xinclude_start_include (struct gdb_xml_parser *parser,
                        void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
   struct xinclude_parsing_data *data = user_data;
-  char *href = VEC_index (gdb_xml_value_s, attributes, 0)->value;
+  char *href = xml_find_attribute (attributes, "href")->value;
   struct cleanup *back_to;
   char *text, *output;
-  int ret;
 
   gdb_xml_debug (parser, _("Processing XInclude of \"%s\""), href);
 
@@ -832,17 +872,17 @@ xml_process_xincludes (const char *name, const char *text,
                       xml_fetch_another fetcher, void *fetcher_baton,
                       int depth)
 {
-  enum XML_Error err;
   struct gdb_xml_parser *parser;
   struct xinclude_parsing_data *data;
   struct cleanup *back_to;
   char *result = NULL;
 
-  data = XZALLOC (struct xinclude_parsing_data);
+  data = XCNEW (struct xinclude_parsing_data);
   obstack_init (&data->obstack);
   back_to = make_cleanup (xml_xinclude_cleanup, data);
 
-  parser = gdb_xml_create_parser_and_cleanup (name, xinclude_elements, data);
+  gdb_xml_create_parser_and_cleanup (name, xinclude_elements,
+                                    data, &parser);
   parser->is_xinclude = 1;
 
   data->include_depth = depth;
@@ -935,68 +975,6 @@ show_debug_xml (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("XML debugging is %s.\n"), value);
 }
 
-/* Return a malloc allocated string with special characters from TEXT
-   replaced by entity references.  */
-
-char *
-xml_escape_text (const char *text)
-{
-  char *result;
-  int i, special;
-
-  /* Compute the length of the result.  */
-  for (i = 0, special = 0; text[i] != '\0'; i++)
-    switch (text[i])
-      {
-      case '\'':
-      case '\"':
-       special += 5;
-       break;
-      case '&':
-       special += 4;
-       break;
-      case '<':
-      case '>':
-       special += 3;
-       break;
-      default:
-       break;
-      }
-
-  /* Expand the result.  */
-  result = xmalloc (i + special + 1);
-  for (i = 0, special = 0; text[i] != '\0'; i++)
-    switch (text[i])
-      {
-      case '\'':
-       strcpy (result + i + special, "&apos;");
-       special += 5;
-       break;
-      case '\"':
-       strcpy (result + i + special, "&quot;");
-       special += 5;
-       break;
-      case '&':
-       strcpy (result + i + special, "&amp;");
-       special += 4;
-       break;
-      case '<':
-       strcpy (result + i + special, "&lt;");
-       special += 3;
-       break;
-      case '>':
-       strcpy (result + i + special, "&gt;");
-       special += 3;
-       break;
-      default:
-       result[i + special] = text[i];
-       break;
-      }
-  result[i + special] = '\0';
-
-  return result;
-}
-
 void
 obstack_xml_printf (struct obstack *obstack, const char *format, ...)
 {
@@ -1018,6 +996,7 @@ obstack_xml_printf (struct obstack *obstack, const char *format, ...)
              {
                char *p;
                char *a = va_arg (ap, char *);
+
                obstack_grow (obstack, prev, f - prev - 1);
                p = xml_escape_text (a);
                obstack_grow_str (obstack, p);
@@ -1048,13 +1027,14 @@ xml_fetch_content_from_file (const char *filename, void *baton)
   if (dirname && *dirname)
     {
       char *fullname = concat (dirname, "/", filename, (char *) NULL);
+
       if (fullname == NULL)
-       nomem (0);
-      file = fopen (fullname, FOPEN_RT);
+       malloc_failure (0);
+      file = gdb_fopen_cloexec (fullname, FOPEN_RT);
       xfree (fullname);
     }
   else
-    file = fopen (filename, FOPEN_RT);
+    file = gdb_fopen_cloexec (filename, FOPEN_RT);
 
   if (file == NULL)
     return NULL;
This page took 0.027136 seconds and 4 git commands to generate.