diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-01-04 22:11:44 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-01-04 22:11:44 +0000 |
commit | e776119fdc2ba0eed3639762bb210095b0405549 (patch) | |
tree | 730e23b0d25c0c4dc0950c6f8c37ca2d16c10166 /gdb/xml-support.h | |
parent | 5e572bb44adb067e5d4daf50169243b610954061 (diff) | |
download | gdb-e776119fdc2ba0eed3639762bb210095b0405549.zip gdb-e776119fdc2ba0eed3639762bb210095b0405549.tar.gz gdb-e776119fdc2ba0eed3639762bb210095b0405549.tar.bz2 |
* memory-map.c (struct_memory_map_parsing_data): Remove most
members. Make property_name an array.
(free_memory_map_parsing_data, memory_map_start_element)
(memory_map_end_element, memory_map_character_data): Delete.
(memory_map_start_memory, memory_map_end_memory)
(memory_map_start_property, memory_map_end_property): New functions.
(property_attributes, memory_children, memory_type_enum)
(memory_attributes, memory_map_children, memory_map_elements): New.
(parse_memory_map): Rewrite.
* xml-support.c (debug_xml): New.
(xml_get_required_attribute, xml_get_integer_attribute)
(xml_get_enum_value, free_xml_parser, make_cleanup_free_xml_parser):
Delete.
(struct scope_level, struct gdb_xml_parser, gdb_xml_body_text)
(gdb_xml_debug, gdb_xml_error, gdb_xml_values_cleanup)
(gdb_xml_start_element, gdb_xml_start_element_wrapper)
(gdb_xml_end_element, gdb_xml_end_element_wrapper, gdb_xml_cleanup)
(gdb_xml_create_parser_and_cleanup, gdb_xml_parse)
(gdb_xml_parse_ulongest, gdb_xml_parse_attr_ulongest)
(gdb_xml_parse_attr_enum, show_debug_xml, _initialize_xml_support):
New.
* xml-support.h (struct gdb_xml_value, gdb_xml_attribute_handler)
(enum gdb_xml_attribute_flag, struct gdb_xml_attribute)
(enum gdb_xml_element_flag, struct gdb_xml_element)
(gdb_xml_element_start_handler, gdb_xml_element_end_handler)
(struct gdb_xml_enum): New.
(gdb_xml_create_parser_and_cleanup, gdb_xml_parse, gdb_xml_debug)
(gdb_xml_error, gdb_xml_parse_attr_ulongest)
(gdb_xml_parse_attr_enum, gdb_xml_parse_ulongest): New prototypes.
(xml_get_required_attribute, xml_get_integer_attribute)
(xml_get_enum_value, make_cleanup_free_xml_parser): Delete prototypes.
* Makefile.in (xml_support_h, xml-support.o): Update.
* gdb.texinfo (Debugging Output): Document "set debug xml"
and "show debug xml".
Diffstat (limited to 'gdb/xml-support.h')
-rw-r--r-- | gdb/xml-support.h | 166 |
1 files changed, 154 insertions, 12 deletions
diff --git a/gdb/xml-support.h b/gdb/xml-support.h index ada4847..e93e840 100644 --- a/gdb/xml-support.h +++ b/gdb/xml-support.h @@ -24,22 +24,164 @@ #ifndef XML_SUPPORT_H #define XML_SUPPORT_H -#include "gdb_expat.h" +#include "gdb_obstack.h" +#include "vec.h" -/* Helper functions for parsing XML documents. See xml-support.c - for more information about these functions. */ +struct gdb_xml_parser; +struct gdb_xml_element; +struct gdb_xml_attribute; -const XML_Char *xml_get_required_attribute (const XML_Char **attrs, - const XML_Char *attr); +/* A name and value pair, used to record parsed attributes. */ -ULONGEST xml_get_integer_attribute (const XML_Char **attrs, - const XML_Char *attr); +struct gdb_xml_value +{ + const char *name; + void *value; +}; +typedef struct gdb_xml_value gdb_xml_value_s; +DEF_VEC_O(gdb_xml_value_s); -int xml_get_enum_value (const XML_Char **attrs, - const XML_Char *attr, - const XML_Char **xml_names, - int *values); +/* The type of an attribute handler. -void make_cleanup_free_xml_parser (XML_Parser parser); + PARSER is the current XML parser, which should be used to issue any + debugging or error messages. The second argument is the + corresponding attribute description, so that a single handler can + be used for multiple attributes; the attribute name is available + for error messages and the handler data is available for additional + customization (see gdb_xml_parse_attr_enum). VALUE is the string + value of the attribute. + + The returned value should be freeable with xfree, and will be freed + after the start handler is called. Errors should be reported by + calling gdb_xml_error. */ + +typedef void *(gdb_xml_attribute_handler) (struct gdb_xml_parser *parser, + const struct gdb_xml_attribute *, + const char *value); + +/* Flags for attributes. If no flags are specified, the attribute is + required. */ + +enum gdb_xml_attribute_flag +{ + GDB_XML_AF_NONE, + GDB_XML_AF_OPTIONAL = 1 << 0, /* The attribute is optional. */ +}; + +/* An expected attribute and the handler to call when it is + encountered. Arrays of struct gdb_xml_attribute are terminated + by an entry with NAME == NULL. */ + +struct gdb_xml_attribute +{ + const char *name; + int flags; + gdb_xml_attribute_handler *handler; + const void *handler_data; +}; + +/* Flags for elements. If no flags are specified, the element is + required exactly once. */ + +enum gdb_xml_element_flag +{ + GDB_XML_EF_NONE, + GDB_XML_EF_OPTIONAL = 1 << 0, /* The element is optional. */ + GDB_XML_EF_REPEATABLE = 1 << 1, /* The element is repeatable. */ +}; + +/* A handler called at the beginning of an element. + + PARSER is the current XML parser, which should be used to issue any + debugging or error messages. ELEMENT is the current element. + USER_DATA is the opaque pointer supplied when the parser was + created. ATTRIBUTES is a vector of the values of any attributes + attached to this element. + + The start handler will only be called if all the required + attributes were present and parsed successfully, and elements of + ATTRIBUTES are guaranteed to be in the same order used in + ELEMENT->ATTRIBUTES (not the order from the XML file). Accordingly + fixed offsets can be used to find any non-optional attributes as + long as no optional attributes precede them. */ + +typedef void (gdb_xml_element_start_handler) + (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, + void *user_data, VEC(gdb_xml_value_s) *attributes); + +/* A handler called at the end of an element. + + PARSER, ELEMENT, and USER_DATA are as for the start handler. BODY + is any accumulated body text inside the element, with leading and + trailing whitespace removed. It will never be NULL. */ + +typedef void (gdb_xml_element_end_handler) + (struct gdb_xml_parser *, const struct gdb_xml_element *, + void *user_data, const char *body_text); + +/* An expected element and the handlers to call when it is + encountered. Arrays of struct gdb_xml_element are terminated + by an entry with NAME == NULL. */ + +struct gdb_xml_element +{ + const char *name; + const struct gdb_xml_attribute *attributes; + const struct gdb_xml_element *children; + int flags; + + gdb_xml_element_start_handler *start_handler; + gdb_xml_element_end_handler *end_handler; +}; + +/* Initialize and return a parser. Register a cleanup to destroy the + parser. */ + +struct gdb_xml_parser *gdb_xml_create_parser_and_cleanup + (const char *name, const struct gdb_xml_element *elements, + void *user_data); + +/* Invoke PARSER on BUFFER. BUFFER is the data to parse, which + should be NUL-terminated. + + The return value is 0 for success or -1 for error. It may throw, + but only if something unexpected goes wrong during parsing; parse + errors will be caught, warned about, and reported as failure. */ + +int gdb_xml_parse (struct gdb_xml_parser *parser, const char *buffer); + +/* Issue a debugging message from one of PARSER's handlers. */ + +void gdb_xml_debug (struct gdb_xml_parser *parser, const char *format, ...) + ATTR_FORMAT (printf, 2, 0); + +/* Issue an error message from one of PARSER's handlers, and stop + parsing. */ + +void gdb_xml_error (struct gdb_xml_parser *parser, const char *format, ...) + ATTR_NORETURN ATTR_FORMAT (printf, 2, 0); + +/* Parse an integer attribute into a ULONGEST. */ + +extern gdb_xml_attribute_handler gdb_xml_parse_attr_ulongest; + +/* Map NAME to VALUE. A struct gdb_xml_enum * should be saved as the + value of handler_data when using gdb_xml_parse_attr_enum to parse a + fixed list of possible strings. The list is terminated by an entry + with NAME == NULL. */ + +struct gdb_xml_enum +{ + const char *name; + ULONGEST value; +}; + +extern gdb_xml_attribute_handler gdb_xml_parse_attr_enum; + +/* Parse an integer string into a ULONGEST and return it, or call + gdb_xml_error if it could not be parsed. */ + +ULONGEST gdb_xml_parse_ulongest (struct gdb_xml_parser *parser, + const char *value); #endif |