mirror of
https://github.com/michaelrsweet/mxml.git
synced 2024-11-08 05:29:58 +00:00
doco updates
This commit is contained in:
parent
9961add0d4
commit
d18b4626fd
@ -70,18 +70,12 @@ MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.</p>
|
||||
<pre>
|
||||
void
|
||||
mxmlAdd(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
int where,
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * child,
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, int where, <a href="#mxml_node_t">mxml_node_t</a> *child, <a href="#mxml_node_t">mxml_node_t</a> * node);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node</td></tr>
|
||||
<tr><td><tt>where</tt></td><td>Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER</td></tr>
|
||||
<tr><td><tt>child</tt></td><td>Child node for where or MXML_ADD_TO_PARENT</td></tr>
|
||||
<tr><td><tt>node</tt></td><td>Node to add</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -116,14 +110,12 @@ named attribute does not exist.</p>
|
||||
<pre>
|
||||
const char *
|
||||
mxmlElementGetAttr(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
const char * name);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, const char * name);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Element node</td></tr>
|
||||
<tr><td><tt>name</tt></td><td>Name of attribute</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -140,16 +132,12 @@ not an element.</p>
|
||||
<pre>
|
||||
void
|
||||
mxmlElementSetAttr(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
const char * name,
|
||||
const char * value);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, const char *name, const char * value);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Element node</td></tr>
|
||||
<tr><td><tt>name</tt></td><td>Name of attribute</td></tr>
|
||||
<tr><td><tt>value</tt></td><td>Attribute value</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -170,22 +158,12 @@ constrains the search to a particular node's children.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlFindElement(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * top,
|
||||
const char * name,
|
||||
const char * attr,
|
||||
const char * value,
|
||||
int descend);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, <a href="#mxml_node_t">mxml_node_t</a> *top, const char *name, const char *attr, const char *value, int descend);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Current node</td></tr>
|
||||
<tr><td><tt>top</tt></td><td>Top node</td></tr>
|
||||
<tr><td><tt>name</tt></td><td>Element name or NULL for any</td></tr>
|
||||
<tr><td><tt>attr</tt></td><td>Attribute name, or NULL for none</td></tr>
|
||||
<tr><td><tt>value</tt></td><td>Attribute value, or NULL for any</td></tr>
|
||||
<tr><td><tt>descend</tt></td><td>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -204,17 +182,13 @@ MXML_ELEMENT or MXML_TEXT nodes.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlLoadFile(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * top,
|
||||
FILE * fp,
|
||||
<a href="#mxml_type_t">mxml_type_t</a> (*cb)(mxml_node_t *));
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *top, FILE *fp, <a href="#mxml_type_t">mxml_type_t</a> (*cb)(mxml_node_t *node));
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>top</tt></td><td>Top node</td></tr>
|
||||
<tr><td><tt>fp</tt></td><td>File to read from</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *)</tt></td><td>Callback function or MXML_NO_CALLBACK</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *node)</tt></td><td>Callback function or MXML_NO_CALLBACK</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
<p>First node or NULL if the file could not be read.</p>
|
||||
@ -232,17 +206,13 @@ MXML_ELEMENT or MXML_TEXT nodes.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlLoadString(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * top,
|
||||
const char * s,
|
||||
<a href="#mxml_type_t">mxml_type_t</a> (*cb)(mxml_node_t *));
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *top, const char *s, <a href="#mxml_type_t">mxml_type_t</a> (*cb)(mxml_node_t *node));
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>top</tt></td><td>Top node</td></tr>
|
||||
<tr><td><tt>s</tt></td><td>String to load</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *)</tt></td><td>Callback function or MXML_NO_CALLBACK</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *node)</tt></td><td>Callback function or MXML_NO_CALLBACK</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
<p>First node or NULL if the string has errors.</p>
|
||||
@ -257,14 +227,12 @@ element node has no parent.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlNewElement(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
const char * name);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, const char * name);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node or MXML_NO_PARENT</td></tr>
|
||||
<tr><td><tt>name</tt></td><td>Name of element</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -280,14 +248,12 @@ integer node has no parent.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlNewInteger(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
int integer);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, int integer);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node or MXML_NO_PARENT</td></tr>
|
||||
<tr><td><tt>integer</tt></td><td>Integer value</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -304,14 +270,12 @@ is copied into the new node.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlNewOpaque(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
const char * opaque);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, const char * opaque);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node or MXML_NO_PARENT</td></tr>
|
||||
<tr><td><tt>opaque</tt></td><td>Opaque string</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -327,14 +291,12 @@ the new real number node has no parent.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlNewReal(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
double real);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, double real);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node or MXML_NO_PARENT</td></tr>
|
||||
<tr><td><tt>real</tt></td><td>Real number value</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -352,16 +314,12 @@ string must be nul-terminated and is copied into the new node.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlNewText(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * parent,
|
||||
int whitespace,
|
||||
const char * string);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *parent, int whitespace, const char * string);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>parent</tt></td><td>Parent node or MXML_NO_PARENT</td></tr>
|
||||
<tr><td><tt>whitespace</tt></td><td>1 = leading whitespace, 0 = no whitespace</td></tr>
|
||||
<tr><td><tt>string</tt></td><td>String</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -399,15 +357,13 @@ allocated.</p>
|
||||
<pre>
|
||||
char *
|
||||
mxmlSaveAllocString(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
int (*cb)(mxml_node_t *int));
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, int (*cb)(mxml_node_t *node, int ws));
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Node to write</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *int)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *node, int ws)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
<p>Allocated string or NULL</p>
|
||||
@ -424,17 +380,13 @@ element tags.</p>
|
||||
<pre>
|
||||
int
|
||||
mxmlSaveFile(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
FILE * fp,
|
||||
int (*cb)(mxml_node_t *int));
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, FILE *fp, int (*cb)(mxml_node_t *node, int ws));
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Node to write</td></tr>
|
||||
<tr><td><tt>fp</tt></td><td>File to write to</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *int)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *node, int ws)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
<p>0 on success, -1 on error.</p>
|
||||
@ -449,19 +401,13 @@ into the specified buffer.</p>
|
||||
<pre>
|
||||
int
|
||||
mxmlSaveString(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
char * buffer,
|
||||
int bufsize,
|
||||
int (*cb)(mxml_node_t *int));
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, char *buffer, int bufsize, int (*cb)(mxml_node_t *node, int ws));
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Node to write</td></tr>
|
||||
<tr><td><tt>buffer</tt></td><td>String buffer</td></tr>
|
||||
<tr><td><tt>bufsize</tt></td><td>Size of string buffer</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *int)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
<tr><td><tt>(*cb)(mxml_node_t *node, int ws)</tt></td><td>Whitespace callback or MXML_NO_CALLBACK</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
<p>Size of string</p>
|
||||
@ -476,16 +422,12 @@ the node's children.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlWalkNext(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * top,
|
||||
int descend);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, <a href="#mxml_node_t">mxml_node_t</a> *top, int descend);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Current node</td></tr>
|
||||
<tr><td><tt>top</tt></td><td>Top node</td></tr>
|
||||
<tr><td><tt>descend</tt></td><td>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
@ -501,16 +443,12 @@ the walk to the node's children.</p>
|
||||
<pre>
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *
|
||||
mxmlWalkPrev(
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * node,
|
||||
<a href="#mxml_node_t">mxml_node_t</a> * top,
|
||||
int descend);
|
||||
<a href="#mxml_node_t">mxml_node_t</a> *node, <a href="#mxml_node_t">mxml_node_t</a> *top, int descend);
|
||||
</pre>
|
||||
<h3>Arguments</h3>
|
||||
<p class="table"><table align="center" border="1" width="80%">
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>node</tt></td><td>Current node</td></tr>
|
||||
<tr><td><tt>top</tt></td><td>Top node</td></tr>
|
||||
<tr><td><tt>descend</tt></td><td>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</td></tr>
|
||||
</tbody></table></p>
|
||||
<h3>Returns</h3>
|
||||
|
144
index.html
144
index.html
@ -103,6 +103,8 @@ href="testmxml.c">testmxml.c</a></tt> and <tt><a
|
||||
href="mxmldoc.c">mxmldoc.c</a></tt> source files for examples of
|
||||
using Mini-XML.</p>
|
||||
|
||||
<h3>The Basics</h3>
|
||||
|
||||
<p>Mini-XML provides a single header file which you include:</p>
|
||||
|
||||
<pre>
|
||||
@ -129,6 +131,54 @@ href="documentation.html#mxmlNewText"><tt>mxmlNewText()</tt></a>
|
||||
functions. Only elements can have child nodes, and the top node
|
||||
must be an element, usually "?xml".</p>
|
||||
|
||||
<p>Each node has pointers for the node above (<tt>parent</tt>), below (<tt>child</tt>),
|
||||
to the left (<tt>prev</tt>), and to the right (<tt>next</tt>) of the current
|
||||
node. If you have an XML file like the following:</p>
|
||||
|
||||
<pre>
|
||||
<?xml version="1.0"?>
|
||||
<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>
|
||||
<node>val9</node>
|
||||
</pre>
|
||||
|
||||
<p>the node tree returned by <tt>mxmlLoadFile()</tt> would look
|
||||
like the following in memory:</p>
|
||||
|
||||
<pre>
|
||||
?xml
|
||||
|
|
||||
node - node - node - group - node - node - node
|
||||
| | | | | | |
|
||||
val1 val2 val3 | val7 val8 val9
|
||||
|
|
||||
node - node - node
|
||||
| | |
|
||||
val4 val5 val6
|
||||
</pre>
|
||||
|
||||
<p>where "-" is a pointer to the next node and "|" is a pointer
|
||||
to the first child node.</p>
|
||||
|
||||
<p>Once you are done with the XML data, use the <a
|
||||
href="documentation.html#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>
|
||||
|
||||
<h3>Loading and Saving XML Files</h3>
|
||||
|
||||
<p>You load an XML file using the <a
|
||||
href="documentation.html#mxmlLoadFile"><tt>mxmlLoadFile()</tt></a>
|
||||
function:</p>
|
||||
@ -142,6 +192,15 @@ tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
</pre>
|
||||
|
||||
<p>The third argument specifies a callback function which
|
||||
returns the value type of the immediate children for a new
|
||||
element node: <tt>MXML_INTEGER</tt>, <tt>MXML_OPAQUE</tt>,
|
||||
<tt>MXML_REAL</tt>, or <tt>MXML_TEXT</tt>. This 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.
|
||||
The default value type is MXML_TEXT if no callback is used.</p>
|
||||
|
||||
<p>Similarly, you save an XML file using the <a
|
||||
href="documentation.html#mxmlSaveFile"><tt>mxmlSaveFile()</tt></a>
|
||||
function:</p>
|
||||
@ -155,6 +214,16 @@ mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
</pre>
|
||||
|
||||
<p>Callback functions for saving are used to optionally insert
|
||||
whitespace before and after elements in the node tree. Your
|
||||
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 0 if no whitespace should be
|
||||
added and the character to insert (space, tab, newline)
|
||||
otherwise.</p>
|
||||
|
||||
<p>The <a
|
||||
href="documentation.html#mxmlLoadString"><tt>mxmlLoadString()</tt></a>,
|
||||
<a
|
||||
@ -179,7 +248,21 @@ mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);
|
||||
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
||||
</pre>
|
||||
|
||||
<p>You can find a named element/node using the <a
|
||||
<h3>Finding and Iterating Nodes</h3>
|
||||
|
||||
<p>The <a
|
||||
href="documentation.html#mxmlWalkPrev"><tt>mxmlWalkPrev()</tt></a>
|
||||
and <a
|
||||
href="documentation.html#mxmlWalkNext"><tt>mxmlWalkNext()</tt></a>functions
|
||||
can be used to iterate through the XML node tree:</p>
|
||||
|
||||
<pre>
|
||||
mxml_node_t *node = mxmlWalkPrev(current, tree, MXML_DESCEND);
|
||||
|
||||
mxml_node_t *node = mxmlWalkNext(current, tree, MXML_DESCEND);
|
||||
</pre>
|
||||
|
||||
<p>In addition, you can find a named element/node using the <a
|
||||
href="documentation.html#mxmlFindElement"><tt>mxmlFindElement()</tt></a>
|
||||
function:</p>
|
||||
|
||||
@ -223,15 +306,64 @@ for (node = mxmlFindElement(tree, tree, "name", NULL, NULL, MXML_DESCEND);
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Finally, once you are done with the XML data, use the <a
|
||||
href="documentation.html#mxmlDelete"><tt>mxmlDelete()</tt></a>
|
||||
function to recursively free the memory that is used for a
|
||||
particular node or the entire tree:</p>
|
||||
<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. 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.</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" elements under the "?xml" parent node
|
||||
in the example above. 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.</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". If you were to
|
||||
walk from the root node "?xml" to the end of the
|
||||
tree with <tt>mxmlWalkNext()</tt>, the order would be:
|
||||
|
||||
<pre>
|
||||
mxmlDelete(tree);
|
||||
?xml
|
||||
node
|
||||
val1
|
||||
node
|
||||
val2
|
||||
node
|
||||
val3
|
||||
group
|
||||
node
|
||||
val4
|
||||
node
|
||||
val5
|
||||
node
|
||||
val6
|
||||
node
|
||||
val7
|
||||
node
|
||||
val8
|
||||
node
|
||||
val9
|
||||
</pre>
|
||||
|
||||
<p>If you started at "val9" and walked using
|
||||
<tt>mxmlWalkPrev()</tt>, the order would be reversed,
|
||||
ending at "?xml".</p></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h2>Getting Help and Reporting Problems</h2>
|
||||
|
||||
<p>You can email me at "mxml <i>at</i> easysw <i>dot</i> com" to
|
||||
|
14
mxml-file.c
14
mxml-file.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* "$Id: mxml-file.c,v 1.18 2003/07/23 14:47:17 mike Exp $"
|
||||
* "$Id: mxml-file.c,v 1.19 2003/07/26 17:24:14 mike Exp $"
|
||||
*
|
||||
* File loading code for mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
@ -80,7 +80,7 @@ static int mxml_write_ws(mxml_node_t *node, void *p,
|
||||
mxml_node_t * /* O - First node or NULL if the file could not be read. */
|
||||
mxmlLoadFile(mxml_node_t *top, /* I - Top node */
|
||||
FILE *fp, /* I - File to read from */
|
||||
mxml_type_t (*cb)(mxml_node_t *))
|
||||
mxml_type_t (*cb)(mxml_node_t *node))
|
||||
/* I - Callback function or MXML_NO_CALLBACK */
|
||||
{
|
||||
return (mxml_load_data(top, fp, cb, mxml_file_getc));
|
||||
@ -101,7 +101,7 @@ mxmlLoadFile(mxml_node_t *top, /* I - Top node */
|
||||
mxml_node_t * /* O - First node or NULL if the string has errors. */
|
||||
mxmlLoadString(mxml_node_t *top, /* I - Top node */
|
||||
const char *s, /* I - String to load */
|
||||
mxml_type_t (*cb)(mxml_node_t *))
|
||||
mxml_type_t (*cb)(mxml_node_t *node))
|
||||
/* I - Callback function or MXML_NO_CALLBACK */
|
||||
{
|
||||
return (mxml_load_data(top, &s, cb, mxml_string_getc));
|
||||
@ -120,7 +120,7 @@ mxmlLoadString(mxml_node_t *top, /* I - Top node */
|
||||
|
||||
char * /* O - Allocated string or NULL */
|
||||
mxmlSaveAllocString(mxml_node_t *node, /* I - Node to write */
|
||||
int (*cb)(mxml_node_t *, int))
|
||||
int (*cb)(mxml_node_t *node, int ws))
|
||||
/* I - Whitespace callback or MXML_NO_CALLBACK */
|
||||
{
|
||||
int bytes; /* Required bytes */
|
||||
@ -178,7 +178,7 @@ mxmlSaveAllocString(mxml_node_t *node, /* I - Node to write */
|
||||
int /* O - 0 on success, -1 on error. */
|
||||
mxmlSaveFile(mxml_node_t *node, /* I - Node to write */
|
||||
FILE *fp, /* I - File to write to */
|
||||
int (*cb)(mxml_node_t *, int))
|
||||
int (*cb)(mxml_node_t *node, int ws))
|
||||
/* I - Whitespace callback or MXML_NO_CALLBACK */
|
||||
{
|
||||
int col; /* Final column */
|
||||
@ -215,7 +215,7 @@ int /* O - Size of string */
|
||||
mxmlSaveString(mxml_node_t *node, /* I - Node to write */
|
||||
char *buffer, /* I - String buffer */
|
||||
int bufsize, /* I - Size of string buffer */
|
||||
int (*cb)(mxml_node_t *, int))
|
||||
int (*cb)(mxml_node_t *node, int ws))
|
||||
/* I - Whitespace callback or MXML_NO_CALLBACK */
|
||||
{
|
||||
int col; /* Final column */
|
||||
@ -1432,5 +1432,5 @@ mxml_write_ws(mxml_node_t *node, /* I - Current node */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-file.c,v 1.18 2003/07/23 14:47:17 mike Exp $".
|
||||
* End of "$Id: mxml-file.c,v 1.19 2003/07/26 17:24:14 mike Exp $".
|
||||
*/
|
||||
|
72
mxml.xml
72
mxml.xml
@ -7,10 +7,8 @@ on the value of the where argument. If the child argument is NULL,
|
||||
puts the new node at the beginning of the child list (MXML_ADD_BEFORE)
|
||||
or at the end of the child list (MXML_ADD_AFTER). The constant
|
||||
MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node</description></argument>
|
||||
<argument name="where" direction="I"><type>int</type><description>Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER</description></argument>
|
||||
<argument name="child" direction="I"><type>mxml_node_t *</type><description>Child node for where or MXML_ADD_TO_PARENT</description></argument>
|
||||
<argument name="node" direction="I"><type>mxml_node_t *</type><description>Node to add</description></argument>
|
||||
name="node" direction="I"><type>mxml_node_t *parent, int where, mxml_node_t
|
||||
*child, mxml_node_t *</type><description>Node to add</description></argument>
|
||||
</function>
|
||||
<function name="mxmlDelete"><description>Delete a node and all of its children.
|
||||
|
||||
@ -24,8 +22,7 @@ char *</type></returnvalue>
|
||||
|
||||
This function returns NULL if the node is not an element or the
|
||||
named attribute does not exist.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Element node</description></argument>
|
||||
<argument name="name" direction="I"><type>const char *</type><description>Name of attribute</description></argument>
|
||||
name="name" direction="I"><type>mxml_node_t *node, const char *</type><description>Name of attribute</description></argument>
|
||||
</function>
|
||||
<function name="mxmlElementSetAttr"><description>Set an attribute.
|
||||
|
||||
@ -33,9 +30,8 @@ If the named attribute already exists, the value of the attribute
|
||||
is replaced by the new string value. The string value is copied
|
||||
into the element node. This function does nothing if the node is
|
||||
not an element.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Element node</description></argument>
|
||||
<argument name="name" direction="I"><type>const char *</type><description>Name of attribute</description></argument>
|
||||
<argument name="value" direction="I"><type>const char *</type><description>Attribute value</description></argument>
|
||||
name="value" direction="I"><type>mxml_node_t *node, const char *name, const
|
||||
char *</type><description>Attribute value</description></argument>
|
||||
</function>
|
||||
<function name="mxmlFindElement"><returnvalue><description>Element node or NULL</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -49,12 +45,8 @@ whether the search descends into child nodes; normally you will use
|
||||
MXML_DESCEND_FIRST for the initial search and MXML_NO_DESCEND to find
|
||||
additional direct descendents of the node. The top node argument
|
||||
constrains the search to a particular node's children.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Current node</description></argument>
|
||||
<argument name="top" direction="I"><type>mxml_node_t *</type><description>Top node</description></argument>
|
||||
<argument name="name" direction="I"><type>const char *</type><description>Element name or NULL for any</description></argument>
|
||||
<argument name="attr" direction="I"><type>const char *</type><description>Attribute name, or NULL for none</description></argument>
|
||||
<argument name="value" direction="I"><type>const char *</type><description>Attribute value, or NULL for any</description></argument>
|
||||
<argument name="descend" direction="I"><type>int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
name="descend" direction="I"><type>mxml_node_t *node, mxml_node_t *top, const
|
||||
char *name, const char *attr, const char *value, int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
</function>
|
||||
<function name="mxmlLoadFile"><returnvalue><description>First node or NULL if the file could not be read.</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -66,9 +58,8 @@ single parent node like <?xml> for the entire file. The callback
|
||||
function returns the value type that should be used for child nodes.
|
||||
If MXML_NO_CALLBACK is specified then all child nodes will be either
|
||||
MXML_ELEMENT or MXML_TEXT nodes.</description><argument
|
||||
name="top" direction="I"><type>mxml_node_t *</type><description>Top node</description></argument>
|
||||
<argument name="fp" direction="I"><type>FILE *</type><description>File to read from</description></argument>
|
||||
<argument name="(*cb)(mxml_node_t *)" direction="I"><type>mxml_type_t</type><description>Callback function or MXML_NO_CALLBACK</description></argument>
|
||||
name="(*cb)(mxml_node_t *node)" direction="I"><type>mxml_node_t *top, FILE
|
||||
*fp, mxml_type_t</type><description>Callback function or MXML_NO_CALLBACK</description></argument>
|
||||
</function>
|
||||
<function name="mxmlLoadString"><returnvalue><description>First node or NULL if the string has errors.</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -80,9 +71,8 @@ single parent node like <?xml> for the entire string. The callback
|
||||
function returns the value type that should be used for child nodes.
|
||||
If MXML_NO_CALLBACK is specified then all child nodes will be either
|
||||
MXML_ELEMENT or MXML_TEXT nodes.</description><argument
|
||||
name="top" direction="I"><type>mxml_node_t *</type><description>Top node</description></argument>
|
||||
<argument name="s" direction="I"><type>const char *</type><description>String to load</description></argument>
|
||||
<argument name="(*cb)(mxml_node_t *)" direction="I"><type>mxml_type_t</type><description>Callback function or MXML_NO_CALLBACK</description></argument>
|
||||
name="(*cb)(mxml_node_t *node)" direction="I"><type>mxml_node_t *top, const
|
||||
char *s, mxml_type_t</type><description>Callback function or MXML_NO_CALLBACK</description></argument>
|
||||
</function>
|
||||
<function name="mxmlNewElement"><returnvalue><description>New node</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -91,8 +81,7 @@ name="top" direction="I"><type>mxml_node_t *</type><description>Top node</descri
|
||||
The new element node is added to the end of the specified parent's child
|
||||
list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
element node has no parent.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node or MXML_NO_PARENT</description></argument>
|
||||
<argument name="name" direction="I"><type>const char *</type><description>Name of element</description></argument>
|
||||
name="name" direction="I"><type>mxml_node_t *parent, const char *</type><description>Name of element</description></argument>
|
||||
</function>
|
||||
<function name="mxmlNewInteger"><returnvalue><description>New node</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -101,8 +90,7 @@ name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node o
|
||||
The new integer node is added to the end of the specified parent's child
|
||||
list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
integer node has no parent.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node or MXML_NO_PARENT</description></argument>
|
||||
<argument name="integer" direction="I"><type>int</type><description>Integer value</description></argument>
|
||||
name="integer" direction="I"><type>mxml_node_t *parent, int</type><description>Integer value</description></argument>
|
||||
</function>
|
||||
<function name="mxmlNewOpaque"><returnvalue><description>New node</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -112,8 +100,7 @@ The new opaque node is added to the end of the specified parent's child
|
||||
list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
opaque node has no parent. The opaque string must be nul-terminated and
|
||||
is copied into the new node.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node or MXML_NO_PARENT</description></argument>
|
||||
<argument name="opaque" direction="I"><type>const char *</type><description>Opaque string</description></argument>
|
||||
name="opaque" direction="I"><type>mxml_node_t *parent, const char *</type><description>Opaque string</description></argument>
|
||||
</function>
|
||||
<function name="mxmlNewReal"><returnvalue><description>New node</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -122,8 +109,7 @@ name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node o
|
||||
The new real number node is added to the end of the specified parent's
|
||||
child list. The constant MXML_NO_PARENT can be used to specify that
|
||||
the new real number node has no parent.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node or MXML_NO_PARENT</description></argument>
|
||||
<argument name="real" direction="I"><type>double</type><description>Real number value</description></argument>
|
||||
name="real" direction="I"><type>mxml_node_t *parent, double</type><description>Real number value</description></argument>
|
||||
</function>
|
||||
<function name="mxmlNewText"><returnvalue><description>New node</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -134,9 +120,8 @@ list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
text node has no parent. The whitespace parameter is used to specify
|
||||
whether leading whitespace is present before the node. The text
|
||||
string must be nul-terminated and is copied into the new node.</description><argument
|
||||
name="parent" direction="I"><type>mxml_node_t *</type><description>Parent node or MXML_NO_PARENT</description></argument>
|
||||
<argument name="whitespace" direction="I"><type>int</type><description>1 = leading whitespace, 0 = no whitespace</description></argument>
|
||||
<argument name="string" direction="I"><type>const char *</type><description>String</description></argument>
|
||||
name="string" direction="I"><type>mxml_node_t *parent, int whitespace, const
|
||||
char *</type><description>String</description></argument>
|
||||
</function>
|
||||
<function name="mxmlRemove"><description>Remove a node from its parent.
|
||||
|
||||
@ -153,8 +138,8 @@ representation of the XML node tree. The string should be freed
|
||||
using the free() function when you are done with it. NULL is returned
|
||||
if the node would produce an empty string or if the string cannot be
|
||||
allocated.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Node to write</description></argument>
|
||||
<argument name="(*cb)(mxml_node_t *int)" direction="I"><type>int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
name="(*cb)(mxml_node_t *node, int ws)" direction="I"><type>mxml_node_t *node,
|
||||
int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
</function>
|
||||
<function name="mxmlSaveFile"><returnvalue><description>0 on success, -1 on error.</description><type>int</type></returnvalue>
|
||||
<description>Save an XML tree to a file.
|
||||
@ -164,9 +149,8 @@ character or nul (0) before and after each element. If MXML_NO_CALLBACK
|
||||
is specified, whitespace will only be added before MXML_TEXT nodes
|
||||
with leading whitespace and before attribute names inside opening
|
||||
element tags.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Node to write</description></argument>
|
||||
<argument name="fp" direction="I"><type>FILE *</type><description>File to write to</description></argument>
|
||||
<argument name="(*cb)(mxml_node_t *int)" direction="I"><type>int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
name="(*cb)(mxml_node_t *node, int ws)" direction="I"><type>mxml_node_t *node,
|
||||
FILE *fp, int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
</function>
|
||||
<function name="mxmlSaveString"><returnvalue><description>Size of string</description><type>int</type></returnvalue>
|
||||
<description>Save an XML node tree to a string.
|
||||
@ -174,10 +158,8 @@ name="node" direction="I"><type>mxml_node_t *</type><description>Node to write</
|
||||
This function returns the total number of bytes that would be
|
||||
required for the string but only copies (bufsize - 1) characters
|
||||
into the specified buffer.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Node to write</description></argument>
|
||||
<argument name="buffer" direction="I"><type>char *</type><description>String buffer</description></argument>
|
||||
<argument name="bufsize" direction="I"><type>int</type><description>Size of string buffer</description></argument>
|
||||
<argument name="(*cb)(mxml_node_t *int)" direction="I"><type>int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
name="(*cb)(mxml_node_t *node, int ws)" direction="I"><type>mxml_node_t *node,
|
||||
char *buffer, int bufsize, int</type><description>Whitespace callback or MXML_NO_CALLBACK</description></argument>
|
||||
</function>
|
||||
<function name="mxmlWalkNext"><returnvalue><description>Next node or NULL</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -186,9 +168,7 @@ name="node" direction="I"><type>mxml_node_t *</type><description>Node to write</
|
||||
The descend argument controls whether the first child is considered
|
||||
to be the next node. The top node argument constrains the walk to
|
||||
the node's children.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Current node</description></argument>
|
||||
<argument name="top" direction="I"><type>mxml_node_t *</type><description>Top node</description></argument>
|
||||
<argument name="descend" direction="I"><type>int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
name="descend" direction="I"><type>mxml_node_t *node, mxml_node_t *top, int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
</function>
|
||||
<function name="mxmlWalkPrev"><returnvalue><description>Previous node or NULL</description><type>mxml_node_t
|
||||
*</type></returnvalue>
|
||||
@ -197,9 +177,7 @@ name="node" direction="I"><type>mxml_node_t *</type><description>Current node</d
|
||||
The descend argument controls whether the previous node's last child
|
||||
is considered to be the previous node. The top node argument constrains
|
||||
the walk to the node's children.</description><argument
|
||||
name="node" direction="I"><type>mxml_node_t *</type><description>Current node</description></argument>
|
||||
<argument name="top" direction="I"><type>mxml_node_t *</type><description>Top node</description></argument>
|
||||
<argument name="descend" direction="I"><type>int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
name="descend" direction="I"><type>mxml_node_t *node, mxml_node_t *top, int</type><description>Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST</description></argument>
|
||||
</function>
|
||||
<struct name="mxml_attr_s"><description>An XML element attribute value.</description><variable
|
||||
name="name"><type>char *</type><description>Attribute name</description></variable>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* "$Id: mxmldoc.c,v 1.14 2003/07/20 14:37:34 mike Exp $"
|
||||
* "$Id: mxmldoc.c,v 1.15 2003/07/26 17:24:14 mike Exp $"
|
||||
*
|
||||
* Documentation generator using mini-XML, a small XML-like file parsing
|
||||
* library.
|
||||
@ -961,7 +961,8 @@ scan_file(const char *filename, /* I - Filename */
|
||||
break;
|
||||
|
||||
case STATE_IDENTIFIER : /* Inside a keyword or identifier */
|
||||
if (isalnum(ch) || ch == '_' || ch == '[' || ch == ']' || ch == ':')
|
||||
if (isalnum(ch) || ch == '_' || ch == '[' || ch == ']' || ch == ':' ||
|
||||
(parens && ch == ','))
|
||||
{
|
||||
if (bufptr < (buffer + sizeof(buffer) - 1))
|
||||
*bufptr++ = ch;
|
||||
@ -2080,5 +2081,5 @@ ws_cb(mxml_node_t *node, /* I - Element node */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxmldoc.c,v 1.14 2003/07/20 14:37:34 mike Exp $".
|
||||
* End of "$Id: mxmldoc.c,v 1.15 2003/07/26 17:24:14 mike Exp $".
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user