/* Helper routines for parsing XML using Expat.
- Copyright (C) 2006-2019 Free Software Foundation, Inc.
+ Copyright (C) 2006-2021 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "gdbcmd.h"
+#include "xml-builtin.h"
#include "xml-support.h"
-#include "common/filestuff.h"
+#include "gdbsupport/filestuff.h"
#include "safe-ctype.h"
#include <vector>
#include <string>
/* Debugging flag. */
-static int debug_xml;
+static bool debug_xml;
/* The contents of this file are only useful if XML support is
available. */
{ 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
{
parser->start_element (name, attrs);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- parser->set_error (ex);
+ parser->set_error (std::move (ex));
}
}
{
parser->end_element (name);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- parser->set_error (ex);
+ parser->set_error (std::move (ex));
}
}
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)
else
{
gdb_assert (m_error.reason < 0);
- throw_exception (m_error);
+ throw_exception (std::move (m_error));
}
if (m_last_line != 0)
struct xinclude_parsing_data
{
xinclude_parsing_data (std::string &output_,
- xml_fetch_another fetcher_, void *fetcher_baton_,
+ xml_fetch_another fetcher_,
int include_depth_)
: output (output_),
skip_depth (0),
include_depth (include_depth_),
- fetcher (fetcher_),
- fetcher_baton (fetcher_baton_)
+ fetcher (fetcher_)
{}
/* Where the output goes. */
/* A function to call to obtain additional features, and its
baton. */
xml_fetch_another fetcher;
- void *fetcher_baton;
};
static void
gdb_xml_error (parser, _("Maximum XInclude depth (%d) exceeded"),
MAX_XINCLUDE_DEPTH);
- gdb::optional<gdb::char_vector> text
- = data->fetcher (href, data->fetcher_baton);
+ gdb::optional<gdb::char_vector> text = data->fetcher (href);
if (!text)
gdb_xml_error (parser, _("Could not load XML document \"%s\""), href);
if (!xml_process_xincludes (data->output, parser->name (),
text->data (), data->fetcher,
- data->fetcher_baton,
data->include_depth + 1))
gdb_xml_error (parser, _("Parsing \"%s\" failed"), href);
bool
xml_process_xincludes (std::string &result,
const char *name, const char *text,
- xml_fetch_another fetcher, void *fetcher_baton,
- int depth)
+ xml_fetch_another fetcher, int depth)
{
- xinclude_parsing_data data (result, fetcher, fetcher_baton, depth);
+ xinclude_parsing_data data (result, fetcher, depth);
gdb_xml_parser parser (name, xinclude_elements, &data);
parser.set_is_xinclude (true);
const char *
fetch_xml_builtin (const char *filename)
{
- const char *(*p)[2];
+ const char *const (*p)[2];
for (p = xml_builtin; (*p)[0]; p++)
if (strcmp ((*p)[0], filename) == 0)
}
gdb::optional<gdb::char_vector>
-xml_fetch_content_from_file (const char *filename, void *baton)
+xml_fetch_content_from_file (const char *filename, const char *dirname)
{
- const char *dirname = (const char *) baton;
gdb_file_up file;
- if (dirname && *dirname)
+ if (dirname != nullptr && *dirname != '\0')
{
- char *fullname = concat (dirname, "/", filename, (char *) NULL);
+ gdb::unique_xmalloc_ptr<char> fullname
+ (concat (dirname, "/", filename, (char *) NULL));
- if (fullname == NULL)
- malloc_failure (0);
- file = gdb_fopen_cloexec (fullname, FOPEN_RT);
- xfree (fullname);
+ file = gdb_fopen_cloexec (fullname.get (), FOPEN_RB);
}
else
- file = gdb_fopen_cloexec (filename, FOPEN_RT);
+ file = gdb_fopen_cloexec (filename, FOPEN_RB);
if (file == NULL)
return {};
return text;
}
+void _initialize_xml_support ();
+void _initialize_xml_support ();
void
-_initialize_xml_support (void)
+_initialize_xml_support ()
{
add_setshow_boolean_cmd ("xml", class_maintenance, &debug_xml,
_("Set XML parser debugging."),