From e4ca6951f073ffb6021606f5048c5de759b87a7f Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 18 Feb 2019 09:00:13 -0500 Subject: [PATCH] Update docos. --- doc/mxml.3 | 2 +- doc/mxml.epub | Bin 679468 -> 679603 bytes doc/mxml.html | 200 +++++++++++++++++++++++++------------------------- 3 files changed, 100 insertions(+), 102 deletions(-) diff --git a/doc/mxml.3 b/doc/mxml.3 index b54bb57..05504e6 100644 --- a/doc/mxml.3 +++ b/doc/mxml.3 @@ -1,4 +1,4 @@ -.TH mxml 3 "Mini-XML API" "2019-02-20" "Mini-XML API" +.TH mxml 3 "Mini-XML API" "2019-03-01" "Mini-XML API" .SH NAME mxml \- Mini-XML API .SH INCLUDE FILE diff --git a/doc/mxml.epub b/doc/mxml.epub index 1715392cef602fee55acc40922d1736afbb067ae..863e9d9aa0c18013b10231c164f2d2f46ca8e203 100644 GIT binary patch delta 19330 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

NoB2Bwl_+dPawcI{kg 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 diff --git a/doc/mxml.html b/doc/mxml.html index 6ba32bc..e8f407c 100644 --- a/doc/mxml.html +++ b/doc/mxml.html @@ -3,91 +3,62 @@ Mini-XML API Reference - + -

-

Mini-XML API Reference

-

Michael R Sweet

-

Copyright © 2003-2019, All Rights Reserved.

+
+

+

Mini-XML API Reference

+

Michael R Sweet

+

Copyright © 2003-2019, All Rights Reserved.

+

Contents

    @@ -302,7 +292,7 @@ h3.title {
-

Introduction

+

Introduction

Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring large non-standard libraries. Mini-XML provides the following functionality:

  • Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and strings.
  • @@ -314,7 +304,7 @@ h3.title {
  • "Find" and "walk" functions for easily locating and navigating trees of data.

Mini-XML doesn't do validation or other types of processing on the data based upon schema files or other sources of definition information.

-

History

+

History

Mini-XML was initially developed for the Gutenprint project to replace the rather large and unwieldy libxml2 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:

It's bad enough that we require libxml2, but rolling our own XML parser is a bit more than we can handle.

@@ -325,14 +315,14 @@ h3.title {

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.

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 4,115 lines of code, compared to 140,410 lines of code for libxml2 version 2.9.1.

-

Resources

+

Resources

The Mini-XML home page can be found at:

https://www.msweet.orgm/mxml
 

From here you can download the current version of Mini-XML, the issue tracker, and other resources.

-

Legal Stuff

+

The Mini-XML library is copyright © 2003-2019 by Michael R Sweet and is provided under the Apache License Version 2.0 with an exception to allow linking against GPL2/LGPL2-only software. See the files "LICENSE" and "NOTICE" for more information.

-

Using Mini-XML

+

Using Mini-XML

Mini-XML provides a single header file which you include:

#include <mxml.h>
 
@@ -342,7 +332,7 @@ h3.title {

If you have the pkg-config software installed, you can use it to determine the proper compiler and linker options for your installation:

gcc `pkg-config --cflags mxml` -o myprogram myprogram.c `pkg-config --libs mxml`
 
-

Loading an XML File

+

Loading an XML File

You load an XML file using the mxmlLoadFile function:

mxml_node_t *
 mxmlLoadFile(mxml_node_t *top, FILE *fp,
@@ -365,7 +355,7 @@ mxml_node_t *
 mxmlLoadString(mxml_node_t *top, const char *s,
                mxml_type_t (*cb)(mxml_node_t *));
 
-

Load Callbacks

+

Load Callbacks

The last argument to the mxmlLoad functions is a callback function which is used to determine the value type of each data node in an XML document. Mini-XML defines several standard callbacks for simple XML data files:

  • MXML_INTEGER_CALLBACK: All data nodes contain whitespace-separated integers.
  • @@ -407,7 +397,7 @@ fp = fopen("filename.xml", "r"); tree = mxmlLoadFile(NULL, fp, type_cb); fclose(fp); -

    Nodes

    +

    Nodes

    Every piece of information in an XML file is stored in memory in "nodes". Nodes are defined by the mxml_node_t structure. Each node has a typed value, optional user data, a parent node, sibling nodes (previous and next), and potentially child nodes.

    For example, if you have an XML file like the following:

    <?xml version="1.0" encoding="utf-8"?>
    @@ -437,11 +427,19 @@ val1   val2   val3     |     val7   val8
                            |      |      |
                          val4   val5   val6
     
    -where "-" is a pointer to the sibling node and "" is a pointer to the first

    child or parent node.

    +

    where "-" is a pointer to the sibling node and "|" is a pointer to the first child or parent node.

    The mxmlGetType function gets the type of a node:

    mxml_type_t
     mxmlGetType(mxml_node_t *node);
     
    +
      +
    • MXML_CUSTOM : A custom value defined by your application,
    • +
    • MXML_ELEMENT : An XML element, CDATA, comment, or processing instruction,
    • +
    • MXML_INTEGER : A whitespace-delimited integer value,
    • +
    • MXML_OPAQUE : An opaque string value that preserves all whitespace,
    • +
    • MXML_REAL : A whitespace-delimited floating point value, or
    • +
    • MXML_TEXT : A whitespace-delimited text (fragment) value.
    • +

    Note: CDATA, comment, and processing directive nodes are currently stored in memory as special elements. This will be changed in a future major release of Mini-XML.

    @@ -465,7 +463,7 @@ mxmlGetPrevSibling(mxml_node_t *node);
    void *
     mxmlGetUserData(mxml_node_t *node);
     
    -

    Creating XML Documents

    +

    Creating XML Documents

    You can create and update XML documents in memory using the various mxmlNew functions. The following code will create the XML document described in the previous section:

    mxml_node_t *xml;    /* <?xml ... ?> */
     mxml_node_t *data;   /* <data> */
    @@ -508,7 +506,7 @@ data = mxmlNewElement(xml, "data");
     mxmlNewText(node, 0, "val1");
     

    The resulting in-memory XML document can then be saved or processed just like one loaded from disk or a string.

    -

    Saving an XML File

    +

    Saving an XML File

    You save an XML file using the mxmlSaveFile function:

    int
     mxmlSaveFile(mxml_node_t *node, FILE *fp,
    @@ -532,7 +530,7 @@ int
     mxmlSaveString(mxml_node_t *node, char *buffer, int bufsize,
                    mxml_save_cb_t cb);
     
    -

    Controlling Line Wrapping

    +

    Controlling Line Wrapping

    When saving XML documents, Mini-XML normally wraps output lines at column 75 so that the text is readable in terminal windows. The mxmlSetWrapMargin function overrides the default wrap margin for the current thread:

    void mxmlSetWrapMargin(int column);
     
    @@ -542,7 +540,7 @@ mxmlSaveString(mxml_node_t *node, char *buffer, int bufsize,

    while the following code disables wrapping by setting the margin to 0:

    mxmlSetWrapMargin(0);
     
    -

    Save Callbacks

    +

    Save Callbacks

    The last argument to the mxmlSave functions is a callback function which is used to automatically insert whitespace in an XML document. 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 MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback function should return NULL if no whitespace should be added or the string to insert (spaces, tabs, carriage returns, and newlines) otherwise.

    The following whitespace callback can be used to add whitespace to XHTML output to make it more readable in a standard text editor:

    const char *
    @@ -617,14 +615,14 @@ fp = fopen("filename.xml", "w");
     mxmlSaveFile(tree, fp, whitespace_cb);
     fclose(fp);
     
    -

    Memory Management

    +

    Memory Management

    Once you are done with the XML data, use the mxmlDelete function to recursively free the memory that is used for a particular node or the entire tree:

    void
     mxmlDelete(mxml_node_t *tree);
     

    You can also use reference counting to manage memory usage. The mxmlRetain and mxmlRelease functions increment and decrement a node's use count, respectively. When the use count goes to zero, mxmlRelease automatically calls mxmlDelete to actually free the memory used by the node tree. New nodes start with a use count of 1.

    -

    More About Nodes

    -

    Element Nodes

    +

    More About Nodes

    +

    Element Nodes

    Element (MXML_ELEMENT) nodes are created using the mxmlNewElement function. Element attributes are set using the mxmlElementSetAttr and mxmlElementSetAttrf functions and cleared using the mxmlElementDeleteAttr function:

    mxml_node_t *
     mxmlNewElement(mxml_node_t *parent, const char *name);
    @@ -658,14 +656,14 @@ mxmlElementGetAttrByIndex(mxml_node_t *node, int idx,
     int
     mxmlElementGetAttrCount(mxml_node_t *node);
     
    -

    CDATA Nodes

    +

    CDATA Nodes

    CDATA (MXML_ELEMENT) nodes are created using the mxmlNewCDATA function:

    mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string);
     

    The mxmlGetCDATA function retrieves the CDATA string pointer for a node:

    const char *mxmlGetCDATA(mxml_node_t *node);
     
    -

    Comment Nodes

    +

    Comment Nodes

    Because comments are currently stored as element nodes, comment (MXML_ELEMENT) nodes are created using the mxmlNewElement function by including the surrounding "!--" and "--" characters in the element name, for example:

    mxml_node_t *node = mxmlNewElement("!-- This is a comment --");
     
    @@ -673,7 +671,7 @@ mxmlElementGetAttrCount(mxml_node_t *node);
    const char *comment = mxmlGetElement(node);
     /* returns "!-- This is a comment --" */
     
    -

    Processing Instruction Nodes

    +

    Processing Instruction Nodes

    Because processing instructions are currently stored as element nodes, processing instruction (MXML_ELEMENT) nodes are created using the mxmlNewElement function including the surrounding "?" characters:

    mxml_node_t *node = mxmlNewElement("?xml-stylesheet type=\"text/css\" href=\"style.css\"?");
     
    @@ -681,7 +679,7 @@ mxmlElementGetAttrCount(mxml_node_t *node);
    const char *instr = mxmlGetElement(node);
     /* returned "?xml-stylesheet type=\"text/css\" href=\"style.css\"?" */
     
    -

    Integer Nodes

    +

    Integer Nodes

    Integer (MXML_INTEGER) nodes are created using the mxmlNewInteger function:

    mxml_node_t *
     mxmlNewInteger(mxml_node_t *parent, int integer);
    @@ -690,7 +688,7 @@ mxmlNewInteger(mxml_node_t *parent, int integer);
         
    int
     mxmlGetInteger(mxml_node_t *node);
     
    -

    Opaque String Nodes

    +

    Opaque String Nodes

    Opaque string (MXML_OPAQUE) nodes are created using the mxmlNewOpaque function:

    mxml_node_t *
     mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
    @@ -699,7 +697,7 @@ mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
         
    const char *
     mxmlGetOpaque(mxml_node_t *node);
     
    -

    Text Nodes

    +

    Text Nodes

    Whitespace-delimited text string (MXML_TEXT) nodes are created using the mxmlNewText and mxmlNewTextf functions. Each text node consists of a text string and (leading) whitespace flag value.

    mxml_node_t *
     mxmlNewText(mxml_node_t *parent, int whitespace,
    @@ -713,7 +711,7 @@ mxmlNewTextf(mxml_node_t *parent, int whitespace,
         
     const char *
      mxmlGetText(mxml_node_t *node, int *whitespace);
     
    -

    Real Number Nodes

    +

    Real Number Nodes

    Real number (MXML_REAL) nodes are created using the mxmlNewReal function:

    mxml_node_t *
     mxmlNewReal(mxml_node_t *parent, double real);
    @@ -722,9 +720,9 @@ mxmlNewReal(mxml_node_t *parent, double real);
         
    double
     mxmlGetReal(mxml_node_t *node);
     
    -

    Locating Data in an XML Document

    +

    Locating Data in an XML Document

    Mini-XML provides many functions for enumerating, searching, and indexing XML documents.

    -

    Finding Nodes

    +

    Finding Nodes

    The mxmlFindPath function finds the (first) value node under a specific element using a "path":

    mxml_node_t *
     mxmlFindPath(mxml_node_t *node, const char *path);
    @@ -780,7 +778,7 @@ for (node = mxmlFindElement(tree, tree, "element", NULL,
         
  • MXML_DESCEND_FIRST: start the search with the first child of the node, and then search siblings. 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 previous example.
  • MXML_DESCEND: search child nodes first, then sibling nodes, and then parent nodes.
-

Iterating Nodes

+

Iterating Nodes

While the mxmlFindNode and mxmlFindPath functions will find a particular element node, sometimes you need to iterate over all nodes. The mxmlWalkNext and mxmlWalkPrev functions can be used to iterate through the XML node tree:

mxml_node_t *
 mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,
@@ -821,7 +819,7 @@ val7
 <node>
 val8
 
-

Indexing

+

Indexing

The mxmlIndexNew function allows you to create an index of nodes for faster searching and enumeration:

mxml_index_t *
 mxmlIndexNew(mxml_node_t *node, const char *element,
@@ -864,7 +862,7 @@ mxmlIndexGetCount(mxml_index_t *ind);
     
void
 mxmlIndexDelete(mxml_index_t *ind);
 
-

Custom Data Types

+

Custom Data Types

Mini-XML supports custom data types via per-thread load and save callbacks. Only a single set of callbacks can be active at any time for the current thread, however your callbacks can store additional information in order to support multiple custom data types as needed. The MXML_CUSTOM node type identifies custom data nodes.

The mxmlGetCustom function retrieves the custom value pointer for a node.

const void *
@@ -996,7 +994,7 @@ save_custom(mxml_node_t *node)
     

You register the callback functions using the mxmlSetCustomHandlers function:

mxmlSetCustomHandlers(load_custom, save_custom);
 
-

SAX (Stream) Loading of Documents

+

SAX (Stream) Loading of Documents

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.

The mxmlSAXLoadFd, mxmlSAXLoadFile, and mxmlSAXLoadString functions provide the SAX loading APIs:

mxml_node_t *