24#include "gdbsupport/filestuff.h"
25#include "safe-ctype.h"
40#define MAX_XINCLUDE_DEPTH 30
90 int parse (
const char *buffer);
93 void vdebug (
const char *format, va_list ap)
97 void verror (
const char *format, va_list ap)
100 void body_text (
const XML_Char *text,
int length);
120#ifdef HAVE_XML_STOPPARSER
166 scope.
body.append (text, length);
184 std::string message = string_vprintf (format, ap);
187 m_name, line, message.c_str ());
190 m_name, message.c_str ());
200 va_start (ap, format);
201 parser->
vdebug (format, ap);
214 throw_verror (XML_PARSE_ERROR, format, ap);
221 va_start (ap, format);
222 parser->
verror (format, ap);
245 const XML_Char **attrs)
273 for (element = scope.
elements; element && element->
name;
274 element++, seen <<= 1)
275 if (strcmp (element->
name,
name) == 0)
278 if (element == NULL || element->
name == NULL)
307 const char *val = NULL;
311 for (p = attrs; *p != NULL; p += 2)
318 if (*p != NULL && val == NULL)
328 "<%s> not specified"),
342 parsed_value = xstrdup (val);
352 for (p = attrs; *p != NULL; p += 2)
361 gdb_xml_debug (
this, _(
"Ignoring unknown attribute %s"), *p);
383 const XML_Char **attrs)
391 catch (gdb_exception &ex)
411 for (element = scope->
elements, seen = 1;
412 element != NULL && element->
name != NULL;
413 element++, seen <<= 1)
414 if ((scope->
seen & seen) == 0
424 if (scope->
body.empty ())
430 length = scope->
body.size ();
431 body = scope->
body.c_str ();
434 while (length > 0 && ISSPACE (body[length - 1]))
436 scope->
body.erase (length);
437 while (*body && ISSPACE (*body))
444 else if (scope->
element == NULL)
463 catch (gdb_exception &ex)
508 const XML_Char *context,
509 const XML_Char *base,
510 const XML_Char *systemId,
511 const XML_Char *publicId)
513 XML_Parser entity_parser;
517 if (systemId == NULL)
524 internal_error (_(
"could not locate built-in DTD %s"),
534 entity_parser = XML_ExternalEntityParserCreate (
expat_parser,
539 XML_SetElementHandler (entity_parser, NULL, NULL);
540 XML_SetDoctypeDeclHandler (entity_parser, NULL, NULL);
541 XML_SetXmlDeclHandler (entity_parser, NULL);
542 XML_SetDefaultHandler (entity_parser, NULL);
543 XML_SetUserData (entity_parser, NULL);
545 status = XML_Parse (entity_parser, text, strlen (text), 1);
547 XML_ParserFree (entity_parser);
559 XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
565 if (
err != XML_ERROR_NONE)
566 internal_error (_(
"XML_UseForeignDTD failed: %s"),
567 XML_ErrorString (
err));
581 const char *error_string;
590 if (
m_error.reason == RETURN_ERROR
591 &&
m_error.error == XML_PARSE_ERROR)
593 gdb_assert (
m_error.message != NULL);
594 error_string =
m_error.what ();
600 error_string = XML_ErrorString (
err);
604 gdb_assert (
m_error.reason < 0);
605 throw_exception (std::move (
m_error));
609 warning (_(
"while parsing %s (at line %d): %s"),
m_name,
612 warning (_(
"while parsing %s: %s"),
m_name, error_string);
625 return parser.
parse (document);
643 result = strtoulst (valstr, &endptr, 0);
676 gdb_xml_error (parser, _(
"Can't convert %s=\"%s\" to an integer"),
679 ret = XNEW (ULONGEST);
680 memcpy (ret, &result,
sizeof (result));
707 enums->
name != NULL; enums++)
708 if (strcasecmp (enums->
name,
value) == 0)
711 if (enums->
name == NULL)
712 gdb_xml_error (parser, _(
"Unknown attribute value %s=\"%s\""),
716 memcpy (ret, &enums->
value, sizeof (enums->
value));
782 gdb_xml_debug (parser, _(
"Processing XInclude of \"%s\""), href);
785 gdb_xml_error (parser, _(
"Maximum XInclude depth (%d) exceeded"),
788 gdb::optional<gdb::char_vector> text = data->fetcher (href);
790 gdb_xml_error (parser, _(
"Could not load XML document \"%s\""), href);
793 text->data (), data->fetcher,
794 data->include_depth + 1))
819 if (data->skip_depth)
824 data->output.append (s, len);
829 const XML_Char *sysid,
const XML_Char *pubid,
830 int has_internal_subset)
851 const XML_Char *encoding,
int standalone)
874 const char *
name,
const char *text,
882 XML_SetCharacterDataHandler (parser.
expat_parser (), NULL);
896 parser.
use_dtd (
"xinclude.dtd");
898 if (parser.
parse (text) == 0)
901 gdb_xml_debug (&parser, _(
"XInclude processing succeeded."));
916 const char *
const (*p)[2];
919 if (strcmp ((*p)[0], filename) == 0)
932 gdb_byte *readbuf,
const gdb_byte *writebuf,
933 ULONGEST offset, LONGEST len)
938 gdb_assert (readbuf != NULL && writebuf == NULL);
939 gdb_assert (filename != NULL);
945 len_avail = strlen (buf);
946 if (offset >= len_avail)
949 if (len > len_avail - offset)
950 len = len_avail - offset;
951 memcpy (readbuf, buf + offset, len);
963gdb::optional<gdb::char_vector>
968 if (dirname !=
nullptr && *dirname !=
'\0')
970 gdb::unique_xmalloc_ptr<char> fullname
971 (concat (dirname,
"/", filename, (
char *) NULL));
973 file = gdb_fopen_cloexec (fullname.get (), FOPEN_RB);
976 file = gdb_fopen_cloexec (filename, FOPEN_RB);
985 if (fseek (file.get (), 0, SEEK_END) == -1)
987 len = ftell (file.get ());
988 rewind (file.get ());
990 gdb::char_vector text (len + 1);
992 if (fread (text.data (), 1, len, file.get ()) != len
993 || ferror (file.get ()))
995 warning (_(
"Read error from \"%s\""), filename);
1009 _(
"Set XML parser debugging."),
1010 _(
"Show XML parser debugging."),
1011 _(
"When set, debugging messages for XML parsers "
static struct @4 attributes[]
struct cmd_list_element * showdebuglist
struct cmd_list_element * setdebuglist
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
static void ATTRIBUTE_PRINTF(1, 0)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
__extension__ enum dwarf_attribute name
const struct gdb_xml_attribute * attributes
gdb_xml_element_start_handler * start_handler
const struct gdb_xml_element * children
gdb_xml_element_end_handler * end_handler
gdb_xml_parser(const char *name, const gdb_xml_element *elements, void *user_data)
void vdebug(const char *format, va_list ap) ATTRIBUTE_PRINTF(2
void void verror(const char *format, va_list ap) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF(2
struct gdb_exception m_error
void set_error(gdb_exception &&error)
void start_element(const XML_Char *name, const XML_Char **attrs)
void end_element(const XML_Char *name)
int parse(const char *buffer)
void use_dtd(const char *dtd_name)
XML_Parser m_expat_parser
void set_is_xinclude(bool is_xinclude)
void void void body_text(const XML_Char *text, int length)
std::vector< scope_level > m_scopes
XML_Parser expat_parser()
gdb::unique_xmalloc_ptr< void > value
scope_level(const gdb_xml_element *elements_=NULL)
const struct gdb_xml_element * elements
const struct gdb_xml_element * element
xinclude_parsing_data(std::string &output_, xml_fetch_another fetcher_, int include_depth_)
xml_fetch_another fetcher
void malloc_failure(long size)
void perror_with_name(const char *string)
void gdb_printf(struct ui_file *stream, const char *format,...)
const char *const xml_builtin[][2]
static void XMLCALL xml_xinclude_end_doctype(void *data_)
const char * fetch_xml_builtin(const char *filename)
static void XMLCALL xml_xinclude_xml_decl(void *data_, const XML_Char *version, const XML_Char *encoding, int standalone)
void gdb_xml_debug(struct gdb_xml_parser *parser, const char *format,...)
void _initialize_xml_support()
static int xml_parse_unsigned_integer(const char *valstr, ULONGEST *valp)
static void gdb_xml_start_element_wrapper(void *data, const XML_Char *name, const XML_Char **attrs)
static void xinclude_end_include(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
gdb::optional< gdb::char_vector > xml_fetch_content_from_file(const char *filename, const char *dirname)
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
const struct gdb_xml_enum gdb_xml_enums_boolean[]
#define MAX_XINCLUDE_DEPTH
const struct gdb_xml_element xinclude_elements[]
const struct gdb_xml_attribute xinclude_attributes[]
static void show_debug_xml(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static void gdb_xml_end_element_wrapper(void *data, const XML_Char *name)
static void XMLCALL xml_xinclude_start_doctype(void *data_, const XML_Char *doctypeName, const XML_Char *sysid, const XML_Char *pubid, int has_internal_subset)
static void gdb_xml_body_text(void *data, const XML_Char *text, int length)
LONGEST xml_builtin_xfer_partial(const char *filename, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
static void xinclude_start_include(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, std::vector< gdb_xml_value > &attributes)
static int XMLCALL gdb_xml_fetch_external_entity(XML_Parser expat_parser, const XML_Char *context, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)
static void XMLCALL xml_xinclude_default(void *data_, const XML_Char *s, int len)
struct gdb_xml_value * xml_find_attribute(std::vector< gdb_xml_value > &attributes, const char *name)
ULONGEST gdb_xml_parse_ulongest(struct gdb_xml_parser *parser, const char *value)
bool xml_process_xincludes(std::string &result, const char *name, const char *text, xml_fetch_another fetcher, int depth)
gdb::function_view< gdb::optional< gdb::char_vector >(const char *)> xml_fetch_another
gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest
gdb_xml_attribute_handler gdb_xml_parse_attr_enum