mirror of
https://github.com/michaelrsweet/mxml.git
synced 2025-02-22 02:05:29 +00:00
Switch to codedoc-generated documentation. Remove all old HTML docs.
This commit is contained in:
parent
3e0c8eaa0e
commit
bc27547035
@ -1,4 +1,4 @@
|
|||||||
# Changes in Mini-XML CURRENT
|
# Changes in Mini-XML 2.13
|
||||||
|
|
||||||
- Fixed a potential buffer overflow when writing floating point data
|
- Fixed a potential buffer overflow when writing floating point data
|
||||||
(Issue #233)
|
(Issue #233)
|
||||||
|
34
Makefile.in
34
Makefile.in
@ -331,33 +331,25 @@ testmxml.o: mxml.h
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# mxml.xml (depends on separate codedoc utility)
|
# Documentation (depends on separate codedoc utility)
|
||||||
#
|
#
|
||||||
|
|
||||||
mxml.xml: mxml.h $(PUBLIBOBJS:.o=.c) \
|
.PHONY: doc
|
||||||
doc/body.man doc/footer.man \
|
doc: mxml.h $(PUBLIBOBJS:.o=.c) \
|
||||||
doc/reference.header
|
doc/body.md doc/body.man doc/footer.man \
|
||||||
|
doc/mxml-cover.png
|
||||||
echo Generating API documentation...
|
echo Generating API documentation...
|
||||||
$(RM) mxml.xml
|
$(RM) mxml.xml
|
||||||
codedoc --header doc/reference.header \
|
|
||||||
--docversion @VERSION@ --author "Michael R Sweet" \
|
|
||||||
--copyright "Copyright 2003-2019, All Rights Reserved." \
|
|
||||||
--title "Mini-XML API Reference" \
|
|
||||||
mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/reference.html
|
|
||||||
codedoc --man mxml --title "Mini-XML API" \
|
|
||||||
--body doc/body.man --footer doc/footer.man \
|
|
||||||
mxml.xml >doc/mxml.man
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# mxml.epub (depends on separate codedoc utility)
|
|
||||||
#
|
|
||||||
|
|
||||||
mxml.epub: mxml.xml doc/body.md doc/mxml-cover.png
|
|
||||||
echo Generating EPUB API documentation...
|
|
||||||
codedoc --body doc/body.md \
|
codedoc --body doc/body.md \
|
||||||
--coverimage doc/mxml-cover.png \
|
--coverimage doc/mxml-cover.png \
|
||||||
--epub mxml.epub mxml.xml
|
mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/mxml.html
|
||||||
|
codedoc --body doc/body.md \
|
||||||
|
--coverimage doc/mxml-cover.png \
|
||||||
|
--epub doc/mxml.epub mxml.xml
|
||||||
|
codedoc --man mxml --title "Mini-XML API" \
|
||||||
|
--body doc/body.man --footer doc/footer.man \
|
||||||
|
mxml.xml >doc/mxml.3
|
||||||
|
$(RM) mxml.xml
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
20
configure
vendored
20
configure
vendored
@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for Mini-XML 2.12.
|
# Generated by GNU Autoconf 2.69 for Mini-XML 2.13.
|
||||||
#
|
#
|
||||||
# Report bugs to <https://github.com/michaelrsweet/mxml/issues>.
|
# Report bugs to <https://github.com/michaelrsweet/mxml/issues>.
|
||||||
#
|
#
|
||||||
@ -580,8 +580,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='Mini-XML'
|
PACKAGE_NAME='Mini-XML'
|
||||||
PACKAGE_TARNAME='mxml'
|
PACKAGE_TARNAME='mxml'
|
||||||
PACKAGE_VERSION='2.12'
|
PACKAGE_VERSION='2.13'
|
||||||
PACKAGE_STRING='Mini-XML 2.12'
|
PACKAGE_STRING='Mini-XML 2.13'
|
||||||
PACKAGE_BUGREPORT='https://github.com/michaelrsweet/mxml/issues'
|
PACKAGE_BUGREPORT='https://github.com/michaelrsweet/mxml/issues'
|
||||||
PACKAGE_URL='https://michaelrsweet.github.io/mxml'
|
PACKAGE_URL='https://michaelrsweet.github.io/mxml'
|
||||||
|
|
||||||
@ -1268,7 +1268,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures Mini-XML 2.12 to adapt to many kinds of systems.
|
\`configure' configures Mini-XML 2.13 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@ -1333,7 +1333,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of Mini-XML 2.12:";;
|
short | recursive ) echo "Configuration of Mini-XML 2.13:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@ -1433,7 +1433,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
Mini-XML configure 2.12
|
Mini-XML configure 2.13
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@ -1840,7 +1840,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by Mini-XML $as_me 2.12, which was
|
It was created by Mini-XML $as_me 2.13, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@ -2298,7 +2298,7 @@ host_os_version=`echo $host_os | sed -e '1,$s/^[^0-9.]*//g'`
|
|||||||
ac_config_headers="$ac_config_headers config.h"
|
ac_config_headers="$ac_config_headers config.h"
|
||||||
|
|
||||||
|
|
||||||
VERSION="2.12"
|
VERSION="2.13"
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
#define MXML_VERSION "Mini-XML v$VERSION"
|
#define MXML_VERSION "Mini-XML v$VERSION"
|
||||||
@ -5146,7 +5146,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by Mini-XML $as_me 2.12, which was
|
This file was extended by Mini-XML $as_me 2.13, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@ -5209,7 +5209,7 @@ _ACEOF
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
Mini-XML config.status 2.12
|
Mini-XML config.status 2.13
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ dnl https://michaelrsweet.github.io/mxml
|
|||||||
dnl
|
dnl
|
||||||
|
|
||||||
dnl Package name and version...
|
dnl Package name and version...
|
||||||
AC_INIT([Mini-XML], [2.12], [https://github.com/michaelrsweet/mxml/issues], [mxml], [https://michaelrsweet.github.io/mxml])
|
AC_INIT([Mini-XML], [2.13], [https://github.com/michaelrsweet/mxml/issues], [mxml], [https://michaelrsweet.github.io/mxml])
|
||||||
|
|
||||||
dnl This line is provided to ensure that you don't run the autoheader program
|
dnl This line is provided to ensure that you don't run the autoheader program
|
||||||
dnl against this project. Doing so is completely unsupported and WILL cause
|
dnl against this project. Doing so is completely unsupported and WILL cause
|
||||||
|
@ -1,633 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1 align='right'><a name='ADVANCED'>Chapter 3 - More Mini-XML
|
|
||||||
Programming Techniques</a></h1>
|
|
||||||
|
|
||||||
<p>This chapter shows additional ways to use the Mini-XML
|
|
||||||
library in your programs.</p>
|
|
||||||
|
|
||||||
<h2><a name='LOAD_CALLBACKS'>Load Callbacks</a></h2>
|
|
||||||
|
|
||||||
<p><a href='#LOAD_XML'>Chapter 2</a> introduced the <a
|
|
||||||
href='#mxmlLoadFile'><tt>mxmlLoadFile()</tt></a> and <a
|
|
||||||
href='#mxmlLoadString'><tt>mxmlLoadString()</tt></a> functions.
|
|
||||||
The last argument to these functions is a callback function
|
|
||||||
which is used to determine the value type of each data node in
|
|
||||||
an XML document.</p>
|
|
||||||
|
|
||||||
<p>Mini-XML defines several standard callbacks for simple
|
|
||||||
XML data files:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li><tt>MXML_INTEGER_CALLBACK</tt> - All data nodes
|
|
||||||
contain whitespace-separated integers.</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_OPAQUE_CALLBACK</tt> - All data nodes
|
|
||||||
contain opaque strings ("CDATA").</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_REAL_CALLBACK</tt> - All data nodes contain
|
|
||||||
whitespace-separated floating-point numbers.</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_TEXT_CALLBACK</tt> - All data nodes contain
|
|
||||||
whitespace-separated strings.</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>You can provide your own callback functions for more complex
|
|
||||||
XML documents. Your callback function will receive a pointer to
|
|
||||||
the current element node and must return the value type of the
|
|
||||||
immediate children for that element node: <tt>MXML_INTEGER</tt>,
|
|
||||||
<tt>MXML_OPAQUE</tt>, <tt>MXML_REAL</tt>, or <tt>MXML_TEXT</tt>.
|
|
||||||
The function is called <i>after</i> the element and its
|
|
||||||
attributes have been read, so you can look at the element name,
|
|
||||||
attributes, and attribute values to determine the proper value
|
|
||||||
type to return.</p>
|
|
||||||
|
|
||||||
<!-- NEED 2in -->
|
|
||||||
<p>The following callback function looks for an attribute named
|
|
||||||
"type" or the element name to determine the value type for its
|
|
||||||
child nodes:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_type_t
|
|
||||||
type_cb(mxml_node_t *node)
|
|
||||||
{
|
|
||||||
const char *type;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* You can lookup attributes and/or use the
|
|
||||||
* element name, hierarchy, etc...
|
|
||||||
*/
|
|
||||||
|
|
||||||
type = mxmlElementGetAttr(node, "type");
|
|
||||||
if (type == NULL)
|
|
||||||
type = mxmlGetElement(node);
|
|
||||||
|
|
||||||
if (!strcmp(type, "integer"))
|
|
||||||
return (MXML_INTEGER);
|
|
||||||
else if (!strcmp(type, "opaque"))
|
|
||||||
return (MXML_OPAQUE);
|
|
||||||
else if (!strcmp(type, "real"))
|
|
||||||
return (MXML_REAL);
|
|
||||||
else
|
|
||||||
return (MXML_TEXT);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>To use this callback function, simply use the name when you
|
|
||||||
call any of the load functions:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "r");
|
|
||||||
tree = mxmlLoadFile(NULL, fp, <b>type_cb</b>);
|
|
||||||
fclose(fp);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<h2><a name='SAVE_CALLBACKS'>Save Callbacks</a></h2>
|
|
||||||
|
|
||||||
<p><a href='#LOAD_XML'>Chapter 2</a> also introduced the <a
|
|
||||||
href='#mxmlSaveFile'><tt>mxmlSaveFile()</tt></a>, <a
|
|
||||||
href='#mxmlSaveString'><tt>mxmlSaveString()</tt></a>, and <a
|
|
||||||
href='#mxmlSaveAllocString'><tt>mxmlSaveAllocString()</tt></a>
|
|
||||||
functions. The last argument to these functions is a callback
|
|
||||||
function which is used to automatically insert whitespace in an
|
|
||||||
XML document.</p>
|
|
||||||
|
|
||||||
<p>Your callback function will be called up to four times for
|
|
||||||
each element node with a pointer to the node and a "where" value
|
|
||||||
of <tt>MXML_WS_BEFORE_OPEN</tt>, <tt>MXML_WS_AFTER_OPEN</tt>,
|
|
||||||
<tt>MXML_WS_BEFORE_CLOSE</tt>, or <tt>MXML_WS_AFTER_CLOSE</tt>.
|
|
||||||
The callback function should return <tt>NULL</tt> if no
|
|
||||||
whitespace should be added and the string to insert (spaces,
|
|
||||||
tabs, carriage returns, and newlines) otherwise.</p>
|
|
||||||
|
|
||||||
<p>The following whitespace callback can be used to add
|
|
||||||
whitespace to XHTML output to make it more readable in a standard
|
|
||||||
text editor:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
const char *
|
|
||||||
whitespace_cb(mxml_node_t *node,
|
|
||||||
int where)
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We can conditionally break to a new line
|
|
||||||
* before or after any element. These are
|
|
||||||
* just common HTML elements...
|
|
||||||
*/
|
|
||||||
|
|
||||||
name = mxmlGetElement(node);
|
|
||||||
|
|
||||||
if (!strcmp(name, "html") ||
|
|
||||||
!strcmp(name, "head") ||
|
|
||||||
!strcmp(name, "body") ||
|
|
||||||
!strcmp(name, "pre") ||
|
|
||||||
!strcmp(name, "p") ||
|
|
||||||
!strcmp(name, "h1") ||
|
|
||||||
!strcmp(name, "h2") ||
|
|
||||||
!strcmp(name, "h3") ||
|
|
||||||
!strcmp(name, "h4") ||
|
|
||||||
!strcmp(name, "h5") ||
|
|
||||||
!strcmp(name, "h6"))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Newlines before open and after
|
|
||||||
* close...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (where == MXML_WS_BEFORE_OPEN ||
|
|
||||||
where == MXML_WS_AFTER_CLOSE)
|
|
||||||
return ("\n");
|
|
||||||
}
|
|
||||||
else if (!strcmp(name, "dl") ||
|
|
||||||
!strcmp(name, "ol") ||
|
|
||||||
!strcmp(name, "ul"))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Put a newline before and after list
|
|
||||||
* elements...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return ("\n");
|
|
||||||
}
|
|
||||||
else if (!strcmp(name, "dd") ||
|
|
||||||
!strcmp(name, "dt") ||
|
|
||||||
!strcmp(name, "li"))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Put a tab before <li>'s, * <dd>'s,
|
|
||||||
* and <dt>'s, and a newline after them...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (where == MXML_WS_BEFORE_OPEN)
|
|
||||||
return ("\t");
|
|
||||||
else if (where == MXML_WS_AFTER_CLOSE)
|
|
||||||
return ("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return NULL for no added whitespace...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>To use this callback function, simply use the name when you
|
|
||||||
call any of the save functions:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "w");
|
|
||||||
mxmlSaveFile(tree, fp, <b>whitespace_cb</b>);
|
|
||||||
fclose(fp);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<h2>Custom Data Types</h2>
|
|
||||||
|
|
||||||
<p>Mini-XML supports custom data types via global load and save
|
|
||||||
callbacks. Only a single set of callbacks can be active at any
|
|
||||||
time, however your callbacks can store additional information in
|
|
||||||
order to support multiple custom data types as needed. The
|
|
||||||
<tt>MXML_CUSTOM</tt> node type identifies custom data nodes.</p>
|
|
||||||
|
|
||||||
<p>The load callback receives a pointer to the current data node
|
|
||||||
and a string of opaque character data from the XML source with
|
|
||||||
character entities converted to the corresponding UTF-8
|
|
||||||
characters. For example, if we wanted to support a custom
|
|
||||||
date/time type whose value is encoded as "yyyy-mm-ddThh:mm:ssZ"
|
|
||||||
(ISO format), the load callback would look like the
|
|
||||||
following:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned year, /* Year */
|
|
||||||
month, /* Month */
|
|
||||||
day, /* Day */
|
|
||||||
hour, /* Hour */
|
|
||||||
minute, /* Minute */
|
|
||||||
second; /* Second */
|
|
||||||
time_t unix; /* UNIX time */
|
|
||||||
} iso_date_time_t;
|
|
||||||
|
|
||||||
int
|
|
||||||
load_custom(mxml_node_t *node,
|
|
||||||
const char *data)
|
|
||||||
{
|
|
||||||
iso_date_time_t *dt;
|
|
||||||
struct tm tmdata;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate data structure...
|
|
||||||
*/
|
|
||||||
|
|
||||||
dt = calloc(1, sizeof(iso_date_time_t));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try reading 6 unsigned integers from the
|
|
||||||
* data string...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
|
|
||||||
&(dt->year), &(dt->month),
|
|
||||||
&(dt->day), &(dt->hour),
|
|
||||||
&(dt->minute),
|
|
||||||
&(dt->second)) != 6)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Unable to read numbers, free the data
|
|
||||||
* structure and return an error...
|
|
||||||
*/
|
|
||||||
|
|
||||||
free(dt);
|
|
||||||
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check values...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (dt->month < 1 || dt->month > 12 ||
|
|
||||||
dt->day < 1 || dt->day > 31 ||
|
|
||||||
dt->hour < 0 || dt->hour > 23 ||
|
|
||||||
dt->minute < 0 || dt->minute > 59 ||
|
|
||||||
dt->second < 0 || dt->second > 59)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Date information is out of range...
|
|
||||||
*/
|
|
||||||
|
|
||||||
free(dt);
|
|
||||||
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert ISO time to UNIX time in
|
|
||||||
* seconds...
|
|
||||||
*/
|
|
||||||
|
|
||||||
tmdata.tm_year = dt->year - 1900;
|
|
||||||
tmdata.tm_mon = dt->month - 1;
|
|
||||||
tmdata.tm_day = dt->day;
|
|
||||||
tmdata.tm_hour = dt->hour;
|
|
||||||
tmdata.tm_min = dt->minute;
|
|
||||||
tmdata.tm_sec = dt->second;
|
|
||||||
|
|
||||||
dt->unix = gmtime(&tmdata);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Assign custom node data and destroy
|
|
||||||
* function pointers...
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxmlSetCustom(node, data, destroy);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return with no errors...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The function itself can return 0 on success or -1 if it is
|
|
||||||
unable to decode the custom data or the data contains an error.
|
|
||||||
Custom data nodes contain a <tt>void</tt> pointer to the
|
|
||||||
allocated custom data for the node and a pointer to a destructor
|
|
||||||
function which will free the custom data when the node is
|
|
||||||
deleted.</p>
|
|
||||||
|
|
||||||
<!-- NEED 15 -->
|
|
||||||
<p>The save callback receives the node pointer and returns an
|
|
||||||
allocated string containing the custom data value. The following
|
|
||||||
save callback could be used for our ISO date/time type:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
char *
|
|
||||||
save_custom(mxml_node_t *node)
|
|
||||||
{
|
|
||||||
char data[255];
|
|
||||||
iso_date_time_t *dt;
|
|
||||||
|
|
||||||
|
|
||||||
dt = (iso_date_time_t *)mxmlGetCustom(node);
|
|
||||||
|
|
||||||
snprintf(data, sizeof(data),
|
|
||||||
"%04u-%02u-%02uT%02u:%02u:%02uZ",
|
|
||||||
dt->year, dt->month, dt->day,
|
|
||||||
dt->hour, dt->minute, dt->second);
|
|
||||||
|
|
||||||
return (strdup(data));
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>You register the callback functions using the <a
|
|
||||||
href='#mxmlSetCustomHandlers'><tt>mxmlSetCustomHandlers()</tt></a>
|
|
||||||
function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxmlSetCustomHandlers(<b>load_custom</b>,
|
|
||||||
<b>save_custom</b>);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- NEED 20 -->
|
|
||||||
<h2>Changing Node Values</h2>
|
|
||||||
|
|
||||||
<p>All of the examples so far have concentrated on creating and
|
|
||||||
loading new XML data nodes. Many applications, however, need to
|
|
||||||
manipulate or change the nodes during their operation, so
|
|
||||||
Mini-XML provides functions to change node values safely and
|
|
||||||
without leaking memory.</p>
|
|
||||||
|
|
||||||
<p>Existing nodes can be changed using the <a
|
|
||||||
href='#mxmlSetElement'><tt>mxmlSetElement()</tt></a>, <a
|
|
||||||
href='#mxmlSetInteger'><tt>mxmlSetInteger()</tt></a>, <a
|
|
||||||
href='#mxmlSetOpaque'><tt>mxmlSetOpaque()</tt></a>, <a
|
|
||||||
href='#mxmlSetReal'><tt>mxmlSetReal()</tt></a>, <a
|
|
||||||
href='#mxmlSetText'><tt>mxmlSetText()</tt></a>, and <a
|
|
||||||
href='#mxmlSetTextf'><tt>mxmlSetTextf()</tt></a> functions. For
|
|
||||||
example, use the following function call to change a text node
|
|
||||||
to contain the text "new" with leading whitespace:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
mxmlSetText(node, 1, "new");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Formatted Text</h2>
|
|
||||||
|
|
||||||
<p>The <a href='#mxmlNewTextf'><tt>mxmlNewTextf()</tt></a> and <a
|
|
||||||
href='#mxmlSetTextf'><tt>mxmlSetTextf()</tt></a> functions create
|
|
||||||
and change text nodes, respectively, using <tt>printf</tt>-style
|
|
||||||
format strings and arguments. For example, use the following
|
|
||||||
function call to create a new text node containing a constructed
|
|
||||||
filename:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t</a> *node;
|
|
||||||
|
|
||||||
node = mxmlNewTextf(node, 1, "%s/%s",
|
|
||||||
path, filename);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Indexing</h2>
|
|
||||||
|
|
||||||
<p>Mini-XML provides functions for managing indices of nodes.
|
|
||||||
The current implementation provides the same functionality as
|
|
||||||
<a href='#mxmlFindElement'><tt>mxmlFindElement()</tt></a>.
|
|
||||||
The advantage of using an index is that searching and
|
|
||||||
enumeration of elements is significantly faster. The only
|
|
||||||
disadvantage is that each index is a static snapshot of the XML
|
|
||||||
document, so indices are not well suited to XML data that is
|
|
||||||
updated more often than it is searched. The overhead of creating
|
|
||||||
an index is approximately equal to walking the XML document
|
|
||||||
tree. Nodes in the index are sorted by element name and
|
|
||||||
attribute value.</p>
|
|
||||||
|
|
||||||
<p>Indices are stored in <a href='#mxml_index_t'><tt>mxml_index_t</tt></a>
|
|
||||||
structures. The <a href='#mxmlIndexNew'><tt>mxmlIndexNew()</tt></a> function
|
|
||||||
creates a new index:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *tree;
|
|
||||||
mxml_index_t *ind;
|
|
||||||
|
|
||||||
ind = mxmlIndexNew(tree, "element",
|
|
||||||
"attribute");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The first argument is the XML node tree to index. Normally this
|
|
||||||
will be a pointer to the <tt>?xml</tt> element.</p>
|
|
||||||
|
|
||||||
<p>The second argument contains the element to index; passing
|
|
||||||
<tt>NULL</tt> indexes all element nodes alphabetically.</p>
|
|
||||||
|
|
||||||
<p>The third argument contains the attribute to index; passing
|
|
||||||
<tt>NULL</tt> causes only the element name to be indexed.</p>
|
|
||||||
|
|
||||||
<p>Once the index is created, the <a
|
|
||||||
href='#mxmlIndexEnum'><tt>mxmlIndexEnum()</tt></a>, <a
|
|
||||||
href='#mxmlIndexFind'><tt>mxmlIndexFind()</tt></a>, and <a
|
|
||||||
href='#mxmlIndexReset'><tt>mxmlIndexReset()</tt></a> functions
|
|
||||||
are used to access the nodes in the index. The <a
|
|
||||||
href='#mxmlIndexReset'><tt>mxmlIndexReset()</tt></a> function
|
|
||||||
resets the "current" node pointer in the index, allowing you to
|
|
||||||
do new searches and enumerations on the same index. Typically
|
|
||||||
you will call this function prior to your calls to <a
|
|
||||||
href='#mxmlIndexEnum'><tt>mxmlIndexEnum()</tt></a> and <a
|
|
||||||
href='#mxmlIndexFind'><tt>mxmlIndexFind()</tt></a>.</p>
|
|
||||||
|
|
||||||
<p>The <a href='#mxmlIndexEnum'><tt>mxmlIndexEnum()</tt></a>
|
|
||||||
function enumerates each of the nodes in the index and can be
|
|
||||||
used in a loop as follows:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
mxmlIndexReset(ind);
|
|
||||||
|
|
||||||
while ((node = mxmlIndexEnum(ind)) != NULL)
|
|
||||||
{
|
|
||||||
// do something with node
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The <a href='#mxmlIndexFind'><tt>mxmlIndexFind()</tt></a>
|
|
||||||
function locates the next occurrence of the named element and
|
|
||||||
attribute value in the index. It can be used to find all
|
|
||||||
matching elements in an index, as follows:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
mxmlIndexReset(ind);
|
|
||||||
|
|
||||||
while ((node = mxmlIndexFind(ind, "element",
|
|
||||||
"attr-value"))
|
|
||||||
!= NULL)
|
|
||||||
{
|
|
||||||
// do something with node
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The second and third arguments represent the element name and
|
|
||||||
attribute value, respectively. A <tt>NULL</tt> pointer is used
|
|
||||||
to return all elements or attributes in the index. Passing
|
|
||||||
<tt>NULL</tt> for both the element name and attribute value
|
|
||||||
is equivalent to calling <tt>mxmlIndexEnum</tt>.</p>
|
|
||||||
|
|
||||||
<p>When you are done using the index, delete it using the
|
|
||||||
<a href='#mxmlIndexDelete()'><tt>mxmlIndexDelete()</tt></a>
|
|
||||||
function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxmlIndexDelete(ind);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2>SAX (Stream) Loading of Documents</h2>
|
|
||||||
|
|
||||||
<p>Mini-XML supports an implementation of the Simple API for XML
|
|
||||||
(SAX) which allows you to load and process an XML document as a
|
|
||||||
stream of nodes. Aside from allowing you to process XML documents of
|
|
||||||
any size, the Mini-XML implementation also allows you to retain
|
|
||||||
portions of the document in memory for later processing.</p>
|
|
||||||
|
|
||||||
<p>The <a href='#mxmlSAXLoad'><tt>mxmlSAXLoadFd</tt></a>, <a
|
|
||||||
href='#mxmlSAXLoadFile'><tt>mxmlSAXLoadFile</tt></a>, and <a
|
|
||||||
href='#mxmlSAXLoadString'><tt>mxmlSAXLoadString</tt></a> functions
|
|
||||||
provide the SAX loading APIs. Each function works like the
|
|
||||||
corresponding <tt>mxmlLoad</tt> function but uses a callback to
|
|
||||||
process each node as it is read.</p>
|
|
||||||
|
|
||||||
<p>The callback function receives the node, an event code, and
|
|
||||||
a user data pointer you supply:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
void
|
|
||||||
sax_cb(mxml_node_t *node,
|
|
||||||
mxml_sax_event_t event,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
... do something ...
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The event will be one of the following:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_CDATA</tt> - CDATA was just read</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_COMMENT</tt> - A comment was just read</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_DATA</tt> - Data (custom, integer, opaque, real, or text) was just read</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_DIRECTIVE</tt> - A processing directive was just read</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_ELEMENT_CLOSE</tt> - A close element was just read (<tt></element></tt>)</li>
|
|
||||||
|
|
||||||
<li><tt>MXML_SAX_ELEMENT_OPEN</tt> - An open element was just read (<tt><element></tt>)</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Elements are <em>released</em> after the close element is
|
|
||||||
processed. All other nodes are released after they are processed.
|
|
||||||
The SAX callback can <em>retain</em> the node using the <a
|
|
||||||
href='#mxmlRetain'><tt>mxmlRetain</tt></a> function. For example,
|
|
||||||
the following SAX callback will retain all nodes, effectively
|
|
||||||
simulating a normal in-memory load:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
void
|
|
||||||
sax_cb(mxml_node_t *node,
|
|
||||||
mxml_sax_event_t event,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
if (event != MXML_SAX_ELEMENT_CLOSE)
|
|
||||||
mxmlRetain(node);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>More typically the SAX callback will only retain a small portion
|
|
||||||
of the document that is needed for post-processing. For example, the
|
|
||||||
following SAX callback will retain the title and headings in an
|
|
||||||
XHTML file. It also retains the (parent) elements like <tt><html></tt>, <tt><head></tt>, and <tt><body></tt>, and processing
|
|
||||||
directives like <tt><?xml ... ?></tt> and <tt><!DOCTYPE ... ></tt>:</p>
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<pre>
|
|
||||||
void
|
|
||||||
sax_cb(mxml_node_t *node,
|
|
||||||
mxml_sax_event_t event,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
if (event == MXML_SAX_ELEMENT_OPEN)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Retain headings and titles...
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *name = mxmlGetElement(node);
|
|
||||||
|
|
||||||
if (!strcmp(name, "html") ||
|
|
||||||
!strcmp(name, "head") ||
|
|
||||||
!strcmp(name, "title") ||
|
|
||||||
!strcmp(name, "body") ||
|
|
||||||
!strcmp(name, "h1") ||
|
|
||||||
!strcmp(name, "h2") ||
|
|
||||||
!strcmp(name, "h3") ||
|
|
||||||
!strcmp(name, "h4") ||
|
|
||||||
!strcmp(name, "h5") ||
|
|
||||||
!strcmp(name, "h6"))
|
|
||||||
mxmlRetain(node);
|
|
||||||
}
|
|
||||||
else if (event == MXML_SAX_DIRECTIVE)
|
|
||||||
mxmlRetain(node);
|
|
||||||
else if (event == MXML_SAX_DATA)
|
|
||||||
{
|
|
||||||
if (mxmlGetRefCount(mxmlGetParent(node)) > 1)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If the parent was retained, then retain
|
|
||||||
* this data node as well.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxmlRetain(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The resulting skeleton document tree can then be searched just
|
|
||||||
like one loaded using the <tt>mxmlLoad</tt> functions. For example,
|
|
||||||
a filter that reads an XHTML document from stdin and then shows the
|
|
||||||
title and headings in the document would look like:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *doc, *title, *body, *heading;
|
|
||||||
|
|
||||||
doc = mxmlSAXLoadFd(NULL, 0,
|
|
||||||
MXML_TEXT_CALLBACK,
|
|
||||||
<b>sax_cb</b>, NULL);
|
|
||||||
|
|
||||||
title = mxmlFindElement(doc, doc, "title",
|
|
||||||
NULL, NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
|
|
||||||
if (title)
|
|
||||||
print_children(title);
|
|
||||||
|
|
||||||
body = mxmlFindElement(doc, doc, "body",
|
|
||||||
NULL, NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
|
|
||||||
if (body)
|
|
||||||
{
|
|
||||||
for (heading = mxmlGetFirstChild(body);
|
|
||||||
heading;
|
|
||||||
heading = mxmlGetNextSibling(heading))
|
|
||||||
print_children(heading);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
590
doc/basics.html
590
doc/basics.html
@ -1,590 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1 align='right'><a name='BASICS'>Chapter 2 - Getting Started
|
|
||||||
with Mini-XML</a></h1>
|
|
||||||
|
|
||||||
<p>This chapter describes how to write programs that use Mini-XML to
|
|
||||||
access data in an XML file. Mini-XML provides the following
|
|
||||||
functionality:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and strings.</li>
|
|
||||||
<li>Data is stored in a linked-list tree structure, preserving the XML data hierarchy.</li>
|
|
||||||
<li>SAX (streamed) reading of XML files and strings to minimize memory usage.</li>
|
|
||||||
<li>Supports arbitrary element names, attributes, and attribute values with no preset limits, just available memory.</li>
|
|
||||||
<li>Supports integer, real, opaque ("cdata"), and text data types in "leaf" nodes.</li>
|
|
||||||
<li>Functions for creating and managing trees of data.</li>
|
|
||||||
<li>"Find" and "walk" functions for easily locating and navigating trees of data.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Mini-XML doesn't do validation or other types of processing on the data based upon schema files or other sources of definition information.</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>The Basics</h2>
|
|
||||||
|
|
||||||
<p>Mini-XML provides a single header file which you include:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
#include <mxml.h>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The Mini-XML library is included with your program using the
|
|
||||||
<kbd>-lmxml</kbd> option:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>gcc -o myprogram myprogram.c -lmxml ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>If you have the <tt>pkg-config(1)</tt> software installed,
|
|
||||||
you can use it to determine the proper compiler and linker options
|
|
||||||
for your installation:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>pkg-config --cflags mxml ENTER</kbd>
|
|
||||||
<kbd>pkg-config --libs mxml ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2>Nodes</h2>
|
|
||||||
|
|
||||||
<p>Every piece of information in an XML file is stored in memory in "nodes".
|
|
||||||
Nodes are defined by the <a href='#mxml_node_t'><tt>mxml_node_t</tt></a>
|
|
||||||
structure. Each node has a typed value, optional user data, a parent node,
|
|
||||||
sibling nodes (previous and next), and potentially child nodes.</p>
|
|
||||||
|
|
||||||
<p>For example, if you have an XML file like the following:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<data>
|
|
||||||
<node>val1</node>
|
|
||||||
<node>val2</node>
|
|
||||||
<node>val3</node>
|
|
||||||
<group>
|
|
||||||
<node>val4</node>
|
|
||||||
<node>val5</node>
|
|
||||||
<node>val6</node>
|
|
||||||
</group>
|
|
||||||
<node>val7</node>
|
|
||||||
<node>val8</node>
|
|
||||||
</data>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>the node tree for the file would look like the following in memory:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
?xml version="1.0" encoding="utf-8"?
|
|
||||||
|
|
|
||||||
data
|
|
||||||
|
|
|
||||||
node - node - node - group - node - node
|
|
||||||
| | | | | |
|
|
||||||
val1 val2 val3 | val7 val8
|
|
||||||
|
|
|
||||||
node - node - node
|
|
||||||
| | |
|
|
||||||
val4 val5 val6
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>where "-" is a pointer to the sibling node and "|" is a pointer
|
|
||||||
to the first child or parent node.</p>
|
|
||||||
|
|
||||||
<p>The <a href="#mxmlGetType"><tt>mxmlGetType</tt></a> function gets the type of
|
|
||||||
a node, one of <tt>MXML_CUSTOM</tt>, <tt>MXML_ELEMENT</tt>,
|
|
||||||
<tt>MXML_INTEGER</tt>, <tt>MXML_OPAQUE</tt>, <tt>MXML_REAL</tt>, or
|
|
||||||
<tt>MXML_TEXT</tt>. The parent and sibling nodes are accessed using the
|
|
||||||
<a href="#mxmlGetParent"><tt>mxmlGetParent</tt></a>,
|
|
||||||
<a href="#mxmlGetNext"><tt>mxmlGetNext</tt></a>, and
|
|
||||||
<a href="#mxmlGetPrevious"><tt>mxmlGetPrevious</tt></a> functions. The
|
|
||||||
<a href="#mxmlGetUserData"><tt>mxmlGetUserData</tt></a> function gets any user
|
|
||||||
data associated with the node.</p>
|
|
||||||
|
|
||||||
<h3>CDATA Nodes</h3>
|
|
||||||
|
|
||||||
<p>CDATA (<tt>MXML_ELEMENT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewCDATA"><tt>mxmlNewCDATA</tt></a> function. The
|
|
||||||
<a href="#mxmlGetCDATA"><tt>mxmlGetCDATA</tt></a> function retrieves the
|
|
||||||
CDATA string pointer for a node.</p>
|
|
||||||
|
|
||||||
<blockquote><b>Note:</b>
|
|
||||||
|
|
||||||
<p>CDATA nodes are currently stored in memory as special elements. This will
|
|
||||||
be changed in a future major release of Mini-XML.</p>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<h3>Custom Nodes</h3>
|
|
||||||
|
|
||||||
<p>Custom (<tt>MXML_CUSTOM</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewCustom"><tt>mxmlNewCustom</tt></a> function or using a custom
|
|
||||||
load callback specified using the
|
|
||||||
<a href="#mxmlSetCustomHandlers"><tt>mxmlSetCustomHandlers</tt></a> function.
|
|
||||||
The <a href="#mxmlGetCustom"><tt>mxmlGetCustom</tt></a> function retrieves the
|
|
||||||
custom value pointer for a node.</p>
|
|
||||||
|
|
||||||
<h3>Comment Nodes</h3>
|
|
||||||
|
|
||||||
<p>Comment (<tt>MXML_ELEMENT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewElement"><tt>mxmlNewElement</tt></a> function. The
|
|
||||||
<a href="#mxmlGetElement"><tt>mxmlGetElement</tt></a> function retrieves the
|
|
||||||
comment string pointer for a node, including the surrounding "!--" and "--"
|
|
||||||
characters.</p>
|
|
||||||
|
|
||||||
<blockquote><b>Note:</b>
|
|
||||||
|
|
||||||
<p>Comment nodes are currently stored in memory as special elements. This will
|
|
||||||
be changed in a future major release of Mini-XML.</p>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<h3>Element Nodes</h3>
|
|
||||||
|
|
||||||
<p>Element (<tt>MXML_ELEMENT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewElement"><tt>mxmlNewElement</tt></a> function. The
|
|
||||||
<a href="#mxmlGetElement"><tt>mxmlGetElement</tt></a> function retrieves the
|
|
||||||
element name, the
|
|
||||||
<a href="#mxmlElementGetAttr"><tt>mxmlElementGetAttr</tt></a> function retrieves
|
|
||||||
the value string for a named attribute associated with the element, and the
|
|
||||||
<a href="#mxmlGetFirstChild"><tt>mxmlGetFirstChild</tt></a> and
|
|
||||||
<a href="#mxmlGetLastChild"><tt>mxmlGetLastChild</tt></a> functions retrieve the
|
|
||||||
first and last child nodes for the element, respectively.</p>
|
|
||||||
|
|
||||||
<h3>Integer Nodes</h3>
|
|
||||||
|
|
||||||
<p>Integer (<tt>MXML_INTEGER</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewInteger"><tt>mxmlNewInteger</tt></a> function. The
|
|
||||||
<a href="#mxmlGetInteger"><tt>mxmlGetInteger</tt></a> function retrieves the
|
|
||||||
integer value for a node.</p>
|
|
||||||
|
|
||||||
<h3>Opaque String Nodes</h3>
|
|
||||||
|
|
||||||
<p>Opaque string (<tt>MXML_OPAQUE</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewOpaque"><tt>mxmlNewOpaque</tt></a> function. The
|
|
||||||
<a href="#mxmlGetOpaque"><tt>mxmlGetOpaque</tt></a> function retrieves the
|
|
||||||
opaque string pointer for a node. Opaque nodes are like string nodes but
|
|
||||||
preserve all whitespace between nodes.</p>
|
|
||||||
|
|
||||||
<h3>Text String Nodes</h3>
|
|
||||||
|
|
||||||
<p>Text string (<tt>MXML_TEXT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewText"><tt>mxmlNewText</tt></a> and
|
|
||||||
<a href="#mxmlNewTextf"><tt>mxmlNewTextf</tt></a> functions. Each text node
|
|
||||||
consists of a single word string and (leading) whitespace value - the
|
|
||||||
<a href="#mxmlGetText"><tt>mxmlGetText</tt></a> function retrieves the
|
|
||||||
string pointer and whitespace value for a node.</p>
|
|
||||||
|
|
||||||
<!-- NEED 12 -->
|
|
||||||
<h3>Processing Instruction Nodes</h3>
|
|
||||||
|
|
||||||
<p>Processing instruction (<tt>MXML_ELEMENT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewElement"><tt>mxmlNewElement</tt></a> function. The
|
|
||||||
<a href="#mxmlGetElement"><tt>mxmlGetElement</tt></a> function retrieves the
|
|
||||||
processing instruction string for a node, including the surrounding "?"
|
|
||||||
characters.</p>
|
|
||||||
|
|
||||||
<blockquote><b>Note:</b>
|
|
||||||
|
|
||||||
<p>Processing instruction nodes are currently stored in memory as special
|
|
||||||
elements. This will be changed in a future major release of Mini-XML.</p>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<h3>Real Number Nodes</h3>
|
|
||||||
|
|
||||||
<p>Real number (<tt>MXML_REAL</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewReal"><tt>mxmlNewReal</tt></a> function. The
|
|
||||||
<a href="#mxmlGetReal"><tt>mxmlGetReal</tt></a> function retrieves the
|
|
||||||
CDATA string pointer for a node.</p>
|
|
||||||
|
|
||||||
<!-- NEED 15 -->
|
|
||||||
<h3>XML Declaration Nodes</h3>
|
|
||||||
|
|
||||||
<p>XML declaration (<tt>MXML_ELEMENT</tt>) nodes are created using the
|
|
||||||
<a href="#mxmlNewXML"><tt>mxmlNewXML</tt></a> function. The
|
|
||||||
<a href="#mxmlGetElement"><tt>mxmlGetElement</tt></a> function retrieves the
|
|
||||||
XML declaration string for a node, including the surrounding "?" characters.</p>
|
|
||||||
|
|
||||||
<blockquote><b>Note:</b>
|
|
||||||
|
|
||||||
<p>XML declaration nodes are currently stored in memory as special elements.
|
|
||||||
This will be changed in a future major release of Mini-XML.</p>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- NEW PAGE -->
|
|
||||||
<h2>Creating XML Documents</h2>
|
|
||||||
|
|
||||||
<p>You can create and update XML documents in memory using the
|
|
||||||
various <tt>mxmlNew</tt> functions. The following code will
|
|
||||||
create the XML document described in the previous section:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *xml; /* <?xml ... ?> */
|
|
||||||
mxml_node_t *data; /* <data> */
|
|
||||||
mxml_node_t *node; /* <node> */
|
|
||||||
mxml_node_t *group; /* <group> */
|
|
||||||
|
|
||||||
xml = mxmlNewXML("1.0");
|
|
||||||
|
|
||||||
data = mxmlNewElement(xml, "data");
|
|
||||||
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val1");
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val2");
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val3");
|
|
||||||
|
|
||||||
group = mxmlNewElement(data, "group");
|
|
||||||
|
|
||||||
node = mxmlNewElement(group, "node");
|
|
||||||
mxmlNewText(node, 0, "val4");
|
|
||||||
node = mxmlNewElement(group, "node");
|
|
||||||
mxmlNewText(node, 0, "val5");
|
|
||||||
node = mxmlNewElement(group, "node");
|
|
||||||
mxmlNewText(node, 0, "val6");
|
|
||||||
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val7");
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val8");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<!-- NEED 6 -->
|
|
||||||
<p>We start by creating the declaration node common to all XML files using the
|
|
||||||
<a href="#mxmlNewXML"><tt>mxmlNewXML</tt></a> function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
xml = mxmlNewXML("1.0");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>We then create the <tt><data></tt> node used for this document using
|
|
||||||
the <a href="#mxmlNewElement"><tt>mxmlNewElement</tt></a> function. The first
|
|
||||||
argument specifies the parent node (<tt>xml</tt>) while the second specifies the
|
|
||||||
element name (<tt>data</tt>):</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
data = mxmlNewElement(xml, "data");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>Each <tt><node>...</node></tt> in the file is created using the
|
|
||||||
<tt>mxmlNewElement</tt> and <a href="#mxmlNewText"><tt>mxmlNewText</tt></a>
|
|
||||||
functions. The first argument of <tt>mxmlNewText</tt> specifies the parent node
|
|
||||||
(<tt>node</tt>). The second argument specifies whether whitespace appears before
|
|
||||||
the text - 0 or false in this case. The last argument specifies the actual text
|
|
||||||
to add:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
node = mxmlNewElement(data, "node");
|
|
||||||
mxmlNewText(node, 0, "val1");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The resulting in-memory XML document can then be saved or processed just like
|
|
||||||
one loaded from disk or a string.</p>
|
|
||||||
|
|
||||||
<!-- NEED 15 -->
|
|
||||||
<h2>Loading XML</h2>
|
|
||||||
|
|
||||||
<p>You load an XML file using the <a
|
|
||||||
href='#mxmlLoadFile'><tt>mxmlLoadFile</tt></a>
|
|
||||||
function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "r");
|
|
||||||
tree = mxmlLoadFile(NULL, fp,
|
|
||||||
MXML_OPAQUE_CALLBACK);
|
|
||||||
fclose(fp);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The first argument specifies an existing XML parent node, if
|
|
||||||
any. Normally you will pass <tt>NULL</tt> for this argument
|
|
||||||
unless you are combining multiple XML sources. The XML file must
|
|
||||||
contain a complete XML document including the <tt>?xml</tt>
|
|
||||||
element if the parent node is <tt>NULL</tt>.</p>
|
|
||||||
|
|
||||||
<p>The second argument specifies the stdio file to read from, as
|
|
||||||
opened by <tt>fopen()</tt> or <tt>popen()</tt>. You can also use
|
|
||||||
<tt>stdin</tt> if you are implementing an XML filter
|
|
||||||
program.</p>
|
|
||||||
|
|
||||||
<p>The third argument specifies a callback function which returns
|
|
||||||
the value type of the immediate children for a new element node:
|
|
||||||
<tt>MXML_CUSTOM</tt>, <tt>MXML_IGNORE</tt>,
|
|
||||||
<tt>MXML_INTEGER</tt>, <tt>MXML_OPAQUE</tt>, <tt>MXML_REAL</tt>,
|
|
||||||
or <tt>MXML_TEXT</tt>. Load callbacks are described in detail in
|
|
||||||
<a href='#LOAD_CALLBACKS'>Chapter 3</a>. The example code uses
|
|
||||||
the <tt>MXML_OPAQUE_CALLBACK</tt> constant which specifies that all
|
|
||||||
data nodes in the document contain opaque string values with whitespace
|
|
||||||
preserved. Other standard callbacks include
|
|
||||||
<tt>MXML_IGNORE_CALLBACK</tt>, <tt>MXML_INTEGER_CALLBACK</tt>,
|
|
||||||
<tt>MXML_REAL_CALLBACK</tt>, and
|
|
||||||
<tt>MXML_TEXT_CALLBACK</tt>.</p>
|
|
||||||
|
|
||||||
<p>The <a href='#mxmlLoadString'><tt>mxmlLoadString</tt></a>
|
|
||||||
function loads XML node trees from a string:</p>
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<pre>
|
|
||||||
char buffer[8192];
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
...
|
|
||||||
tree = mxmlLoadString(NULL, buffer,
|
|
||||||
MXML_OPAQUE_CALLBACK);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The first and third arguments are the same as used for
|
|
||||||
<tt>mxmlLoadFile()</tt>. The second argument specifies the
|
|
||||||
string or character buffer to load and must be a complete XML
|
|
||||||
document including the <tt>?xml</tt> element if the parent node
|
|
||||||
is <tt>NULL</tt>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- NEED 15 -->
|
|
||||||
<h2>Saving XML</h2>
|
|
||||||
|
|
||||||
<p>You save an XML file using the <a
|
|
||||||
href='#mxmlSaveFile'><tt>mxmlSaveFile</tt></a> function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "w");
|
|
||||||
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
|
||||||
fclose(fp);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The first argument is the XML node tree to save. It should
|
|
||||||
normally be a pointer to the top-level <tt>?xml</tt> node in
|
|
||||||
your XML document.</p>
|
|
||||||
|
|
||||||
<p>The second argument is the stdio file to write to, as opened
|
|
||||||
by <tt>fopen()</tt> or <tt>popen()</tt>. You can also use
|
|
||||||
<tt>stdout</tt> if you are implementing an XML filter
|
|
||||||
program.</p>
|
|
||||||
|
|
||||||
<p>The third argument is the whitespace callback to use when
|
|
||||||
saving the file. Whitespace callbacks are covered in detail in <a
|
|
||||||
href='SAVE_CALLBACKS'>Chapter 3</a>. The previous example code
|
|
||||||
uses the <tt>MXML_NO_CALLBACK</tt> constant to specify that no
|
|
||||||
special whitespace handling is required.</p>
|
|
||||||
|
|
||||||
<p>The <a
|
|
||||||
href='#mxmlSaveAllocString'><tt>mxmlSaveAllocString</tt></a>,
|
|
||||||
and <a href='#mxmlSaveString'><tt>mxmlSaveString</tt></a>
|
|
||||||
functions save XML node trees to strings:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
char buffer[8192];
|
|
||||||
char *ptr;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
...
|
|
||||||
mxmlSaveString(tree, buffer, sizeof(buffer),
|
|
||||||
MXML_NO_CALLBACK);
|
|
||||||
|
|
||||||
...
|
|
||||||
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The first and last arguments are the same as used for
|
|
||||||
<tt>mxmlSaveFile()</tt>. The <tt>mxmlSaveString</tt> function
|
|
||||||
takes pointer and size arguments for saving the XML document to
|
|
||||||
a fixed-size buffer, while <tt>mxmlSaveAllocString()</tt>
|
|
||||||
returns a string buffer that was allocated using
|
|
||||||
<tt>malloc()</tt>.</p>
|
|
||||||
|
|
||||||
<!-- NEED 15 -->
|
|
||||||
<h3>Controlling Line Wrapping</h3>
|
|
||||||
|
|
||||||
<p>When saving XML documents, Mini-XML normally wraps output
|
|
||||||
lines at column 75 so that the text is readable in terminal
|
|
||||||
windows. The <a
|
|
||||||
href='#mxmlSetWrapMargin'><tt>mxmlSetWrapMargin</tt></a> function
|
|
||||||
overrides the default wrap margin:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
/* Set the margin to 132 columns */
|
|
||||||
mxmlSetWrapMargin(132);
|
|
||||||
|
|
||||||
/* Disable wrapping */
|
|
||||||
mxmlSetWrapMargin(0);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2>Memory Management</h2>
|
|
||||||
|
|
||||||
<p>Once you are done with the XML data, use the <a
|
|
||||||
href="#mxmlDelete"><tt>mxmlDelete</tt></a> function to recursively
|
|
||||||
free the memory that is used for a particular node or the entire
|
|
||||||
tree:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxmlDelete(tree);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>You can also use reference counting to manage memory usage. The
|
|
||||||
<a href="#mxmlRetain"><tt>mxmlRetain</tt></a> and
|
|
||||||
<a href="#mxmlRelease"><tt>mxmlRelease</tt></a> functions increment and
|
|
||||||
decrement a node's use count, respectively. When the use count goes to 0,
|
|
||||||
<tt>mxmlRelease</tt> will automatically call <tt>mxmlDelete</tt> to actually
|
|
||||||
free the memory used by the node tree. New nodes automatically start with a
|
|
||||||
use count of 1.</p>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- NEW PAGE-->
|
|
||||||
<h2>Finding and Iterating Nodes</h2>
|
|
||||||
|
|
||||||
<p>The <a
|
|
||||||
href='#mxmlWalkPrev'><tt>mxmlWalkPrev</tt></a>
|
|
||||||
and <a
|
|
||||||
href='#mxmlWalkNext'><tt>mxmlWalkNext</tt></a>functions
|
|
||||||
can be used to iterate through the XML node tree:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
node = mxmlWalkPrev(current, tree,
|
|
||||||
MXML_DESCEND);
|
|
||||||
|
|
||||||
node = mxmlWalkNext(current, tree,
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>In addition, you can find a named element/node using the <a
|
|
||||||
href='#mxmlFindElement'><tt>mxmlFindElement</tt></a>
|
|
||||||
function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
node = mxmlFindElement(tree, tree, "name",
|
|
||||||
"attr", "value",
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The <tt>name</tt>, <tt>attr</tt>, and <tt>value</tt>
|
|
||||||
arguments can be passed as <tt>NULL</tt> to act as wildcards,
|
|
||||||
e.g.:</p>
|
|
||||||
|
|
||||||
<!-- NEED 4 -->
|
|
||||||
<pre>
|
|
||||||
/* Find the first "a" element */
|
|
||||||
node = mxmlFindElement(tree, tree, "a",
|
|
||||||
NULL, NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
<!-- NEED 5 -->
|
|
||||||
<pre>
|
|
||||||
/* Find the first "a" element with "href"
|
|
||||||
attribute */
|
|
||||||
node = mxmlFindElement(tree, tree, "a",
|
|
||||||
"href", NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
<!-- NEED 6 -->
|
|
||||||
<pre>
|
|
||||||
/* Find the first "a" element with "href"
|
|
||||||
to a URL */
|
|
||||||
node = mxmlFindElement(tree, tree, "a",
|
|
||||||
"href",
|
|
||||||
"http://www.example.com/",
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
<!-- NEED 5 -->
|
|
||||||
<pre>
|
|
||||||
/* Find the first element with a "src"
|
|
||||||
attribute */
|
|
||||||
node = mxmlFindElement(tree, tree, NULL,
|
|
||||||
"src", NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
<!-- NEED 5 -->
|
|
||||||
<pre>
|
|
||||||
/* Find the first element with a "src"
|
|
||||||
= "foo.jpg" */
|
|
||||||
node = mxmlFindElement(tree, tree, NULL,
|
|
||||||
"src", "foo.jpg",
|
|
||||||
MXML_DESCEND);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>You can also iterate with the same function:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
for (node = mxmlFindElement(tree, tree,
|
|
||||||
"name",
|
|
||||||
NULL, NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
node != NULL;
|
|
||||||
node = mxmlFindElement(node, tree,
|
|
||||||
"name",
|
|
||||||
NULL, NULL,
|
|
||||||
MXML_DESCEND))
|
|
||||||
{
|
|
||||||
... do something ...
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<p>The <tt>MXML_DESCEND</tt> argument can actually be one of
|
|
||||||
three constants:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li><tt>MXML_NO_DESCEND</tt> means to not to look at any
|
|
||||||
child nodes in the element hierarchy, just look at
|
|
||||||
siblings at the same level or parent nodes until the top
|
|
||||||
node or top-of-tree is reached.
|
|
||||||
|
|
||||||
<p>The previous node from "group" would be the "node"
|
|
||||||
element to the left, while the next node from "group" would
|
|
||||||
be the "node" element to the right.<br><br></p></li>
|
|
||||||
|
|
||||||
<li><tt>MXML_DESCEND_FIRST</tt> means that it is OK to
|
|
||||||
descend to the first child of a node, but not to descend
|
|
||||||
further when searching. You'll normally use this when
|
|
||||||
iterating through direct children of a parent node, e.g. all
|
|
||||||
of the "node" and "group" elements under the "?xml" parent
|
|
||||||
node in the example above.
|
|
||||||
|
|
||||||
<p>This mode is only applicable to the search function; the
|
|
||||||
walk functions treat this as <tt>MXML_DESCEND</tt> since
|
|
||||||
every call is a first time.<br><br></p></li>
|
|
||||||
|
|
||||||
<li><tt>MXML_DESCEND</tt> means to keep descending until
|
|
||||||
you hit the bottom of the tree. The previous node from
|
|
||||||
"group" would be the "val3" node and the next node would
|
|
||||||
be the first node element under "group".
|
|
||||||
|
|
||||||
<p>If you were to walk from the root node "?xml" to the end
|
|
||||||
of the tree with <tt>mxmlWalkNext()</tt>, the order would
|
|
||||||
be:</p>
|
|
||||||
|
|
||||||
<p><tt>?xml data node val1 node val2 node val3 group node
|
|
||||||
val4 node val5 node val6 node val7 node val8</tt></p>
|
|
||||||
|
|
||||||
<p>If you started at "val8" and walked using
|
|
||||||
<tt>mxmlWalkPrev()</tt>, the order would be reversed,
|
|
||||||
ending at "?xml".</p></li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2>Finding Specific Nodes</h2>
|
|
||||||
|
|
||||||
<p>You can find specific nodes in the tree using the <a
|
|
||||||
href='#mxmlFindValue'><tt>mxmlFindPath</tt></a>, for example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
mxml_node_t *value;
|
|
||||||
|
|
||||||
value = mxmlFindPath(tree, "path/to/*/foo/bar");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The second argument is a "path" to the parent node. Each component of the
|
|
||||||
path is separated by a slash (/) and represents a named element in the document
|
|
||||||
tree or a wildcard (*) path representing 0 or more intervening nodes.</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Mini-XML API Reference
|
title: Mini-XML API Reference
|
||||||
author: Michael R Sweet
|
author: Michael R Sweet
|
||||||
copyright: Copyright © 2003-2018, All Rights Reserved.
|
copyright: Copyright © 2003-2019, All Rights Reserved.
|
||||||
docversion: 2.12
|
docversion: 2.13
|
||||||
...
|
...
|
||||||
|
|
||||||
# Introduction
|
# Introduction
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
mxmldoc(1), Mini-XML Programmers Manual, https://michaelrsweet.github.io/mxml
|
Mini-XML Programmers Manual, https://www.msweet.org/mxml
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
Copyright \[co] 2003-2017 by Michael R Sweet.
|
Copyright \[co] 2003-2019 by Michael R Sweet.
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 31 KiB |
@ -1,77 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1 align='right'><a name='INSTALL'>Chapter 1 - Building,
|
|
||||||
Installing, and Packaging Mini-XML</a></h1>
|
|
||||||
|
|
||||||
<p>This chapter describes how to build, install, and package
|
|
||||||
Mini-XML on your system from the source archive. You will need an
|
|
||||||
ANSI/ISO-C compatible compiler to build Mini-XML - GCC works, as
|
|
||||||
do most vendors' C compilers. If you are building Mini-XML on
|
|
||||||
Windows, we recommend using the Visual C++ environment with the
|
|
||||||
supplied solution file. For other operating systems, you'll need a
|
|
||||||
POSIX-compatible shell and <tt>make</tt> program in addition to
|
|
||||||
the C compiler.</p>
|
|
||||||
|
|
||||||
<h2>Compiling Mini-XML</h2>
|
|
||||||
|
|
||||||
<p>Mini-XML comes with both an autoconf-based configure script
|
|
||||||
and a Visual C++ solution that can be used to compile the library
|
|
||||||
and associated tools.</p>
|
|
||||||
|
|
||||||
<h3>Compiling with Visual C++</h3>
|
|
||||||
|
|
||||||
<p>Open the <VAR>mxml.sln</VAR> solution in the <VAR>vcnet</VAR>
|
|
||||||
folder. Choose the desired build configuration, "Debug" (the
|
|
||||||
default) or "Release", and then choose <VAR>Build Solution</VAR>
|
|
||||||
from the <VAR>Build</VAR> menu.</p>
|
|
||||||
|
|
||||||
<h3>Compiling with Command-Line Tools</h3>
|
|
||||||
|
|
||||||
<p>Type the following command to configure the Mini-XML source
|
|
||||||
code for your system:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>./configure ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>The default install prefix is <var>/usr/local</var>, which
|
|
||||||
can be overridden using the <kbd>--prefix</kbd> option:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>./configure --prefix=/foo ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>Other configure options can be found using the
|
|
||||||
<kbd>--help</kbd> option:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>./configure --help ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>Once you have configured the software, use the
|
|
||||||
<tt>make(1)</tt> program to do the build and run the test
|
|
||||||
program to verify that things are working, as follows:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>make ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Installing Mini-XML</h2>
|
|
||||||
|
|
||||||
<p>If you are using Visual C++, copy the <VAR>mxml.lib</VAR> and
|
|
||||||
and <VAR>mxml.h</VAR> files to the Visual C++ <VAR>lib</VAR> and
|
|
||||||
<VAR>include<VAR> directories, respectively.</p>
|
|
||||||
|
|
||||||
<p>Otherwise, use the <tt>make</tt> command with the
|
|
||||||
<kbd>install</kbd> target to install Mini-XML in the configured
|
|
||||||
directories:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<kbd>make install ENTER</kbd>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
181
doc/intro.html
181
doc/intro.html
@ -1,181 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Mini-XML Programmers Manual, Version 2.12</title>
|
|
||||||
<meta name="copyright" content="Copyright 2003-2018">
|
|
||||||
<meta name="author" content="Michael R Sweet">
|
|
||||||
<meta name="keywords" content="XML, C, C++, library">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1 align="right"><a name="INTRO">Introduction</a></h1>
|
|
||||||
|
|
||||||
<p>This programmers manual describes Mini-XML version 2.12, a small
|
|
||||||
XML parsing library that you can use to read and write XML data
|
|
||||||
files in your C and C++ applications.</p>
|
|
||||||
|
|
||||||
<p>Mini-XML was initially developed for the <a
|
|
||||||
href="http://gutenprint.sf.net/">Gutenprint</a> project to replace
|
|
||||||
the rather large and unwieldy <tt>libxml2</tt> library with
|
|
||||||
something substantially smaller and easier-to-use. It all began one
|
|
||||||
morning in June of 2003 when Robert posted the following sentence to
|
|
||||||
the developer's list:</p>
|
|
||||||
|
|
||||||
<blockquote><em>It's bad enough that we require libxml2, but rolling
|
|
||||||
our own XML parser is a bit more than we can handle.</em></blockquote>
|
|
||||||
|
|
||||||
<p>I then replied with:</p>
|
|
||||||
|
|
||||||
<blockquote><em>Given the limited scope of what you use in XML, it
|
|
||||||
should be trivial to code a mini-XML API in a few hundred lines of
|
|
||||||
code.</em></blockquote>
|
|
||||||
|
|
||||||
<p>I took my own challenge and coded furiously for two days to
|
|
||||||
produced the initial public release of Mini-XML, total lines of
|
|
||||||
code: 696. Robert promptly integrated Mini-XML into Gutenprint
|
|
||||||
and removed libxml2.</p>
|
|
||||||
|
|
||||||
<p>Thanks to lots of feedback and support from various
|
|
||||||
developers, Mini-XML has evolved since then to provide a more
|
|
||||||
complete XML implementation and now stands at a whopping 3,792
|
|
||||||
lines of code, compared to 140,410 lines of code for libxml2
|
|
||||||
version 2.9.1.</p>
|
|
||||||
|
|
||||||
<p>Aside from Gutenprint, Mini-XML is used for the
|
|
||||||
following projects/software applications:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li><a href="https://www.cups.org/">CUPS</a></li>
|
|
||||||
|
|
||||||
<li><a
|
|
||||||
href="http://zynaddsubfx.sourceforge.net">ZynAddSubFX</a></li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Please file a bug on Github if you would like your project added or
|
|
||||||
removed from this list, or if you have any comments/quotes you would like me to
|
|
||||||
publish about your experiences with Mini-XML.</p>
|
|
||||||
|
|
||||||
<!-- NEED 1in -->
|
|
||||||
<h2>Organization of This Document</h2>
|
|
||||||
|
|
||||||
<p>This manual is organized into the following chapters and
|
|
||||||
appendices:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li>Chapter 1, "<a href="#INSTALL">Building,
|
|
||||||
Installing, and Packaging Mini-XML</a>", provides
|
|
||||||
compilation, installation, and packaging instructions for
|
|
||||||
Mini-XML.</li>
|
|
||||||
|
|
||||||
<li>Chapter 2, "<a href="#BASICS">Getting
|
|
||||||
Started with Mini-XML</a>", shows how to use the
|
|
||||||
Mini-XML library in your programs.</li>
|
|
||||||
|
|
||||||
<li>Chapter 3, "<a href="#ADVANCED">More
|
|
||||||
Mini-XML Programming Techniques</a>", shows additional
|
|
||||||
ways to use the Mini-XML library.</li>
|
|
||||||
|
|
||||||
<li>Appendix A, "<a href="#LICENSE">Mini-XML License</a>",
|
|
||||||
provides the terms and conditions for using and distributing
|
|
||||||
Mini-XML.</li>
|
|
||||||
|
|
||||||
<li>Appendix B, "<a href="#REFERENCE">Library
|
|
||||||
Reference</a>", contains a complete reference for
|
|
||||||
Mini-XML, generated by <tt>mxmldoc</tt>.</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<h2>Notation Conventions</h2>
|
|
||||||
|
|
||||||
<p>Various font and syntax conventions are used in this guide.
|
|
||||||
Examples and their meanings and uses are explained below:</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
|
|
||||||
<dt><code>mxmldoc</code><br>
|
|
||||||
<code>mxmldoc(1)</code></dt>
|
|
||||||
|
|
||||||
<dd>The names of commands; the first mention of a command
|
|
||||||
or function in a chapter is followed by a manual page
|
|
||||||
section number.<br><br></dd>
|
|
||||||
|
|
||||||
<dt><var>/var</var><br>
|
|
||||||
<var>/etc/hosts</var></dt>
|
|
||||||
|
|
||||||
<dd>File and directory names.<br><br></dd>
|
|
||||||
|
|
||||||
<dt><tt>Request ID is Printer-123</tt></dt>
|
|
||||||
|
|
||||||
<dd>Screen output.<br><br></dd>
|
|
||||||
|
|
||||||
<dt><kbd>lp -d printer filename ENTER</kbd></dt>
|
|
||||||
|
|
||||||
<dd>Literal user input; special keys like
|
|
||||||
<kbd>ENTER</kbd> are in ALL CAPS.<br><br></dd>
|
|
||||||
|
|
||||||
<dt>12.3</dt>
|
|
||||||
|
|
||||||
<dd>Numbers in the text are written using the period (.)
|
|
||||||
to indicate the decimal point.<br><br></dd>
|
|
||||||
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<!-- NEED 10 -->
|
|
||||||
<h2>Abbreviations</h2>
|
|
||||||
|
|
||||||
<p>The following abbreviations are used throughout this
|
|
||||||
manual:</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
|
|
||||||
<dt>Gb</dt>
|
|
||||||
<dd>Gigabytes, or 1073741824 bytes<br><br></dd>
|
|
||||||
|
|
||||||
<dt>kb</dt>
|
|
||||||
<dd>Kilobytes, or 1024 bytes<br><br></dd>
|
|
||||||
|
|
||||||
<dt>Mb</dt>
|
|
||||||
<dd>Megabytes, or 1048576 bytes<br><br></dd>
|
|
||||||
|
|
||||||
<dt>UTF-8, UTF-16</dt>
|
|
||||||
<dd>Unicode Transformation Format, 8-bit or 16-bit<br><br></dd>
|
|
||||||
|
|
||||||
<dt>W3C</dt>
|
|
||||||
<dd>World Wide Web Consortium<br><br></dd>
|
|
||||||
|
|
||||||
<dt>XML</dt>
|
|
||||||
<dd>Extensible Markup Language<br><br></dd>
|
|
||||||
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<!-- NEED 12 -->
|
|
||||||
<h2>Other References</h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
|
|
||||||
<dt>The Unicode Standard, Version 4.0, Addison-Wesley,
|
|
||||||
ISBN 0-321-18578-1</dt>
|
|
||||||
|
|
||||||
<dd>The definition of the Unicode character set which is
|
|
||||||
used for XML.<br><br></dd>
|
|
||||||
|
|
||||||
<dt><a
|
|
||||||
href="http://www.w3.org/TR/2004/REC-xml-20040204/">Extensible
|
|
||||||
Markup Language (XML) 1.0 (Third Edition)</a></dt>
|
|
||||||
|
|
||||||
<dd>The XML specification from the World Wide Web
|
|
||||||
Consortium (W3C)<br><br></dd>
|
|
||||||
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<!-- NEED 6 -->
|
|
||||||
<h2>Legal Stuff</h2>
|
|
||||||
|
|
||||||
<p>The Mini-XML library is copyright 2003-2018 by Michael R Sweet. License terms
|
|
||||||
are described in <a href="#LICENSE">Appendix A - Mini-XML License</a>.</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
593
doc/license.html
593
doc/license.html
@ -1,593 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1 align='right'><a name='LICENSE'>Appendix A - Mini-XML
|
|
||||||
License</a></h1>
|
|
||||||
|
|
||||||
<p>The Mini-XML library and included programs are provided under
|
|
||||||
the terms of the GNU Library General Public License version 2
|
|
||||||
(LGPL2) with the following exceptions:</p>
|
|
||||||
|
|
||||||
<p><b>1.</b> Static linking of applications to the Mini-XML
|
|
||||||
library does not constitute a derivative work and does
|
|
||||||
not require the author to provide source code for the
|
|
||||||
application, use the shared Mini-XML libraries, or link
|
|
||||||
their applications against a user-supplied version of
|
|
||||||
Mini-XML.</p>
|
|
||||||
|
|
||||||
<p><i>If you link the application to a modified version
|
|
||||||
of Mini-XML, then the changes to Mini-XML must be
|
|
||||||
provided under the terms of the LGPL2 in sections 1, 2,
|
|
||||||
and 4.</i></p>
|
|
||||||
|
|
||||||
<p><b>2.</b> You do not have to provide a copy of the Mini-XML
|
|
||||||
license with programs that are linked to the Mini-XML
|
|
||||||
library, nor do you have to identify the Mini-XML license
|
|
||||||
in your program or documentation as required by section 6
|
|
||||||
of the LGPL2.</p>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<p align=center><b>GNU LIBRARY GENERAL PUBLIC LICENSE</b></p>
|
|
||||||
<p align='center'>Version 2, June 1991
|
|
||||||
<br>Copyright (C) 1991 Free Software Foundation, Inc.
|
|
||||||
<br>59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
<br>Everyone is permitted to copy and distribute verbatim copies of
|
|
||||||
this license document, but changing it is not allowed.
|
|
||||||
<br>[This is the first released version of the library GPL. It is
|
|
||||||
numbered 2 because it goes with version 2 of the ordinary GPL.]</p>
|
|
||||||
|
|
||||||
<p><b>Preamble</b></p>
|
|
||||||
|
|
||||||
<p>The licenses for most software are designed to take away your freedom
|
|
||||||
to share and change it. By contrast, the GNU General Public Licenses
|
|
||||||
are intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users.</p>
|
|
||||||
|
|
||||||
<p>This license, the Library General Public License, applies to some
|
|
||||||
specially designated Free Software Foundation software, and to any
|
|
||||||
other libraries whose authors decide to use it. You can use it for
|
|
||||||
your libraries, too.</p>
|
|
||||||
|
|
||||||
<p>When we speak of free software, we are referring to freedom,
|
|
||||||
not price. Our General Public Licenses are designed to make sure
|
|
||||||
that you have the freedom to distribute copies of free software
|
|
||||||
(and charge for this service if you wish), that you receive
|
|
||||||
source code or can get it if you want it, that you can change
|
|
||||||
the software or use pieces of it in new free programs; and that
|
|
||||||
you know you can do these things.</p>
|
|
||||||
|
|
||||||
<p>To protect your rights, we need to make restrictions that
|
|
||||||
forbid anyone to deny you these rights or to ask you to
|
|
||||||
surrender the rights. These restrictions translate to certain
|
|
||||||
responsibilities for you if you distribute copies of the
|
|
||||||
library, or if you modify it.</p>
|
|
||||||
|
|
||||||
<p>For example, if you distribute copies of the library, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights
|
|
||||||
that we gave you. You must make sure that they, too, receive or
|
|
||||||
can get the source code. If you link a program with the library,
|
|
||||||
you must provide complete object files to the recipients so that
|
|
||||||
they can relink them with the library, after making changes to
|
|
||||||
the library and recompiling it. And you must show them these
|
|
||||||
terms so they know their rights.</p>
|
|
||||||
|
|
||||||
<p>Our method of protecting your rights has two steps: (1)
|
|
||||||
copyright the library, and (2) offer you this license which
|
|
||||||
gives you legal permission to copy, distribute and/or modify the
|
|
||||||
library.</p>
|
|
||||||
|
|
||||||
<p>Also, for each distributor's protection, we want to make
|
|
||||||
certain that everyone understands that there is no warranty for
|
|
||||||
this free library. If the library is modified by someone else
|
|
||||||
and passed on, we want its recipients to know that what they
|
|
||||||
have is not the original version, so that any problems
|
|
||||||
introduced by others will not reflect on the original authors'
|
|
||||||
reputations.</p>
|
|
||||||
|
|
||||||
<p>Finally, any free program is threatened constantly by
|
|
||||||
software patents. We wish to avoid the danger that companies
|
|
||||||
distributing free software will individually obtain patent
|
|
||||||
licenses, thus in effect transforming the program into
|
|
||||||
proprietary software. To prevent this, we have made it clear
|
|
||||||
that any patent must be licensed for everyone's free use or not
|
|
||||||
licensed at all.</p>
|
|
||||||
|
|
||||||
<p>Most GNU software, including some libraries, is covered by
|
|
||||||
the ordinary GNU General Public License, which was designed for
|
|
||||||
utility programs. This license, the GNU Library General Public
|
|
||||||
License, applies to certain designated libraries. This license
|
|
||||||
is quite different from the ordinary one; be sure to read it in
|
|
||||||
full, and don't assume that anything in it is the same as in the
|
|
||||||
ordinary license.</p>
|
|
||||||
|
|
||||||
<p>The reason we have a separate public license for some
|
|
||||||
libraries is that they blur the distinction we usually make
|
|
||||||
between modifying or adding to a program and simply using it.
|
|
||||||
Linking a program with a library, without changing the library,
|
|
||||||
is in some sense simply using the library, and is analogous to
|
|
||||||
running a utility program or application program. However, in a
|
|
||||||
textual and legal sense, the linked executable is a combined
|
|
||||||
work, a derivative of the original library, and the ordinary
|
|
||||||
General Public License treats it as such.</p>
|
|
||||||
|
|
||||||
<p>Because of this blurred distinction, using the ordinary
|
|
||||||
General Public License for libraries did not effectively promote
|
|
||||||
software sharing, because most developers did not use the
|
|
||||||
libraries. We concluded that weaker conditions might promote
|
|
||||||
sharing better.</p>
|
|
||||||
|
|
||||||
<p>However, unrestricted linking of non-free programs would
|
|
||||||
deprive the users of those programs of all benefit from the free
|
|
||||||
status of the libraries themselves. This Library General Public
|
|
||||||
License is intended to permit developers of non-free programs to
|
|
||||||
use free libraries, while preserving your freedom as a user of
|
|
||||||
such programs to change the free libraries that are incorporated
|
|
||||||
in them. (We have not seen how to achieve this as regards
|
|
||||||
changes in header files, but we have achieved it as regards
|
|
||||||
changes in the actual functions of the Library.) The hope is
|
|
||||||
that this will lead to faster development of free libraries.</p>
|
|
||||||
|
|
||||||
<p>The precise terms and conditions for copying, distribution
|
|
||||||
and modification follow. Pay close attention to the difference
|
|
||||||
between a "work based on the libary" and a "work
|
|
||||||
that uses the library". The former contains code derived
|
|
||||||
from the library, while the latter only works together with the
|
|
||||||
library.</p>
|
|
||||||
|
|
||||||
<p>Note that it is possible for a library to be covered by the
|
|
||||||
ordinary General Public License rather than by this special
|
|
||||||
one.</p>
|
|
||||||
|
|
||||||
<p align='center'><b>TERMS AND CONDITIONS FOR COPYING,
|
|
||||||
DISTRIBUTION AND MODIFICATION</b></p>
|
|
||||||
|
|
||||||
<p><strong>0.</strong> This License Agreement applies to any
|
|
||||||
software library which contains a notice placed by the copyright
|
|
||||||
holder or other authorized party saying it may be distributed
|
|
||||||
under the terms of this Library General Public License (also
|
|
||||||
called "this License"). Each licensee is addressed as
|
|
||||||
"you".
|
|
||||||
|
|
||||||
<p>A "library" means a collection of software
|
|
||||||
functions and/or data prepared so as to be conveniently linked
|
|
||||||
with application programs (which use some of those functions and
|
|
||||||
data) to form executables.</p>
|
|
||||||
|
|
||||||
<p>The "Library", below, refers to any such software
|
|
||||||
library or work which has been distributed under these terms. A
|
|
||||||
"work based on the Library" means either the Library
|
|
||||||
or any derivative work under copyright law: that is to say, a
|
|
||||||
work containing the Library or a portion of it, either verbatim
|
|
||||||
or with modifications and/or translated straightforwardly into
|
|
||||||
another language. (Hereinafter, translation is included without
|
|
||||||
limitation in the term "modification".)</p>
|
|
||||||
|
|
||||||
<p>"Source code" for a work means the preferred form
|
|
||||||
of the work for making modifications to it. For a library,
|
|
||||||
complete source code means all the source code for all modules
|
|
||||||
it contains, plus any associated interface definition files,
|
|
||||||
plus the scripts used to control compilation and installation of
|
|
||||||
the library.</p>
|
|
||||||
|
|
||||||
<p>Activities other than copying, distribution and modification
|
|
||||||
are not covered by this License; they are outside its scope. The
|
|
||||||
act of running a program using the Library is not restricted,
|
|
||||||
and output from such a program is covered only if its contents
|
|
||||||
constitute a work based on the Library (independent of the use
|
|
||||||
of the Library in a tool for writing it). Whether that is true
|
|
||||||
depends on what the Library does and what the program that uses
|
|
||||||
the Library does.</p>
|
|
||||||
|
|
||||||
<p><strong>1.</strong> You may copy and distribute verbatim
|
|
||||||
copies of the Library's complete source code as you receive it,
|
|
||||||
in any medium, provided that you conspicuously and appropriately
|
|
||||||
publish on each copy an appropriate copyright notice and
|
|
||||||
disclaimer of warranty; keep intact all the notices that refer
|
|
||||||
to this License and to the absence of any warranty; and
|
|
||||||
distribute a copy of this License along with the Library.</p>
|
|
||||||
|
|
||||||
<p>You may charge a fee for the physical act of transferring a
|
|
||||||
copy, and you may at your option offer warranty protection in
|
|
||||||
exchange for a fee.</p>
|
|
||||||
|
|
||||||
<p><strong>2.</strong> You may modify your copy or copies of the
|
|
||||||
Library or any portion of it, thus forming a work based on the
|
|
||||||
Library, and copy and distribute such modifications or work
|
|
||||||
under the terms of Section 1 above, provided that you also meet
|
|
||||||
all of these conditions:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<p><strong>a)</strong> The modified work must itself be
|
|
||||||
a software library.
|
|
||||||
|
|
||||||
<p><strong>b)</strong> You must cause the files modified
|
|
||||||
to carry prominent notices stating that you changed the
|
|
||||||
files and the date of any change.</p>
|
|
||||||
|
|
||||||
<p><strong>c)</strong> You must cause the whole of the
|
|
||||||
work to be licensed at no charge to all third parties
|
|
||||||
under the terms of this License.</p>
|
|
||||||
|
|
||||||
<p><strong>d)</strong> If a facility in the modified
|
|
||||||
Library refers to a function or a table of data to be
|
|
||||||
supplied by an application program that uses the
|
|
||||||
facility, other than as an argument passed when the
|
|
||||||
facility is invoked, then you must make a good faith
|
|
||||||
effort to ensure that, in the event an application does
|
|
||||||
not supply such function or table, the facility still
|
|
||||||
operates, and performs whatever part of its purpose
|
|
||||||
remains meaningful.</p>
|
|
||||||
|
|
||||||
<p>(For example, a function in a library to compute
|
|
||||||
square roots has a purpose that is entirely well-defined
|
|
||||||
independent of the application. Therefore, Subsection 2d
|
|
||||||
requires that any application-supplied function or table
|
|
||||||
used by this function must be optional: if the
|
|
||||||
application does not supply it, the square root function
|
|
||||||
must still compute square roots.)</p>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the
|
|
||||||
Library, and can be reasonably considered independent and
|
|
||||||
separate works in themselves, then this License, and its terms,
|
|
||||||
do not apply to those sections when you distribute them as
|
|
||||||
separate works. But when you distribute the same sections as
|
|
||||||
part of a whole which is a work based on the Library, the
|
|
||||||
distribution of the whole must be on the terms of this License,
|
|
||||||
whose permissions for other licensees extend to the entire
|
|
||||||
whole, and thus to each and every part regardless of who wrote
|
|
||||||
it.</p>
|
|
||||||
|
|
||||||
<p>Thus, it is not the intent of this section to claim rights or
|
|
||||||
contest your rights to work written entirely by you; rather, the
|
|
||||||
intent is to exercise the right to control the distribution of
|
|
||||||
derivative or collective works based on the Library.</p>
|
|
||||||
|
|
||||||
<p>In addition, mere aggregation of another work not based on
|
|
||||||
the Library with the Library (or with a work based on the
|
|
||||||
Library) on a volume of a storage or distribution medium does
|
|
||||||
not bring the other work under the scope of this License.</p>
|
|
||||||
|
|
||||||
<p><strong>3.</strong> You may opt to apply the terms of the
|
|
||||||
ordinary GNU General Public License instead of this License to a
|
|
||||||
given copy of the Library. To do this, you must alter all the
|
|
||||||
notices that refer to this License, so that they refer to the
|
|
||||||
ordinary GNU General Public License, version 2, instead of to
|
|
||||||
this License. (If a newer version than version 2 of the ordinary
|
|
||||||
GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change
|
|
||||||
in these notices.</p>
|
|
||||||
|
|
||||||
<p>Once this change is made in a given copy, it is irreversible
|
|
||||||
for that copy, so the ordinary GNU General Public License
|
|
||||||
applies to all subsequent copies and derivative works made from
|
|
||||||
that copy.</p>
|
|
||||||
|
|
||||||
<p>This option is useful when you wish to copy part of the code
|
|
||||||
of the Library into a program that is not a library.</p>
|
|
||||||
|
|
||||||
<p><strong>4.</strong> You may copy and distribute the Library
|
|
||||||
(or a portion or derivative of it, under Section 2) in object
|
|
||||||
code or executable form under the terms of Sections 1 and 2
|
|
||||||
above provided that you accompany it with the complete
|
|
||||||
corresponding machine-readable source code, which must be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a
|
|
||||||
medium customarily used for software interchange.</p>
|
|
||||||
|
|
||||||
<p>If distribution of object code is made by offering access to
|
|
||||||
copy from a designated place, then offering equivalent access to
|
|
||||||
copy the source code from the same place satisfies the
|
|
||||||
requirement to distribute the source code, even though third
|
|
||||||
parties are not compelled to copy the source along with the
|
|
||||||
object code.</p>
|
|
||||||
|
|
||||||
<p><strong>5.</strong> A program that contains no derivative of
|
|
||||||
any portion of the Library, but is designed to work with the
|
|
||||||
Library by being compiled or linked with it, is called a
|
|
||||||
"work that uses the Library". Such a work, in
|
|
||||||
isolation, is not a derivative work of the Library, and
|
|
||||||
therefore falls outside the scope of this License.</p>
|
|
||||||
|
|
||||||
<p>However, linking a "work that uses the Library"
|
|
||||||
with the Library creates an executable that is a derivative of
|
|
||||||
the Library (because it contains portions of the Library),
|
|
||||||
rather than a "work that uses the library". The
|
|
||||||
executable is therefore covered by this License. Section 6
|
|
||||||
states terms for distribution of such executables.</p>
|
|
||||||
|
|
||||||
<p>When a "work that uses the Library" uses material
|
|
||||||
from a header file that is part of the Library, the object code
|
|
||||||
for the work may be a derivative work of the Library even though
|
|
||||||
the source code is not. Whether this is true is especially
|
|
||||||
significant if the work can be linked without the Library, or if
|
|
||||||
the work is itself a library. The threshold for this to be true
|
|
||||||
is not precisely defined by law.</p>
|
|
||||||
|
|
||||||
<p>If such an object file uses only numerical parameters, data
|
|
||||||
structure layouts and accessors, and small macros and small
|
|
||||||
inline functions (ten lines or less in length), then the use of
|
|
||||||
the object file is unrestricted, regardless of whether it is
|
|
||||||
legally a derivative work. (Executables containing this object
|
|
||||||
code plus portions of the Library will still fall under Section
|
|
||||||
6.)</p>
|
|
||||||
|
|
||||||
<p>Otherwise, if the work is a derivative of the Library, you
|
|
||||||
may distribute the object code for the work under the terms of
|
|
||||||
Section 6. Any executables containing that work also fall under
|
|
||||||
Section 6, whether or not they are linked directly with the
|
|
||||||
Library itself.</p>
|
|
||||||
|
|
||||||
<p><strong>6.</strong> As an exception to the Sections above,
|
|
||||||
you may also compile or link a "work that uses the
|
|
||||||
Library" with the Library to produce a work containing
|
|
||||||
portions of the Library, and distribute that work under terms of
|
|
||||||
your choice, provided that the terms permit modification of the
|
|
||||||
work for the customer's own use and reverse engineering for
|
|
||||||
debugging such modifications.</p>
|
|
||||||
|
|
||||||
<p>You must give prominent notice with each copy of the work
|
|
||||||
that the Library is used in it and that the Library and its use
|
|
||||||
are covered by this License. You must supply a copy of this
|
|
||||||
License. If the work during execution displays copyright
|
|
||||||
notices, you must include the copyright notice for the Library
|
|
||||||
among them, as well as a reference directing the user to the
|
|
||||||
copy of this License. Also, you must do one of these things:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<strong>a)</strong> Accompany the work with the complete
|
|
||||||
corresponding machine-readable source code for the
|
|
||||||
Library including whatever changes were used in the work
|
|
||||||
(which must be distributed under Sections 1 and 2
|
|
||||||
above); and, if the work is an executable linked with
|
|
||||||
the Library, with the complete machine-readable
|
|
||||||
"work that uses the Library", as object code
|
|
||||||
and/or source code, so that the user can modify the
|
|
||||||
Library and then relink to produce a modified executable
|
|
||||||
containing the modified Library. (It is understood that
|
|
||||||
the user who changes the contents of definitions files
|
|
||||||
in the Library will not necessarily be able to recompile
|
|
||||||
the application to use the modified definitions.)
|
|
||||||
|
|
||||||
<p><strong>b)</strong> Accompany the work with a written
|
|
||||||
offer, valid for at least three years, to give the same
|
|
||||||
user the materials specified in Subsection 6a, above,
|
|
||||||
for a charge no more than the cost of performing this
|
|
||||||
distribution.</p>
|
|
||||||
|
|
||||||
<p><strong>c)</strong> If distribution of the work is
|
|
||||||
made by offering access to copy from a designated place,
|
|
||||||
offer equivalent access to copy the above specified
|
|
||||||
materials from the same place.</p>
|
|
||||||
|
|
||||||
<p><strong>d)</strong> Verify that the user has already
|
|
||||||
received a copy of these materials or that you have
|
|
||||||
already sent this user a copy.</p>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>For an executable, the required form of the "work that
|
|
||||||
uses the Library" must include any data and utility
|
|
||||||
programs needed for reproducing the executable from it. However,
|
|
||||||
as a special exception, the source code distributed need not
|
|
||||||
include anything that is normally distributed (in either source
|
|
||||||
or binary form) with the major components (compiler, kernel, and
|
|
||||||
so on) of the operating system on which the executable runs,
|
|
||||||
unless that component itself accompanies the executable.</p>
|
|
||||||
|
|
||||||
<p>It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you
|
|
||||||
cannot use both them and the Library together in an executable
|
|
||||||
that you distribute.</p>
|
|
||||||
|
|
||||||
<p><strong>7.</strong> You may place library facilities that are
|
|
||||||
a work based on the Library side-by-side in a single library
|
|
||||||
together with other library facilities not covered by this
|
|
||||||
License, and distribute such a combined library, provided that
|
|
||||||
the separate distribution of the work based on the Library and
|
|
||||||
of the other library facilities is otherwise permitted, and
|
|
||||||
provided that you do these two things:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<strong>a)</strong> Accompany the combined library with
|
|
||||||
a copy of the same work based on the Library, uncombined
|
|
||||||
with any other library facilities. This must be
|
|
||||||
distributed under the terms of the Sections above.
|
|
||||||
|
|
||||||
<p><strong>b)</strong> Give prominent notice with the
|
|
||||||
combined library of the fact that part of it is a work
|
|
||||||
based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.</p>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p><strong>8.</strong> You may not copy, modify, sublicense,
|
|
||||||
link with, or distribute the Library except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to copy,
|
|
||||||
modify, sublicense, link with, or distribute the Library is
|
|
||||||
void, and will automatically terminate your rights under this
|
|
||||||
License. However, parties who have received copies, or rights,
|
|
||||||
from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full
|
|
||||||
compliance.</p>
|
|
||||||
|
|
||||||
<p><strong>9.</strong> You are not required to accept this
|
|
||||||
License, since you have not signed it. However, nothing else
|
|
||||||
grants you permission to modify or distribute the Library or its
|
|
||||||
derivative works. These actions are prohibited by law if you do
|
|
||||||
not accept this License. Therefore, by modifying or distributing
|
|
||||||
the Library (or any work based on the Library), you indicate
|
|
||||||
your acceptance of this License to do so, and all its terms and
|
|
||||||
conditions for copying, distributing or modifying the Library or
|
|
||||||
works based on it.</p>
|
|
||||||
|
|
||||||
<p><strong>10.</strong> Each time you redistribute the Library
|
|
||||||
(or any work based on the Library), the recipient automatically
|
|
||||||
receives a license from the original licensor to copy,
|
|
||||||
distribute, link with or modify the Library subject to these
|
|
||||||
terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted
|
|
||||||
herein. You are not responsible for enforcing compliance by
|
|
||||||
third parties to this License.</p>
|
|
||||||
|
|
||||||
<p><strong>11.</strong> If, as a consequence of a court judgment
|
|
||||||
or allegation of patent infringement or for any other reason
|
|
||||||
(not limited to patent issues), conditions are imposed on you
|
|
||||||
(whether by court order, agreement or otherwise) that contradict
|
|
||||||
the conditions of this License, they do not excuse you from the
|
|
||||||
conditions of this License. If you cannot distribute so as to
|
|
||||||
satisfy simultaneously your obligations under this License and
|
|
||||||
any other pertinent obligations, then as a consequence you may
|
|
||||||
not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the
|
|
||||||
Library by all those who receive copies directly or indirectly
|
|
||||||
through you, then the only way you could satisfy both it and
|
|
||||||
this License would be to refrain entirely from distribution of
|
|
||||||
the Library.</p>
|
|
||||||
|
|
||||||
<p>If any portion of this section is held invalid or
|
|
||||||
unenforceable under any particular circumstance, the balance of
|
|
||||||
the section is intended to apply, and the section as a whole is
|
|
||||||
intended to apply in other circumstances.</p>
|
|
||||||
|
|
||||||
<p>It is not the purpose of this section to induce you to
|
|
||||||
infringe any patents or other property right claims or to
|
|
||||||
contest validity of any such claims; this section has the sole
|
|
||||||
purpose of protecting the integrity of the free software
|
|
||||||
distribution system which is implemented by public license
|
|
||||||
practices. Many people have made generous contributions to the
|
|
||||||
wide range of software distributed through that system in
|
|
||||||
reliance on consistent application of that system; it is up to
|
|
||||||
the author/donor to decide if he or she is willing to distribute
|
|
||||||
software through any other system and a licensee cannot impose
|
|
||||||
that choice.</p>
|
|
||||||
|
|
||||||
<p>This section is intended to make thoroughly clear what is
|
|
||||||
believed to be a consequence of the rest of this License.</p>
|
|
||||||
|
|
||||||
<p><strong>12.</strong> If the distribution and/or use of the
|
|
||||||
Library is restricted in certain countries either by patents or
|
|
||||||
by copyrighted interfaces, the original copyright holder who
|
|
||||||
places the Library under this License may add an explicit
|
|
||||||
geographical distribution limitation excluding those countries,
|
|
||||||
so that distribution is permitted only in or among countries not
|
|
||||||
thus excluded. In such case, this License incorporates the
|
|
||||||
limitation as if written in the body of this License.</p>
|
|
||||||
|
|
||||||
<p><strong>13.</strong> The Free Software Foundation may publish
|
|
||||||
revised and/or new versions of the Library General Public
|
|
||||||
License from time to time. Such new versions will be similar in
|
|
||||||
spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.</p>
|
|
||||||
|
|
||||||
<p>Each version is given a distinguishing version number. If the
|
|
||||||
Library specifies a version number of this License which applies
|
|
||||||
to it and "any later version", you have the option of
|
|
||||||
following the terms and conditions either of that version or of
|
|
||||||
any later version published by the Free Software Foundation. If
|
|
||||||
the Library does not specify a license version number, you may
|
|
||||||
choose any version ever published by the Free Software
|
|
||||||
Foundation.</p>
|
|
||||||
|
|
||||||
<p><strong>14.</strong> If you wish to incorporate parts of the
|
|
||||||
Library into other free programs whose distribution conditions
|
|
||||||
are incompatible with these, write to the author to ask for
|
|
||||||
permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we
|
|
||||||
sometimes make exceptions for this. Our decision will be guided
|
|
||||||
by the two goals of preserving the free status of all
|
|
||||||
derivatives of our free software and of promoting the sharing
|
|
||||||
and reuse of software generally.</p>
|
|
||||||
|
|
||||||
<p align='center'><b>NO WARRANTY</b></p>
|
|
||||||
|
|
||||||
<p><strong>15.</strong> BECAUSE THE LIBRARY IS LICENSED FREE OF
|
|
||||||
CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT
|
|
||||||
PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN
|
|
||||||
WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
|
|
||||||
LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
||||||
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
|
|
||||||
THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
|
|
||||||
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
|
||||||
CORRECTION.</p>
|
|
||||||
|
|
||||||
<p><strong>16.</strong> IN NO EVENT UNLESS REQUIRED BY
|
|
||||||
APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT
|
|
||||||
HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
|
||||||
THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
|
|
||||||
DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
|
|
||||||
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
|
||||||
OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.</p>
|
|
||||||
|
|
||||||
<p align='center'><b>END OF TERMS AND CONDITIONS</b></p>
|
|
||||||
|
|
||||||
<p><b>How to Apply These Terms to Your New Libraries</b></p>
|
|
||||||
|
|
||||||
<p>If you develop a new library, and you want it to be of the
|
|
||||||
greatest possible use to the public, we recommend making it free
|
|
||||||
software that everyone can redistribute and change. You can do so
|
|
||||||
by permitting redistribution under these terms (or, alternatively,
|
|
||||||
under the terms of the ordinary General Public License).
|
|
||||||
|
|
||||||
<p>To apply these terms, attach the following notices to the
|
|
||||||
library. It is safest to attach them to the start of each source
|
|
||||||
file to most effectively convey the exclusion of warranty; and each
|
|
||||||
file should have at least the "copyright" line and a pointer to
|
|
||||||
where the full notice is found.
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<p><var>one line to give the library's name and an idea of what it
|
|
||||||
does.</var><br>
|
|
||||||
Copyright (C) <var>year</var> <var>name of author</var>
|
|
||||||
|
|
||||||
<p>This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2.1 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
<p>This library 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
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
<p>You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
||||||
02111-1307 USA
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
<p>You should also get your employer (if you work as a programmer)
|
|
||||||
or your school, if any, to sign a "copyright disclaimer" for the
|
|
||||||
library, if necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<p>Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
|
||||||
library `Frob' (a library for tweaking knobs) written by James
|
|
||||||
Random Hacker.
|
|
||||||
|
|
||||||
<p><var>signature of Ty Coon</var>, 1 April 1990 Ty Coon, President
|
|
||||||
of Vice
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>That's all there is to it!
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,24 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Script to make documentation...
|
|
||||||
#
|
|
||||||
# Copyright 2003-2017 by Michael R Sweet.
|
|
||||||
#
|
|
||||||
# These coded instructions, statements, and computer programs are the
|
|
||||||
# property of Michael R Sweet and are protected by Federal copyright
|
|
||||||
# law. Distribution and use rights are outlined in the file "COPYING"
|
|
||||||
# which should have been included with this file. If this file is
|
|
||||||
# missing or damaged, see the license at:
|
|
||||||
#
|
|
||||||
# https://michaelrsweet.github.io/mxml
|
|
||||||
#
|
|
||||||
|
|
||||||
htmldoc --verbose --path "hires;." --batch mxml.book -f mxml.pdf
|
|
||||||
|
|
||||||
htmldoc --verbose --batch mxml.book --no-title -f mxml.html
|
|
||||||
|
|
||||||
htmldoc --verbose --batch mxml.book --titleimage mxml-cover.png -f mxml.epub
|
|
||||||
|
|
||||||
rm -rf mxml.d
|
|
||||||
mkdir mxml.d
|
|
||||||
htmldoc --verbose --batch mxml.book --no-title -t html -d mxml.d
|
|
@ -1,4 +1,4 @@
|
|||||||
.TH mxml 3 "Mini-XML API" "12/01/18" "Mini-XML API"
|
.TH mxml 3 "Mini-XML API" "01/02/19" "Mini-XML API"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
mxml \- Mini-XML API
|
mxml \- Mini-XML API
|
||||||
.SH INCLUDE FILE
|
.SH INCLUDE FILE
|
||||||
@ -1348,6 +1348,6 @@ The XML node type.
|
|||||||
typedef enum mxml_type_e mxml_type_t;
|
typedef enum mxml_type_e mxml_type_t;
|
||||||
.fi
|
.fi
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
mxmldoc(1), Mini-XML Programmers Manual, https://michaelrsweet.github.io/mxml
|
Mini-XML Programmers Manual, https://www.msweet.org/mxml
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
Copyright \[co] 2003-2017 by Michael R Sweet.
|
Copyright \[co] 2003-2019 by Michael R Sweet.
|
@ -1,8 +0,0 @@
|
|||||||
#HTMLDOC 1.8.30
|
|
||||||
-t pdf14 -f "mxml.pdf" --book --toclevels 3 --no-numbered --toctitle "Table of Contents" --title --titleimage "title.html" --linkstyle plain --size 4.25x6.875in --left 0.750in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=95 --fontsize 9.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Helvetica --headfootsize 8.0 --headfootfont Helvetica-Oblique --charset iso-8859-1 --links --embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 300 --no-strict --no-overflow
|
|
||||||
intro.html
|
|
||||||
install.html
|
|
||||||
basics.html
|
|
||||||
advanced.html
|
|
||||||
license.html
|
|
||||||
reference.html
|
|
BIN
doc/mxml.epub
Normal file
BIN
doc/mxml.epub
Normal file
Binary file not shown.
4914
doc/mxml.html
4914
doc/mxml.html
File diff suppressed because it is too large
Load Diff
BIN
doc/mxml.pdf
BIN
doc/mxml.pdf
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
<h1 align="right"><a name="REFERENCE">Appendix B - Library Reference</a></h1>
|
|
1674
doc/reference.html
1674
doc/reference.html
File diff suppressed because it is too large
Load Diff
@ -1,33 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Mini-XML Programmers Manual</title>
|
|
||||||
<meta name="author" content="Michael R Sweet">
|
|
||||||
<meta name="copyright" content="Copyright 2003-2018">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" summary="">
|
|
||||||
<tr><td height="100%">
|
|
||||||
|
|
||||||
<h1 align="center"><img src="mxml.png" width="50%"><br>
|
|
||||||
<font size="-1">Mini-XML Programmers Manual<br>
|
|
||||||
Version 2.12</h1>
|
|
||||||
|
|
||||||
<P ALIGN="CENTER">MICHAEL R. SWEET</P>
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- NEW PAGE -->
|
|
||||||
<P><FONT SIZE="+1"><B>Mini-XML Programmers Manual, Version 2.12</B></FONT></P>
|
|
||||||
|
|
||||||
<P><B>Copyright © 2003-2018 by Michael R Sweet</B></P>
|
|
||||||
|
|
||||||
<P><SMALL>Permission is granted to copy, distribute and/or modify
|
|
||||||
this document under the terms of the GNU Library General Public
|
|
||||||
License, Version 2. A copy of this license is included in <A
|
|
||||||
HREF="#LICENSE">Appendix A - Mini-XML License</A>.</SMALL></P>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -2,7 +2,7 @@
|
|||||||
* Visual Studio configuration file for Mini-XML, a small XML file parsing
|
* Visual Studio configuration file for Mini-XML, a small XML file parsing
|
||||||
* library.
|
* library.
|
||||||
*
|
*
|
||||||
* Copyright 2003-2018 by Michael R Sweet.
|
* Copyright 2003-2019 by Michael R Sweet.
|
||||||
*
|
*
|
||||||
* These coded instructions, statements, and computer programs are the
|
* These coded instructions, statements, and computer programs are the
|
||||||
* property of Michael R Sweet and are protected by Federal copyright
|
* property of Michael R Sweet and are protected by Federal copyright
|
||||||
@ -63,7 +63,7 @@
|
|||||||
* Version number...
|
* Version number...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MXML_VERSION "Mini-XML v2.12"
|
#define MXML_VERSION "Mini-XML v2.13"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user