X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fxml-support.c;h=ae727da03b360d0039c1f4fa70fd31fcb1f8a816;hb=3017b94d60f1e8929886be6992547973ad354f4c;hp=1f53d7af54c48af9d37da669f21d0186e2a43b67;hpb=2edf834e298b15c882678db22e86745f701807fa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xml-support.c b/gdb/xml-support.c index 1f53d7af54..ae727da03b 100644 --- a/gdb/xml-support.c +++ b/gdb/xml-support.c @@ -1,6 +1,6 @@ /* Helper routines for parsing XML using Expat. - Copyright (C) 2006-2017 Free Software Foundation, Inc. + Copyright (C) 2006-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -20,7 +20,7 @@ #include "defs.h" #include "gdbcmd.h" #include "xml-support.h" -#include "filestuff.h" +#include "common/filestuff.h" #include "safe-ctype.h" #include #include @@ -113,9 +113,9 @@ struct gdb_xml_parser { m_is_xinclude = is_xinclude; } /* A thrown error, if any. */ - void set_error (gdb_exception error) + void set_error (gdb_exception &&error) { - m_error = error; + m_error = std::move (error); #ifdef HAVE_XML_STOPPARSER XML_StopParser (m_expat_parser, XML_FALSE); #endif @@ -179,16 +179,14 @@ void gdb_xml_parser::vdebug (const char *format, va_list ap) { int line = XML_GetCurrentLineNumber (m_expat_parser); - char *message; - message = xstrvprintf (format, ap); + std::string message = string_vprintf (format, ap); if (line) fprintf_unfiltered (gdb_stderr, "%s (line %d): %s\n", - m_name, line, message); + m_name, line, message.c_str ()); else fprintf_unfiltered (gdb_stderr, "%s: %s\n", - m_name, message); - xfree (message); + m_name, message.c_str ()); } void @@ -228,32 +226,16 @@ gdb_xml_error (struct gdb_xml_parser *parser, const char *format, ...) ATTRIBUTES. Returns NULL if not found. */ struct gdb_xml_value * -xml_find_attribute (VEC(gdb_xml_value_s) *attributes, const char *name) +xml_find_attribute (std::vector &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; + for (gdb_xml_value &value : attributes) + if (strcmp (value.name, name) == 0) + return &value; return NULL; } -/* Clean up a vector of parsed attribute values. */ - -static void -gdb_xml_values_cleanup (void *data) -{ - VEC(gdb_xml_value_s) **values = (VEC(gdb_xml_value_s) **) data; - struct gdb_xml_value *value; - int ix; - - for (ix = 0; VEC_iterate (gdb_xml_value_s, *values, ix, value); ix++) - xfree (value->value); - VEC_free (gdb_xml_value_s, *values); -} - /* Handle the start of an element. NAME is the element, and ATTRS are the names and values of this element's attributes. */ @@ -266,9 +248,7 @@ gdb_xml_parser::start_element (const XML_Char *name, const struct gdb_xml_element *element; const struct gdb_xml_attribute *attribute; - VEC(gdb_xml_value_s) *attributes = NULL; unsigned int seen; - struct cleanup *back_to; /* Push an error scope. If we return or throw an exception before filling this in, it will tell us to ignore children of this @@ -317,7 +297,7 @@ gdb_xml_parser::start_element (const XML_Char *name, scope.seen |= seen; - back_to = make_cleanup (gdb_xml_values_cleanup, &attributes); + std::vector attributes; for (attribute = element->attributes; attribute != NULL && attribute->name != NULL; @@ -326,7 +306,6 @@ gdb_xml_parser::start_element (const XML_Char *name, const char *val = NULL; const XML_Char **p; void *parsed_value; - struct gdb_xml_value new_value; for (p = attrs; *p != NULL; p += 2) if (!strcmp (attribute->name, p[0])) @@ -361,9 +340,7 @@ gdb_xml_parser::start_element (const XML_Char *name, else parsed_value = xstrdup (val); - new_value.name = attribute->name; - new_value.value = parsed_value; - VEC_safe_push (gdb_xml_value_s, attributes, &new_value); + attributes.emplace_back (attribute->name, parsed_value); } /* Check for unrecognized attributes. */ @@ -395,8 +372,6 @@ gdb_xml_parser::start_element (const XML_Char *name, scope_level &new_scope = m_scopes.back (); new_scope.element = element; new_scope.elements = element->children; - - do_cleanups (back_to); } /* Wrapper for gdb_xml_start_element, to prevent throwing exceptions @@ -408,15 +383,14 @@ gdb_xml_start_element_wrapper (void *data, const XML_Char *name, { struct gdb_xml_parser *parser = (struct gdb_xml_parser *) data; - TRY + try { parser->start_element (name, attrs); } - CATCH (ex, RETURN_MASK_ALL) + catch (gdb_exception &ex) { - parser->set_error (ex); + parser->set_error (std::move (ex)); } - END_CATCH } /* Handle the end of an element. NAME is the current element. */ @@ -481,15 +455,14 @@ gdb_xml_end_element_wrapper (void *data, const XML_Char *name) { struct gdb_xml_parser *parser = (struct gdb_xml_parser *) data; - TRY + try { parser->end_element (name); } - CATCH (ex, RETURN_MASK_ALL) + catch (gdb_exception &ex) { - parser->set_error (ex); + parser->set_error (std::move (ex)); } - END_CATCH } /* Free a parser and all its associated state. */ @@ -506,7 +479,6 @@ gdb_xml_parser::gdb_xml_parser (const char *name, void *user_data) : m_name (name), m_user_data (user_data), - m_error (exception_none), m_last_line (0), m_dtd_name (NULL), m_is_xinclude (false) @@ -620,7 +592,7 @@ gdb_xml_parser::parse (const char *buffer) && m_error.error == XML_PARSE_ERROR) { gdb_assert (m_error.message != NULL); - error_string = m_error.message; + error_string = m_error.what (); } else if (status == XML_STATUS_ERROR) { @@ -631,7 +603,7 @@ gdb_xml_parser::parse (const char *buffer) else { gdb_assert (m_error.reason < 0); - throw_exception (m_error); + throw_exception (std::move (m_error)); } if (m_last_line != 0) @@ -803,11 +775,12 @@ struct xinclude_parsing_data static void xinclude_start_include (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct xinclude_parsing_data *data = (struct xinclude_parsing_data *) user_data; - char *href = (char *) xml_find_attribute (attributes, "href")->value; + char *href = (char *) xml_find_attribute (attributes, "href")->value.get (); gdb_xml_debug (parser, _("Processing XInclude of \"%s\""), href); @@ -815,13 +788,13 @@ xinclude_start_include (struct gdb_xml_parser *parser, gdb_xml_error (parser, _("Maximum XInclude depth (%d) exceeded"), MAX_XINCLUDE_DEPTH); - gdb::unique_xmalloc_ptr text = data->fetcher (href, - data->fetcher_baton); - if (text == NULL) + gdb::optional text + = data->fetcher (href, data->fetcher_baton); + if (!text) gdb_xml_error (parser, _("Could not load XML document \"%s\""), href); if (!xml_process_xincludes (data->output, parser->name (), - text.get (), data->fetcher, + text->data (), data->fetcher, data->fetcher_baton, data->include_depth + 1)) gdb_xml_error (parser, _("Parsing \"%s\" failed"), href); @@ -993,7 +966,7 @@ show_debug_xml (struct ui_file *file, int from_tty, fprintf_filtered (file, _("XML debugging is %s.\n"), value); } -gdb::unique_xmalloc_ptr +gdb::optional xml_fetch_content_from_file (const char *filename, void *baton) { const char *dirname = (const char *) baton; @@ -1012,7 +985,7 @@ xml_fetch_content_from_file (const char *filename, void *baton) file = gdb_fopen_cloexec (filename, FOPEN_RT); if (file == NULL) - return NULL; + return {}; /* Read in the whole file. */ @@ -1023,16 +996,16 @@ xml_fetch_content_from_file (const char *filename, void *baton) len = ftell (file.get ()); rewind (file.get ()); - gdb::unique_xmalloc_ptr text ((char *) xmalloc (len + 1)); + gdb::char_vector text (len + 1); - fread (text.get (), 1, len, file.get ()); - if (ferror (file.get ())) + if (fread (text.data (), 1, len, file.get ()) != len + || ferror (file.get ())) { warning (_("Read error from \"%s\""), filename); - return NULL; + return {}; } - text.get ()[len] = '\0'; + text.back () = '\0'; return text; }