/* Helper routines for parsing XML using Expat.
- Copyright (C) 2006-2018 Free Software Foundation, Inc.
+ Copyright (C) 2006-2019 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 "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
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
{
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. */
{
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. */
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)
&& 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)
{
else
{
gdb_assert (m_error.reason < 0);
- throw_exception (m_error);
+ throw_exception (std::move (m_error));
}
if (m_last_line != 0)
gdb_xml_error (parser, _("Maximum XInclude depth (%d) exceeded"),
MAX_XINCLUDE_DEPTH);
- gdb::unique_xmalloc_ptr<char> text = data->fetcher (href,
- data->fetcher_baton);
- if (text == NULL)
+ gdb::optional<gdb::char_vector> 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);
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)
fprintf_filtered (file, _("XML debugging is %s.\n"), value);
}
-gdb::unique_xmalloc_ptr<char>
+gdb::optional<gdb::char_vector>
xml_fetch_content_from_file (const char *filename, void *baton)
{
const char *dirname = (const char *) baton;
{
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 (filename, FOPEN_RT);
if (file == NULL)
- return NULL;
+ return {};
/* Read in the whole file. */
len = ftell (file.get ());
rewind (file.get ());
- gdb::unique_xmalloc_ptr<char> text ((char *) xmalloc (len + 1));
+ gdb::char_vector text (len + 1);
- if (fread (text.get (), 1, len, file.get ()) != len
+ 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;
}