Uniquefy gdb.threads/attach-into-signal.exp
[deliverable/binutils-gdb.git] / gdb / xml-support.c
index 2edc82cb2eac8d11944fb7b5922114e741138350..9756acb83558174e56053e9098958bf3a41a4c8f 100644 (file)
@@ -1,7 +1,6 @@
 /* Helper routines for parsing XML using Expat.
 
-   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 2006-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "defs.h"
 #include "gdbcmd.h"
-#include "exceptions.h"
 #include "xml-support.h"
-
-#include "gdb_string.h"
+#include "filestuff.h"
 #include "safe-ctype.h"
 
 /* Debugging flag.  */
@@ -94,7 +91,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);
     }
 
@@ -316,22 +313,22 @@ gdb_xml_start_element_wrapper (void *data, const XML_Char *name,
                               const XML_Char **attrs)
 {
   struct gdb_xml_parser *parser = data;
-  volatile struct gdb_exception ex;
 
   if (parser->error.reason < 0)
     return;
 
-  TRY_CATCH (ex, RETURN_MASK_ALL)
+  TRY
     {
       gdb_xml_start_element (data, name, attrs);
     }
-  if (ex.reason < 0)
+  CATCH (ex, RETURN_MASK_ALL)
     {
       parser->error = ex;
 #ifdef HAVE_XML_STOPPARSER
       XML_StopParser (parser->expat_parser, XML_FALSE);
 #endif
     }
+  END_CATCH
 }
 
 /* Handle the end of an element.  DATA is our local XML parser, and
@@ -399,22 +396,22 @@ static void
 gdb_xml_end_element_wrapper (void *data, const XML_Char *name)
 {
   struct gdb_xml_parser *parser = data;
-  volatile struct gdb_exception ex;
 
   if (parser->error.reason < 0)
     return;
 
-  TRY_CATCH (ex, RETURN_MASK_ALL)
+  TRY
     {
       gdb_xml_end_element (data, name);
     }
-  if (ex.reason < 0)
+  CATCH (ex, RETURN_MASK_ALL)
     {
       parser->error = ex;
 #ifdef HAVE_XML_STOPPARSER
       XML_StopParser (parser->expat_parser, XML_FALSE);
 #endif
     }
+  END_CATCH
 }
 
 /* Free a parser and all its associated state.  */
@@ -440,20 +437,21 @@ 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.  */
 
-static struct gdb_xml_parser *
-gdb_xml_create_parser_and_cleanup_1 (const char *name,
-                                    const struct gdb_xml_element *elements,
-                                    void *user_data, struct cleanup **old_chain)
+static struct cleanup *
+gdb_xml_create_parser_and_cleanup (const char *name,
+                                  const struct gdb_xml_element *elements,
+                                  void *user_data,
+                                  struct gdb_xml_parser **parser_result)
 {
   struct gdb_xml_parser *parser;
   struct scope_level start_scope;
-  struct cleanup *dummy;
+  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)
     {
@@ -476,25 +474,8 @@ gdb_xml_create_parser_and_cleanup_1 (const char *name,
   start_scope.elements = elements;
   VEC_safe_push (scope_level_s, parser->scopes, &start_scope);
 
-  if (old_chain == NULL)
-    old_chain = &dummy;
-
-  *old_chain = make_cleanup (gdb_xml_cleanup, parser);
-  return parser;
-}
-
-/* Initialize and return a parser.  Register a cleanup to destroy the
-   parser.  */
-
-struct gdb_xml_parser *
-gdb_xml_create_parser_and_cleanup (const char *name,
-                                  const struct gdb_xml_element *elements,
-                                  void *user_data)
-{
-  struct cleanup *old_chain;
-
-  return gdb_xml_create_parser_and_cleanup_1 (name, elements, user_data,
-                                             &old_chain);
+  *parser_result = parser;
+  return make_cleanup (gdb_xml_cleanup, parser);
 }
 
 /* External entity handler.  The only external entities we support
@@ -623,8 +604,8 @@ gdb_xml_parse_quick (const char *name, const char *dtd_name,
   struct cleanup *back_to;
   int result;
 
-  parser = gdb_xml_create_parser_and_cleanup_1 (name, elements,
-                                               user_data, &back_to);
+  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);
@@ -893,11 +874,12 @@ xml_process_xincludes (const char *name, const char *text,
   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;
@@ -1045,11 +1027,11 @@ xml_fetch_content_from_file (const char *filename, void *baton)
 
       if (fullname == NULL)
        malloc_failure (0);
-      file = fopen (fullname, FOPEN_RT);
+      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.028629 seconds and 4 git commands to generate.