summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/lib/util/xmlfile.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/lib/util/xmlfile.h')
-rw-r--r--trunk/src/lib/util/xmlfile.h201
1 files changed, 201 insertions, 0 deletions
diff --git a/trunk/src/lib/util/xmlfile.h b/trunk/src/lib/util/xmlfile.h
new file mode 100644
index 00000000000..8f0a9c4a5b3
--- /dev/null
+++ b/trunk/src/lib/util/xmlfile.h
@@ -0,0 +1,201 @@
+/***************************************************************************
+
+ xmlfile.h
+
+ XML file parsing code.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __XMLFILE_H__
+#define __XMLFILE_H__
+
+#include "osdcore.h"
+#include "corefile.h"
+
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+enum
+{
+ XML_PARSE_FLAG_WHITESPACE_SIGNIFICANT = 1
+};
+
+
+enum
+{
+ XML_INT_FORMAT_DECIMAL,
+ XML_INT_FORMAT_DECIMAL_POUND,
+ XML_INT_FORMAT_HEX_DOLLAR,
+ XML_INT_FORMAT_HEX_C
+};
+
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+/* forward type declarations */
+struct XML_ParserStruct;
+
+
+/* a node representing an attribute */
+typedef struct _xml_attribute_node xml_attribute_node;
+struct _xml_attribute_node
+{
+ xml_attribute_node * next; /* pointer to next attribute node */
+ const char * name; /* pointer to copy of tag name */
+ const char * value; /* pointer to copy of value string */
+};
+
+
+/* a node representing a data item and its relationships */
+typedef struct _xml_data_node xml_data_node;
+struct _xml_data_node
+{
+ xml_data_node * next; /* pointer to next sibling node */
+ xml_data_node * parent; /* pointer to parent node */
+ xml_data_node * child; /* pointer to first child node */
+ const char * name; /* pointer to copy of tag name */
+ const char * value; /* pointer to copy of value string */
+ xml_attribute_node * attribute; /* pointer to array of attribute nodes */
+ int line; /* line number for this node's start */
+};
+
+
+/* extended error information from parsing */
+typedef struct _xml_parse_error xml_parse_error;
+struct _xml_parse_error
+{
+ const char * error_message;
+ int error_line;
+ int error_column;
+};
+
+
+/* parsing options */
+typedef struct _xml_parse_options xml_parse_options;
+struct _xml_parse_options
+{
+ xml_parse_error * error;
+ void (*init_parser)(struct XML_ParserStruct *parser);
+ UINT32 flags;
+};
+
+
+
+/***************************************************************************
+ FUNCTION PROTOTYPES
+***************************************************************************/
+
+
+/* ----- XML file objects ----- */
+
+/* create a new empty xml file object */
+xml_data_node *xml_file_create(void);
+
+/* parse an XML file into its nodes */
+xml_data_node *xml_file_read(core_file *file, xml_parse_options *opts);
+
+/* parse an XML string into its nodes */
+xml_data_node *xml_string_read(const char *string, xml_parse_options *opts);
+
+/* write an XML tree to a file */
+void xml_file_write(xml_data_node *node, core_file *file);
+
+/* free an XML file object */
+void xml_file_free(xml_data_node *node);
+
+
+
+/* ----- XML node management ----- */
+
+/* count the number of child nodes */
+int xml_count_children(xml_data_node *node);
+
+/* find the next sibling with the given tag */
+xml_data_node *xml_get_sibling(xml_data_node *node, const char *name);
+
+/* find the next sibling with the given tag and/or attribute/value pair */
+xml_data_node *xml_find_matching_sibling(xml_data_node *node, const char *name, const char *attribute, const char *matchval);
+
+/* add a new child node */
+xml_data_node *xml_add_child(xml_data_node *node, const char *name, const char *value);
+
+/* either return an existing child node or create one if it doesn't exist */
+xml_data_node *xml_get_or_add_child(xml_data_node *node, const char *name, const char *value);
+
+/* delete a node and its children */
+void xml_delete_node(xml_data_node *node);
+
+
+
+/* ----- XML attribute management ----- */
+
+/* find an attribute node with the specified tag */
+xml_attribute_node *xml_get_attribute(xml_data_node *node, const char *attribute);
+
+/* return the string value of an attribute, or the specified default if not present */
+const char *xml_get_attribute_string(xml_data_node *node, const char *attribute, const char *defvalue);
+
+/* return the integer value of an attribute, or the specified default if not present */
+int xml_get_attribute_int(xml_data_node *node, const char *attribute, int defvalue);
+
+/* return the format of the given integer attribute */
+int xml_get_attribute_int_format(xml_data_node *node, const char *attribute);
+
+/* return the float value of an attribute, or the specified default if not present */
+float xml_get_attribute_float(xml_data_node *node, const char *attribute, float defvalue);
+
+/* set the string value of an attribute */
+xml_attribute_node *xml_set_attribute(xml_data_node *node, const char *name, const char *value);
+
+/* set the integer value of an attribute */
+xml_attribute_node *xml_set_attribute_int(xml_data_node *node, const char *name, int value);
+
+/* set the float value of an attribute */
+xml_attribute_node *xml_set_attribute_float(xml_data_node *node, const char *name, float value);
+
+
+
+/* ----- miscellaneous interfaces ----- */
+
+/* normalize a string into something that can be written to an XML file */
+const char *xml_normalize_string(const char *string);
+
+#endif /* __XMLFILE_H__ */