24 #include "safe-ctype.h" 39 #define MAX_XINCLUDE_DEPTH 30 92 void vdebug (
const char *format, va_list ap)
96 void verror (
const char *format, va_list ap)
99 void body_text (
const XML_Char *text,
int length);
119 #ifdef HAVE_XML_STOPPARSER 165 scope.
body.append (text, length);
201 va_start (ap, format);
202 parser->
vdebug (format, ap);
222 va_start (ap, format);
223 parser->
verror (format, ap);
262 const XML_Char **attrs)
292 for (element = scope.
elements; element && element->
name;
293 element++, seen <<= 1)
294 if (strcmp (element->
name,
name) == 0)
297 if (element == NULL || element->
name == NULL)
326 const char *val = NULL;
331 for (p = attrs; *p != NULL; p += 2)
338 if (*p != NULL && val == NULL)
348 "<%s> not specified"),
362 parsed_value = xstrdup (val);
365 new_value.
value = parsed_value;
374 for (p = attrs; *p != NULL; p += 2)
407 const XML_Char **attrs)
436 for (element = scope->
elements, seen = 1;
437 element != NULL && element->
name != NULL;
438 element++, seen <<= 1)
439 if ((scope->
seen & seen) == 0
449 if (scope->
body.empty ())
455 length = scope->
body.size ();
456 body = scope->
body.c_str ();
459 while (length > 0 && ISSPACE (body[length - 1]))
461 scope->
body.erase (length);
462 while (*body && ISSPACE (*body))
469 else if (scope->
element == NULL)
535 const XML_Char *context,
536 const XML_Char *base,
537 const XML_Char *systemId,
538 const XML_Char *publicId)
540 XML_Parser entity_parser;
544 if (systemId == NULL)
552 _(
"could not locate built-in DTD %s"),
562 entity_parser = XML_ExternalEntityParserCreate (
expat_parser,
567 XML_SetElementHandler (entity_parser, NULL, NULL);
568 XML_SetDoctypeDeclHandler (entity_parser, NULL, NULL);
569 XML_SetXmlDeclHandler (entity_parser, NULL);
570 XML_SetDefaultHandler (entity_parser, NULL);
571 XML_SetUserData (entity_parser, NULL);
573 status = XML_Parse (entity_parser, text, strlen (text), 1);
575 XML_ParserFree (entity_parser);
587 XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
593 if (
err != XML_ERROR_NONE)
595 _(
"XML_UseForeignDTD failed: %s"),
596 XML_ErrorString (
err));
610 const char *error_string;
629 error_string = XML_ErrorString (
err);
654 return parser.
parse (document);
705 gdb_xml_error (parser,
_(
"Can't convert %s=\"%s\" to an integer"),
709 memcpy (ret, &result,
sizeof (result));
736 enums->
name != NULL; enums++)
737 if (strcasecmp (enums->
name,
value) == 0)
740 if (enums->
name == NULL)
745 memcpy (ret, &enums->
value, sizeof (enums->
value));
821 gdb_xml_error (parser,
_(
"Could not load XML document \"%s\""), href);
835 void *user_data,
const char *body_text)
856 data->
output.append (s, len);
861 const XML_Char *sysid,
const XML_Char *pubid,
862 int has_internal_subset)
883 const XML_Char *encoding,
int standalone)
906 const char *
name,
const char *text,
915 XML_SetCharacterDataHandler (parser.
expat_parser (), NULL);
929 parser.
use_dtd (
"xinclude.dtd");
931 if (parser.
parse (text) == 0)
952 if (strcmp ((*p)[0], filename) == 0)
971 gdb_assert (readbuf != NULL && writebuf == NULL);
978 len_avail = strlen (buf);
982 if (len > len_avail -
offset)
984 memcpy (readbuf, buf +
offset, len);
999 const char *dirname = (
const char *) baton;
1002 if (dirname && *dirname)
1004 char *fullname = concat (dirname,
"/", filename, (
char *) NULL);
1006 if (fullname == NULL)
1021 if (fseek (file.get (), 0, SEEK_END) == -1)
1023 len = ftell (file.get ());
1024 rewind (file.get ());
1028 if (fread (text.get (), 1, len, file.get ()) != len
1029 || ferror (file.get ()))
1031 warning (
_(
"Read error from \"%s\""), filename);
1035 text.get ()[len] =
'\0';
1043 _(
"Set XML parser debugging."),
1044 _(
"Show XML parser debugging."),
1045 _(
"When set, debugging messages for XML parsers " xml_fetch_another fetcher
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
void set_is_xinclude(bool is_xinclude)
static void XMLCALL xml_xinclude_end_doctype(void *data_)
static void gdb_xml_body_text(void *data, const XML_Char *text, int length)
void start_element(const XML_Char *name, const XML_Char **attrs)
const char *const xml_builtin[][2]
gdb_xml_parser(const char *name, const gdb_xml_element *elements, void *user_data)
const struct gdb_xml_attribute * attributes
static void xinclude_end_include(struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, const char *body_text)
char * xstrvprintf(const char *format, va_list ap)
void warning(const char *fmt,...)
XML_Parser expat_parser()
void internal_error(const char *file, int line, const char *fmt,...)
std::vector< scope_level > m_scopes
static void gdb_xml_start_element_wrapper(void *data, const XML_Char *name, const XML_Char **attrs)
int parse(const char *buffer)
const struct gdb_exception exception_none
void set_error(gdb_exception error)
gdb::unique_xmalloc_ptr< char >(* xml_fetch_another)(const char *href, void *baton)
#define VEC_safe_push(T, V, O)
struct gdb_exception m_error
const struct gdb_xml_element xinclude_elements[]
void void void body_text(const XML_Char *text, int length)
#define VEC_iterate(T, V, I, P)
const struct gdb_xml_element * children
static void show_debug_xml(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
#define CATCH(EXCEPTION, MASK)
std::unique_ptr< FILE, gdb_file_deleter > gdb_file_up
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
struct gdb_xml_value * xml_find_attribute(VEC(gdb_xml_value_s) *attributes, const char *name)
XML_Parser m_expat_parser
static void gdb_xml_values_cleanup(void *data)
__extension__ enum dwarf_attribute name
void fprintf_filtered(struct ui_file *stream, const char *format,...)
void gdb_xml_debug(struct gdb_xml_parser *parser, const char *format,...)
static int xml_parse_unsigned_integer(const char *valstr, ULONGEST *valp)
bool xml_process_xincludes(std::string &result, const char *name, const char *text, xml_fetch_another fetcher, void *fetcher_baton, int depth)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
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 * gdb_xml_parse_attr_ulongest(struct gdb_xml_parser *parser, const struct gdb_xml_attribute *attribute, const char *value)
gdb_file_up gdb_fopen_cloexec(const char *filename, const char *opentype)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
static void XMLCALL xml_xinclude_xml_decl(void *data_, const XML_Char *version, const XML_Char *encoding, int standalone)
gdb_xml_element_end_handler * end_handler
static void XMLCALL xml_xinclude_default(void *data_, const XML_Char *s, int len)
const struct gdb_xml_element * element
ULONGEST strtoulst(const char *num, const char **trailer, int base)
struct cmd_list_element * setdebuglist
const struct gdb_xml_element * elements
ULONGEST gdb_xml_parse_ulongest(struct gdb_xml_parser *parser, const char *value)
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
#define MAX_XINCLUDE_DEPTH
const struct gdb_xml_enum gdb_xml_enums_boolean[]
void throw_exception(struct gdb_exception exception)
void use_dtd(const char *dtd_name)
void vdebug(const char *format, va_list ap) ATTRIBUTE_PRINTF(2
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)
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
static void gdb_xml_end_element_wrapper(void *data, const XML_Char *name)
void throw_verror(enum errors error, const char *fmt, va_list ap)
gdb::unique_xmalloc_ptr< char > xml_fetch_content_from_file(const char *filename, void *baton)
scope_level(const gdb_xml_element *elements_=NULL)
void add_setshow_boolean_cmd(const char *name, enum command_class theclass, int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
LONGEST xml_builtin_xfer_partial(const char *filename, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
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)
unsigned long long ULONGEST
void * gdb_xml_parse_attr_enum(struct gdb_xml_parser *parser, const struct gdb_xml_attribute *attribute, const char *value)
xinclude_parsing_data(std::string &output_, xml_fetch_another fetcher_, void *fetcher_baton_, int include_depth_)
void _initialize_xml_support(void)
struct cmd_list_element * showdebuglist
void void verror(const char *format, va_list ap) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF(2
void end_element(const XML_Char *name)
void error(const char *fmt,...)
void malloc_failure(long size) ATTRIBUTE_NORETURN
const struct gdb_xml_attribute xinclude_attributes[]
const char * fetch_xml_builtin(const char *filename)
void do_cleanups(struct cleanup *old_chain)
enum return_reason reason
gdb_xml_element_start_handler * start_handler