|  | /* Helper routines for parsing XML using Expat. | 
|  |  | 
|  | Copyright (C) 2006-2021 Free Software Foundation, Inc. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  |  | 
|  | #ifndef XML_SUPPORT_H | 
|  | #define XML_SUPPORT_H | 
|  |  | 
|  | #include "gdb_obstack.h" | 
|  | #include "gdbsupport/xml-utils.h" | 
|  | #include "gdbsupport/byte-vector.h" | 
|  | #include "gdbsupport/gdb_optional.h" | 
|  | #include "gdbsupport/function-view.h" | 
|  |  | 
|  | struct gdb_xml_parser; | 
|  | struct gdb_xml_element; | 
|  | struct gdb_xml_attribute; | 
|  |  | 
|  | /* Return an XML document which was compiled into GDB, from | 
|  | the given FILENAME, or NULL if the file was not compiled in.  */ | 
|  |  | 
|  | const char *fetch_xml_builtin (const char *filename); | 
|  |  | 
|  | /* A to_xfer_partial helper function which reads XML files which were | 
|  | compiled into GDB.  The target may call this function from its own | 
|  | to_xfer_partial handler, after converting object and annex to the | 
|  | appropriate filename.  */ | 
|  |  | 
|  | LONGEST xml_builtin_xfer_partial (const char *filename, | 
|  | gdb_byte *readbuf, const gdb_byte *writebuf, | 
|  | ULONGEST offset, LONGEST len); | 
|  |  | 
|  | /* Support for XInclude.  */ | 
|  |  | 
|  | /* Callback to fetch a new XML file, based on the provided HREF.  */ | 
|  |  | 
|  | using xml_fetch_another = gdb::function_view<gdb::optional<gdb::char_vector> | 
|  | (const char * /* href */)>; | 
|  |  | 
|  | /* Append the expansion of TEXT after processing <xi:include> tags in | 
|  | RESULT.  FETCHER will be called to retrieve any new files.  DEPTH | 
|  | should be zero on the initial call. | 
|  |  | 
|  | On failure, this function uses NAME in a warning and returns false. | 
|  | It may throw an exception, but does not for XML parsing | 
|  | problems.  */ | 
|  |  | 
|  | bool xml_process_xincludes (std::string &result, | 
|  | const char *name, const char *text, | 
|  | xml_fetch_another fetcher, int depth); | 
|  |  | 
|  | /* Simplified XML parser infrastructure.  */ | 
|  |  | 
|  | /* A name and value pair, used to record parsed attributes.  */ | 
|  |  | 
|  | struct gdb_xml_value | 
|  | { | 
|  | gdb_xml_value (const char *name_, void *value_) | 
|  | : name (name_), value (value_) | 
|  | {} | 
|  |  | 
|  | const char *name; | 
|  | gdb::unique_xmalloc_ptr<void> value; | 
|  | }; | 
|  |  | 
|  | /* The type of an attribute handler. | 
|  |  | 
|  | 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, std::vector<gdb_xml_value> &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; | 
|  | }; | 
|  |  | 
|  | /* Parse a XML document.  DOCUMENT is the data to parse, which should | 
|  | be NUL-terminated. If non-NULL, use the compiled-in DTD named | 
|  | DTD_NAME to drive the parsing. | 
|  |  | 
|  | 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_quick (const char *name, const char *dtd_name, | 
|  | const struct gdb_xml_element *elements, | 
|  | const char *document, void *user_data); | 
|  |  | 
|  | /* Issue a debugging message from one of PARSER's handlers.  */ | 
|  |  | 
|  | void gdb_xml_debug (struct gdb_xml_parser *parser, const char *format, ...) | 
|  | ATTRIBUTE_PRINTF (2, 3); | 
|  |  | 
|  | /* 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, ...) | 
|  | ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 3); | 
|  |  | 
|  | /* Find the attribute named NAME in the set of parsed attributes | 
|  | ATTRIBUTES.  Returns NULL if not found.  */ | 
|  |  | 
|  | struct gdb_xml_value *xml_find_attribute | 
|  | (std::vector<gdb_xml_value> &attributes, const char *name); | 
|  |  | 
|  | /* 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; | 
|  | }; | 
|  |  | 
|  | /* A handler_data for yes/no boolean values.  */ | 
|  | extern const struct gdb_xml_enum gdb_xml_enums_boolean[]; | 
|  |  | 
|  | 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); | 
|  |  | 
|  | /* Open FILENAME, read all its text into memory, close it, and return | 
|  | the text.  If something goes wrong, return an uninstantiated optional | 
|  | and warn.  */ | 
|  |  | 
|  | extern gdb::optional<gdb::char_vector> xml_fetch_content_from_file | 
|  | (const char *filename, const char *dirname); | 
|  |  | 
|  | #endif |