From aaefc5c07c766284876065d79c07498f5f64f08d Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 3 Jan 2011 02:03:29 +0000 Subject: [PATCH] Rename mxmlFindValue to mxmlFindPath. Rename mxmlGetPrevious to mxmlGetPrevSibling. Rename mxmlGetNext to mxmlGetNextSibling. Update documentation. --- CHANGES | 4 +- COPYING | 26 +-- Makefile.in | 79 +++++++-- README | 26 ++- configure.in | 10 +- doc/advanced.html | 45 ++--- doc/basics.html | 271 ++++++++++++++++++----------- doc/docset.intro | 25 ++- doc/footer.man | 2 +- doc/hires/logo.png | Bin 141627 -> 0 bytes doc/install.html | 2 +- doc/intro.html | 2 +- doc/intro.man | 22 ++- doc/license.html | 36 ++-- doc/logo.opacity | Bin 14917 -> 0 bytes doc/logo.png | Bin 25191 -> 0 bytes doc/mxml.html | 417 ++++++++++++++++++++++++++++----------------- doc/mxmldoc.html | 4 +- doc/mxmldoc.xsd | 4 +- doc/reference.html | 57 +++++-- doc/relnotes.html | 6 +- doc/schema.html | 6 +- mxml-get.c | 50 +++--- mxml-node.c | 45 +++-- mxml-search.c | 22 ++- mxml.h | 17 +- mxml.xml | 40 +++-- testmxml.c | 8 +- vcnet/mxml1.def | 19 ++- vcnet/mxml1.vcproj | 4 + 30 files changed, 805 insertions(+), 444 deletions(-) delete mode 100644 doc/hires/logo.png delete mode 100644 doc/logo.opacity delete mode 100644 doc/logo.png diff --git a/CHANGES b/CHANGES index 2093f23..62b2666 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -CHANGES - 2011-01-01 +CHANGES - 2011-01-02 -------------------- CHANGES IN Mini-XML 2.7 @@ -8,7 +8,7 @@ CHANGES IN Mini-XML 2.7 header to preserve source compatibility (STR #118) - Updated the source headers to reference the Mini-XML license and its exceptions to the LGPL2 (STR #108) - - Added a new mxmlFindValue() function to find the value node of a + - Added a new mxmlFindPath() function to find the value node of a named element (STR #110) - Building a static version of the library did not work on Windows (STR #112) diff --git a/COPYING b/COPYING index d7b975c..4d0aa78 100644 --- a/COPYING +++ b/COPYING @@ -6,21 +6,21 @@ 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: - 1. 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. + 1. 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. - 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. +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. - 2. 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. + 2. 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. GNU LIBRARY GENERAL PUBLIC LICENSE diff --git a/Makefile.in b/Makefile.in index 3b8fe88..6e51352 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3,7 +3,7 @@ # # Makefile for Mini-XML, a small XML-like file parsing library. # -# Copyright 2003-2010 by Michael R Sweet. +# Copyright 2003-2011 by Michael R Sweet. # # These coded instructions, statements, and computer programs are the # property of Michael R Sweet and are protected by Federal copyright @@ -69,9 +69,11 @@ INSTALL_SCRIPT = $(INSTALL) -m 755 # Rules... # +.SILENT: .SUFFIXES: .c .man .o .c.o: - $(CC) $(CFLAGS) -c $< + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< # @@ -101,6 +103,7 @@ all: Makefile config.h $(TARGETS) # clean: + echo Cleaning build files... $(RM) $(OBJS) $(TARGETS) $(RM) mxmldoc-static libmxml.a @@ -110,6 +113,7 @@ clean: # distclean: clean + echo Cleaning distribution files... $(RM) config.cache config.log config.status $(RM) Makefile config.h $(RM) -r autom4te*.cache @@ -123,9 +127,11 @@ distclean: clean .PHONY: clang clang-changes clang: + echo Doing static code analysis of all code using CLANG... $(RM) -r clang scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) clean all clang-changes: + echo Doing static code analysis of changed code using CLANG... scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) all @@ -134,41 +140,50 @@ clang-changes: # install: $(TARGETS) install-$(LIBMXML) install-libmxml.a + echo Installing mxmldoc in $(BUILDROOT)$(bindir)... $(INSTALL_DIR) $(BUILDROOT)$(bindir) - $(INSTALL_BIN) mxmldoc $(BUILDROOT)$(bindir) + $(INSTALL_BIN) mxmldoc $(BUILDROOT)$(bindir) + echo Installing documentation in $(BUILDROOT)$(docdir)... $(INSTALL_DIR) $(BUILDROOT)$(docdir) for file in $(DOCFILES); do \ $(INSTALL_MAN) $$file $(BUILDROOT)$(docdir); \ done + echo Installing header files in $(BUILDROOT)$(includedir)... $(INSTALL_DIR) $(BUILDROOT)$(includedir) $(INSTALL_DATA) mxml.h $(BUILDROOT)$(includedir) + echo Installing pkgconfig files in $(BUILDROOT)$(libdir)/pkgconfig... $(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig $(INSTALL_DATA) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig + echo Installing man pages in $(BUILDROOT)$(mandir)... $(INSTALL_DIR) $(BUILDROOT)$(mandir)/man1 $(INSTALL_MAN) doc/mxmldoc.man $(BUILDROOT)$(mandir)/man1/mxmldoc.1 $(INSTALL_DIR) $(BUILDROOT)$(mandir)/man3 $(INSTALL_MAN) doc/mxml.man $(BUILDROOT)$(mandir)/man3/mxml.3 install-libmxml.a: + echo Installing libmxml.a to $(BUILDROOT)$(libdir)... $(INSTALL_DIR) $(BUILDROOT)$(libdir) $(INSTALL_LIB) libmxml.a $(BUILDROOT)$(libdir) $(RANLIB) $(BUILDROOT)$(libdir)/libmxml.a -install-libmxml.so.1.4: +install-libmxml.so.1.5: + echo Installing libmxml.so to $(BUILDROOT)$(libdir)... $(INSTALL_DIR) $(BUILDROOT)$(libdir) - $(INSTALL_LIB) libmxml.so.1.4 $(BUILDROOT)$(libdir) + $(INSTALL_LIB) libmxml.so.1.5 $(BUILDROOT)$(libdir) $(RM) $(BUILDROOT)$(libdir)/libmxml.so - $(LN) libmxml.so.1.4 $(BUILDROOT)$(libdir)/libmxml.so + $(LN) libmxml.so.1.5 $(BUILDROOT)$(libdir)/libmxml.so $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1 - $(LN) libmxml.so.1.4 $(BUILDROOT)$(libdir)/libmxml.so.1 + $(LN) libmxml.so.1.5 $(BUILDROOT)$(libdir)/libmxml.so.1 install-libmxml.sl.1: + echo Installing libmxml.sl to $(BUILDROOT)$(libdir)... $(INSTALL_DIR) $(BUILDROOT)$(libdir) $(INSTALL_LIB) libmxml.sl.1 $(BUILDROOT)$(libdir) $(RM) $(BUILDROOT)$(libdir)/libmxml.so $(LN) libmxml.sl.1 $(BUILDROOT)$(libdir)/libmxml.sl install-libmxml.1.dylib: + echo Installing libmxml.dylib to $(BUILDROOT)$(libdir)... $(INSTALL_DIR) $(BUILDROOT)$(libdir) $(INSTALL_LIB) libmxml.1.dylib $(BUILDROOT)$(libdir) $(RM) $(BUILDROOT)$(libdir)/libmxml.dylib @@ -180,35 +195,45 @@ install-libmxml.1.dylib: # uninstall: uninstall-$(LIBMXML) uninstall-libmxml.a + echo Uninstalling mxmldoc from $(BUILDROOT)$(bindir)... $(RM) $(BUILDROOT)$(bindir)/mxmldoc + echo Uninstalling documentation from $(BUILDROOT)$(docdir)... $(RM) -r $(BUILDROOT)$(docdir) + echo Uninstalling headers from $(BUILDROOT)$(includedir)... $(RM) $(BUILDROOT)$(includedir)/mxml.h + echo Uninstalling pkgconfig files from $(BUILDROOT)$(libdir)/pkgconfig... $(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc + echo Uninstalling man pages from $(BUILDROOT)$(mandir)... $(RM) $(BUILDROOT)$(mandir)/man1/mxmldoc.1 $(RM) $(BUILDROOT)$(mandir)/man3/mxml.3 uninstall-libmxml.a: + echo Uninstalling libmxml.a from $(BUILDROOT)$(libdir)... $(RM) $(BUILDROOT)$(libdir)/libmxml.a -uninstall-libmxml.so.1.4: +uninstall-libmxml.so.1.5: + echo Uninstalling libmxml.so from $(BUILDROOT)$(libdir)... $(RM) $(BUILDROOT)$(libdir)/libmxml.so $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1 $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1.4 uninstall-libmxml.sl.1: + echo Uninstalling libmxml.sl from $(BUILDROOT)$(libdir)... $(RM) $(BUILDROOT)$(libdir)/libmxml.sl $(RM) $(BUILDROOT)$(libdir)/libmxml.sl.1 uninstall-libmxml.1.dylib: + echo Uninstalling libmxml.dylib from $(BUILDROOT)$(libdir)... $(RM) $(BUILDROOT)$(libdir)/libmxml.dylib $(RM) $(BUILDROOT)$(libdir)/libmxml.1.dylib # -# Make packages using EPM (http://www.easysw.com/epm/) +# Make packages using EPM (http://www.epmhome.org/) # epm: all + echo Creating distribution packages... epm --output-dir dist -v -f native mxml epm --output-dir dist -v -f portable mxml @@ -218,6 +243,7 @@ epm: all # Makefile: configure Makefile.in + echo Updating makefile... if test -f config.status; then \ ./config.status --recheck; \ ./config.status; \ @@ -228,6 +254,7 @@ Makefile: configure Makefile.in config.h: configure config.h.in + echo Updating config.h... autoconf if test -f config.status; then \ ./config.status --recheck; \ @@ -238,11 +265,24 @@ config.h: configure config.h.in touch config.h +# +# Figure out lines-of-code... +# + +.PHONY: sloc + +sloc: + echo "libmxml: \c" + sloccount $(LIBOBJS:.o=.c) mxml-private.c mxml.h 2>/dev/null | \ + grep "Total Physical" | awk '{print $$9}' + + # # libmxml.a # libmxml.a: $(LIBOBJS) + echo Creating $@... $(RM) $@ $(AR) $(ARFLAGS) $@ $(LIBOBJS) $(RANLIB) $@ @@ -252,14 +292,15 @@ mxml-entity.o mxml-file.o mxml-private.o: mxml-private.h # -# libmxml.so.1.4 +# libmxml.so.1.5 # -libmxml.so.1.4: $(LIBOBJS) - $(DSO) $(DSOFLAGS) -o libmxml.so.1.4 $(LIBOBJS) +libmxml.so.1.5: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o libmxml.so.1.5 $(LIBOBJS) $(RM) libmxml.so libmxml.so.1 - $(LN) libmxml.so.1.4 libmxml.so - $(LN) libmxml.so.1.4 libmxml.so.1 + $(LN) libmxml.so.1.5 libmxml.so + $(LN) libmxml.so.1.5 libmxml.so.1 # @@ -267,6 +308,7 @@ libmxml.so.1.4: $(LIBOBJS) # libmxml.sl.1: $(LIBOBJS) + echo Creating $@... $(DSO) $(DSOFLAGS) -o libmxml.sl.1 $(LIBOBJS) $(RM) libmxml.sl $(LN) libmxml.sl.1 libmxml.sl @@ -277,9 +319,10 @@ libmxml.sl.1: $(LIBOBJS) # libmxml.1.dylib: $(LIBOBJS) + echo Creating $@... $(DSO) $(DSOFLAGS) -o libmxml.1.dylib \ -install_name $(libdir)/libmxml.dylib \ - -current_version 1.4.0 \ + -current_version 1.5.0 \ -compatibility_version 1.0.0 \ $(LIBOBJS) $(RM) libmxml.dylib @@ -291,9 +334,11 @@ libmxml.1.dylib: $(LIBOBJS) # mxmldoc: $(LIBMXML) mxmldoc.o + echo Linking $@... $(CC) -L. $(LDFLAGS) -o $@ mxmldoc.o -lmxml $(LIBS) mxmldoc-static: libmxml.a mxmldoc.o + echo Linking $@... $(CC) $(LDFLAGS) -o $@ mxmldoc.o libmxml.a $(LIBS) mxmldoc.o: mxml.h @@ -304,6 +349,7 @@ mxmldoc.o: mxml.h # testmxml: libmxml.a testmxml.o + echo Linking $@... $(CC) $(LDFLAGS) -o $@ testmxml.o libmxml.a $(LIBS) @echo Testing library... ./testmxml test.xml >temp1.xml 2>temp1s.xml @@ -335,6 +381,7 @@ testmxml.o: mxml.h # mxml.xml: mxmldoc-static mxml.h $(PUBLIBOBJS:.o=.c) + echo Generating API documentation... $(RM) mxml.xml ./mxmldoc-static --header doc/reference.heading mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/reference.html if test "x`uname`" = xDarwin; then \ @@ -351,6 +398,7 @@ mxml.xml: mxmldoc-static mxml.h $(PUBLIBOBJS:.o=.c) fi valgrind: mxmldoc-static + echo Doing dynamic code analysis using Valgrind... $(RM) valgrind.xml valgrind --tool=memcheck --leak-check=yes ./mxmldoc-static \ valgrind.xml mxml.h $(PUBLIBOBJS:.o=.c) \ @@ -362,6 +410,7 @@ valgrind: mxmldoc-static # doc/mxml.man: mxmldoc-static mxml.xml + echo "Generating mxml(3) man page..." $(RM) doc/mxml.man ./mxmldoc-static --man mxml --title "Mini-XML API" \ --intro doc/intro.man --footer doc/footer.man \ diff --git a/README b/README index 620c5d7..248b090 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -README - 2010-11-08 +README - 2011-01-02 ------------------- @@ -133,7 +133,7 @@ DOCUMENTATION /* Find the first "a" element with "href" to a URL */ node = mxmlFindElement(tree, tree, "a", "href", - "http://www.easysw.com/~mike/mxml/", + "http://www.minixml.org/", MXML_DESCEND); /* Find the first element with a "src" attribute*/ @@ -156,11 +156,25 @@ DOCUMENTATION ... do something ... } - The "mxmlFindValue()" function finds the (first) value node under a specific + The "mxmlFindPath()" function finds the (first) value node under a specific element using a "path": - mxml_node_t *value = mxmlFindValue(tree, "path/to/*/foo/bar"); - + mxml_node_t *value = mxmlFindPath(tree, "path/to/*/foo/bar"); + + The "mxmlGetInteger()", "mxmlGetOpaque()", "mxmlGetReal()", and + "mxmlGetText()" functions retrieve the value from a node: + + mxml_node_t *node; + + int intvalue = mxmlGetInteger(node); + + const char *opaquevalue = mxmlGetOpaque(node); + + double realvalue = mxmlGetReal(node); + + int whitespacevalue; + const char *textvalue = mxmlGetText(node, &whitespacevalue); + Finally, 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: @@ -178,5 +192,5 @@ GETTING HELP AND REPORTING PROBLEMS LEGAL STUFF - The Mini-XML library is Copyright 2003-2010 by Michael Sweet. License terms + The Mini-XML library is Copyright 2003-2011 by Michael Sweet. License terms are described in the file "COPYING". diff --git a/configure.in b/configure.in index 753c8d7..d2a686e 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ dnl "$Id$" dnl dnl Configuration script for Mini-XML, a small XML-like file parsing library. dnl -dnl Copyright 2003-2010 by Michael R Sweet. +dnl Copyright 2003-2011 by Michael R Sweet. dnl dnl These coded instructions, statements, and computer programs are the dnl property of Michael R Sweet and are protected by Federal copyright @@ -171,7 +171,7 @@ if test x$enable_shared != xno; then case "$uname" in SunOS* | UNIX_S*) AC_MSG_RESULT(yes) - LIBMXML="libmxml.so.1.4" + LIBMXML="libmxml.so.1.5" DSO="\$(CC)" DSOFLAGS="$DSOFLAGS -Wl,-h,libmxml.so.1 -G -R\$(libdir) \$(OPTIM)" LDFLAGS="$LDFLAGS -R\$(libdir)" @@ -187,14 +187,14 @@ if test x$enable_shared != xno; then IRIX) AC_MSG_RESULT(yes) - LIBMXML="libmxml.so.1.4" + LIBMXML="libmxml.so.1.5" DSO="\$(CC)" DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi1.0,-soname,libmxml.so.1 -shared \$(OPTIM)" ;; OSF1* | Linux | GNU) AC_MSG_RESULT(yes) - LIBMXML="libmxml.so.1.4" + LIBMXML="libmxml.so.1.5" DSO="\$(CC)" DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)" LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)" @@ -202,7 +202,7 @@ if test x$enable_shared != xno; then *BSD*) AC_MSG_RESULT(yes) - LIBMXML="libmxml.so.1.4" + LIBMXML="libmxml.so.1.5" DSO="\$(CC)" DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-R\$(libdir) -shared \$(OPTIM)" LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)" diff --git a/doc/advanced.html b/doc/advanced.html index a1aef45..67fcbb8 100644 --- a/doc/advanced.html +++ b/doc/advanced.html @@ -64,7 +64,7 @@ child nodes:

type = mxmlElementGetAttr(node, "type"); if (type == NULL) - type = node->value.element.name; + type = mxmlGetElement(node); if (!strcmp(type, "integer")) return (MXML_INTEGER); @@ -125,7 +125,7 @@ text editor:

* just common HTML elements... */ - name = node->value.element.name; + name = mxmlGetElement(node); if (!strcmp(name, "html") || !strcmp(name, "head") || @@ -243,10 +243,10 @@ following:

*/ if (sscanf(data, "%u-%u-%uT%u:%u:%uZ", - &(dt->year), &(dt->month), - &(dt->day), &(dt->hour), - &(dt->minute), - &(dt->second)) != 6) + &(dt->year), &(dt->month), + &(dt->day), &(dt->hour), + &(dt->minute), + &(dt->second)) != 6) { /* * Unable to read numbers, free the data @@ -296,8 +296,7 @@ following:

* function pointers... */ - node->value.custom.data = dt; - node->value.custom.destroy = free; + mxmlSetCustom(node, data, destroy); /* * Return with no errors... @@ -314,6 +313,7 @@ allocated custom data for the node and a pointer to a destructor function which will free the custom data when the node is deleted.

+

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:

@@ -326,7 +326,7 @@ save callback could be used for our ISO date/time type:

iso_date_time_t *dt; - dt = (iso_date_time_t *)node->custom.data; + dt = (iso_date_time_t *)mxmlGetCustom(node); snprintf(data, sizeof(data), "%04u-%02u-%02uT%02u:%02u:%02uZ", @@ -404,9 +404,8 @@ an index is approximately equal to walking the XML document tree. Nodes in the index are sorted by element name and attribute value.

-

Indices are stored in mxml_index_t structures. The -mxmlIndexNew() function +

Indices are stored in mxml_index_t +structures. The mxmlIndexNew() function creates a new index:

@@ -568,7 +567,7 @@ directives like  <?xml ... ?> and  <!DOCTYPE ... >
         * Retain headings and titles...
         */
 
-        char *name = node->value.element.name;
+        char *name = mxmlGetElement(node);
 
         if (!strcmp(name, "html") ||
             !strcmp(name, "head") ||
@@ -584,15 +583,17 @@ directives like  <?xml ... ?> and  <!DOCTYPE ... >
       }
       else if (event == MXML_SAX_DIRECTIVE)
         mxmlRetain(node);
-      else if (event == MXML_SAX_DATA &&
-               node->parent->ref_count > 1)
+      else if (event == MXML_SAX_DATA)
       {
-       /*
-        * If the parent was retained, then retain
-        * this data node as well.
-        */
+        if (mxmlGetRefCount(mxmlGetParent(node)) > 1)
+        {
+         /*
+          * If the parent was retained, then retain
+          * this data node as well.
+          */
 
-        mxmlRetain(node);
+          mxmlRetain(node);
+        }
       }
     }
 
@@ -622,9 +623,9 @@ title and headings in the document would look like:

if (body) { - for (heading = body->child; + for (heading = mxmlGetFirstChild(body); heading; - heading = heading->next) + heading = mxmlGetNextSibling(heading)) print_children(heading); } diff --git a/doc/basics.html b/doc/basics.html index 9ca0838..7823fa6 100644 --- a/doc/basics.html +++ b/doc/basics.html @@ -23,7 +23,7 @@ functionality:

attribute values with no preset limits, just available memory. -
  • Support for integer, real, opaque ("cdata"), and text +
  • Support for integer, real, opaque ("CDATA"), and text data types in "leaf" nodes.
  • "Find", "index", and "walk" functions for easily @@ -63,74 +63,12 @@ for your installation:

    Nodes

    -

    Every piece of information in an XML file (elements, text, -numbers) is stored in memory in "nodes". Nodes are defined by -the mxml_node_t -structure. The type member -defines the node type (element, integer, opaque, real, or text) -which determines which value you want to look at in the value union.

    +

    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.

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 2-1: Mini-XML Node Value Members
    ValueTypeNode member
    Customvoid *node->value.custom.data
    Elementchar *node->value.element.name
    Integerintnode->value.integer
    Opaque (string)char *node->value.opaque
    Realdoublenode->value.real
    Textchar *node->value.text.string
    - -

    Each node also has a user_data member which allows you -to associate application-specific data with each node as needed.

    - -

    New nodes are created using the mxmlNewElement, mxmlNewInteger, mxmlNewOpaque, mxmlNewReal, mxmlNewText, mxmlNewTextf, and mxmlNewXML functions. Only -elements can have child nodes, and the top node must be an element, usually the -<?xml version="1.0" encoding="utf-8"?> node created by -mxmlNewXML().

    - -

    Nodes have pointers to the node above (parent), below -(child), left (prev), and right (next) -of the current node. If you have an XML file like the following:

    +

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

         <?xml version="1.0" encoding="utf-8"?>
    @@ -148,8 +86,7 @@ of the current node. If you have an XML file like the following:

    </data>
    -

    the node tree for the file would look like the following in -memory:

    +

    the node tree for the file would look like the following in memory:

         ?xml version="1.0" encoding="utf-8"?
    @@ -165,17 +102,127 @@ memory:

    val4 val5 val6
    -

    where "-" is a pointer to the next node and "|" is a pointer -to the first child node.

    +

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

    -

    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:

    +

    The mxmlGetType function gets the type of +a node, one of MXML_CUSTOM, MXML_ELEMENT, +MXML_INTEGER, MXML_OPAQUE, MXML_REAL, or +MXML_TEXT. The parent and sibling nodes are accessed using the +mxmlGetParent, +mxmlGetNext, and +mxmlGetPrevious functions. The +mxmlGetUserData function gets any user +data associated with the node.

    + +

    CDATA Nodes

    + +

    CDATA (MXML_ELEMENT) nodes are created using the +mxmlNewCDATA function. The +mxmlGetCDATA function retrieves the +CDATA string pointer for a node.

    + +
    Note: + +

    CDATA nodes are currently stored in memory as special elements. This will +be changed in a future major release of Mini-XML.

    +
    + +

    Custom Nodes

    + +

    Custom (MXML_CUSTOM) nodes are created using the +mxmlNewCustom function or using a custom +load callback specified using the +mxmlSetCustomHandlers function. +The mxmlGetCustom function retrieves the +custom value pointer for a node.

    + +

    Comment Nodes

    + +

    Comment (MXML_ELEMENT) nodes are created using the +mxmlNewElement function. The +mxmlGetElement function retrieves the +comment string pointer for a node, including the surrounding "!--" and "--" +characters.

    + +
    Note: + +

    Comment nodes are currently stored in memory as special elements. This will +be changed in a future major release of Mini-XML.

    +
    + +

    Element Nodes

    + +

    Element (MXML_ELEMENT) nodes are created using the +mxmlNewElement function. The +mxmlGetElement function retrieves the +element name, the +mxmlElementGetAttr function retrieves +the value string for a named attribute associated with the element, and the +mxmlGetFirstChild and +mxmlGetLastChild functions retrieve the +first and last child nodes for the element, respectively.

    + +

    Integer Nodes

    + +

    Integer (MXML_INTEGER) nodes are created using the +mxmlNewInteger function. The +mxmlGetInteger function retrieves the +integer value for a node.

    + +

    Opaque Nodes

    + +

    Opaque (MXML_OPAQUE) nodes are created using the +mxmlNewOpaque function. The +mxmlGetOpaque function retrieves the +opaque string pointer for a node. Opaque nodes are like string nodes but +preserve all whitespace between nodes.

    + +

    Text Nodes

    + +

    Text (MXML_TEXT) nodes are created using the +mxmlNewText and +mxmlNewTextf functions. Each text node +consists of a text string and (leading) whitespace value - the +mxmlGetText function retrieves the +text string pointer and whitespace value for a node.

    + + +

    Processing Instruction Nodes

    + +

    Processing instruction (MXML_ELEMENT) nodes are created using the +mxmlNewElement function. The +mxmlGetElement function retrieves the +processing instruction string for a node, including the surrounding "?" +characters.

    + +
    Note: + +

    Processing instruction nodes are currently stored in memory as special +elements. This will be changed in a future major release of Mini-XML.

    +
    + +

    Real Number Nodes

    + +

    Real number (MXML_REAL) nodes are created using the +mxmlNewReal function. The +mxmlGetReal function retrieves the +CDATA string pointer for a node.

    + + +

    XML Declaration Nodes

    + +

    XML declaration (MXML_ELEMENT) nodes are created using the +mxmlNewXML function. The +mxmlGetElement function retrieves the +XML declaration string for a node, including the surrounding "?" characters.

    + +
    Note: + +

    XML declaration nodes are currently stored in memory as special elements. +This will be changed in a future major release of Mini-XML.

    +
    -
    -    mxmlDelete(tree);
    -

    Creating XML Documents

    @@ -216,41 +263,39 @@ create the XML document described in the previous section:

    mxmlNewText(node, 0, "val8"); -

    We start by creating the <?xml version="1.0" encoding="utf-8"?> -node common to all XML files using the mxmlNewXML function:

    + +

    We start by creating the declaration node common to all XML files using the +mxmlNewXML function:

         xml = mxmlNewXML("1.0");
     
    -

    We then create the <data> node used for this -document using the mxmlNewElement function. The -first argument specifies the parent node (xml) while the -second specifies the element name (data):

    +

    We then create the <data> node used for this document using +the mxmlNewElement function. The first +argument specifies the parent node (xml) while the second specifies the +element name (data):

         data = mxmlNewElement(xml, "data");
     
    -

    Each <node>...</node> in the file is -created using the mxmlNewElement and mxmlNewText functions. The first -argument of mxmlNewText specifies the parent node -(node). 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:

    +

    Each <node>...</node> in the file is created using the +mxmlNewElement and mxmlNewText +functions. The first argument of mxmlNewText specifies the parent node +(node). 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:

         node = mxmlNewElement(data, "node");
         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.

    +

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

    - +

    Loading XML

    You load an XML file using the ?xml element if the parent node is NULL.

    - +

    Saving XML

    You save an XML file using the mxmlSaveAllocString() returns a string buffer that was allocated using malloc().

    +

    Controlling Line Wrapping

    When saving XML documents, Mini-XML normally wraps output @@ -382,6 +428,25 @@ overrides the default wrap margin:

    mxmlSetWrapMargin(0); +

    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:

    + +
    +    mxmlDelete(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 0, +mxmlRelease will automatically call mxmlDelete to actually +free the memory used by the node tree. New nodes automatically start with a +use count of 1.

    +

    Finding and Iterating Nodes

    @@ -522,13 +587,15 @@ three constants:

    -

    Finding Value Nodes

    +

    Finding Specific Nodes

    -

    You can find the value of a specific node in the tree using the mxmlFindValue, for example: +

    You can find specific nodes in the tree using the mxmlFindPath, for example:

    -    mxml_node_t *value = mxmlFindValue(tree, "path/to/*/foo/bar");
    +    mxml_node_t *value;
    +
    +    value = mxmlFindPath(tree, "path/to/*/foo/bar");
     

    The second argument is a "path" to the parent node. Each component of the diff --git a/doc/docset.intro b/doc/docset.intro index a900653..a179ddd 100644 --- a/doc/docset.intro +++ b/doc/docset.intro @@ -18,7 +18,7 @@ as do most vendors' ANSI C compilers) and a "make" program.

  • Supports arbitrary element names, attributes, and attribute values with no preset limits, just available memory.
  • -
  • Supports integer, real, opaque ("cdata"), and text data types in +
  • Supports integer, real, opaque ("CDATA"), and text data types in "leaf" nodes.
  • Functions for creating, indexing, and managing trees of data.
  • @@ -146,6 +146,29 @@ for (node = mxmlFindElement(tree, tree, "name", NULL, } +

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

    + +
    +mxml_node_t *value = mxmlFindPath(tree, "path/to/*/foo/bar");
    +
    + +

    The "mxmlGetInteger()", "mxmlGetOpaque()", "mxmlGetReal()", and +"mxmlGetText()" functions retrieve the value from a node:

    + +
    +mxml_node_t *node;
    +
    +int intvalue = mxmlGetInteger(node);
    +
    +const char *opaquevalue = mxmlGetOpaque(node);
    +
    +double realvalue = mxmlGetReal(node);
    +
    +int whitespacevalue;
    +const char *textvalue = mxmlGetText(node, &whitespacevalue);
    +
    +

    Finally, 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:

    diff --git a/doc/footer.man b/doc/footer.man index 62efb92..db38303 100644 --- a/doc/footer.man +++ b/doc/footer.man @@ -1,4 +1,4 @@ .SH SEE ALSO mxmldoc(1), Mini-XML Programmers Manual, http://www.minixml.org/ .SH COPYRIGHT -Copyright 2003-2008 by Michael Sweet. +Copyright 2003-2011 by Michael Sweet. diff --git a/doc/hires/logo.png b/doc/hires/logo.png deleted file mode 100644 index c96685656226e6d470109e74649168b16cd829b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141627 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⁣S_*maH`~08@Bx~C^V^@(!Gz=zWs+wS-G~@73KOo~Z zSY7%=1aA2_vN-LqQleAF(wuR}R>nMPH>KOxc9)4- zR-Ghg#`#ni`5n$&(^;&|i%)cLgVVR9Eeql3a+-hOujhJ>o}uZyLrP}L@|r@J^4PCo zCnm?!J69?8JU@EzWdQ% zz#ZRgt2L!}3@-VusaW1{z##gVXdU?~g+z@b8LWxW+1={aKO|l4h~dZAdeZ7rCn;_1 zw|Z`gPJ8BcYSunkg||a(zc}oT7OMa_Z;nm(A%S}lo_4^Nt{G5Mr(97%JZoeZ(BSfL z<#L+GeW7y&xCs7_+Hqw56pB;B%1)~z!izF^XZS;;#fB9AGCUM`;O#PKv)i-Rc1rpL zzo9fC*CywvVJP^zMs8HWcBT|Y=t-JZ?EAT;_V$YhgV;8tuH|0-eAW^En zkbU3r6_=DcA@YI$*BZ5VgP}+sVm@G{UX;XupWG=9op+d%-s0eiiTGF>A@a&zY2E8- zib_dN)^P^<8PWmLjABr)mz!$bOrK6nkTa8ujmo(1_?ni)mc-ixxikaOUyu67(mEIz3X(S_uMr#9HeX%S?Q6ANuActjjjf_m&`lyn7MEPe(kEzWpRT3YusKn170GPmY^M|8tY;(YO72m@ z2#~nALw#Votmjr;8fZ%mG(b;?_NUxKyd5He9X2y!L&&h3o~9C7l#>Xp$|(e{2+7ld z`bW{@waw@c5;Po|12_>rhI2Gc=7N0KI`Kb#GW87L&K5Vp+ud7|*IXBZ;3+GJHh!+R z`ygrQ;yyl4cd}mj+7jQ_;+2vVT+%#6W)jM~IPbV;Osi6WHpos)&#ySw(zUV@qzZ<0 zQDE-novFL+z*F&G31~W!|4_I6s?9H0K#R`)q%+3r(JB{CAs!J*c}y*mRJq$nYk9gP z6-GnXN*J|j->QfNj_J+EFd~^*Lj2DJIaU!?2KJZ&!IXC#zP8J~$4{ni$`NXVg9`MA zPO?nk%<}Y9udCt!YCFC_=2U}OY+=iqR(lBP_1fl=?U$k-ep1XAtf`Hp^kcK3csT#g(uDVJ-mrHrn-Ehfxu&-I^pg3$P_a%% zPpPmX4&q6T%BPI7E8+qA zKx=XP2)3OwE=wjavYe>#L7O}VIoO69A+$U~A|Sc!$QAo@8wLbMET*~GJQ*Ii_(H*) zAZdVV`wgV6L#-aLu0lJUpyhPU1ILe~5kG{gF%z8$+48Tcdq?}wP#PM_3K>;o$AzC; zHAE#EyDa+~ayUn2pr|Bc@NF@!hiJg9Yf=nMZhf1RQ@_GVrIjX6R2Tx~8 z#Kxd}@q&o`I0kfz;~sg=d*poMsPLXEB7um*H3ve5$Q-T!%8b5L0b}KaE$OoiHg3M z9R>1bm&!6~J_s6wFxZjz3yALq&^lr*Vm>=dsgU1eoKmPVTUei-4vP8;wJR)HQEAm9 z?tp`kXPksUwCMga?a5^)X zwbV7>do=sEb>YQ-X7ca0N*v(1VpNk?cc2s~rD8cSRz~K#k23=Tu+V%Qx2fsvbG2(A z`EAd1;^X62L1tgMf1#DZBGM-ott=h^=csIRoJf!(LdG-J!9 So%y@KpPkhyT&;y~!v6sE3Wrkw diff --git a/doc/install.html b/doc/install.html index 2a76973..5884501 100644 --- a/doc/install.html +++ b/doc/install.html @@ -94,7 +94,7 @@ of formats. The epm program is available from the following URL:

    -    http://www.easysw.com/epm/
    +    http://www.epmhome.org/
     

    Use the make command with the epm target diff --git a/doc/intro.html b/doc/intro.html index 7ad8fe0..53e93e3 100644 --- a/doc/intro.html +++ b/doc/intro.html @@ -37,7 +37,7 @@ 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 3,747 +complete XML implementation and now stands at a whopping 3,965 lines of code, compared to 103,893 lines of code for libxml2 version 2.6.9.

    diff --git a/doc/intro.man b/doc/intro.man index 7d05617..55bf45a 100644 --- a/doc/intro.man +++ b/doc/intro.man @@ -19,7 +19,7 @@ preserving the XML data hierarchy. Supports arbitrary element names, attributes, and attribute values with no preset limits, just available memory. .IP \(bu 4 -Supports integer, real, opaque ("cdata"), and text data types in +Supports integer, real, opaque ("CDATA"), and text data types in "leaf" nodes. .IP \(bu 4 Functions for creating, indexing, and managing trees of data. @@ -141,11 +141,27 @@ You can also iterate with the same function: } .fi .PP -To find the value of a specific node in the tree, use the "mxmlFindValue()" +To find the value of a specific node in the tree, use the "mxmlFindPath()" function: .nf - mxml_node_t *value = mxmlFindValue(tree, "path/to/*/foo/bar"); + mxml_node_t *value = mxmlFindPath(tree, "path/to/*/foo/bar"); +.fi +.PP +The "mxmlGetInteger()", "mxmlGetOpaque()", "mxmlGetReal()", and "mxmlGetText()" +functions retrieve the value from a node: +.nf + + mxml_node_t *node; + + int intvalue = mxmlGetInteger(node); + + const char *opaquevalue = mxmlGetOpaque(node); + + double realvalue = mxmlGetReal(node); + + int whitespacevalue; + const char *textvalue = mxmlGetText(node, &whitespacevalue); .fi .PP Finally, once you are done with the XML data, use the diff --git a/doc/license.html b/doc/license.html index da6f593..5a8ed3e 100644 --- a/doc/license.html +++ b/doc/license.html @@ -9,30 +9,26 @@ License the terms of the GNU Library General Public License version 2 (LGPL2) with the following exceptions:

    -
      +

      1. 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.

      -
    1. 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. +

      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.

      -

      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.

      -
    2. +

      2. 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.

      -
    3. 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.
    4. +

       

      -
    - -

    GNU LIBRARY GENERAL PUBLIC LICENSE

    Version 2, June 1991
    Copyright (C) 1991 Free Software Foundation, Inc. diff --git a/doc/logo.opacity b/doc/logo.opacity deleted file mode 100644 index f27a0316cafb8e8d889a635826f2053aaf6a2d87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14917 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 QVVJ;O5FEI7UCn>|KRPL3d;kCd diff --git a/doc/logo.png b/doc/logo.png deleted file mode 100644 index 836d655d813d422c94dd994cacc39a146ca8d486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25191 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 Started with Mini-XML

    -
  • Finding and Iterating Nodes
  • -
  • Finding Value Nodes
  • +
  • Memory Management
  • +
  • Finding and Iterating Nodes
  • +
  • Finding Specific Nodes
  • More Mini-XML Programming Techniques @@ -203,7 +218,7 @@ libxml2 library with something substantially smaller and 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 3,747 lines of code, + implementation and now stands at a whopping 3,965 lines of code, compared to 103,893 lines of code for libxml2 version 2.6.9.

    Aside from Gutenprint, Mini-XML is used for the following projects/software applications:

    @@ -386,7 +401,7 @@ rpmbuild(8) software to create Red Hat Package Manager ("RPM") epm(1) program to create software packages in a variety of formats. The epm program is available from the following URL:

    -    http://www.easysw.com/epm/
    +    http://www.epmhome.org/
     

    Use the make command with the epm target to create portable and native packages for your system:

    @@ -413,7 +428,7 @@ hspace="10" src="2.gif" width="100">Getting Started with Mini-XML
  • Writing of UTF-8 encoded XML files and strings.
  • Support for arbitrary element names, attributes, and attribute values with no preset limits, just available memory.
  • -
  • Support for integer, real, opaque ("cdata"), and text data types in +
  • Support for integer, real, opaque ("CDATA"), and text data types in "leaf" nodes.
  • "Find", "index", and "walk" functions for easily accessing data in an XML document.
  • @@ -440,47 +455,12 @@ hspace="10" src="2.gif" width="100">Getting Started with Mini-XML pkg-config --libs mxml ENTER

    Nodes

    -

    Every piece of information in an XML file (elements, text, numbers) - is stored in memory in "nodes". Nodes are defined by the -mxml_node_t structure. The type - member defines the node type (element, integer, opaque, real, or - text) which determines which value you want to look at in the -value union.

    - - -
    - - - - - - - - - -
    Table 2-1: Mini-XML Node Value - Members
    ValueTypeNode member
    Customvoid * -node->value.custom.data
    Elementchar * -node->value.element.name
    Integerintnode->value.integer -
    Opaque (string)char * -node->value.opaque
    Realdoublenode->value.real
    Textchar *node->value.text.string -
    -
    -

    Each node also has a user_data member which allows you to - associate application-specific data with each node as needed.

    -

    New nodes are created using the -mxmlNewElement, mxmlNewInteger -, mxmlNewOpaque, -mxmlNewReal, mxmlNewText -, mxmlNewTextf, and -mxmlNewXML functions. Only elements can have child nodes, - and the top node must be an element, usually the <?xml - version="1.0" encoding="utf-8"?> node created by mxmlNewXML() -.

    -

    Nodes have pointers to the node above (parent), below ( -child), left (prev), and right (next) of the - current node. If you have an XML file like the following:

    +

    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"?>
         <data>
    @@ -510,15 +490,96 @@ child), left (prev), and right (next) of the
                                |      |      |
                              val4   val5   val6
     
    -

    where "-" is a pointer to the next node and "|" is a pointer to the - first child node.

    -

    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:

    -
    -    mxmlDelete(tree);
    -
    +

    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, one of MXML_CUSTOM, MXML_ELEMENT, +MXML_INTEGER, MXML_OPAQUE, MXML_REAL, or +MXML_TEXT. The parent and sibling nodes are accessed using the +mxmlGetParent, mxmlGetNext +, and mxmlGetPrevious functions. + The mxmlGetUserData function + gets any user data associated with the node.

    +

    CDATA Nodes

    +

    CDATA (MXML_ELEMENT) nodes are created using the +mxmlNewCDATA function. The +mxmlGetCDATA function retrieves the CDATA string pointer for a + node.

    +
    Note: +

    CDATA nodes are currently stored in memory as special elements. This + will be changed in a future major release of Mini-XML.

    +
    +

    Custom Nodes

    +

    Custom (MXML_CUSTOM) nodes are created using the +mxmlNewCustom function or using a custom load callback + specified using the +mxmlSetCustomHandlers function. The +mxmlGetCustom function retrieves the custom value pointer for a + node.

    +

    Comment Nodes

    +

    Comment (MXML_ELEMENT) nodes are created using the +mxmlNewElement function. The +mxmlGetElement function retrieves the comment string pointer + for a node, including the surrounding "!--" and "--" characters.

    +
    Note: +

    Comment nodes are currently stored in memory as special elements. + This will be changed in a future major release of Mini-XML.

    +
    +

    Element Nodes

    +

    Element (MXML_ELEMENT) nodes are created using the +mxmlNewElement function. The +mxmlGetElement function retrieves the element name, the +mxmlElementGetAttr function retrieves the value string for + a named attribute associated with the element, and the +mxmlGetFirstChild and +mxmlGetLastChild functions retrieve the first and last child + nodes for the element, respectively.

    +

    Integer Nodes

    +

    Integer (MXML_INTEGER) nodes are created using the +mxmlNewInteger function. The +mxmlGetInteger function retrieves the integer value for a node.

    +

    Opaque Nodes

    +

    Opaque (MXML_OPAQUE) nodes are created using the +mxmlNewOpaque function. The +mxmlGetOpaque function retrieves the opaque string pointer for + a node. Opaque nodes are like string nodes but preserve all whitespace + between nodes.

    +

    Text Nodes

    +

    Text (MXML_TEXT) nodes are created using the +mxmlNewText and mxmlNewTextf + functions. Each text node consists of a text string and (leading) + whitespace value - the mxmlGetText + function retrieves the text string pointer and whitespace value for a + node.

    + +

    Processing Instruction Nodes

    +

    Processing instruction (MXML_ELEMENT) nodes are created + using the mxmlNewElement + function. The mxmlGetElement + function retrieves the processing instruction string for a node, + including the surrounding "?" characters.

    +
    Note: +

    Processing instruction nodes are currently stored in memory as + special elements. This will be changed in a future major release of + Mini-XML.

    +
    +

    Real Number Nodes

    +

    Real number (MXML_REAL) nodes are created using the +mxmlNewReal function. The +mxmlGetReal function retrieves the CDATA string pointer for a + node.

    + + +

    XML Declaration Nodes

    +

    XML declaration (MXML_ELEMENT) nodes are created using the mxmlNewXML function. The +mxmlGetElement function retrieves the XML declaration + string for a node, including the surrounding "?" characters.

    +
    Note: +

    XML declaration nodes are currently stored in memory as special + elements. This will be changed in a future major release of Mini-XML.

    +

    Creating XML Documents

    You can create and update XML documents in memory using the various @@ -555,9 +616,10 @@ mxmlNew functions. The following code will create the XML document node = mxmlNewElement(data, "node"); mxmlNewText(node, 0, "val8"); -

    We start by creating the <?xml version="1.0" encoding="utf-8"?> - node common to all XML files using the -mxmlNewXML function:

    + + +

    We start by creating the declaration node common to all XML files + using the mxmlNewXML function:

         xml = mxmlNewXML("1.0");
     
    @@ -581,7 +643,7 @@ mxmlNewElement and mxmlNewText

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

    - +

    Loading XML

    You load an XML file using the mxmlLoadFile function:

    @@ -629,7 +691,7 @@ mxmlLoadFile(). The second argument specifies the string or character buffer to load and must be a complete XML document including the ?xml element if the parent node is NULL.

    - +

    Saving XML

    You save an XML file using the mxmlSaveFile function:

    @@ -670,6 +732,8 @@ mxmlSaveFile(). The mxmlSaveString function takes pointer and size arguments for saving the XML document to a fixed-size buffer, while mxmlSaveAllocString() returns a string buffer that was allocated using malloc().

    + +

    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 @@ -682,9 +746,22 @@ mxmlSaveFile(). The mxmlSaveString function takes pointer /* Disable wrapping */ mxmlSetWrapMargin(0); +

    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:

    +
    +    mxmlDelete(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 0, mxmlRelease will automatically + call mxmlDelete to actually free the memory used by the node + tree. New nodes automatically start with a use count of 1.

    -

    Finding and Iterating Nodes

    +

    Finding and Iterating Nodes

    The mxmlWalkPrev and mxmlWalkNextfunctions can be used to iterate through the XML node tree:

    @@ -806,11 +883,13 @@ mxmlSaveFile(). The mxmlSaveString function takes pointer the order would be reversed, ending at "?xml".

    -

    Finding Value Nodes

    -

    You can find the value of a specific node in the tree using the -mxmlFindValue, for example:

    +

    Finding Specific Nodes

    +

    You can find specific nodes in the tree using the +mxmlFindPath, for example:

    -    mxml_node_t *value = mxmlFindValue(tree, "path/to/*/foo/bar");
    +    mxml_node_t *value;
    +
    +    value = mxmlFindPath(tree, "path/to/*/foo/bar");
     

    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 @@ -865,7 +944,7 @@ MXML_REAL, or MXML_TEXT. The function is called after type = mxmlElementGetAttr(node, "type"); if (type == NULL) - type = node->value.element.name; + type = mxmlGetElement(node); if (!strcmp(type, "integer")) return (MXML_INTEGER); @@ -916,7 +995,7 @@ MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback * just common HTML elements... */ - name = node->value.element.name; + name = mxmlGetElement(node); if (!strcmp(name, "html") || !strcmp(name, "head") || @@ -1080,8 +1159,7 @@ MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback * function pointers... */ - node->value.custom.data = dt; - node->value.custom.destroy = free; + mxmlSetCustom(node, data, destroy); /* * Return with no errors... @@ -1095,6 +1173,8 @@ MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback contain a void 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.

    + +

    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:

    @@ -1106,7 +1186,7 @@ MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback iso_date_time_t *dt; - dt = (iso_date_time_t *)node->custom.data; + dt = (iso_date_time_t *)mxmlGetCustom(node); snprintf(data, sizeof(data), "%04u-%02u-%02uT%02u:%02u:%02uZ", @@ -1297,7 +1377,7 @@ mxmlRetain function. For example, the following SAX callback * Retain headings and titles... */ - char *name = node->value.element.name; + char *name = mxmlGetElement(node); if (!strcmp(name, "html") || !strcmp(name, "head") || @@ -1313,15 +1393,17 @@ mxmlRetain function. For example, the following SAX callback } else if (event == MXML_SAX_DIRECTIVE) mxmlRetain(node); - else if (event == MXML_SAX_DATA && - node->parent->ref_count > 1) + else if (event == MXML_SAX_DATA) { - /* - * If the parent was retained, then retain - * this data node as well. - */ + if (mxmlGetRefCount(mxmlGetParent(node)) > 1) + { + /* + * If the parent was retained, then retain + * this data node as well. + */ - mxmlRetain(node); + mxmlRetain(node); + } } } @@ -1349,9 +1431,9 @@ mxmlRetain function. For example, the following SAX callback if (body) { - for (heading = body->child; + for (heading = mxmlGetFirstChild(body); heading; - heading = heading->next) + heading = mxmlGetNextSibling(heading)) print_children(heading); } @@ -1417,7 +1499,7 @@ hspace="10" src="4.gif" width="100">Using the mxmldoc Utility will document all public names it finds in your source files - any names starting with the underscore character (_) or names that are documented with the @private@ directive are - treated as private and are undocumented.

    + treated as private and are not documented.

    Comments appearing directly before a function or type definition are used to document that function or type. Comments appearing after argument, definition, return type, or variable declarations are used to @@ -1472,8 +1554,8 @@ hspace="10" src="4.gif" width="100">Using the mxmldoc Utility included in the documentation

  • @since ...@ - flags the item as new since a particular release. The text following the @since up to the closing @ - is highlighted in the generated documentation, e.g. @since CUPS - 1.3@.
  • + is highlighted in the generated documentation, e.g. @since Mini-XML + 2.7@. @@ -1513,22 +1595,19 @@ hspace="10" src="A.gif" width="100">Mini-XML License

    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:

    -
      -
    1. 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. +

      1. 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.

      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.

      -
    2. -
    3. 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.
    4. -
    - - +

    2. 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.

    +

     

    GNU LIBRARY GENERAL PUBLIC LICENSE

    Version 2, June 1991
    Copyright (C) 1991 Free Software Foundation, Inc. @@ -1947,9 +2026,12 @@ hspace="10" src="A.gif" width="100">Mini-XML License hspace="10" src="B.gif" width="100">Release Notes

    Changes in Mini-XML 2.7

      +
    • Added data accessor ("get") functions and made the mxml_node_t and + mxml_index_t structures private but still available in the Mini-XML + header to preserve source compatibility (STR #118)
    • Updated the source headers to reference the Mini-XML license and its exceptions to the LGPL2 (STR #108)
    • -
    • Added a new mxmlFindValue() function to find the value node of a +
    • Added a new mxmlFindPath() function to find the value node of a named element (STR #110)
    • Building a static version of the library did not work on Windows (STR #112)
    • @@ -2261,8 +2343,8 @@ mxmlEntityGetValue mxmlEntityRemoveCallback
    • mxmlFindElement
    • -
    • -mxmlFindValue
    • +
    • +mxmlFindPath
    • mxmlGetCDATA
    • @@ -2275,16 +2357,18 @@ mxmlGetFirstChild
    • mxmlGetInteger
    • mxmlGetLastChild
    • -
    • mxmlGetNext -
    • +
    • +mxmlGetNextSibling
    • mxmlGetOpaque
    • mxmlGetParent
    • -
    • -mxmlGetPrevious
    • +
    • +mxmlGetPrevSibling
    • mxmlGetReal
    • +
    • +mxmlGetRefCount
    • mxmlGetText
    • mxmlGetType
    • @@ -2624,9 +2708,9 @@ mxmlEntityRemoveCallback children.

      - Mini-XML 2.7 mxmlFindValue

      -

      Find a value with the given path.

      -

      mxml_node_t *mxmlFindValue ( + Mini-XML 2.7 mxmlFindPath +

      Find a node with the given path.

      +

      mxml_node_t *mxmlFindPath (
          mxml_node_t *top,
          const char *path
      );

      @@ -2638,17 +2722,20 @@ mxmlEntityRemoveCallback
      Path to element

      Return Value

      -

      First value node or NULL

      +

      Found node or NULL

      Discussion

      The "path" is a slash-separated list of element names. The name "*" is considered a wildcard for one or more levels of elements. For example, "foo/one/two", "bar/two/one", "*/one", and so - forth.

      + forth. +
      +
      The first child node of the found node is returned if the given + node has children and the first child is a value node.

       Mini-XML 2.7 mxmlGetCDATA

      Get the value for a CDATA node.

      -

      char *mxmlGetCDATA ( +

      const char *mxmlGetCDATA (
          mxml_node_t *node
      );

      Parameters

      @@ -2665,7 +2752,7 @@ mxmlEntityRemoveCallback  Mini-XML 2.7 mxmlGetCustom

      Get the value for a custom node.

      -

      void *mxmlGetCustom ( +

      const void *mxmlGetCustom (
          mxml_node_t *node
      );

      Parameters

      @@ -2682,7 +2769,7 @@ mxmlEntityRemoveCallback  Mini-XML 2.7 mxmlGetElement

      Get the name for an element node.

      -

      char *mxmlGetElement ( +

      const char *mxmlGetElement (
          mxml_node_t *node
      );

      Parameters

      @@ -2749,9 +2836,10 @@ mxmlEntityRemoveCallback

      Discussion

      NULL is returned if the node is not an element node or if the node has no children.

      -

      mxmlGetNext

      +

      mxmlGetNextSibling

      Return the node type...

      -

      mxml_node_t *mxmlGetNext ( +

      mxml_node_t + *mxmlGetNextSibling (
          mxml_node_t *node
      );

      Parameters

      @@ -2768,7 +2856,7 @@ mxmlEntityRemoveCallback  Mini-XML 2.7 mxmlGetOpaque

      Get an opaque string value for a node or its first child.

      -

      char *mxmlGetOpaque ( +

      const char *mxmlGetOpaque (
          mxml_node_t *node
      );

      Parameters

      @@ -2799,10 +2887,10 @@ mxmlEntityRemoveCallback

      NULL is returned for a root node.

      - Mini-XML 2.7 mxmlGetPrevious

      + Mini-XML 2.7 mxmlGetPrevSibling

      Get the previous node for the current parent.

      -

      mxml_node_t *mxmlGetPrevious - ( +

      mxml_node_t + *mxmlGetPrevSibling (
          mxml_node_t *node
      );

      Parameters

      @@ -2834,9 +2922,28 @@ mxmlEntityRemoveCallback is not a real value node.

      + Mini-XML 2.7 mxmlGetRefCount

      +

      Get the current reference (use) count for a node.

      +

      int mxmlGetRefCount ( +
          mxml_node_t *node +
      );

      +

      Parameters

      +
      +
      node
      +
      Node
      +
      +

      Return Value

      +

      Reference count

      +

      Discussion

      +

      The initial reference count of new nodes is 1. Use + the mxmlRetain and +mxmlRelease functions to increment and decrement a + node's reference count. .

      +

      +  Mini-XML 2.7 mxmlGetText

      Get the text value for a node or its first child.

      -

      char *mxmlGetText ( +

      const char *mxmlGetText (
          mxml_node_t *node,
          int *whitespace
      );

      @@ -2853,7 +2960,7 @@ mxmlEntityRemoveCallback

      Discussion

      NULL is returned if the node (or its first child) is not a text node. The "whitespace" argument can be NULL.

      -

      +

       Mini-XML 2.7 mxmlGetType

      Get the node type.

      @@ -2870,7 +2977,7 @@ mxmlEntityRemoveCallback

      Discussion

      MXML_IGNORE is returned if "node" is NULL.

      -

      +

       Mini-XML 2.7 mxmlGetUserData

      Get the user data pointer for a node.

      @@ -2932,7 +3039,7 @@ NULL.

      this function for the first time with a particular set of "element" and "value" strings. Passing NULL for both "element" and "value" is equivalent to calling mxmlIndexEnum().

      -

      +

       Mini-XML 2.7 mxmlIndexGetCount

      Get the number of nodes in an index.

      @@ -3076,7 +3183,7 @@ NULL.


      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading child nodes of the specified type.

      -

      +

       Mini-XML 2.3 mxmlNewCDATA

      Create a new CDATA node.

      @@ -3099,7 +3206,7 @@ NULL.

      to specify that the new CDATA node has no parent. The data string must be nul-terminated and is copied into the new node. CDATA nodes use the MXML_ELEMENT type.

      -

      +

       Mini-XML 2.1 mxmlNewCustom

      Create a new custom data node.

      @@ -3258,7 +3365,7 @@ NULL.

      parameter is used to specify whether leading whitespace is present before the node. The format string must be nul-terminated and is formatted into the new node.

      -

      +

       Mini-XML 2.3 mxmlNewXML

      Create a new XML document tree.

      @@ -3276,7 +3383,7 @@ NULL.

      The "version" argument specifies the version number to put in the ?xml element node. If NULL, version 1.0 is assumed.

      -

      +

       Mini-XML 2.3 mxmlRelease

      Release a node.

      @@ -3307,7 +3414,7 @@ NULL.

      Does not free memory used by the node - use mxmlDelete() for that. This function does nothing if the node has no parent.

      -

      +

       Mini-XML 2.3 mxmlRetain

      Retain a node.

      @@ -3321,7 +3428,7 @@ NULL.

      Return Value

      New reference count

      -

      +

       Mini-XML 2.3 mxmlSAXLoadFd

      Load a file descriptor into an XML node tree @@ -3363,7 +3470,7 @@ NULL.


      The SAX callback must call mxmlRetain() for any nodes that need to be kept for later use. Otherwise, nodes are deleted when the parent node is closed or after each data, comment, CDATA, or directive node.

      -

      +

       Mini-XML 2.3 mxmlSAXLoadFile

      Load a file into an XML node tree using a SAX @@ -3406,7 +3513,7 @@ NULL.


      The SAX callback must call mxmlRetain() for any nodes that need to be kept for later use. Otherwise, nodes are deleted when the parent node is closed or after each data, comment, CDATA, or directive node.

      -

      +

       Mini-XML 2.3 mxmlSAXLoadString

      Load a string into an XML node tree using a SAX @@ -3556,7 +3663,7 @@ NULL.

      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.

      -

      +

       Mini-XML 2.3 mxmlSetCDATA

      Set the element name of a CDATA node.

      @@ -3576,7 +3683,7 @@ NULL.

      Discussion

      The node is not changed if it is not a CDATA element node.

      -

      +

       Mini-XML 2.1 mxmlSetCustom

      Set the data and destructor of a custom data @@ -3749,7 +3856,7 @@ mxmlSetCustomHandlers

      0 on success, -1 on failure

      Discussion

      The node is not changed if it is not a text node.

      -

      +

       Mini-XML 2.7 mxmlSetUserData

      Set the user data pointer for a node.

      @@ -3766,7 +3873,7 @@ mxmlSetCustomHandlers

      Return Value

      0 on success, -1 on failure

      -

      +

       Mini-XML 2.3 mxmlSetWrapMargin

      Set the wrap margin when saving XML data.

      @@ -3923,7 +4030,7 @@ hspace="10" src="D.gif" width="100">XML Schema

      This appendix provides the XML schema that is used for the XML files produced by mxmldoc. This schema is available on-line at:

      -    http://www.easysw.com/~mike/mxmldoc.xsd
      +    http://www.minixml.org/mxmldoc.xsd
       

      mxmldoc.xsd

      
      @@ -3931,8 +4038,8 @@ hspace="10" src="D.gif" width="100">XML Schema
       <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <xsd:annotation>
           <xsd:documentation xml:lang="en">
      -      Mini-XML 2.3 documentation schema for mxmldoc output.
      -      Copyright 2003-2007 by Michael Sweet.
      +      Mini-XML 2.7 documentation schema for mxmldoc output.
      +      Copyright 2003-2011 by Michael Sweet.
           </xsd:documentation>
         </xsd:annotation>
       
      diff --git a/doc/mxmldoc.html b/doc/mxmldoc.html
      index bf1eda4..89e1cf3 100644
      --- a/doc/mxmldoc.html
      +++ b/doc/mxmldoc.html
      @@ -88,7 +88,7 @@ to describe the functions, types, and constants in your code.
       source files - any names starting with the underscore character (_) 
       or names that are documented with the @private@ directive are treated as private
      -and are undocumented.

      +and are not documented.

      Comments appearing directly before a function or type definition are used to document that function or type. Comments appearing after @@ -155,7 +155,7 @@ following special @name ...@ directive strings:

    • @since ...@ - flags the item as new since a particular release. The text following the @since up to the closing @ is highlighted in the generated - documentation, e.g. @since CUPS 1.3@.
    • + documentation, e.g. @since Mini-XML 2.7@.
    diff --git a/doc/mxmldoc.xsd b/doc/mxmldoc.xsd index 3d1124b..26c6508 100644 --- a/doc/mxmldoc.xsd +++ b/doc/mxmldoc.xsd @@ -2,8 +2,8 @@ - Mini-XML 2.3 documentation schema for mxmldoc output. - Copyright 2003-2007 by Michael Sweet. + Mini-XML 2.7 documentation schema for mxmldoc output. + Copyright 2003-2011 by Michael Sweet. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public diff --git a/doc/reference.html b/doc/reference.html index 1905021..55f3cdb 100644 --- a/doc/reference.html +++ b/doc/reference.html @@ -155,7 +155,7 @@ Reference
  • mxmlEntityGetValue
  • mxmlEntityRemoveCallback
  • mxmlFindElement
  • -
  • mxmlFindValue
  • +
  • mxmlFindPath
  • mxmlGetCDATA
  • mxmlGetCustom
  • mxmlGetElement
  • @@ -163,11 +163,12 @@ Reference
  • mxmlGetInteger
  • mxmlGetLastChild
  • -
  • mxmlGetNext
  • +
  • mxmlGetNextSibling
  • mxmlGetOpaque
  • mxmlGetParent
  • -
  • mxmlGetPrevious
  • +
  • mxmlGetPrevSibling
  • mxmlGetReal
  • +
  • mxmlGetRefCount
  • mxmlGetText
  • mxmlGetType
  • mxmlGetUserData
  • @@ -452,10 +453,10 @@ 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.

    -

     Mini-XML 2.7 mxmlFindValue

    -

    Find a value with the given path.

    +

     Mini-XML 2.7 mxmlFindPath

    +

    Find a node with the given path.

    -mxml_node_t *mxmlFindValue (
    +mxml_node_t *mxmlFindPath (
        mxml_node_t *top,
        const char *path
    );

    @@ -467,17 +468,20 @@ constrains the search to a particular node's children.

    Path to element

    Return Value

    -

    First value node or NULL

    +

    Found node or NULL

    Discussion

    The "path" is a slash-separated list of element names. The name "*" is considered a wildcard for one or more levels of elements. For example, -"foo/one/two", "bar/two/one", "*/one", and so forth. +"foo/one/two", "bar/two/one", "*/one", and so forth.
    +
    +The first child node of the found node is returned if the given node has +children and the first child is a value node.

     Mini-XML 2.7 mxmlGetCDATA

    Get the value for a CDATA node.

    -char *mxmlGetCDATA (
    +const char *mxmlGetCDATA (
        mxml_node_t *node
    );

    Parameters

    @@ -494,7 +498,7 @@ char *mxmlGetCDATA (

     Mini-XML 2.7 mxmlGetCustom

    Get the value for a custom node.

    -void *mxmlGetCustom (
    +const void *mxmlGetCustom (
        mxml_node_t *node
    );

    Parameters

    @@ -512,7 +516,7 @@ value node.

     Mini-XML 2.7 mxmlGetElement

    Get the name for an element node.

    -char *mxmlGetElement (
    +const char *mxmlGetElement (
        mxml_node_t *node
    );

    Parameters

    @@ -580,10 +584,10 @@ int mxmlGetInteger (
    has no children.

    -

    mxmlGetNext

    +

    mxmlGetNextSibling

    Return the node type...

    -mxml_node_t *mxmlGetNext (
    +mxml_node_t *mxmlGetNextSibling (
        mxml_node_t *node
    );

    Parameters

    @@ -599,7 +603,7 @@ has no children.

     Mini-XML 2.7 mxmlGetOpaque

    Get an opaque string value for a node or its first child.

    -char *mxmlGetOpaque (
    +const char *mxmlGetOpaque (
        mxml_node_t *node
    );

    Parameters

    @@ -631,10 +635,10 @@ value node.

    NULL is returned for a root node.

    -

     Mini-XML 2.7 mxmlGetPrevious

    +

     Mini-XML 2.7 mxmlGetPrevSibling

    Get the previous node for the current parent.

    -mxml_node_t *mxmlGetPrevious (
    +mxml_node_t *mxmlGetPrevSibling (
        mxml_node_t *node
    );

    Parameters

    @@ -665,10 +669,29 @@ double mxmlGetReal (

    0.0 is returned if the node (or its first child) is not a real value node.

    +

     Mini-XML 2.7 mxmlGetRefCount

    +

    Get the current reference (use) count for a node.

    +

    +int mxmlGetRefCount (
    +    mxml_node_t *node
    +);

    +

    Parameters

    +
    +
    node
    +
    Node
    +
    +

    Return Value

    +

    Reference count

    +

    Discussion

    +

    The initial reference count of new nodes is 1. Use the mxmlRetain +and mxmlRelease functions to increment and decrement a node's +reference count. + +.

     Mini-XML 2.7 mxmlGetText

    Get the text value for a node or its first child.

    -char *mxmlGetText (
    +const char *mxmlGetText (
        mxml_node_t *node,
        int *whitespace
    );

    diff --git a/doc/relnotes.html b/doc/relnotes.html index c409162..6dceabf 100644 --- a/doc/relnotes.html +++ b/doc/relnotes.html @@ -9,10 +9,14 @@ hspace="10" width="100" height="100" alt="B">Release Notes
      +
    • Added data accessor ("get") functions and made the mxml_node_t and + mxml_index_t structures private but still available in the Mini-XML + header to preserve source compatibility (STR #118)
    • +
    • Updated the source headers to reference the Mini-XML license and its exceptions to the LGPL2 (STR #108)
    • -
    • Added a new mxmlFindValue() function to find the value node of a +
    • Added a new mxmlFindPath() function to find the value node of a named element (STR #110)
    • Building a static version of the library did not work on Windows diff --git a/doc/schema.html b/doc/schema.html index 15cce10..3ba0261 100644 --- a/doc/schema.html +++ b/doc/schema.html @@ -9,7 +9,7 @@ files produced by mxmldoc. This schema is available on-line at:

      -    http://www.easysw.com/~mike/mxmldoc.xsd
      +    http://www.minixml.org/mxmldoc.xsd
       

      mxmldoc.xsd

      @@ -19,8 +19,8 @@ at:

      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:documentation xml:lang="en"> - Mini-XML 2.3 documentation schema for mxmldoc output. - Copyright 2003-2007 by Michael Sweet. + Mini-XML 2.7 documentation schema for mxmldoc output. + Copyright 2003-2011 by Michael Sweet. </xsd:documentation> </xsd:annotation> diff --git a/mxml-get.c b/mxml-get.c index 2fb1e23..fa96d87 100644 --- a/mxml-get.c +++ b/mxml-get.c @@ -15,22 +15,22 @@ * * Contents: * - * mxmlGetCDATA() - Get the value for a CDATA node. - * mxmlGetCustom() - Get the value for a custom node. - * mxmlGetElement() - Get the name for an element node. - * mxmlGetFirstChild() - Get the first child of an element node. - * mxmlGetInteger() - Get the integer value from the specified node or its - * first child. - * mxmlGetLastChild() - Get the last child of an element node. - * mxmlGetNext() - Get the next node for the current parent. - * mxmlGetOpaque() - Get an opaque string value for a node or its first - * child. - * mxmlGetParent() - Get the parent node. - * mxmlGetPrevious() - Get the previous node for the current parent. - * mxmlGetReal() - Get the real value for a node or its first child. - * mxmlGetText() - Get the text value for a node or its first child. - * mxmlGetType() - Get the node type. - * mxmlGetUserData() - Get the user data pointer for a node. + * mxmlGetCDATA() - Get the value for a CDATA node. + * mxmlGetCustom() - Get the value for a custom node. + * mxmlGetElement() - Get the name for an element node. + * mxmlGetFirstChild() - Get the first child of an element node. + * mxmlGetInteger() - Get the integer value from the specified node or its + * first child. + * mxmlGetLastChild() - Get the last child of an element node. + * mxmlGetNextSibling() - Get the next node for the current parent. + * mxmlGetOpaque() - Get an opaque string value for a node or its first + * child. + * mxmlGetParent() - Get the parent node. + * mxmlGetPrevSibling() - Get the previous node for the current parent. + * mxmlGetReal() - Get the real value for a node or its first child. + * mxmlGetText() - Get the text value for a node or its first child. + * mxmlGetType() - Get the node type. + * mxmlGetUserData() - Get the user data pointer for a node. */ /* @@ -49,7 +49,7 @@ * @since Mini-XML 2.7@ */ -char * /* O - CDATA value or NULL */ +const char * /* O - CDATA value or NULL */ mxmlGetCDATA(mxml_node_t *node) /* I - Node to get */ { /* @@ -77,7 +77,7 @@ mxmlGetCDATA(mxml_node_t *node) /* I - Node to get */ * @since Mini-XML 2.7@ */ -void * /* O - Custom value or NULL */ +const void * /* O - Custom value or NULL */ mxmlGetCustom(mxml_node_t *node) /* I - Node to get */ { /* @@ -110,7 +110,7 @@ mxmlGetCustom(mxml_node_t *node) /* I - Node to get */ * @since Mini-XML 2.7@ */ -char * /* O - Element name or NULL */ +const char * /* O - Element name or NULL */ mxmlGetElement(mxml_node_t *node) /* I - Node to get */ { /* @@ -217,7 +217,7 @@ mxmlGetLastChild(mxml_node_t *node) /* I - Node to get */ /* - * 'mxmlGetNext()' - Get the next node for the current parent. + * 'mxmlGetNextSibling()' - Get the next node for the current parent. * * @code NULL@ is returned if this is the last child for the current parent. * @@ -225,7 +225,7 @@ mxmlGetLastChild(mxml_node_t *node) /* I - Node to get */ */ mxml_node_t * -mxmlGetNext(mxml_node_t *node) /* I - Node to get */ +mxmlGetNextSibling(mxml_node_t *node) /* I - Node to get */ { /* * Range check input... @@ -251,7 +251,7 @@ mxmlGetNext(mxml_node_t *node) /* I - Node to get */ * @since Mini-XML 2.7@ */ -char * /* O - Opaque string or NULL */ +const char * /* O - Opaque string or NULL */ mxmlGetOpaque(mxml_node_t *node) /* I - Node to get */ { /* @@ -303,7 +303,7 @@ mxmlGetParent(mxml_node_t *node) /* I - Node to get */ /* - * 'mxmlGetPrevious()' - Get the previous node for the current parent. + * 'mxmlGetPrevSibling()' - Get the previous node for the current parent. * * @code NULL@ is returned if this is the first child for the current parent. * @@ -311,7 +311,7 @@ mxmlGetParent(mxml_node_t *node) /* I - Node to get */ */ mxml_node_t * /* O - Previous node or NULL */ -mxmlGetPrevious(mxml_node_t *node) /* I - Node to get */ +mxmlGetPrevSibling(mxml_node_t *node) /* I - Node to get */ { /* * Range check input... @@ -370,7 +370,7 @@ mxmlGetReal(mxml_node_t *node) /* I - Node to get */ * @since Mini-XML 2.7@ */ -char * /* O - Text string or NULL */ +const char * /* O - Text string or NULL */ mxmlGetText(mxml_node_t *node, /* I - Node to get */ int *whitespace) /* O - 1 if string is preceded by whitespace, 0 otherwise */ { diff --git a/mxml-node.c b/mxml-node.c index fc72b56..d4c94a3 100644 --- a/mxml-node.c +++ b/mxml-node.c @@ -3,7 +3,7 @@ * * Node support code for Mini-XML, a small XML-like file parsing library. * - * Copyright 2003-2010 by Michael R Sweet. + * Copyright 2003-2011 by Michael R Sweet. * * These coded instructions, statements, and computer programs are the * property of Michael R Sweet and are protected by Federal copyright @@ -15,21 +15,6 @@ * * Contents: * - * mxmlAdd() - Add a node to a tree. - * mxmlDelete() - Delete a node and all of its children. - * mxmlNewCDATA() - Create a new CDATA node. - * mxmlNewCustom() - Create a new custom data node. - * mxmlNewElement() - Create a new element node. - * mxmlNewInteger() - Create a new integer node. - * mxmlNewOpaque() - Create a new opaque string. - * mxmlNewReal() - Create a new real number node. - * mxmlNewText() - Create a new text fragment node. - * mxmlNewTextf() - Create a new formatted text fragment node. - * mxmlNewXML() - Create a new XML document tree. - * mxmlRelease() - Release a node. - * mxmlRemove() - Remove a node from its parent. - * mxmlRetain() - Retain a node. - * mxml_new() - Create a new node. */ /* @@ -276,6 +261,34 @@ mxmlDelete(mxml_node_t *node) /* I - Node to delete */ } +/* + * 'mxmlGetRefCount()' - Get the current reference (use) count for a node. + * + * The initial reference count of new nodes is 1. Use the @link mxmlRetain@ + * and @link mxmlRelease@ functions to increment and decrement a node's + * reference count. + * + * @since Mini-XML 2.7@. + */ + +int /* O - Reference count */ +mxmlGetRefCount(mxml_node_t *node) /* I - Node */ +{ + /* + * Range check input... + */ + + if (!node) + return (0); + + /* + * Return the reference count... + */ + + return (node->ref_count); +} + + /* * 'mxmlNewCDATA()' - Create a new CDATA node. * diff --git a/mxml-search.c b/mxml-search.c index ab0e1b3..31265fc 100644 --- a/mxml-search.c +++ b/mxml-search.c @@ -118,22 +118,25 @@ mxmlFindElement(mxml_node_t *node, /* I - Current node */ /* - * 'mxmlFindValue()' - Find a value with the given path. + * 'mxmlFindPath()' - Find a node with the given path. * * The "path" is a slash-separated list of element names. The name "*" is * considered a wildcard for one or more levels of elements. For example, * "foo/one/two", "bar/two/one", "*\/one", and so forth. * + * The first child node of the found node is returned if the given node has + * children and the first child is a value node. + * * @since Mini-XML 2.7@ */ -mxml_node_t * /* O - First value node or NULL */ -mxmlFindValue(mxml_node_t *top, /* I - Top node */ - const char *path) /* I - Path to element */ +mxml_node_t * /* O - Found node or NULL */ +mxmlFindPath(mxml_node_t *top, /* I - Top node */ + const char *path) /* I - Path to element */ { mxml_node_t *node; /* Current node */ - char element[256], /* Current element name */ - *pathsep; /* Separator in path */ + char element[256]; /* Current element name */ + const char *pathsep; /* Separator in path */ int descend; /* mxmlFindElement option */ @@ -191,10 +194,13 @@ mxmlFindValue(mxml_node_t *top, /* I - Top node */ } /* - * If we get this far, return the first child of the current node... + * If we get this far, return the node or its first child... */ - return (node->child); + if (node->child && node->child->type != MXML_ELEMENT) + return (node->child); + else + return (node); } diff --git a/mxml.h b/mxml.h index 216a195..8886812 100644 --- a/mxml.h +++ b/mxml.h @@ -210,19 +210,20 @@ extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb); extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top, const char *name, const char *attr, const char *value, int descend); -extern mxml_node_t *mxmlFindValue(mxml_node_t *node, const char *path); -extern char *mxmlGetCDATA(mxml_node_t *node); -extern void *mxmlGetCustom(mxml_node_t *node); -extern char *mxmlGetElement(mxml_node_t *node); +extern mxml_node_t *mxmlFindPath(mxml_node_t *node, const char *path); +extern const char *mxmlGetCDATA(mxml_node_t *node); +extern const void *mxmlGetCustom(mxml_node_t *node); +extern const char *mxmlGetElement(mxml_node_t *node); extern mxml_node_t *mxmlGetFirstChild(mxml_node_t *node); extern int mxmlGetInteger(mxml_node_t *node); extern mxml_node_t *mxmlGetLastChild(mxml_node_t *node); -extern mxml_node_t *mxmlGetNext(mxml_node_t *node); -extern char *mxmlGetOpaque(mxml_node_t *node); +extern mxml_node_t *mxmlGetNextSibling(mxml_node_t *node); +extern const char *mxmlGetOpaque(mxml_node_t *node); extern mxml_node_t *mxmlGetParent(mxml_node_t *node); -extern mxml_node_t *mxmlGetPrevious(mxml_node_t *node); +extern mxml_node_t *mxmlGetPrevSibling(mxml_node_t *node); extern double mxmlGetReal(mxml_node_t *node); -extern char *mxmlGetText(mxml_node_t *node, int *whitespace); +extern int mxmlGetRefCount(mxml_node_t *node); +extern const char *mxmlGetText(mxml_node_t *node, int *whitespace); extern mxml_type_t mxmlGetType(mxml_node_t *node); extern void *mxmlGetUserData(mxml_node_t *node); extern void mxmlIndexDelete(mxml_index_t *ind); diff --git a/mxml.xml b/mxml.xml index fca5a40..f5950fd 100644 --- a/mxml.xml +++ b/mxml.xml @@ -197,17 +197,20 @@ constrains the search to a particular node's children. Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST - + mxml_node_t * - First value node or NULL + Found node or NULL - Find a value with the given path. + Find a node with the given path. The "path" is a slash-separated list of element names. The name "*" is considered a wildcard for one or more levels of elements. For example, "foo/one/two", "bar/two/one", "*/one", and so forth. +The first child node of the found node is returned if the given node has +children and the first child is a value node. + @since Mini-XML 2.7@ mxml_node_t * @@ -220,7 +223,7 @@ considered a wildcard for one or more levels of elements. For example, - char * + const char * CDATA value or NULL Get the value for a CDATA node. @@ -235,7 +238,7 @@ considered a wildcard for one or more levels of elements. For example, - void * + const void * Custom value or NULL Get the value for a custom node. @@ -251,7 +254,7 @@ value node. - char * + const char * Element name or NULL Get the name for an element node. @@ -312,7 +315,7 @@ has no children. Node to get - + mxml_node_t * Get the next node for the current parent. @@ -329,7 +332,7 @@ has no children. - char * + const char * Opaque string or NULL Get an opaque string value for a node or its first child. @@ -358,7 +361,7 @@ value node. Node to get - + mxml_node_t * Previous node or NULL @@ -388,9 +391,26 @@ value node. Node to get + + + int + Reference count + + Get the current reference (use) count for a node. + +The initial reference count of new nodes is 1. Use the @link mxmlRetain@ +and @link mxmlRelease@ functions to increment and decrement a node's +reference count. + +@since Mini-XML 2.7@. + + mxml_node_t * + Node + + - char * + const char * Text string or NULL Get the text value for a node or its first child. diff --git a/testmxml.c b/testmxml.c index 2fc1329..d06a9dc 100644 --- a/testmxml.c +++ b/testmxml.c @@ -261,10 +261,10 @@ main(int argc, /* I - Number of command-line args */ } /* - * Test mxmlFindValue... + * Test mxmlFindPath... */ - node = mxmlFindValue(tree, "*/two"); + node = mxmlFindPath(tree, "*/two"); if (!node) { fputs("ERROR: Unable to find value for \"*/two\".\n", stderr); @@ -278,7 +278,7 @@ main(int argc, /* I - Number of command-line args */ return (1); } - node = mxmlFindValue(tree, "foo/*/two"); + node = mxmlFindPath(tree, "foo/*/two"); if (!node) { fputs("ERROR: Unable to find value for \"foo/*/two\".\n", stderr); @@ -292,7 +292,7 @@ main(int argc, /* I - Number of command-line args */ return (1); } - node = mxmlFindValue(tree, "foo/bar/one/two"); + node = mxmlFindPath(tree, "foo/bar/one/two"); if (!node) { fputs("ERROR: Unable to find value for \"foo/bar/one/two\".\n", stderr); diff --git a/vcnet/mxml1.def b/vcnet/mxml1.def index 04ca1e5..90725f8 100644 --- a/vcnet/mxml1.def +++ b/vcnet/mxml1.def @@ -17,10 +17,26 @@ EXPORTS mxmlEntityGetValue mxmlEntityRemoveCallback mxmlFindElement - mxmlFindValue + mxmlFindPath + mxmlGetCDATA + mxmlGetCustom + mxmlGetElement + mxmlGetFirstChild + mxmlGetInteger + mxmlGetLastChild + mxmlGetNextSibling + mxmlGetOpaque + mxmlGetParent + mxmlGetPrevSibling + mxmlGetReal + mxmlGetRefCount + mxmlGetText + mxmlGetType + mxmlGetUserData mxmlIndexDelete mxmlIndexEnum mxmlIndexFind + mxmlIndexGetCount mxmlIndexNew mxmlIndexReset mxmlLoadFd @@ -55,6 +71,7 @@ EXPORTS mxmlSetReal mxmlSetText mxmlSetTextf + mxmlSetUserData mxmlSetWrapMargin mxmlWalkNext mxmlWalkPrev diff --git a/vcnet/mxml1.vcproj b/vcnet/mxml1.vcproj index cb933a4..0264008 100644 --- a/vcnet/mxml1.vcproj +++ b/vcnet/mxml1.vcproj @@ -196,6 +196,10 @@ RelativePath="..\mxml-file.c" > + +