24 #include "safe-ctype.h"
37 #define MAX_XINCLUDE_DEPTH 30
89 if (parser->error.reason < 0)
92 if (scope->
body == NULL)
94 scope->
body = XCNEW (
struct obstack);
95 obstack_init (scope->
body);
98 obstack_grow (scope->
body, text, length);
113 va_start (ap, format);
117 parser->
name, line, message);
120 parser->
name, message);
133 parser->last_line =
line;
134 va_start (ap, format);
148 if (strcmp (value->
name, name) == 0)
174 const XML_Char **attrs)
190 memset (&new_scope, 0,
sizeof (new_scope));
199 for (element = scope->
elements; element && element->
name;
200 element++, seen <<= 1)
201 if (strcmp (element->
name, name) == 0)
204 if (element == NULL || element->
name == NULL)
209 if (parser->is_xinclude)
225 gdb_xml_error (parser,
_(
"Element <%s> only expected once"), name);
232 attribute != NULL && attribute->
name != NULL;
235 const char *val = NULL;
240 for (p = attrs; *p != NULL; p += 2)
241 if (!strcmp (attribute->
name, p[0]))
247 if (*p != NULL && val == NULL)
257 "<%s> not specified"),
266 attribute->
name, val);
269 parsed_value = attribute->
handler (parser, attribute, val);
271 parsed_value = xstrdup (val);
274 new_value.
value = parsed_value;
283 for (p = attrs; *p != NULL; p += 2)
286 attribute != NULL && attribute->
name != NULL;
288 if (strcmp (attribute->
name, *p) == 0)
291 if (attribute == NULL || attribute->
name == NULL)
313 const XML_Char **attrs)
317 if (parser->error.reason < 0)
327 #ifdef HAVE_XML_STOPPARSER
347 for (element = scope->
elements, seen = 1;
348 element != NULL && element->
name != NULL;
349 element++, seen <<= 1)
350 if ((scope->
seen & seen) == 0
360 if (scope->
body == NULL)
366 length = obstack_object_size (scope->
body);
367 obstack_1grow (scope->
body,
'\0');
368 body = obstack_finish (scope->
body);
371 while (length > 0 && ISSPACE (body[length-1]))
372 body[--length] =
'\0';
373 while (*body && ISSPACE (*body))
380 else if (scope->
element == NULL)
386 obstack_free (scope->
body, NULL);
400 if (parser->error.reason < 0)
410 #ifdef HAVE_XML_STOPPARSER
432 obstack_free (scope->
body, NULL);
473 memset (&start_scope, 0,
sizeof (start_scope));
477 *parser_result = parser;
487 const XML_Char *context,
488 const XML_Char *base,
489 const XML_Char *systemId,
490 const XML_Char *publicId)
493 XML_Parser entity_parser;
497 if (systemId == NULL)
502 _(
"could not locate built-in DTD %s"),
512 entity_parser = XML_ExternalEntityParserCreate (expat_parser, context, NULL);
516 XML_SetElementHandler (entity_parser, NULL, NULL);
517 XML_SetDoctypeDeclHandler (entity_parser, NULL, NULL);
518 XML_SetXmlDeclHandler (entity_parser, NULL);
519 XML_SetDefaultHandler (entity_parser, NULL);
520 XML_SetUserData (entity_parser, NULL);
522 status = XML_Parse (entity_parser, text, strlen (text), 1);
524 XML_ParserFree (entity_parser);
536 parser->dtd_name = dtd_name;
539 XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
544 err = XML_UseForeignDTD (parser->
expat_parser, XML_TRUE);
545 if (err != XML_ERROR_NONE)
547 _(
"XML_UseForeignDTD failed: %s"),
548 XML_ErrorString (err));
562 const char *error_string;
566 status = XML_Parse (parser->
expat_parser, buffer, strlen (buffer), 1);
575 error_string = parser->error.message;
581 error_string = XML_ErrorString (err);
589 if (parser->last_line != 0)
590 warning (
_(
"while parsing %s (at line %d): %s"), parser->
name,
591 parser->last_line, error_string);
593 warning (
_(
"while parsing %s: %s"), parser->
name, error_string);
601 const char *document,
void *user_data)
609 if (dtd_name != NULL)
650 gdb_xml_error (parser,
_(
"Can't convert \"%s\" to an integer"), value);
666 gdb_xml_error (parser,
_(
"Can't convert %s=\"%s\" to an integer"),
667 attribute->
name, value);
669 ret =
xmalloc (
sizeof (result));
670 memcpy (ret, &result,
sizeof (result));
696 if (strcasecmp (enums->
name, value) == 0)
699 if (enums->
name == NULL)
701 attribute->
name, value);
704 memcpy (ret, &enums->
value, sizeof (enums->
value));
770 gdb_xml_error (parser,
_(
"Could not load XML document \"%s\""), href);
779 obstack_grow (&data->
obstack, output, strlen (output));
790 void *user_data,
const char *body_text)
810 obstack_grow (&data->
obstack, s, len);
815 const XML_Char *sysid,
const XML_Char *pubid,
816 int has_internal_subset)
837 const XML_Char *
encoding,
int standalone)
849 obstack_free (&data->
obstack, NULL);
883 parser->is_xinclude = 1;
889 XML_SetCharacterDataHandler (parser->
expat_parser, NULL);
907 obstack_1grow (&data->
obstack,
'\0');
908 result = xstrdup (obstack_finish (&data->
obstack));
931 if (strcmp ((*p)[0], filename) == 0)
950 gdb_assert (readbuf != NULL && writebuf == NULL);
957 len_avail = strlen (buf);
958 if (offset >= len_avail)
961 if (len > len_avail - offset)
963 memcpy (readbuf, buf + offset, len);
983 va_start (ap, format);
986 for (f = format; *f; f++)
995 char *a = va_arg (ap,
char *);
997 obstack_grow (obstack, prev, f - prev - 1);
1018 const char *dirname = baton;
1024 if (dirname && *dirname)
1026 char *fullname = concat (dirname,
"/", filename, (
char *) NULL);
1028 if (fullname == NULL)
1052 bytes_read = fread (text + offset, 1, len - offset - 1, file);
1055 warning (
_(
"Read error from \"%s\""), filename);
1060 offset += bytes_read;
1082 _(
"Set XML parser debugging."),
1083 _(
"Show XML parser debugging."),
1084 _(
"When set, debugging messages for XML parsers "
xml_fetch_another fetcher
void obstack_xml_printf(struct obstack *obstack, const char *format,...)
gdb_xml_attribute_handler * handler
static void XMLCALL xml_xinclude_end_doctype(void *data_)
static void gdb_xml_body_text(void *data, const XML_Char *text, int length)
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)
const void * handler_data
char *(* xml_fetch_another)(const char *href, void *baton)
char * xstrvprintf(const char *format, va_list ap)
void warning(const char *fmt,...)
int gdb_xml_parse(struct gdb_xml_parser *parser, const char *buffer)
static void xml_xinclude_cleanup(void *data_)
void internal_error(const char *file, int line, const char *fmt,...)
static void gdb_xml_start_element_wrapper(void *data, const XML_Char *name, const XML_Char **attrs)
#define VEC_safe_push(T, V, O)
FILE * gdb_fopen_cloexec(const char *filename, const char *opentype)
#define VEC_quick_push(T, V, O)
char * xml_escape_text(const char *text)
static void gdb_xml_cleanup(void *arg)
#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)
#define VEC_reserve(T, V, R)
int gdb_xml_parse_quick(const char *name, const char *dtd_name, const struct gdb_xml_element *elements, const char *document, void *user_data)
static void gdb_xml_values_cleanup(void *data)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
void gdb_xml_debug(struct gdb_xml_parser *parser, const char *format,...)
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t err
static int xml_parse_unsigned_integer(const char *valstr, ULONGEST *valp)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
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)
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t int status
void free_current_contents(void *ptr)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
void * gdb_xml_parse_attr_ulongest(struct gdb_xml_parser *parser, const struct gdb_xml_attribute *attribute, const char *value)
static void gdb_xml_start_element(void *data, const XML_Char *name, const XML_Char **attrs)
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)
char * xml_fetch_content_from_file(const char *filename, void *baton)
struct cmd_list_element * setdebuglist
const struct gdb_xml_element * elements
ULONGEST gdb_xml_parse_ulongest(struct gdb_xml_parser *parser, const char *value)
EXPORTED_CONST char *const xml_builtin[][2]
void gdb_xml_error(struct gdb_xml_parser *parser, const char *format,...)
#define MAX_XINCLUDE_DEPTH
PTR xrealloc(PTR ptr, size_t size)
struct cleanup * make_cleanup_fclose(FILE *file)
void throw_exception(struct gdb_exception exception)
struct gdb_xml_value * xml_find_attribute(VEC(gdb_xml_value_s)*attributes, const char *name)
void discard_cleanups(struct cleanup *old_chain)
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_end_element_wrapper(void *data, const XML_Char *name)
void throw_verror(enum errors error, const char *fmt, va_list ap)
struct ui_file * gdb_stderr
#define obstack_grow_str(OBSTACK, STRING)
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)
void _initialize_xml_support(void)
static struct cleanup * gdb_xml_create_parser_and_cleanup(const char *name, const struct gdb_xml_element *elements, void *user_data, struct gdb_xml_parser **parser_result)
struct cmd_list_element * showdebuglist
void gdb_xml_use_dtd(struct gdb_xml_parser *parser, const char *dtd_name)
static void gdb_xml_end_element(void *data, const XML_Char *name)
char * xml_process_xincludes(const char *name, const char *text, xml_fetch_another fetcher, void *fetcher_baton, int depth)
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)
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_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
const ULONGEST const LONGEST len
gdb_xml_element_start_handler * start_handler