From 558ddcfe40d87083f350e42d3e32cfb161449bd5 Mon Sep 17 00:00:00 2001 From: Scott McCreary Date: Thu, 19 Nov 2009 02:34:39 +0000 Subject: [PATCH] Updated .bep and patch for mxml-2.6 from michaelvoliveira with some minor changes by me. Works on gcc2 now. --- dev-cpp/mxml/mxml-2.6.bep | 7 +- dev-cpp/mxml/mxml-2.6.patch | 33484 ----------------- dev-cpp/mxml/mxml.OptionalPackageDescription | 4 +- dev-cpp/mxml/patches/mxml-2.6.patch | 1542 + 4 files changed, 1546 insertions(+), 33491 deletions(-) delete mode 100644 dev-cpp/mxml/mxml-2.6.patch create mode 100644 dev-cpp/mxml/patches/mxml-2.6.patch diff --git a/dev-cpp/mxml/mxml-2.6.bep b/dev-cpp/mxml/mxml-2.6.bep index 5e424aa8a..a01aed3f8 100644 --- a/dev-cpp/mxml/mxml-2.6.bep +++ b/dev-cpp/mxml/mxml-2.6.bep @@ -1,15 +1,12 @@ DESCRIPTION="Mini-XML is a small XML library that you can use to read and write XML and XML-like data files in your application without requiring large non-standard libraries. " HOMEPAGE="http://www.minixml.org/index.php" -SRC_URI="http://www.minixml.org/software.php?VERSION=2.6&FILE=mxml/2.6/mxml-2.6.tar.gz" +SRC_URI="http://ftp.easysw.com/pub/mxml/2.6/mxml-2.6.tar.gz" REVISION="1" -STATUS_R5="untested" -STATUS_BONE="untested" STATUS_HAIKU="stable" DEPEND="" BUILD { - setgcc gcc4 cd mxml-2.6 - ./configure --build='i586-pc-beos' --prefix=/boot/common --enable-shared + ./configure --prefix=/boot/common --enable-shared make } diff --git a/dev-cpp/mxml/mxml-2.6.patch b/dev-cpp/mxml/mxml-2.6.patch deleted file mode 100644 index 24a7e086a..000000000 --- a/dev-cpp/mxml/mxml-2.6.patch +++ /dev/null @@ -1,33484 +0,0 @@ -diff -Naur mxml-2.6/ANNOUNCEMENT mxml-2.6-haiku/ANNOUNCEMENT ---- mxml-2.6/ANNOUNCEMENT 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/ANNOUNCEMENT 2007-11-23 02:15:07.000000000 +0000 -@@ -0,0 +1,7 @@ -+Mini-XML 2.4 is now available for download from: -+ -+ http://www.easysw.com/~mike/mxml/software.php -+ -+Mini-XML 2.4 fixes some build and XML parsing bugs, adds support -+for the apos character entity, and adds per-thread global settings. -+ -diff -Naur mxml-2.6/CHANGES mxml-2.6-haiku/CHANGES ---- mxml-2.6/CHANGES 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/CHANGES 2009-05-17 17:31:51.000000000 +0000 -@@ -0,0 +1,323 @@ -+CHANGES - 2009-05-17 -+-------------------- -+ -+CHANGES IN Mini-XML 2.6 -+ -+ - Documentation fixes (STR #91, STR #92) -+ - The mxmldoc program did not handle typedef comments properly (STR #72) -+ - Added support for "long long" printf formats. -+ - The XML parser now ignores BOMs in UTF-8 XML files (STR #89) -+ - The mxmldoc program now supports generating Xcode documentation sets. -+ - mxmlSave*() did not output UTF-8 correctly on some platforms. -+ - mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to avoid -+ problems with non-conformant XML parsers that assume something other -+ than UTF-8 as the default encoding. -+ - Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and -+ "" was always followed by a newline (STR #76) -+ - The mxml.pc.in file was broken (STR #79) -+ - The mxmldoc program now handles "typedef enum name {} name" correctly -+ (STR #72) -+ -+ -+CHANGES IN Mini-XML 2.5 -+ -+ - The mxmldoc program now makes greater use of CSS and -+ supports a --css option to embed an alternate stylesheet. -+ - The mxmldoc program now supports --header and --footer -+ options to insert documentation content before and -+ after the generated content. -+ - The mxmldoc program now supports a --framed option to -+ generate framed HTML output. -+ - The mxmldoc program now creates a table of contents -+ including any headings in the --intro file when -+ generating HTML output. -+ - The man pages and man page output from mxmldoc did -+ not use "\-" for dashes (STR #68) -+ - The debug version of the Mini-XML DLL could not be -+ built (STR #65) -+ - Processing instructions and directives did not work -+ when not at the top level of a document (STR #67) -+ - Spaces around the "=" in attributes were not supported -+ (STR #67) -+ -+ -+CHANGES IN Mini-XML 2.4 -+ -+ - Fixed shared library build problems on HP-UX and Mac OS X. -+ - The mxmldoc program did not output argument descriptions -+ for functions properly. -+ - All global settings (custom, error, and entity callbacks -+ and the wrap margin) are now managed separately for each -+ thread. -+ - Added mxmlElementDeleteAttr() function (STR #59) -+ - mxmlElementSetAttrf() did not work (STR #57) -+ - mxmlLoad*() incorrectly treated declarations as parent -+ elements (STR #56) -+ - mxmlLoad*() incorrectly allowed attributes without values -+ (STR #47) -+ - Fixed Visual C++ build problems (STR #49) -+ - mxmlLoad*() did not return NULL when an element contained -+ an error (STR #46) -+ - Added support for the apos character entity (STR #54) -+ - Fixed whitespace detection with Unicode characters (STR -+ #48) -+ - mxmlWalkNext() and mxmlWalkPrev() did not work correctly -+ when called with a node with no children as the top node -+ (STR #53) -+ -+ -+CHANGES IN Mini-XML 2.3 -+ -+ - Added two exceptions to the LGPL to support static -+ linking of applications against Mini-XML -+ - The mxmldoc utility can now generate man pages, too. -+ - Added a mxmlNewXML() function -+ - Added a mxmlElementSetAttrf() function (STR #43) -+ - Added snprintf() emulation function for test program (STR -+ #32) -+ - Added the _CRT_SECURE_NO_DEPRECATE definition when -+ building on VC++ 2005 (STR #36) -+ - mxmlLoad*() did not detect missing > characters in -+ elements (STR #41) -+ - mxmlLoad*() did not detect missing close tags at the end -+ of an XML document (STR #45) -+ - Added user_data and ref_count members to mxml_node_t -+ structure -+ - Added mxmlReleaseNode() and mxmlRetainNode() APIs for -+ reference-counted nodes -+ - Added mxmlSetWrapMargin() to control the wrapping of XML -+ output -+ - Added conditional check for EINTR error code for -+ certain Windows compilers that do not define it (STR -+ #33) -+ - The mxmldoc program now generates correct HTML 4.0 -+ output - previously it generated invalid XHTML -+ - The mxmldoc program now supports "@deprecated@, -+ "@private@", and "@since version@" comments -+ - Fixed function and enumeration type bugs in mxmldoc. -+ - Fixed the XML schema for mxmldoc -+ - The mxmldoc program now supports --intro, --section, -+ and --title options -+ - The mxmlLoad*() functions could leak a node on an error -+ (STR #27) -+ - The mxml_vsnprintf() function could get in an infinite -+ loop on a buffer overflow (STR #25) -+ - Added new mxmlNewCDATA() and mxmlSetCDATA() functions -+ to create and set CDATA nodes, which are really just -+ special element nodes -+ - Added new MXML_IGNORE type and MXML_IGNORE_CB callback -+ to ignore non-element nodes, e.g. whitespace -+ - mxmlLoad*() crashed when reporting an error in some -+ invalid XML (STR #23) -+ -+ -+CHANGES IN Mini-XML 2.2.2 -+ -+ - mxmlLoad*() did not treat custom data as opaque, so -+ whitespace characters would be lost. -+ -+ -+CHANGES IN Mini-XML 2.2.1 -+ -+ - mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now -+ correctly return NULL on error (STR #21) -+ - mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), -+ mxmlNewText(), and mxmlNewTextf() incorrectly required -+ a parent node (STR #22) -+ - Fixed an XML output bug in mxmldoc. -+ - The "make install" target now uses the install command -+ to set the proper permissions on UNIX/Linux/OSX. -+ - Fixed a MingW/Cygwin compilation problem (STR #18) -+ -+ -+CHANGES IN Mini-XML 2.2 -+ -+ - Added shared library support (STR #17) -+ - mxmlLoad*() now returns an error when an XML stream -+ contains illegal control characters (STR #10) -+ - mxmlLoad*() now returns an error when an element -+ contains two attributes with the same name in -+ conformance with the XML spec (STR #16) -+ - Added support for CDATA (STR #14, STR #15) -+ - Updated comment and processing instruction handling - -+ no entity support per XML specification. -+ - Added checking for invalid comment termination ("--->" -+ is not allowed) -+ -+ -+CHANGES IN Mini-XML 2.1 -+ -+ - Added support for custom data nodes (STR #6) -+ - Now treat UTF-8 sequences which are longer than -+ necessary as an error (STR #4) -+ - Fixed entity number support (STR #8) -+ - Fixed mxmlLoadString() bug with UTF-8 (STR #7) -+ - Fixed entity lookup bug (STR #5) -+ - Added mxmlLoadFd() and mxmlSaveFd() functions. -+ - Fixed multi-word UTF-16 handling. -+ -+ -+CHANGES IN Mini-XML 2.0 -+ -+ - New programmers manual. -+ - Added Visual C++ project files for Microsoft Windows -+ users. -+ - Added optimizations to mxmldoc, mxmlSaveFile(), and -+ mxmlIndexNew() (STR #2) -+ - mxmlEntityAddCallback() now returns an integer status -+ (STR #2) -+ - Added UTF-16 support (input only; all output is UTF-8) -+ - Added index functions to build a searchable index of -+ XML nodes. -+ - Added character entity callback interface to support -+ additional character entities beyond those defined in -+ the XHTML specification. -+ - Added support for XHTML character entities. -+ - The mxmldoc utility now produces XML output which -+ conforms to an updated XML schema, described in the file -+ "doc/mxmldoc.xsd". -+ - Changed the whitespace callback interface to return -+ strings instead of a single character, allowing for -+ greater control over the formatting of XML files -+ written using Mini-XML. THIS CHANGE WILL REQUIRE -+ CHANGES TO YOUR 1.x CODE IF YOU USE WHITESPACE -+ CALLBACKS. -+ - The mxmldoc utility is now capable of documenting C++ -+ classes, functions, and structures, and correctly -+ handles C++ comments. -+ - Added new modular tests for mxmldoc. -+ - Updated the mxmldoc output to be more compatible with -+ embedding in manuals produced with HTMLDOC. -+ - The makefile incorrectly included a "/" separator -+ between the destination path and install path. This -+ caused problems when building and installing with -+ MingW. -+ -+ -+CHANGES IN Mini-XML 1.3 -+ -+ - Fixes for mxmldoc. -+ - Added support for reading standard HTML entity names. -+ - mxmlLoadString/File() did not decode character -+ entities in element names, attribute names, or -+ attribute values. -+ - mxmlLoadString/File() would crash when loading non- -+ conformant XML data under an existing parent (top) -+ node. -+ - Fixed several bugs in the mxmldoc utility. -+ - Added new error callback function to catch a variety -+ of errors and log them to someplace other than stderr. -+ - The mxmlElementSetAttr() function now allows for NULL -+ attribute values. -+ - The load and save functions now properly handle quoted -+ element and attribute name strings properly, e.g. for -+ !DOCTYPE declarations. -+ -+ -+CHANGES IN Mini-XML 1.2 -+ -+ - Added new "set" methods to set the value of a node. -+ - Added new formatted text methods mxmlNewTextf() and -+ mxmlSetTextf() to create/set a text node value using -+ printf-style formats. -+ - Added new standard callbacks for use with the mxmlLoad -+ functions. -+ - Updated the HTML documentation to include examples of -+ the walk and load function output. -+ - Added --with/without-ansi configure option to control -+ the strdup() function check. -+ - Added --with/without-snprintf configure option to -+ control the snprintf() and vsnprintf() function -+ checks. -+ -+ -+CHANGES IN Mini-XML 1.1.2 -+ -+ - The mxml(3) man page wasn't updated for the string -+ functions. -+ - mxmlSaveString() returned the wrong number of -+ characters. -+ - mxml_add_char() updated the buffer pointer in the -+ wrong place. -+ -+ -+CHANGES IN Mini-XML 1.1.1 -+ -+ - The private mxml_add_ch() function did not update the -+ start-of-buffer pointer which could cause a crash when -+ using mxmlSaveString(). -+ - The private mxml_write_ws() function called putc() -+ instead of using the proper callback which could cause -+ a crash when using mxmlSaveString(). -+ - Added a mxmlSaveAllocString() convenience function for -+ saving an XML node tree to an allocated string. -+ -+ -+CHANGES IN Mini-XML 1.1 -+ -+ - The mxmlLoadFile() function now uses dynamically -+ allocated string buffers for element names, attribute -+ names, and attribute values. Previously they were -+ capped at 16383, 255, and 255 bytes, respectively. -+ - Added a new mxmlLoadString() function for loading an -+ XML node tree from a string. -+ - Added a new mxmlSaveString() function for saving an -+ XML node tree to a string. -+ - Add emulation of strdup() if the local platform does -+ not provide the function. -+ -+ -+CHANGES IN Mini-XML 1.0 -+ -+ - The mxmldoc program now handles function arguments, -+ structures, unions, enumerations, classes, and -+ typedefs properly. -+ - Documentation provided via mxmldoc and more in-line -+ comments in the code. -+ - Added man pages and packaging files. -+ -+ -+CHANGES IN Mini-XML 0.93 -+ -+ - New mxmldoc example program that is also used to -+ create and update code documentation using XML and -+ produce HTML reference pages. -+ - Added mxmlAdd() and mxmlRemove() functions to add and -+ remove nodes from a tree. This provides more -+ flexibility over where the nodes are inserted and -+ allows nodes to be moved within the tree as needed. -+ - mxmlLoadFile() now correctly handles comments. -+ - mxmlLoadFile() now supports the required "gt", "quot", -+ and "nbsp" character entities. -+ - mxmlSaveFile() now uses newlines as whitespace -+ when valid to do so. -+ - mxmlFindElement() now also takes attribute name and -+ attribute value string arguments to limit the search -+ to specific elements with attributes and/or values. -+ NULL pointers can be used as "wildcards". -+ - Added uninstall target to makefile, and auto-reconfig -+ if Makefile.in or configure.in are changed. -+ - mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() -+ now all provide "descend" arguments to control whether -+ they descend into child nodes in the tree. -+ - Fixed some whitespace issues in mxmlLoadFile(). -+ - Fixed Unicode output and whitespace issues in -+ mxmlSaveFile(). -+ - mxmlSaveFile() now supports a whitespace callback to -+ provide more human-readable XML output under program -+ control. -+ -+ -+CHANGES IN Mini-XML 0.92 -+ -+ - mxmlSaveFile() didn't return a value on success. -+ -+ -+CHANGES IN Mini-XML 0.91 -+ -+ - mxmlWalkNext() would go into an infinite loop. -+ -+ -+CHANGES IN Mini-XML 0.9 -+ -+ - Initial public release. -diff -Naur mxml-2.6/COPYING mxml-2.6-haiku/COPYING ---- mxml-2.6/COPYING 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/COPYING 2005-10-18 19:26:08.000000000 +0000 -@@ -0,0 +1,507 @@ -+ Mini-XML License -+ October 18, 2005 -+ -+ -+The Mini-XML library and included programs are provided under the -+terms of the GNU Library General Public License (LGPL) 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. -+ -+ 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 LGPL 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 -+ LGPL. -+ -+ -+ GNU LIBRARY GENERAL PUBLIC LICENSE -+ Version 2, June 1991 -+ -+ Copyright (C) 1991 Free Software Foundation, Inc. -+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ -+ Everyone is permitted to copy and distribute verbatim copies -+ of this license document, but changing it is not allowed. -+ -+ [This is the first released version of the library GPL. It is -+ numbered 2 because it goes with version 2 of the ordinary GPL.] -+ -+ Preamble -+ -+ The licenses for most software are designed to take away your -+freedom to share and change it. By contrast, the GNU General Public -+Licenses are intended to guarantee your freedom to share and change -+free software--to make sure the software is free for all its users. -+ -+ This license, the Library General Public License, applies to some -+specially designated Free Software Foundation software, and to any -+other libraries whose authors decide to use it. You can use it for -+your libraries, too. -+ -+ When we speak of free software, we are referring to freedom, not -+price. Our General Public Licenses are designed to make sure that you -+have the freedom to distribute copies of free software (and charge for -+this service if you wish), that you receive source code or can get it -+if you want it, that you can change the software or use pieces of it -+in new free programs; and that you know you can do these things. -+ -+ To protect your rights, we need to make restrictions that forbid -+anyone to deny you these rights or to ask you to surrender the rights. -+These restrictions translate to certain responsibilities for you if -+you distribute copies of the library, or if you modify it. -+ -+ For example, if you distribute copies of the library, whether gratis -+or for a fee, you must give the recipients all the rights that we gave -+you. You must make sure that they, too, receive or can get the source -+code. If you link a program with the library, you must provide -+complete object files to the recipients so that they can relink them -+with the library, after making changes to the library and recompiling -+it. And you must show them these terms so they know their rights. -+ -+ Our method of protecting your rights has two steps: (1) copyright -+the library, and (2) offer you this license which gives you legal -+permission to copy, distribute and/or modify the library. -+ -+ Also, for each distributor's protection, we want to make certain -+that everyone understands that there is no warranty for this free -+library. If the library is modified by someone else and passed on, we -+want its recipients to know that what they have is not the original -+version, so that any problems introduced by others will not reflect on -+the original authors' reputations. -+ -+ Finally, any free program is threatened constantly by software -+patents. We wish to avoid the danger that companies distributing free -+software will individually obtain patent licenses, thus in effect -+transforming the program into proprietary software. To prevent this, -+we have made it clear that any patent must be licensed for everyone's -+free use or not licensed at all. -+ -+ Most GNU software, including some libraries, is covered by the ordinary -+GNU General Public License, which was designed for utility programs. This -+license, the GNU Library General Public License, applies to certain -+designated libraries. This license is quite different from the ordinary -+one; be sure to read it in full, and don't assume that anything in it is -+the same as in the ordinary license. -+ -+ The reason we have a separate public license for some libraries is that -+they blur the distinction we usually make between modifying or adding to a -+program and simply using it. Linking a program with a library, without -+changing the library, is in some sense simply using the library, and is -+analogous to running a utility program or application program. However, in -+a textual and legal sense, the linked executable is a combined work, a -+derivative of the original library, and the ordinary General Public License -+treats it as such. -+ -+ Because of this blurred distinction, using the ordinary General -+Public License for libraries did not effectively promote software -+sharing, because most developers did not use the libraries. We -+concluded that weaker conditions might promote sharing better. -+ -+ However, unrestricted linking of non-free programs would deprive the -+users of those programs of all benefit from the free status of the -+libraries themselves. This Library General Public License is intended to -+permit developers of non-free programs to use free libraries, while -+preserving your freedom as a user of such programs to change the free -+libraries that are incorporated in them. (We have not seen how to achieve -+this as regards changes in header files, but we have achieved it as regards -+changes in the actual functions of the Library.) The hope is that this -+will lead to faster development of free libraries. -+ -+ The precise terms and conditions for copying, distribution and -+modification follow. Pay close attention to the difference between a -+"work based on the library" and a "work that uses the library". The -+former contains code derived from the library, while the latter only -+works together with the library. -+ -+ Note that it is possible for a library to be covered by the ordinary -+General Public License rather than by this special one. -+ -+ GNU LIBRARY GENERAL PUBLIC LICENSE -+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -+ -+ 0. This License Agreement applies to any software library which -+contains a notice placed by the copyright holder or other authorized -+party saying it may be distributed under the terms of this Library -+General Public License (also called "this License"). Each licensee is -+addressed as "you". -+ -+ A "library" means a collection of software functions and/or data -+prepared so as to be conveniently linked with application programs -+(which use some of those functions and data) to form executables. -+ -+ The "Library", below, refers to any such software library or work -+which has been distributed under these terms. A "work based on the -+Library" means either the Library or any derivative work under -+copyright law: that is to say, a work containing the Library or a -+portion of it, either verbatim or with modifications and/or translated -+straightforwardly into another language. (Hereinafter, translation is -+included without limitation in the term "modification".) -+ -+ "Source code" for a work means the preferred form of the work for -+making modifications to it. For a library, complete source code means -+all the source code for all modules it contains, plus any associated -+interface definition files, plus the scripts used to control compilation -+and installation of the library. -+ -+ Activities other than copying, distribution and modification are not -+covered by this License; they are outside its scope. The act of -+running a program using the Library is not restricted, and output from -+such a program is covered only if its contents constitute a work based -+on the Library (independent of the use of the Library in a tool for -+writing it). Whether that is true depends on what the Library does -+and what the program that uses the Library does. -+ -+ 1. You may copy and distribute verbatim copies of the Library's -+complete source code as you receive it, in any medium, provided that -+you conspicuously and appropriately publish on each copy an -+appropriate copyright notice and disclaimer of warranty; keep intact -+all the notices that refer to this License and to the absence of any -+warranty; and distribute a copy of this License along with the -+Library. -+ -+ You may charge a fee for the physical act of transferring a copy, -+and you may at your option offer warranty protection in exchange for a -+fee. -+ -+ 2. You may modify your copy or copies of the Library or any portion -+of it, thus forming a work based on the Library, and copy and -+distribute such modifications or work under the terms of Section 1 -+above, provided that you also meet all of these conditions: -+ -+ a) The modified work must itself be a software library. -+ -+ b) You must cause the files modified to carry prominent notices -+ stating that you changed the files and the date of any change. -+ -+ c) You must cause the whole of the work to be licensed at no -+ charge to all third parties under the terms of this License. -+ -+ d) If a facility in the modified Library refers to a function or a -+ table of data to be supplied by an application program that uses -+ the facility, other than as an argument passed when the facility -+ is invoked, then you must make a good faith effort to ensure that, -+ in the event an application does not supply such function or -+ table, the facility still operates, and performs whatever part of -+ its purpose remains meaningful. -+ -+ (For example, a function in a library to compute square roots has -+ a purpose that is entirely well-defined independent of the -+ application. Therefore, Subsection 2d requires that any -+ application-supplied function or table used by this function must -+ be optional: if the application does not supply it, the square -+ root function must still compute square roots.) -+ -+These requirements apply to the modified work as a whole. If -+identifiable sections of that work are not derived from the Library, -+and can be reasonably considered independent and separate works in -+themselves, then this License, and its terms, do not apply to those -+sections when you distribute them as separate works. But when you -+distribute the same sections as part of a whole which is a work based -+on the Library, the distribution of the whole must be on the terms of -+this License, whose permissions for other licensees extend to the -+entire whole, and thus to each and every part regardless of who wrote -+it. -+ -+Thus, it is not the intent of this section to claim rights or contest -+your rights to work written entirely by you; rather, the intent is to -+exercise the right to control the distribution of derivative or -+collective works based on the Library. -+ -+In addition, mere aggregation of another work not based on the Library -+with the Library (or with a work based on the Library) on a volume of -+a storage or distribution medium does not bring the other work under -+the scope of this License. -+ -+ 3. You may opt to apply the terms of the ordinary GNU General Public -+License instead of this License to a given copy of the Library. To do -+this, you must alter all the notices that refer to this License, so -+that they refer to the ordinary GNU General Public License, version 2, -+instead of to this License. (If a newer version than version 2 of the -+ordinary GNU General Public License has appeared, then you can specify -+that version instead if you wish.) Do not make any other change in -+these notices. -+ -+ Once this change is made in a given copy, it is irreversible for -+that copy, so the ordinary GNU General Public License applies to all -+subsequent copies and derivative works made from that copy. -+ -+ This option is useful when you wish to copy part of the code of -+the Library into a program that is not a library. -+ -+ 4. You may copy and distribute the Library (or a portion or -+derivative of it, under Section 2) in object code or executable form -+under the terms of Sections 1 and 2 above provided that you accompany -+it with the complete corresponding machine-readable source code, which -+must be distributed under the terms of Sections 1 and 2 above on a -+medium customarily used for software interchange. -+ -+ If distribution of object code is made by offering access to copy -+from a designated place, then offering equivalent access to copy the -+source code from the same place satisfies the requirement to -+distribute the source code, even though third parties are not -+compelled to copy the source along with the object code. -+ -+ 5. A program that contains no derivative of any portion of the -+Library, but is designed to work with the Library by being compiled or -+linked with it, is called a "work that uses the Library". Such a -+work, in isolation, is not a derivative work of the Library, and -+therefore falls outside the scope of this License. -+ -+ However, linking a "work that uses the Library" with the Library -+creates an executable that is a derivative of the Library (because it -+contains portions of the Library), rather than a "work that uses the -+library". The executable is therefore covered by this License. -+Section 6 states terms for distribution of such executables. -+ -+ When a "work that uses the Library" uses material from a header file -+that is part of the Library, the object code for the work may be a -+derivative work of the Library even though the source code is not. -+Whether this is true is especially significant if the work can be -+linked without the Library, or if the work is itself a library. The -+threshold for this to be true is not precisely defined by law. -+ -+ If such an object file uses only numerical parameters, data -+structure layouts and accessors, and small macros and small inline -+functions (ten lines or less in length), then the use of the object -+file is unrestricted, regardless of whether it is legally a derivative -+work. (Executables containing this object code plus portions of the -+Library will still fall under Section 6.) -+ -+ Otherwise, if the work is a derivative of the Library, you may -+distribute the object code for the work under the terms of Section 6. -+Any executables containing that work also fall under Section 6, -+whether or not they are linked directly with the Library itself. -+ -+ 6. As an exception to the Sections above, you may also compile or -+link a "work that uses the Library" with the Library to produce a -+work containing portions of the Library, and distribute that work -+under terms of your choice, provided that the terms permit -+modification of the work for the customer's own use and reverse -+engineering for debugging such modifications. -+ -+ You must give prominent notice with each copy of the work that the -+Library is used in it and that the Library and its use are covered by -+this License. You must supply a copy of this License. If the work -+during execution displays copyright notices, you must include the -+copyright notice for the Library among them, as well as a reference -+directing the user to the copy of this License. Also, you must do one -+of these things: -+ -+ a) Accompany the work with the complete corresponding -+ machine-readable source code for the Library including whatever -+ changes were used in the work (which must be distributed under -+ Sections 1 and 2 above); and, if the work is an executable linked -+ with the Library, with the complete machine-readable "work that -+ uses the Library", as object code and/or source code, so that the -+ user can modify the Library and then relink to produce a modified -+ executable containing the modified Library. (It is understood -+ that the user who changes the contents of definitions files in the -+ Library will not necessarily be able to recompile the application -+ to use the modified definitions.) -+ -+ b) Accompany the work with a written offer, valid for at -+ least three years, to give the same user the materials -+ specified in Subsection 6a, above, for a charge no more -+ than the cost of performing this distribution. -+ -+ c) If distribution of the work is made by offering access to copy -+ from a designated place, offer equivalent access to copy the above -+ specified materials from the same place. -+ -+ d) Verify that the user has already received a copy of these -+ materials or that you have already sent this user a copy. -+ -+ For an executable, the required form of the "work that uses the -+Library" must include any data and utility programs needed for -+reproducing the executable from it. However, as a special exception, -+the source code distributed need not include anything that is normally -+distributed (in either source or binary form) with the major -+components (compiler, kernel, and so on) of the operating system on -+which the executable runs, unless that component itself accompanies -+the executable. -+ -+ It may happen that this requirement contradicts the license -+restrictions of other proprietary libraries that do not normally -+accompany the operating system. Such a contradiction means you cannot -+use both them and the Library together in an executable that you -+distribute. -+ -+ 7. You may place library facilities that are a work based on the -+Library side-by-side in a single library together with other library -+facilities not covered by this License, and distribute such a combined -+library, provided that the separate distribution of the work based on -+the Library and of the other library facilities is otherwise -+permitted, and provided that you do these two things: -+ -+ a) Accompany the combined library with a copy of the same work -+ based on the Library, uncombined with any other library -+ facilities. This must be distributed under the terms of the -+ Sections above. -+ -+ b) Give prominent notice with the combined library of the fact -+ that part of it is a work based on the Library, and explaining -+ where to find the accompanying uncombined form of the same work. -+ -+ 8. You may not copy, modify, sublicense, link with, or distribute -+the Library except as expressly provided under this License. Any -+attempt otherwise to copy, modify, sublicense, link with, or -+distribute the Library is void, and will automatically terminate your -+rights under this License. However, parties who have received copies, -+or rights, from you under this License will not have their licenses -+terminated so long as such parties remain in full compliance. -+ -+ 9. You are not required to accept this License, since you have not -+signed it. However, nothing else grants you permission to modify or -+distribute the Library or its derivative works. These actions are -+prohibited by law if you do not accept this License. Therefore, by -+modifying or distributing the Library (or any work based on the -+Library), you indicate your acceptance of this License to do so, and -+all its terms and conditions for copying, distributing or modifying -+the Library or works based on it. -+ -+ 10. Each time you redistribute the Library (or any work based on the -+Library), the recipient automatically receives a license from the -+original licensor to copy, distribute, link with or modify the Library -+subject to these terms and conditions. You may not impose any further -+restrictions on the recipients' exercise of the rights granted herein. -+You are not responsible for enforcing compliance by third parties to -+this License. -+ -+ 11. If, as a consequence of a court judgment or allegation of patent -+infringement or for any other reason (not limited to patent issues), -+conditions are imposed on you (whether by court order, agreement or -+otherwise) that contradict the conditions of this License, they do not -+excuse you from the conditions of this License. If you cannot -+distribute so as to satisfy simultaneously your obligations under this -+License and any other pertinent obligations, then as a consequence you -+may not distribute the Library at all. For example, if a patent -+license would not permit royalty-free redistribution of the Library by -+all those who receive copies directly or indirectly through you, then -+the only way you could satisfy both it and this License would be to -+refrain entirely from distribution of the Library. -+ -+If any portion of this section is held invalid or unenforceable under any -+particular circumstance, the balance of the section is intended to apply, -+and the section as a whole is intended to apply in other circumstances. -+ -+It is not the purpose of this section to induce you to infringe any -+patents or other property right claims or to contest validity of any -+such claims; this section has the sole purpose of protecting the -+integrity of the free software distribution system which is -+implemented by public license practices. Many people have made -+generous contributions to the wide range of software distributed -+through that system in reliance on consistent application of that -+system; it is up to the author/donor to decide if he or she is willing -+to distribute software through any other system and a licensee cannot -+impose that choice. -+ -+This section is intended to make thoroughly clear what is believed to -+be a consequence of the rest of this License. -+ -+ 12. If the distribution and/or use of the Library is restricted in -+certain countries either by patents or by copyrighted interfaces, the -+original copyright holder who places the Library under this License may add -+an explicit geographical distribution limitation excluding those countries, -+so that distribution is permitted only in or among countries not thus -+excluded. In such case, this License incorporates the limitation as if -+written in the body of this License. -+ -+ 13. The Free Software Foundation may publish revised and/or new -+versions of the Library General Public License from time to time. -+Such new versions will be similar in spirit to the present version, -+but may differ in detail to address new problems or concerns. -+ -+Each version is given a distinguishing version number. If the Library -+specifies a version number of this License which applies to it and -+"any later version", you have the option of following the terms and -+conditions either of that version or of any later version published by -+the Free Software Foundation. If the Library does not specify a -+license version number, you may choose any version ever published by -+the Free Software Foundation. -+ -+ 14. If you wish to incorporate parts of the Library into other free -+programs whose distribution conditions are incompatible with these, -+write to the author to ask for permission. For software which is -+copyrighted by the Free Software Foundation, write to the Free -+Software Foundation; we sometimes make exceptions for this. Our -+decision will be guided by the two goals of preserving the free status -+of all derivatives of our free software and of promoting the sharing -+and reuse of software generally. -+ -+ NO WARRANTY -+ -+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -+ -+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -+DAMAGES. -+ -+ END OF TERMS AND CONDITIONS -+ -+ Appendix: How to Apply These Terms to Your New Libraries -+ -+ If you develop a new library, and you want it to be of the greatest -+possible use to the public, we recommend making it free software that -+everyone can redistribute and change. You can do so by permitting -+redistribution under these terms (or, alternatively, under the terms of the -+ordinary General Public License). -+ -+ To apply these terms, attach the following notices to the library. It is -+safest to attach them to the start of each source file to most effectively -+convey the exclusion of warranty; and each file should have at least the -+"copyright" line and a pointer to where the full notice is found. -+ -+ -+ Copyright (C) -+ -+ This library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Library General Public -+ License as published by the Free Software Foundation; either -+ version 2 of the License, or (at your option) any later version. -+ -+ This library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Library General Public License for more details. -+ -+ You should have received a copy of the GNU Library General Public -+ License along with this library; if not, write to the Free -+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ -+Also add information on how to contact you by electronic and paper mail. -+ -+You should also get your employer (if you work as a programmer) or your -+school, if any, to sign a "copyright disclaimer" for the library, if -+necessary. Here is a sample; alter the names: -+ -+ Yoyodyne, Inc., hereby disclaims all copyright interest in the -+ library `Frob' (a library for tweaking knobs) written by James Random Hacker. -+ -+ , 1 April 1990 -+ Ty Coon, President of Vice -+ -+That's all there is to it! -diff -Naur mxml-2.6/Makefile.in mxml-2.6-haiku/Makefile.in ---- mxml-2.6/Makefile.in 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/Makefile.in 2008-12-06 04:20:38.000000000 +0000 -@@ -0,0 +1,380 @@ -+# -+# "$Id: Makefile.in 370 2008-12-06 04:20:38Z mike $" -+# -+# Makefile for Mini-XML, a small XML-like file parsing library. -+# -+# Copyright 2003-2008 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 -+# License as published by the Free Software Foundation; either -+# version 2, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+ -+# -+# Compiler tools definitions... -+# -+ -+AR = @AR@ -+ARFLAGS = @ARFLAGS@ -+ARCHFLAGS = @ARCHFLAGS@ -+CC = @CC@ -+CFLAGS = $(OPTIM) $(ARCHFLAGS) @CFLAGS@ @CPPFLAGS@ @PTHREAD_FLAGS@ -+CP = @CP@ -+DSO = @DSO@ -+DSOFLAGS = @DSOFLAGS@ -+LDFLAGS = $(OPTIM) $(ARCHFLAGS) @LDFLAGS@ -+INSTALL = @INSTALL@ -+LIBMXML = @LIBMXML@ -+LIBS = @LIBS@ @PTHREAD_LIBS@ -+LN = @LN@ -s -+MKDIR = @MKDIR@ -+OPTIM = @OPTIM@ -+RANLIB = @RANLIB@ -+RM = @RM@ -f -+SHELL = /bin/sh -+ -+ -+# -+# Configured directories... -+# -+ -+prefix = @prefix@ -+exec_prefix = @exec_prefix@ -+bindir = @bindir@ -+datarootdir = @datarootdir@ -+includedir = @includedir@ -+libdir = @libdir@ -+mandir = @mandir@ -+docdir = @docdir@ -+BUILDROOT = $(DSTROOT) -+ -+ -+# -+# Install commands... -+# -+ -+INSTALL_BIN = $(LIBTOOL) $(INSTALL) -m 755 -s -+INSTALL_DATA = $(INSTALL) -m 644 -+INSTALL_DIR = $(INSTALL) -d -+INSTALL_LIB = $(LIBTOOL) $(INSTALL) -m 755 -+INSTALL_MAN = $(INSTALL) -m 644 -+INSTALL_SCRIPT = $(INSTALL) -m 755 -+ -+ -+# -+# Rules... -+# -+ -+.SUFFIXES: .c .man .o -+.c.o: -+ $(CC) $(CFLAGS) -c $< -+ -+ -+# -+# Targets... -+# -+ -+DOCFILES = doc/0.gif doc/1.gif doc/2.gif doc/3.gif doc/4.gif \ -+ doc/A.gif doc/B.gif doc/C.gif doc/D.gif \ -+ doc/mxml.html doc/mxmldoc.xsd \ -+ README COPYING CHANGES -+PUBLIBOBJS = mxml-attr.o mxml-entity.o mxml-file.o mxml-index.o \ -+ mxml-node.o mxml-search.o mxml-set.o -+LIBOBJS = $(PUBLIBOBJS) mxml-private.o mxml-string.o -+OBJS = mxmldoc.o testmxml.o $(LIBOBJS) -+TARGETS = $(LIBMXML) mxmldoc testmxml mxml.xml doc/mxml.man -+ -+ -+# -+# Make everything... -+# -+ -+all: Makefile config.h $(TARGETS) -+ -+ -+# -+# Clean everything... -+# -+ -+clean: -+ $(RM) $(OBJS) $(TARGETS) -+ $(RM) mxmldoc-static libmxml.a -+ -+ -+# -+# Really clean everything... -+# -+ -+distclean: clean -+ $(RM) config.cache config.log config.status -+ $(RM) Makefile config.h -+ $(RM) -r autom4te*.cache -+ $(RM) *.bck *.bak -+ $(RM) -r clang -+ -+ -+# -+# Run the clang.llvm.org static code analysis tool on the C sources. -+# -+ -+.PHONY: clang -+clang: -+ $(RM) -r clang -+ scan-build -k -V -o `pwd`/clang $(MAKE) $(MFLAGS) CC=ccc-analyzer clean all -+ -+ -+# -+# Install everything... -+# -+ -+install: $(TARGETS) install-$(LIBMXML) install-libmxml.a -+ $(INSTALL_DIR) $(BUILDROOT)$(bindir) -+ $(INSTALL_BIN) mxmldoc $(BUILDROOT)$(bindir) -+ $(INSTALL_DIR) $(BUILDROOT)$(docdir) -+ for file in $(DOCFILES); do \ -+ $(INSTALL_MAN) $$file $(BUILDROOT)$(docdir); \ -+ done -+ $(INSTALL_DIR) $(BUILDROOT)$(includedir) -+ $(INSTALL_DATA) mxml.h $(BUILDROOT)$(includedir) -+ $(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig -+ $(INSTALL_DATA) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig -+ $(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: -+ $(INSTALL_DIR) $(BUILDROOT)$(libdir) -+ $(INSTALL_LIB) libmxml.a $(BUILDROOT)$(libdir) -+ $(RANLIB) $(BUILDROOT)$(libdir)/libmxml.a -+ -+install-libmxml.so.1.4: -+ $(INSTALL_DIR) $(BUILDROOT)$(libdir) -+ $(INSTALL_LIB) libmxml.so.1.4 $(BUILDROOT)$(libdir) -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.so -+ $(LN) libmxml.so.1.4 $(BUILDROOT)$(libdir)/libmxml.so -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1 -+ $(LN) libmxml.so.1.4 $(BUILDROOT)$(libdir)/libmxml.so.1 -+ -+install-libmxml.sl.1: -+ $(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: -+ $(INSTALL_DIR) $(BUILDROOT)$(libdir) -+ $(INSTALL_LIB) libmxml.1.dylib $(BUILDROOT)$(libdir) -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.dylib -+ $(LN) libmxml.1.dylib $(BUILDROOT)$(libdir)/libmxml.dylib -+ -+ -+# -+# Uninstall everything... -+# -+ -+uninstall: uninstall-$(LIBMXML) uninstall-libmxml.a -+ $(RM) $(BUILDROOT)$(bindir)/mxmldoc -+ $(RM) -r $(BUILDROOT)$(docdir) -+ $(RM) $(BUILDROOT)$(includedir)/mxml.h -+ $(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc -+ $(RM) $(BUILDROOT)$(mandir)/man1/mxmldoc.1 -+ $(RM) $(BUILDROOT)$(mandir)/man3/mxml.3 -+ -+uninstall-libmxml.a: -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.a -+ -+uninstall-libmxml.so.1.4: -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.so -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1 -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.so.1.4 -+ -+uninstall-libmxml.sl.1: -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.sl -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.sl.1 -+ -+uninstall-libmxml.1.dylib: -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.dylib -+ $(RM) $(BUILDROOT)$(libdir)/libmxml.1.dylib -+ -+ -+# -+# Make packages using EPM (http://www.easysw.com/epm/) -+# -+ -+epm: all -+ epm --output-dir dist -v -f native mxml -+ epm --output-dir dist -v -f portable mxml -+ -+ -+# -+# autoconf stuff... -+# -+ -+Makefile: configure Makefile.in -+ if test -f config.status; then \ -+ ./config.status --recheck; \ -+ ./config.status; \ -+ else \ -+ ./configure; \ -+ fi -+ touch config.h -+ -+ -+config.h: configure config.h.in -+ autoconf -+ if test -f config.status; then \ -+ ./config.status --recheck; \ -+ ./config.status; \ -+ else \ -+ ./configure; \ -+ fi -+ touch config.h -+ -+ -+# -+# libmxml.a -+# -+ -+libmxml.a: $(LIBOBJS) -+ $(RM) $@ -+ $(AR) $(ARFLAGS) $@ $(LIBOBJS) -+ $(RANLIB) $@ -+ -+$(LIBOBJS): mxml.h -+mxml-entity.o mxml-file.o mxml-private.o: mxml-private.h -+ -+ -+# -+# libmxml.so.1.4 -+# -+ -+libmxml.so.1.4: $(LIBOBJS) -+ $(DSO) $(DSOFLAGS) -o libmxml.so.1.4 $(LIBOBJS) -+ $(RM) libmxml.so libmxml.so.1 -+ $(LN) libmxml.so.1.4 libmxml.so -+ $(LN) libmxml.so.1.4 libmxml.so.1 -+ -+ -+# -+# libmxml.sl.1 -+# -+ -+libmxml.sl.1: $(LIBOBJS) -+ $(DSO) $(DSOFLAGS) -o libmxml.sl.1 $(LIBOBJS) -+ $(RM) libmxml.sl -+ $(LN) libmxml.sl.1 libmxml.sl -+ -+ -+# -+# libmxml.1.dylib -+# -+ -+libmxml.1.dylib: $(LIBOBJS) -+ $(DSO) $(DSOFLAGS) -o libmxml.1.dylib \ -+ -install_name $(libdir)/libmxml.dylib \ -+ -current_version 1.4.0 \ -+ -compatibility_version 1.0.0 \ -+ $(LIBOBJS) -+ $(RM) libmxml.dylib -+ $(LN) libmxml.1.dylib libmxml.dylib -+ -+ -+# -+# mxmldoc -+# -+ -+mxmldoc: $(LIBMXML) mxmldoc.o -+ $(CC) -L. $(LDFLAGS) -o $@ mxmldoc.o -lmxml $(LIBS) -+ -+mxmldoc-static: libmxml.a mxmldoc.o -+ $(CC) $(LDFLAGS) -o $@ mxmldoc.o libmxml.a $(LIBS) -+ -+mxmldoc.o: mxml.h -+ -+ -+# -+# testmxml -+# -+ -+testmxml: libmxml.a testmxml.o -+ $(CC) $(LDFLAGS) -o $@ testmxml.o libmxml.a $(LIBS) -+ @echo Testing library... -+ ./testmxml test.xml >temp1.xml 2>temp1s.xml -+ ./testmxml temp1.xml >temp2.xml 2>temp2s.xml -+ @if cmp temp1.xml temp2.xml; then \ -+ echo Stdio file test passed!; \ -+ $(RM) temp2.xml temp2s.xml; \ -+ else \ -+ echo Stdio file test failed!; \ -+ fi -+ @if cmp temp1.xml temp1s.xml; then \ -+ echo String test passed!; \ -+ $(RM) temp1.xml temp1s.xml; \ -+ else \ -+ echo String test failed!; \ -+ fi -+ @if cmp test.xml test.xmlfd; then \ -+ echo File descriptor test passed!; \ -+ $(RM) test.xmlfd; \ -+ else \ -+ echo File descriptor test failed!; \ -+ fi -+ -+testmxml.o: mxml.h -+ -+ -+# -+# mxml.xml -+# -+ -+mxml.xml: mxmldoc-static mxml.h $(PUBLIBOBJS:.o=.c) -+ $(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 \ -+ ./mxmldoc-static --docset org.minixml.docset \ -+ --docversion @VERSION@ --feedname minixml.org \ -+ --feedurl http://www.minixml.org/org.minixml.atom \ -+ --header doc/docset.header --intro doc/docset.intro \ -+ --css doc/docset.css --title "Mini-XML API Reference" \ -+ mxml.xml || exit 1; \ -+ /Developer/usr/bin/docsetutil package --output org.minixml.xar \ -+ --atom org.minixml.atom \ -+ --download-url http://www.minixml.org/org.minixml.xar \ -+ org.minixml.docset || exit 1; \ -+ fi -+ -+valgrind: mxmldoc-static -+ $(RM) valgrind.xml -+ valgrind --tool=memcheck --leak-check=yes ./mxmldoc-static \ -+ valgrind.xml mxml.h $(PUBLIBOBJS:.o=.c) \ -+ >valgrind.html 2>valgrind.out -+ -+ -+# -+# doc/mxml.man -+# -+ -+doc/mxml.man: mxmldoc-static mxml.xml -+ $(RM) doc/mxml.man -+ ./mxmldoc-static --man mxml --title "Mini-XML API" \ -+ --intro doc/intro.man --footer doc/footer.man \ -+ mxml.xml >doc/mxml.man -+ -+ -+# -+# All object files depend on the makefile... -+# -+ -+$(OBJS): Makefile config.h -+ -+ -+# -+# End of "$Id: Makefile.in 370 2008-12-06 04:20:38Z mike $". -+# -diff -Naur mxml-2.6/README mxml-2.6-haiku/README ---- mxml-2.6/README 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/README 2009-05-17 17:17:46.000000000 +0000 -@@ -0,0 +1,177 @@ -+README - 2009-05-17 -+------------------- -+ -+ -+INTRODUCTION -+ -+ This README file describes the Mini-XML library version 2.6. -+ -+ Mini-XML is a small XML parsing library that you can use to read XML and -+ XML-like data files in your application without requiring large non-standard -+ libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works, -+ as do most vendors' ANSI C compilers) and a "make" program. -+ -+ Mini-XML provides the following functionality: -+ -+ - Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and -+ strings. -+ - Data is stored in a linked-list tree structure, preserving the XML -+ data hierarchy. -+ - 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 -+ "leaf" nodes. -+ - Functions for creating and managing trees of data. -+ - "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. -+ -+ -+BUILDING Mini-XML -+ -+ Mini-XML comes with an autoconf-based configure script; just type the -+ following command to get things going: -+ -+ ./configure -+ -+ The default install prefix is /usr/local, which can be overridden using the -+ --prefix option: -+ -+ ./configure --prefix=/foo -+ -+ Other configure options can be found using the --help option: -+ -+ ./configure --help -+ -+ Once you have configured the software, type "make" to do the build and run -+ the test program to verify that things are working, as follows: -+ -+ make -+ -+ If you are using Mini-XML under Microsoft Windows with Visual C++ 2008, use -+ the included project files in the "vcnet" subdirectory to build the library -+ instead. -+ -+ -+INSTALLING Mini-XML -+ -+ The "install" target will install Mini-XML in the lib and include -+ directories: -+ -+ make install -+ -+ Once you have installed it, use the "-lmxml" option to link your application -+ against it. -+ -+ -+DOCUMENTATION -+ -+ The documentation is available in the "doc" subdirectory in the files -+ "mxml.html" (HTML) and "mxml.pdf" (PDF). You can also look at the -+ "testmxml.c" and "mxmldoc.c" source files for examples of using Mini-XML. -+ -+ Mini-XML provides a single header file which you include: -+ -+ #include -+ -+ 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. New nodes can be -+ created using the "mxmlNewElement()", "mxmlNewInteger()", "mxmlNewOpaque()", -+ "mxmlNewReal()", and "mxmlNewText()" functions. Only elements can have -+ child nodes, and the top node must be an element, usually "?xml". -+ -+ You load an XML file using the "mxmlLoadFile()" function: -+ -+ FILE *fp; -+ mxml_node_t *tree; -+ -+ fp = fopen("filename.xml", "r"); -+ tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); -+ fclose(fp); -+ -+ Similarly, you save an XML file using the "mxmlSaveFile()" function: -+ -+ FILE *fp; -+ mxml_node_t *tree; -+ -+ fp = fopen("filename.xml", "w"); -+ mxmlSaveFile(tree, fp, MXML_NO_CALLBACK); -+ fclose(fp); -+ -+ The "mxmlLoadString()", "mxmlSaveAllocString()", and "mxmlSaveString()" -+ functions load XML node trees from and save XML node trees to strings: -+ -+ char buffer[8192]; -+ char *ptr; -+ mxml_node_t *tree; -+ -+ ... -+ tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK); -+ -+ ... -+ mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK); -+ -+ ... -+ ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK); -+ -+ You can find a named element/node using the "mxmlFindElement()" function: -+ -+ mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr", -+ "value", MXML_DESCEND); -+ -+ The "name", "attr", and "value" arguments can be passed as NULL to act as -+ wildcards, e.g.: -+ -+ /* Find the first "a" element */ -+ node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND); -+ -+ /* Find the first "a" element with "href" attribute */ -+ node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND); -+ -+ /* Find the first "a" element with "href" to a URL */ -+ node = mxmlFindElement(tree, tree, "a", "href", -+ "http://www.easysw.com/~mike/mxml/", -+ MXML_DESCEND); -+ -+ /* Find the first element with a "src" attribute*/ -+ node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND); -+ -+ /* Find the first element with a "src" = "foo.jpg" */ -+ node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg", -+ MXML_DESCEND); -+ -+ You can also iterate with the same function: -+ -+ mxml_node_t *node; -+ -+ for (node = mxmlFindElement(tree, tree, "name", NULL, NULL, -+ MXML_DESCEND); -+ node != NULL; -+ node = mxmlFindElement(node, tree, "name", NULL, NULL, -+ MXML_DESCEND)) -+ { -+ ... do something ... -+ } -+ -+ 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: -+ -+ mxmlDelete(tree); -+ -+ -+GETTING HELP AND REPORTING PROBLEMS -+ -+ The Mini-XML web site provides access to a discussion forum and bug -+ reporting page: -+ -+ http://www.minixml.org/ -+ -+ -+LEGAL STUFF -+ -+ The Mini-XML library is Copyright 2003-2009 by Michael Sweet. License terms -+ are described in the file "COPYING". -diff -Naur mxml-2.6/config.h.in mxml-2.6-haiku/config.h.in ---- mxml-2.6/config.h.in 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/config.h.in 2009-04-18 17:05:52.000000000 +0000 -@@ -0,0 +1,97 @@ -+/* -+ * "$Id: config.h.in 387 2009-04-18 17:05:52Z mike $" -+ * -+ * Configuration file for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+ -+/* -+ * Version number... -+ */ -+ -+#define MXML_VERSION "" -+ -+ -+/* -+ * Inline function support... -+ */ -+ -+#define inline -+ -+ -+/* -+ * Long long support... -+ */ -+ -+#undef HAVE_LONG_LONG -+ -+ -+/* -+ * Do we have the snprintf() and vsnprintf() functions? -+ */ -+ -+#undef HAVE_SNPRINTF -+#undef HAVE_VSNPRINTF -+ -+ -+/* -+ * Do we have the strXXX() functions? -+ */ -+ -+#undef HAVE_STRDUP -+ -+ -+/* -+ * Do we have threading support? -+ */ -+ -+#undef HAVE_PTHREAD_H -+ -+ -+/* -+ * Define prototypes for string functions as needed... -+ */ -+ -+# ifndef HAVE_STRDUP -+extern char *_mxml_strdup(const char *); -+# define strdup _mxml_strdup -+# endif /* !HAVE_STRDUP */ -+ -+extern char *_mxml_strdupf(const char *, ...); -+extern char *_mxml_vstrdupf(const char *, va_list); -+ -+# ifndef HAVE_SNPRINTF -+extern int _mxml_snprintf(char *, size_t, const char *, ...); -+# define snprintf _mxml_snprintf -+# endif /* !HAVE_SNPRINTF */ -+ -+# ifndef HAVE_VSNPRINTF -+extern int _mxml_vsnprintf(char *, size_t, const char *, va_list); -+# define vsnprintf _mxml_vsnprintf -+# endif /* !HAVE_VSNPRINTF */ -+ -+/* -+ * End of "$Id: config.h.in 387 2009-04-18 17:05:52Z mike $". -+ */ -diff -Naur mxml-2.6/configure mxml-2.6-haiku/configure ---- mxml-2.6/configure 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/configure 2009-04-18 17:05:52.000000000 +0000 -@@ -0,0 +1,5974 @@ -+#! /bin/sh -+# Guess values for system-dependent variables and create Makefiles. -+# Generated by GNU Autoconf 2.61. -+# -+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -+# This configure script is free software; the Free Software Foundation -+# gives unlimited permission to copy, distribute and modify it. -+## --------------------- ## -+## M4sh Initialization. ## -+## --------------------- ## -+ -+# Be more Bourne compatible -+DUALCASE=1; export DUALCASE # for MKS sh -+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then -+ emulate sh -+ NULLCMD=: -+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which -+ # is contrary to our usage. Disable this feature. -+ alias -g '${1+"$@"}'='"$@"' -+ setopt NO_GLOB_SUBST -+else -+ case `(set -o) 2>/dev/null` in -+ *posix*) set -o posix ;; -+esac -+ -+fi -+ -+ -+ -+ -+# PATH needs CR -+# Avoid depending upon Character Ranges. -+as_cr_letters='abcdefghijklmnopqrstuvwxyz' -+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -+as_cr_Letters=$as_cr_letters$as_cr_LETTERS -+as_cr_digits='0123456789' -+as_cr_alnum=$as_cr_Letters$as_cr_digits -+ -+# The user is always right. -+if test "${PATH_SEPARATOR+set}" != set; then -+ echo "#! /bin/sh" >conf$$.sh -+ echo "exit 0" >>conf$$.sh -+ chmod +x conf$$.sh -+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -+ PATH_SEPARATOR=';' -+ else -+ PATH_SEPARATOR=: -+ fi -+ rm -f conf$$.sh -+fi -+ -+# Support unset when possible. -+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -+ as_unset=unset -+else -+ as_unset=false -+fi -+ -+ -+# IFS -+# We need space, tab and new line, in precisely that order. Quoting is -+# there to prevent editors from complaining about space-tab. -+# (If _AS_PATH_WALK were called with IFS unset, it would disable word -+# splitting by setting IFS to empty value.) -+as_nl=' -+' -+IFS=" "" $as_nl" -+ -+# Find who we are. Look in the path if we contain no directory separator. -+case $0 in -+ *[\\/]* ) as_myself=$0 ;; -+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+# We did not find ourselves, most probably we were run as `sh COMMAND' -+# in which case we are not to be found in the path. -+if test "x$as_myself" = x; then -+ as_myself=$0 -+fi -+if test ! -f "$as_myself"; then -+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 -+ { (exit 1); exit 1; } -+fi -+ -+# Work around bugs in pre-3.0 UWIN ksh. -+for as_var in ENV MAIL MAILPATH -+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+done -+PS1='$ ' -+PS2='> ' -+PS4='+ ' -+ -+# NLS nuisances. -+for as_var in \ -+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -+ LC_TELEPHONE LC_TIME -+do -+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -+ eval $as_var=C; export $as_var -+ else -+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+ fi -+done -+ -+# Required to use basename. -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then -+ as_basename=basename -+else -+ as_basename=false -+fi -+ -+ -+# Name of the executable. -+as_me=`$as_basename -- "$0" || -+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)' \| . 2>/dev/null || -+echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ -+# CDPATH. -+$as_unset CDPATH -+ -+ -+if test "x$CONFIG_SHELL" = x; then -+ if (eval ":") 2>/dev/null; then -+ as_have_required=yes -+else -+ as_have_required=no -+fi -+ -+ if test $as_have_required = yes && (eval ": -+(as_func_return () { -+ (exit \$1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. -+fi -+ -+test \$exitcode = 0) || { (exit 1); exit 1; } -+ -+( -+ as_lineno_1=\$LINENO -+ as_lineno_2=\$LINENO -+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && -+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -+") 2> /dev/null; then -+ : -+else -+ as_candidate_shells= -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ case $as_dir in -+ /*) -+ for as_base in sh bash ksh sh5; do -+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base" -+ done;; -+ esac -+done -+IFS=$as_save_IFS -+ -+ -+ for as_shell in $as_candidate_shells $SHELL; do -+ # Try only shells that exist, to save several forks. -+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } && -+ { ("$as_shell") 2> /dev/null <<\_ASEOF -+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then -+ emulate sh -+ NULLCMD=: -+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which -+ # is contrary to our usage. Disable this feature. -+ alias -g '${1+"$@"}'='"$@"' -+ setopt NO_GLOB_SUBST -+else -+ case `(set -o) 2>/dev/null` in -+ *posix*) set -o posix ;; -+esac -+ -+fi -+ -+ -+: -+_ASEOF -+}; then -+ CONFIG_SHELL=$as_shell -+ as_have_required=yes -+ if { "$as_shell" 2> /dev/null <<\_ASEOF -+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then -+ emulate sh -+ NULLCMD=: -+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which -+ # is contrary to our usage. Disable this feature. -+ alias -g '${1+"$@"}'='"$@"' -+ setopt NO_GLOB_SUBST -+else -+ case `(set -o) 2>/dev/null` in -+ *posix*) set -o posix ;; -+esac -+ -+fi -+ -+ -+: -+(as_func_return () { -+ (exit $1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = "$1" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. -+fi -+ -+test $exitcode = 0) || { (exit 1); exit 1; } -+ -+( -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } -+ -+_ASEOF -+}; then -+ break -+fi -+ -+fi -+ -+ done -+ -+ if test "x$CONFIG_SHELL" != x; then -+ for as_var in BASH_ENV ENV -+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+ done -+ export CONFIG_SHELL -+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -+fi -+ -+ -+ if test $as_have_required = no; then -+ echo This script requires a shell more modern than all the -+ echo shells that I found on your system. Please install a -+ echo modern shell, or manually run the script under such a -+ echo shell if you do have one. -+ { (exit 1); exit 1; } -+fi -+ -+ -+fi -+ -+fi -+ -+ -+ -+(eval "as_func_return () { -+ (exit \$1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. -+fi -+ -+test \$exitcode = 0") || { -+ echo No shell found that supports shell functions. -+ echo Please tell autoconf@gnu.org about your system, -+ echo including any error possibly output before this -+ echo message -+} -+ -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { -+ -+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO -+ # uniformly replaced by the line number. The first 'sed' inserts a -+ # line-number line after each line using $LINENO; the second 'sed' -+ # does the real work. The second script uses 'N' to pair each -+ # line-number line with the line containing $LINENO, and appends -+ # trailing '-' during substitution so that $LINENO is not a special -+ # case at line end. -+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -+ # scripts with optimization help from Paolo Bonzini. Blame Lee -+ # E. McMahon (1931-1989) for sed's syntax. :-) -+ sed -n ' -+ p -+ /[$]LINENO/= -+ ' <$as_myself | -+ sed ' -+ s/[$]LINENO.*/&-/ -+ t lineno -+ b -+ :lineno -+ N -+ :loop -+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ -+ t loop -+ s/-\n.*// -+ ' >$as_me.lineno && -+ chmod +x "$as_me.lineno" || -+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 -+ { (exit 1); exit 1; }; } -+ -+ # Don't try to exec as it changes $[0], causing all sort of problems -+ # (the dirname of $[0] is not the place where we might find the -+ # original and so on. Autoconf is especially sensitive to this). -+ . "./$as_me.lineno" -+ # Exit status is that of the last command. -+ exit -+} -+ -+ -+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then -+ as_dirname=dirname -+else -+ as_dirname=false -+fi -+ -+ECHO_C= ECHO_N= ECHO_T= -+case `echo -n x` in -+-n*) -+ case `echo 'x\c'` in -+ *c*) ECHO_T=' ';; # ECHO_T is single tab character. -+ *) ECHO_C='\c';; -+ esac;; -+*) -+ ECHO_N='-n';; -+esac -+ -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+rm -f conf$$ conf$$.exe conf$$.file -+if test -d conf$$.dir; then -+ rm -f conf$$.dir/conf$$.file -+else -+ rm -f conf$$.dir -+ mkdir conf$$.dir -+fi -+echo >conf$$.file -+if ln -s conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s='ln -s' -+ # ... but there are two gotchas: -+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. -+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -+ # In both cases, we have to default to `cp -p'. -+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -+ as_ln_s='cp -p' -+elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+else -+ as_ln_s='cp -p' -+fi -+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -+rmdir conf$$.dir 2>/dev/null -+ -+if mkdir -p . 2>/dev/null; then -+ as_mkdir_p=: -+else -+ test -d ./-p && rmdir ./-p -+ as_mkdir_p=false -+fi -+ -+if test -x / >/dev/null 2>&1; then -+ as_test_x='test -x' -+else -+ if ls -dL / >/dev/null 2>&1; then -+ as_ls_L_option=L -+ else -+ as_ls_L_option= -+ fi -+ as_test_x=' -+ eval sh -c '\'' -+ if test -d "$1"; then -+ test -d "$1/."; -+ else -+ case $1 in -+ -*)set "./$1";; -+ esac; -+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in -+ ???[sx]*):;;*)false;;esac;fi -+ '\'' sh -+ ' -+fi -+as_executable_p=$as_test_x -+ -+# Sed expression to map a string onto a valid CPP name. -+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -+ -+# Sed expression to map a string onto a valid variable name. -+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -+ -+ -+ -+exec 7<&0 &1 -+ -+# Name of the host. -+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -+# so uname gets run too. -+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -+ -+# -+# Initializations. -+# -+ac_default_prefix=/usr/local -+ac_clean_files= -+ac_config_libobj_dir=. -+LIBOBJS= -+cross_compiling=no -+subdirs= -+MFLAGS= -+MAKEFLAGS= -+SHELL=${CONFIG_SHELL-/bin/sh} -+ -+# Identity of this package. -+PACKAGE_NAME= -+PACKAGE_TARNAME= -+PACKAGE_VERSION= -+PACKAGE_STRING= -+PACKAGE_BUGREPORT= -+ -+ac_unique_file="mxml.h" -+# Factoring default headers for most tests. -+ac_includes_default="\ -+#include -+#ifdef HAVE_SYS_TYPES_H -+# include -+#endif -+#ifdef HAVE_SYS_STAT_H -+# include -+#endif -+#ifdef STDC_HEADERS -+# include -+# include -+#else -+# ifdef HAVE_STDLIB_H -+# include -+# endif -+#endif -+#ifdef HAVE_STRING_H -+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -+# include -+# endif -+# include -+#endif -+#ifdef HAVE_STRINGS_H -+# include -+#endif -+#ifdef HAVE_INTTYPES_H -+# include -+#endif -+#ifdef HAVE_STDINT_H -+# include -+#endif -+#ifdef HAVE_UNISTD_H -+# include -+#endif" -+ -+ac_subst_vars='SHELL -+PATH_SEPARATOR -+PACKAGE_NAME -+PACKAGE_TARNAME -+PACKAGE_VERSION -+PACKAGE_STRING -+PACKAGE_BUGREPORT -+exec_prefix -+prefix -+program_transform_name -+bindir -+sbindir -+libexecdir -+datarootdir -+datadir -+sysconfdir -+sharedstatedir -+localstatedir -+includedir -+oldincludedir -+docdir -+infodir -+htmldir -+dvidir -+pdfdir -+psdir -+libdir -+localedir -+mandir -+DEFS -+ECHO_C -+ECHO_N -+ECHO_T -+LIBS -+build_alias -+host_alias -+target_alias -+VERSION -+LDFLAGS -+OPTIM -+ARCHFLAGS -+CC -+CFLAGS -+CPPFLAGS -+ac_ct_CC -+EXEEXT -+OBJEXT -+CXX -+CXXFLAGS -+ac_ct_CXX -+INSTALL_PROGRAM -+INSTALL_SCRIPT -+INSTALL_DATA -+RANLIB -+AR -+CP -+LN -+MKDIR -+RM -+ARFLAGS -+CPP -+GREP -+EGREP -+PTHREAD_FLAGS -+PTHREAD_LIBS -+DSO -+DSOFLAGS -+LIBMXML -+PICFLAG -+PC_CFLAGS -+PC_LIBS -+LIBOBJS -+LTLIBOBJS' -+ac_subst_files='' -+ ac_precious_vars='build_alias -+host_alias -+target_alias -+CC -+CFLAGS -+LDFLAGS -+LIBS -+CPPFLAGS -+CXX -+CXXFLAGS -+CCC -+CPP' -+ -+ -+# Initialize some variables set by options. -+ac_init_help= -+ac_init_version=false -+# The variables have the same names as the options, with -+# dashes changed to underlines. -+cache_file=/dev/null -+exec_prefix=NONE -+no_create= -+no_recursion= -+prefix=NONE -+program_prefix=NONE -+program_suffix=NONE -+program_transform_name=s,x,x, -+silent= -+site= -+srcdir= -+verbose= -+x_includes=NONE -+x_libraries=NONE -+ -+# Installation directory options. -+# These are left unexpanded so users can "make install exec_prefix=/foo" -+# and all the variables that are supposed to be based on exec_prefix -+# by default will actually change. -+# Use braces instead of parens because sh, perl, etc. also accept them. -+# (The list follows the same order as the GNU Coding Standards.) -+bindir='${exec_prefix}/bin' -+sbindir='${exec_prefix}/sbin' -+libexecdir='${exec_prefix}/libexec' -+datarootdir='${prefix}/share' -+datadir='${datarootdir}' -+sysconfdir='${prefix}/etc' -+sharedstatedir='${prefix}/com' -+localstatedir='${prefix}/var' -+includedir='${prefix}/include' -+oldincludedir='/usr/include' -+docdir='${datarootdir}/doc/${PACKAGE}' -+infodir='${datarootdir}/info' -+htmldir='${docdir}' -+dvidir='${docdir}' -+pdfdir='${docdir}' -+psdir='${docdir}' -+libdir='${exec_prefix}/lib' -+localedir='${datarootdir}/locale' -+mandir='${datarootdir}/man' -+ -+ac_prev= -+ac_dashdash= -+for ac_option -+do -+ # If the previous option needs an argument, assign it. -+ if test -n "$ac_prev"; then -+ eval $ac_prev=\$ac_option -+ ac_prev= -+ continue -+ fi -+ -+ case $ac_option in -+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; -+ *) ac_optarg=yes ;; -+ esac -+ -+ # Accept the important Cygnus configure options, so we can diagnose typos. -+ -+ case $ac_dashdash$ac_option in -+ --) -+ ac_dashdash=yes ;; -+ -+ -bindir | --bindir | --bindi | --bind | --bin | --bi) -+ ac_prev=bindir ;; -+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) -+ bindir=$ac_optarg ;; -+ -+ -build | --build | --buil | --bui | --bu) -+ ac_prev=build_alias ;; -+ -build=* | --build=* | --buil=* | --bui=* | --bu=*) -+ build_alias=$ac_optarg ;; -+ -+ -cache-file | --cache-file | --cache-fil | --cache-fi \ -+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) -+ ac_prev=cache_file ;; -+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ -+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) -+ cache_file=$ac_optarg ;; -+ -+ --config-cache | -C) -+ cache_file=config.cache ;; -+ -+ -datadir | --datadir | --datadi | --datad) -+ ac_prev=datadir ;; -+ -datadir=* | --datadir=* | --datadi=* | --datad=*) -+ datadir=$ac_optarg ;; -+ -+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ -+ | --dataroo | --dataro | --datar) -+ ac_prev=datarootdir ;; -+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ -+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) -+ datarootdir=$ac_optarg ;; -+ -+ -disable-* | --disable-*) -+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ { (exit 1); exit 1; }; } -+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` -+ eval enable_$ac_feature=no ;; -+ -+ -docdir | --docdir | --docdi | --doc | --do) -+ ac_prev=docdir ;; -+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) -+ docdir=$ac_optarg ;; -+ -+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) -+ ac_prev=dvidir ;; -+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) -+ dvidir=$ac_optarg ;; -+ -+ -enable-* | --enable-*) -+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ { (exit 1); exit 1; }; } -+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` -+ eval enable_$ac_feature=\$ac_optarg ;; -+ -+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ -+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ -+ | --exec | --exe | --ex) -+ ac_prev=exec_prefix ;; -+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ -+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ -+ | --exec=* | --exe=* | --ex=*) -+ exec_prefix=$ac_optarg ;; -+ -+ -gas | --gas | --ga | --g) -+ # Obsolete; use --with-gas. -+ with_gas=yes ;; -+ -+ -help | --help | --hel | --he | -h) -+ ac_init_help=long ;; -+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) -+ ac_init_help=recursive ;; -+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) -+ ac_init_help=short ;; -+ -+ -host | --host | --hos | --ho) -+ ac_prev=host_alias ;; -+ -host=* | --host=* | --hos=* | --ho=*) -+ host_alias=$ac_optarg ;; -+ -+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) -+ ac_prev=htmldir ;; -+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ -+ | --ht=*) -+ htmldir=$ac_optarg ;; -+ -+ -includedir | --includedir | --includedi | --included | --include \ -+ | --includ | --inclu | --incl | --inc) -+ ac_prev=includedir ;; -+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ -+ | --includ=* | --inclu=* | --incl=* | --inc=*) -+ includedir=$ac_optarg ;; -+ -+ -infodir | --infodir | --infodi | --infod | --info | --inf) -+ ac_prev=infodir ;; -+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) -+ infodir=$ac_optarg ;; -+ -+ -libdir | --libdir | --libdi | --libd) -+ ac_prev=libdir ;; -+ -libdir=* | --libdir=* | --libdi=* | --libd=*) -+ libdir=$ac_optarg ;; -+ -+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ -+ | --libexe | --libex | --libe) -+ ac_prev=libexecdir ;; -+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ -+ | --libexe=* | --libex=* | --libe=*) -+ libexecdir=$ac_optarg ;; -+ -+ -localedir | --localedir | --localedi | --localed | --locale) -+ ac_prev=localedir ;; -+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) -+ localedir=$ac_optarg ;; -+ -+ -localstatedir | --localstatedir | --localstatedi | --localstated \ -+ | --localstate | --localstat | --localsta | --localst | --locals) -+ ac_prev=localstatedir ;; -+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ -+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) -+ localstatedir=$ac_optarg ;; -+ -+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) -+ ac_prev=mandir ;; -+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) -+ mandir=$ac_optarg ;; -+ -+ -nfp | --nfp | --nf) -+ # Obsolete; use --without-fp. -+ with_fp=no ;; -+ -+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ -+ | --no-cr | --no-c | -n) -+ no_create=yes ;; -+ -+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ -+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) -+ no_recursion=yes ;; -+ -+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ -+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ -+ | --oldin | --oldi | --old | --ol | --o) -+ ac_prev=oldincludedir ;; -+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ -+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ -+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) -+ oldincludedir=$ac_optarg ;; -+ -+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) -+ ac_prev=prefix ;; -+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) -+ prefix=$ac_optarg ;; -+ -+ -program-prefix | --program-prefix | --program-prefi | --program-pref \ -+ | --program-pre | --program-pr | --program-p) -+ ac_prev=program_prefix ;; -+ -program-prefix=* | --program-prefix=* | --program-prefi=* \ -+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) -+ program_prefix=$ac_optarg ;; -+ -+ -program-suffix | --program-suffix | --program-suffi | --program-suff \ -+ | --program-suf | --program-su | --program-s) -+ ac_prev=program_suffix ;; -+ -program-suffix=* | --program-suffix=* | --program-suffi=* \ -+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) -+ program_suffix=$ac_optarg ;; -+ -+ -program-transform-name | --program-transform-name \ -+ | --program-transform-nam | --program-transform-na \ -+ | --program-transform-n | --program-transform- \ -+ | --program-transform | --program-transfor \ -+ | --program-transfo | --program-transf \ -+ | --program-trans | --program-tran \ -+ | --progr-tra | --program-tr | --program-t) -+ ac_prev=program_transform_name ;; -+ -program-transform-name=* | --program-transform-name=* \ -+ | --program-transform-nam=* | --program-transform-na=* \ -+ | --program-transform-n=* | --program-transform-=* \ -+ | --program-transform=* | --program-transfor=* \ -+ | --program-transfo=* | --program-transf=* \ -+ | --program-trans=* | --program-tran=* \ -+ | --progr-tra=* | --program-tr=* | --program-t=*) -+ program_transform_name=$ac_optarg ;; -+ -+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) -+ ac_prev=pdfdir ;; -+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) -+ pdfdir=$ac_optarg ;; -+ -+ -psdir | --psdir | --psdi | --psd | --ps) -+ ac_prev=psdir ;; -+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) -+ psdir=$ac_optarg ;; -+ -+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ -+ | -silent | --silent | --silen | --sile | --sil) -+ silent=yes ;; -+ -+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) -+ ac_prev=sbindir ;; -+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ -+ | --sbi=* | --sb=*) -+ sbindir=$ac_optarg ;; -+ -+ -sharedstatedir | --sharedstatedir | --sharedstatedi \ -+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ -+ | --sharedst | --shareds | --shared | --share | --shar \ -+ | --sha | --sh) -+ ac_prev=sharedstatedir ;; -+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ -+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ -+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ -+ | --sha=* | --sh=*) -+ sharedstatedir=$ac_optarg ;; -+ -+ -site | --site | --sit) -+ ac_prev=site ;; -+ -site=* | --site=* | --sit=*) -+ site=$ac_optarg ;; -+ -+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) -+ ac_prev=srcdir ;; -+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) -+ srcdir=$ac_optarg ;; -+ -+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ -+ | --syscon | --sysco | --sysc | --sys | --sy) -+ ac_prev=sysconfdir ;; -+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ -+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) -+ sysconfdir=$ac_optarg ;; -+ -+ -target | --target | --targe | --targ | --tar | --ta | --t) -+ ac_prev=target_alias ;; -+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) -+ target_alias=$ac_optarg ;; -+ -+ -v | -verbose | --verbose | --verbos | --verbo | --verb) -+ verbose=yes ;; -+ -+ -version | --version | --versio | --versi | --vers | -V) -+ ac_init_version=: ;; -+ -+ -with-* | --with-*) -+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ { (exit 1); exit 1; }; } -+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` -+ eval with_$ac_package=\$ac_optarg ;; -+ -+ -without-* | --without-*) -+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ { (exit 1); exit 1; }; } -+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'` -+ eval with_$ac_package=no ;; -+ -+ --x) -+ # Obsolete; use --with-x. -+ with_x=yes ;; -+ -+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ -+ | --x-incl | --x-inc | --x-in | --x-i) -+ ac_prev=x_includes ;; -+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ -+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) -+ x_includes=$ac_optarg ;; -+ -+ -x-libraries | --x-libraries | --x-librarie | --x-librari \ -+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) -+ ac_prev=x_libraries ;; -+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ -+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) -+ x_libraries=$ac_optarg ;; -+ -+ -*) { echo "$as_me: error: unrecognized option: $ac_option -+Try \`$0 --help' for more information." >&2 -+ { (exit 1); exit 1; }; } -+ ;; -+ -+ *=*) -+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 -+ { (exit 1); exit 1; }; } -+ eval $ac_envvar=\$ac_optarg -+ export $ac_envvar ;; -+ -+ *) -+ # FIXME: should be removed in autoconf 3.0. -+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2 -+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2 -+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} -+ ;; -+ -+ esac -+done -+ -+if test -n "$ac_prev"; then -+ ac_option=--`echo $ac_prev | sed 's/_/-/g'` -+ { echo "$as_me: error: missing argument to $ac_option" >&2 -+ { (exit 1); exit 1; }; } -+fi -+ -+# Be sure to have absolute directory names. -+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ -+ datadir sysconfdir sharedstatedir localstatedir includedir \ -+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ -+ libdir localedir mandir -+do -+ eval ac_val=\$$ac_var -+ case $ac_val in -+ [\\/$]* | ?:[\\/]* ) continue;; -+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;; -+ esac -+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -+ { (exit 1); exit 1; }; } -+done -+ -+# There might be people who depend on the old broken behavior: `$host' -+# used to hold the argument of --host etc. -+# FIXME: To remove some day. -+build=$build_alias -+host=$host_alias -+target=$target_alias -+ -+# FIXME: To remove some day. -+if test "x$host_alias" != x; then -+ if test "x$build_alias" = x; then -+ cross_compiling=maybe -+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. -+ If a cross compiler is detected then cross compile mode will be used." >&2 -+ elif test "x$build_alias" != "x$host_alias"; then -+ cross_compiling=yes -+ fi -+fi -+ -+ac_tool_prefix= -+test -n "$host_alias" && ac_tool_prefix=$host_alias- -+ -+test "$silent" = yes && exec 6>/dev/null -+ -+ -+ac_pwd=`pwd` && test -n "$ac_pwd" && -+ac_ls_di=`ls -di .` && -+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || -+ { echo "$as_me: error: Working directory cannot be determined" >&2 -+ { (exit 1); exit 1; }; } -+test "X$ac_ls_di" = "X$ac_pwd_ls_di" || -+ { echo "$as_me: error: pwd does not report name of working directory" >&2 -+ { (exit 1); exit 1; }; } -+ -+ -+# Find the source files, if location was not specified. -+if test -z "$srcdir"; then -+ ac_srcdir_defaulted=yes -+ # Try the directory containing this script, then the parent directory. -+ ac_confdir=`$as_dirname -- "$0" || -+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$0" : 'X\(//\)[^/]' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)' \| . 2>/dev/null || -+echo X"$0" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)[^/].*/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ srcdir=$ac_confdir -+ if test ! -r "$srcdir/$ac_unique_file"; then -+ srcdir=.. -+ fi -+else -+ ac_srcdir_defaulted=no -+fi -+if test ! -r "$srcdir/$ac_unique_file"; then -+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." -+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 -+ { (exit 1); exit 1; }; } -+fi -+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -+ac_abs_confdir=`( -+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 -+ { (exit 1); exit 1; }; } -+ pwd)` -+# When building in place, set srcdir=. -+if test "$ac_abs_confdir" = "$ac_pwd"; then -+ srcdir=. -+fi -+# Remove unnecessary trailing slashes from srcdir. -+# Double slashes in file names in object file debugging info -+# mess up M-x gdb in Emacs. -+case $srcdir in -+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -+esac -+for ac_var in $ac_precious_vars; do -+ eval ac_env_${ac_var}_set=\${${ac_var}+set} -+ eval ac_env_${ac_var}_value=\$${ac_var} -+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} -+ eval ac_cv_env_${ac_var}_value=\$${ac_var} -+done -+ -+# -+# Report the --help message. -+# -+if test "$ac_init_help" = "long"; then -+ # Omit some internal or obsolete options to make the list less imposing. -+ # This message is too long to be a string in the A/UX 3.1 sh. -+ cat <<_ACEOF -+\`configure' configures this package to adapt to many kinds of systems. -+ -+Usage: $0 [OPTION]... [VAR=VALUE]... -+ -+To assign environment variables (e.g., CC, CFLAGS...), specify them as -+VAR=VALUE. See below for descriptions of some of the useful variables. -+ -+Defaults for the options are specified in brackets. -+ -+Configuration: -+ -h, --help display this help and exit -+ --help=short display options specific to this package -+ --help=recursive display the short help of all the included packages -+ -V, --version display version information and exit -+ -q, --quiet, --silent do not print \`checking...' messages -+ --cache-file=FILE cache test results in FILE [disabled] -+ -C, --config-cache alias for \`--cache-file=config.cache' -+ -n, --no-create do not create output files -+ --srcdir=DIR find the sources in DIR [configure dir or \`..'] -+ -+Installation directories: -+ --prefix=PREFIX install architecture-independent files in PREFIX -+ [$ac_default_prefix] -+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX -+ [PREFIX] -+ -+By default, \`make install' will install all the files in -+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -+an installation prefix other than \`$ac_default_prefix' using \`--prefix', -+for instance \`--prefix=\$HOME'. -+ -+For better control, use the options below. -+ -+Fine tuning of the installation directories: -+ --bindir=DIR user executables [EPREFIX/bin] -+ --sbindir=DIR system admin executables [EPREFIX/sbin] -+ --libexecdir=DIR program executables [EPREFIX/libexec] -+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] -+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] -+ --localstatedir=DIR modifiable single-machine data [PREFIX/var] -+ --libdir=DIR object code libraries [EPREFIX/lib] -+ --includedir=DIR C header files [PREFIX/include] -+ --oldincludedir=DIR C header files for non-gcc [/usr/include] -+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] -+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR] -+ --infodir=DIR info documentation [DATAROOTDIR/info] -+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale] -+ --mandir=DIR man documentation [DATAROOTDIR/man] -+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] -+ --htmldir=DIR html documentation [DOCDIR] -+ --dvidir=DIR dvi documentation [DOCDIR] -+ --pdfdir=DIR pdf documentation [DOCDIR] -+ --psdir=DIR ps documentation [DOCDIR] -+_ACEOF -+ -+ cat <<\_ACEOF -+_ACEOF -+fi -+ -+if test -n "$ac_init_help"; then -+ -+ cat <<\_ACEOF -+ -+Optional Features: -+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) -+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] -+ --enable-debug turn on debugging, default=no -+ --enable-threads enable multi-threading support -+ --enable-shared turn on shared libraries, default=no -+ -+Optional Packages: -+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] -+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) -+ --with-ansi set full ANSI C mode, default=no -+ --with-archflags set additional architecture flags, default=none -+ --with-docdir set directory for documentation, default=${prefix}/share/doc/mxml -+ --with-vsnprintf use vsnprintf emulation functions, default=auto -+ -+Some influential environment variables: -+ CC C compiler command -+ CFLAGS C compiler flags -+ LDFLAGS linker flags, e.g. -L if you have libraries in a -+ nonstandard directory -+ LIBS libraries to pass to the linker, e.g. -l -+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if -+ you have headers in a nonstandard directory -+ CXX C++ compiler command -+ CXXFLAGS C++ compiler flags -+ CPP C preprocessor -+ -+Use these variables to override the choices made by `configure' or to help -+it to find libraries and programs with nonstandard names/locations. -+ -+_ACEOF -+ac_status=$? -+fi -+ -+if test "$ac_init_help" = "recursive"; then -+ # If there are subdirs, report their specific --help. -+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue -+ test -d "$ac_dir" || continue -+ ac_builddir=. -+ -+case "$ac_dir" in -+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -+*) -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A ".." for each directory in $ac_dir_suffix. -+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` -+ case $ac_top_builddir_sub in -+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; -+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; -+ esac ;; -+esac -+ac_abs_top_builddir=$ac_pwd -+ac_abs_builddir=$ac_pwd$ac_dir_suffix -+# for backward compatibility: -+ac_top_builddir=$ac_top_build_prefix -+ -+case $srcdir in -+ .) # We are building in place. -+ ac_srcdir=. -+ ac_top_srcdir=$ac_top_builddir_sub -+ ac_abs_top_srcdir=$ac_pwd ;; -+ [\\/]* | ?:[\\/]* ) # Absolute name. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir -+ ac_abs_top_srcdir=$srcdir ;; -+ *) # Relative name. -+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_build_prefix$srcdir -+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -+esac -+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -+ -+ cd "$ac_dir" || { ac_status=$?; continue; } -+ # Check for guested configure. -+ if test -f "$ac_srcdir/configure.gnu"; then -+ echo && -+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive -+ elif test -f "$ac_srcdir/configure"; then -+ echo && -+ $SHELL "$ac_srcdir/configure" --help=recursive -+ else -+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 -+ fi || ac_status=$? -+ cd "$ac_pwd" || { ac_status=$?; break; } -+ done -+fi -+ -+test -n "$ac_init_help" && exit $ac_status -+if $ac_init_version; then -+ cat <<\_ACEOF -+configure -+generated by GNU Autoconf 2.61 -+ -+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -+This configure script is free software; the Free Software Foundation -+gives unlimited permission to copy, distribute and modify it. -+_ACEOF -+ exit -+fi -+cat >config.log <<_ACEOF -+This file contains any messages produced by compilers while -+running configure, to aid debugging if configure makes a mistake. -+ -+It was created by $as_me, which was -+generated by GNU Autoconf 2.61. Invocation command line was -+ -+ $ $0 $@ -+ -+_ACEOF -+exec 5>>config.log -+{ -+cat <<_ASUNAME -+## --------- ## -+## Platform. ## -+## --------- ## -+ -+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -+uname -m = `(uname -m) 2>/dev/null || echo unknown` -+uname -r = `(uname -r) 2>/dev/null || echo unknown` -+uname -s = `(uname -s) 2>/dev/null || echo unknown` -+uname -v = `(uname -v) 2>/dev/null || echo unknown` -+ -+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` -+ -+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` -+ -+_ASUNAME -+ -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ echo "PATH: $as_dir" -+done -+IFS=$as_save_IFS -+ -+} >&5 -+ -+cat >&5 <<_ACEOF -+ -+ -+## ----------- ## -+## Core tests. ## -+## ----------- ## -+ -+_ACEOF -+ -+ -+# Keep a trace of the command line. -+# Strip out --no-create and --no-recursion so they do not pile up. -+# Strip out --silent because we don't want to record it for future runs. -+# Also quote any args containing shell meta-characters. -+# Make two passes to allow for proper duplicate-argument suppression. -+ac_configure_args= -+ac_configure_args0= -+ac_configure_args1= -+ac_must_keep_next=false -+for ac_pass in 1 2 -+do -+ for ac_arg -+ do -+ case $ac_arg in -+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ -+ | -silent | --silent | --silen | --sile | --sil) -+ continue ;; -+ *\'*) -+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; -+ esac -+ case $ac_pass in -+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; -+ 2) -+ ac_configure_args1="$ac_configure_args1 '$ac_arg'" -+ if test $ac_must_keep_next = true; then -+ ac_must_keep_next=false # Got value, back to normal. -+ else -+ case $ac_arg in -+ *=* | --config-cache | -C | -disable-* | --disable-* \ -+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ -+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ -+ | -with-* | --with-* | -without-* | --without-* | --x) -+ case "$ac_configure_args0 " in -+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; -+ esac -+ ;; -+ -* ) ac_must_keep_next=true ;; -+ esac -+ fi -+ ac_configure_args="$ac_configure_args '$ac_arg'" -+ ;; -+ esac -+ done -+done -+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } -+ -+# When interrupted or exit'd, cleanup temporary files, and complete -+# config.log. We remove comments because anyway the quotes in there -+# would cause problems or look ugly. -+# WARNING: Use '\'' to represent an apostrophe within the trap. -+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -+trap 'exit_status=$? -+ # Save into config.log some information that might help in debugging. -+ { -+ echo -+ -+ cat <<\_ASBOX -+## ---------------- ## -+## Cache variables. ## -+## ---------------- ## -+_ASBOX -+ echo -+ # The following way of writing the cache mishandles newlines in values, -+( -+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do -+ eval ac_val=\$$ac_var -+ case $ac_val in #( -+ *${as_nl}*) -+ case $ac_var in #( -+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; -+ esac -+ case $ac_var in #( -+ _ | IFS | as_nl) ;; #( -+ *) $as_unset $ac_var ;; -+ esac ;; -+ esac -+ done -+ (set) 2>&1 | -+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( -+ *${as_nl}ac_space=\ *) -+ sed -n \ -+ "s/'\''/'\''\\\\'\'''\''/g; -+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" -+ ;; #( -+ *) -+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" -+ ;; -+ esac | -+ sort -+) -+ echo -+ -+ cat <<\_ASBOX -+## ----------------- ## -+## Output variables. ## -+## ----------------- ## -+_ASBOX -+ echo -+ for ac_var in $ac_subst_vars -+ do -+ eval ac_val=\$$ac_var -+ case $ac_val in -+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; -+ esac -+ echo "$ac_var='\''$ac_val'\''" -+ done | sort -+ echo -+ -+ if test -n "$ac_subst_files"; then -+ cat <<\_ASBOX -+## ------------------- ## -+## File substitutions. ## -+## ------------------- ## -+_ASBOX -+ echo -+ for ac_var in $ac_subst_files -+ do -+ eval ac_val=\$$ac_var -+ case $ac_val in -+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; -+ esac -+ echo "$ac_var='\''$ac_val'\''" -+ done | sort -+ echo -+ fi -+ -+ if test -s confdefs.h; then -+ cat <<\_ASBOX -+## ----------- ## -+## confdefs.h. ## -+## ----------- ## -+_ASBOX -+ echo -+ cat confdefs.h -+ echo -+ fi -+ test "$ac_signal" != 0 && -+ echo "$as_me: caught signal $ac_signal" -+ echo "$as_me: exit $exit_status" -+ } >&5 -+ rm -f core *.core core.conftest.* && -+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files && -+ exit $exit_status -+' 0 -+for ac_signal in 1 2 13 15; do -+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -+done -+ac_signal=0 -+ -+# confdefs.h avoids OS command line length limits that DEFS can exceed. -+rm -f -r conftest* confdefs.h -+ -+# Predefined preprocessor variables. -+ -+cat >>confdefs.h <<_ACEOF -+#define PACKAGE_NAME "$PACKAGE_NAME" -+_ACEOF -+ -+ -+cat >>confdefs.h <<_ACEOF -+#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -+_ACEOF -+ -+ -+cat >>confdefs.h <<_ACEOF -+#define PACKAGE_VERSION "$PACKAGE_VERSION" -+_ACEOF -+ -+ -+cat >>confdefs.h <<_ACEOF -+#define PACKAGE_STRING "$PACKAGE_STRING" -+_ACEOF -+ -+ -+cat >>confdefs.h <<_ACEOF -+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -+_ACEOF -+ -+ -+# Let the site file select an alternate cache file if it wants to. -+# Prefer explicitly selected file to automatically selected ones. -+if test -n "$CONFIG_SITE"; then -+ set x "$CONFIG_SITE" -+elif test "x$prefix" != xNONE; then -+ set x "$prefix/share/config.site" "$prefix/etc/config.site" -+else -+ set x "$ac_default_prefix/share/config.site" \ -+ "$ac_default_prefix/etc/config.site" -+fi -+shift -+for ac_site_file -+do -+ if test -r "$ac_site_file"; then -+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -+echo "$as_me: loading site script $ac_site_file" >&6;} -+ sed 's/^/| /' "$ac_site_file" >&5 -+ . "$ac_site_file" -+ fi -+done -+ -+if test -r "$cache_file"; then -+ # Some versions of bash will fail to source /dev/null (special -+ # files actually), so we avoid doing that. -+ if test -f "$cache_file"; then -+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -+echo "$as_me: loading cache $cache_file" >&6;} -+ case $cache_file in -+ [\\/]* | ?:[\\/]* ) . "$cache_file";; -+ *) . "./$cache_file";; -+ esac -+ fi -+else -+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -+echo "$as_me: creating cache $cache_file" >&6;} -+ >$cache_file -+fi -+ -+# Check that the precious variables saved in the cache have kept the same -+# value. -+ac_cache_corrupted=false -+for ac_var in $ac_precious_vars; do -+ eval ac_old_set=\$ac_cv_env_${ac_var}_set -+ eval ac_new_set=\$ac_env_${ac_var}_set -+ eval ac_old_val=\$ac_cv_env_${ac_var}_value -+ eval ac_new_val=\$ac_env_${ac_var}_value -+ case $ac_old_set,$ac_new_set in -+ set,) -+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} -+ ac_cache_corrupted=: ;; -+ ,set) -+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} -+ ac_cache_corrupted=: ;; -+ ,);; -+ *) -+ if test "x$ac_old_val" != "x$ac_new_val"; then -+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} -+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -+echo "$as_me: former value: $ac_old_val" >&2;} -+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -+echo "$as_me: current value: $ac_new_val" >&2;} -+ ac_cache_corrupted=: -+ fi;; -+ esac -+ # Pass precious variables to config.status. -+ if test "$ac_new_set" = set; then -+ case $ac_new_val in -+ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; -+ *) ac_arg=$ac_var=$ac_new_val ;; -+ esac -+ case " $ac_configure_args " in -+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. -+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; -+ esac -+ fi -+done -+if $ac_cache_corrupted; then -+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -+echo "$as_me: error: changes in the environment can compromise the build" >&2;} -+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ -+ -+ac_config_headers="$ac_config_headers config.h" -+ -+ -+VERSION=2.6 -+ -+cat >>confdefs.h <<_ACEOF -+#define MXML_VERSION "Mini-XML v$VERSION" -+_ACEOF -+ -+ -+CFLAGS="${CFLAGS:=}" -+CXXFLAGS="${CXXFLAGS:=}" -+LDFLAGS="${LDFLAGS:=}" -+ -+OPTIM="" -+ -+ -+ -+# Check whether --with-ansi was given. -+if test "${with_ansi+set}" = set; then -+ withval=$with_ansi; use_ansi="$withval" -+else -+ use_ansi="no" -+fi -+ -+ -+ -+# Check whether --with-archflags was given. -+if test "${with_archflags+set}" = set; then -+ withval=$with_archflags; ARCHFLAGS="$withval" -+else -+ ARCHFLAGS="" -+fi -+ -+ -+ -+# Check whether --enable-debug was given. -+if test "${enable_debug+set}" = set; then -+ enableval=$enable_debug; if eval "test x$enable_debug = xyes"; then -+ OPTIM="-g" -+fi -+fi -+ -+ -+ -+# Check whether --with-docdir was given. -+if test "${with_docdir+set}" = set; then -+ withval=$with_docdir; docdir="$withval" -+else -+ docdir="NONE" -+fi -+ -+ -+ -+ -+ -+# Check whether --with-vsnprintf was given. -+if test "${with_vsnprintf+set}" = set; then -+ withval=$with_vsnprintf; use_vsnprintf="$withval" -+else -+ use_vsnprintf="no" -+fi -+ -+ -+uname=`uname` -+uversion=`uname -r | sed -e '1,$s/[^0-9]//g'` -+if test x$uname = xIRIX64; then -+ uname="IRIX" -+fi -+ -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -+set dummy ${ac_tool_prefix}gcc; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CC"; then -+ ac_cv_prog_CC="$CC" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_CC="${ac_tool_prefix}gcc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ { echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+fi -+if test -z "$ac_cv_prog_CC"; then -+ ac_ct_CC=$CC -+ # Extract the first word of "gcc", so it can be a program name with args. -+set dummy gcc; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_CC"; then -+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_ac_ct_CC="gcc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+ac_ct_CC=$ac_cv_prog_ac_ct_CC -+if test -n "$ac_ct_CC"; then -+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+echo "${ECHO_T}$ac_ct_CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ if test "x$ac_ct_CC" = x; then -+ CC="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&5 -+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+ac_tool_warned=yes ;; -+esac -+ CC=$ac_ct_CC -+ fi -+else -+ CC="$ac_cv_prog_CC" -+fi -+ -+if test -z "$CC"; then -+ if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -+set dummy ${ac_tool_prefix}cc; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CC"; then -+ ac_cv_prog_CC="$CC" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_CC="${ac_tool_prefix}cc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ { echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ fi -+fi -+if test -z "$CC"; then -+ # Extract the first word of "cc", so it can be a program name with args. -+set dummy cc; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CC"; then -+ ac_cv_prog_CC="$CC" # Let the user override the test. -+else -+ ac_prog_rejected=no -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then -+ ac_prog_rejected=yes -+ continue -+ fi -+ ac_cv_prog_CC="cc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+if test $ac_prog_rejected = yes; then -+ # We found a bogon in the path, so make sure we never use it. -+ set dummy $ac_cv_prog_CC -+ shift -+ if test $# != 0; then -+ # We chose a different compiler from the bogus one. -+ # However, it has the same basename, so the bogon will be chosen -+ # first if we set CC to just the basename; use the full file name. -+ shift -+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" -+ fi -+fi -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ { echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+fi -+if test -z "$CC"; then -+ if test -n "$ac_tool_prefix"; then -+ for ac_prog in cl.exe -+ do -+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -+set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CC"; then -+ ac_cv_prog_CC="$CC" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ { echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ test -n "$CC" && break -+ done -+fi -+if test -z "$CC"; then -+ ac_ct_CC=$CC -+ for ac_prog in cl.exe -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_CC"; then -+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_ac_ct_CC="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+ac_ct_CC=$ac_cv_prog_ac_ct_CC -+if test -n "$ac_ct_CC"; then -+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+echo "${ECHO_T}$ac_ct_CC" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ test -n "$ac_ct_CC" && break -+done -+ -+ if test "x$ac_ct_CC" = x; then -+ CC="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&5 -+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+ac_tool_warned=yes ;; -+esac -+ CC=$ac_ct_CC -+ fi -+fi -+ -+fi -+ -+ -+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -+See \`config.log' for more details." >&5 -+echo "$as_me: error: no acceptable C compiler found in \$PATH -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+ -+# Provide some information about the compiler. -+echo "$as_me:$LINENO: checking for C compiler version" >&5 -+ac_compiler=`set X $ac_compile; echo $2` -+{ (ac_try="$ac_compiler --version >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler --version >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (ac_try="$ac_compiler -v >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler -v >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (ac_try="$ac_compiler -V >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler -V >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+ac_clean_files_save=$ac_clean_files -+ac_clean_files="$ac_clean_files a.out a.exe b.out" -+# Try to create an executable without -o first, disregard a.out. -+# It will help us diagnose broken compilers, and finding out an intuition -+# of exeext. -+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } -+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -+# -+# List of possible output files, starting from the most likely. -+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) -+# only as a last resort. b.out is created by i960 compilers. -+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' -+# -+# The IRIX 6 linker writes into existing files which may not be -+# executable, retaining their permissions. Remove them first so a -+# subsequent execution test works. -+ac_rmfiles= -+for ac_file in $ac_files -+do -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; -+ * ) ac_rmfiles="$ac_rmfiles $ac_file";; -+ esac -+done -+rm -f $ac_rmfiles -+ -+if { (ac_try="$ac_link_default" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link_default") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -+# in a Makefile. We should not override ac_cv_exeext if it was cached, -+# so that the user can short-circuit this test for compilers unknown to -+# Autoconf. -+for ac_file in $ac_files '' -+do -+ test -f "$ac_file" || continue -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) -+ ;; -+ [ab].out ) -+ # We found the default executable, but exeext='' is most -+ # certainly right. -+ break;; -+ *.* ) -+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; -+ then :; else -+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -+ fi -+ # We set ac_cv_exeext here because the later test for it is not -+ # safe: cross compilers may not add the suffix if given an `-o' -+ # argument, so we may need to know it at that point already. -+ # Even if this section looks crufty: it has the advantage of -+ # actually working. -+ break;; -+ * ) -+ break;; -+ esac -+done -+test "$ac_cv_exeext" = no && ac_cv_exeext= -+ -+else -+ ac_file='' -+fi -+ -+{ echo "$as_me:$LINENO: result: $ac_file" >&5 -+echo "${ECHO_T}$ac_file" >&6; } -+if test -z "$ac_file"; then -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -+See \`config.log' for more details." >&5 -+echo "$as_me: error: C compiler cannot create executables -+See \`config.log' for more details." >&2;} -+ { (exit 77); exit 77; }; } -+fi -+ -+ac_exeext=$ac_cv_exeext -+ -+# Check that the compiler produces executables we can run. If not, either -+# the compiler is broken, or we cross compile. -+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } -+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -+# If not cross compiling, check that we can run a simple program. -+if test "$cross_compiling" != yes; then -+ if { ac_try='./$ac_file' -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_try") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ cross_compiling=no -+ else -+ if test "$cross_compiling" = maybe; then -+ cross_compiling=yes -+ else -+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -+If you meant to cross compile, use \`--host'. -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot run C compiled programs. -+If you meant to cross compile, use \`--host'. -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ fi -+fi -+{ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ -+rm -f a.out a.exe conftest$ac_cv_exeext b.out -+ac_clean_files=$ac_clean_files_save -+# Check that the compiler produces executables we can run. If not, either -+# the compiler is broken, or we cross compile. -+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } -+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 -+echo "${ECHO_T}$cross_compiling" >&6; } -+ -+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 -+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ # If both `conftest.exe' and `conftest' are `present' (well, observable) -+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -+# work properly (i.e., refer to `conftest.exe'), while it won't with -+# `rm'. -+for ac_file in conftest.exe conftest conftest.*; do -+ test -f "$ac_file" || continue -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; -+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -+ break;; -+ * ) break;; -+ esac -+done -+else -+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+rm -f conftest$ac_cv_exeext -+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -+echo "${ECHO_T}$ac_cv_exeext" >&6; } -+ -+rm -f conftest.$ac_ext -+EXEEXT=$ac_cv_exeext -+ac_exeext=$EXEEXT -+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 -+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } -+if test "${ac_cv_objext+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.o conftest.obj -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ for ac_file in conftest.o conftest.obj conftest.*; do -+ test -f "$ac_file" || continue; -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; -+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` -+ break;; -+ esac -+done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute suffix of object files: cannot compile -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+rm -f conftest.$ac_cv_objext conftest.$ac_ext -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -+echo "${ECHO_T}$ac_cv_objext" >&6; } -+OBJEXT=$ac_cv_objext -+ac_objext=$OBJEXT -+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } -+if test "${ac_cv_c_compiler_gnu+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+#ifndef __GNUC__ -+ choke me -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_compiler_gnu=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_compiler_gnu=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ac_cv_c_compiler_gnu=$ac_compiler_gnu -+ -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } -+GCC=`test $ac_compiler_gnu = yes && echo yes` -+ac_test_CFLAGS=${CFLAGS+set} -+ac_save_CFLAGS=$CFLAGS -+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } -+if test "${ac_cv_prog_cc_g+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_save_c_werror_flag=$ac_c_werror_flag -+ ac_c_werror_flag=yes -+ ac_cv_prog_cc_g=no -+ CFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cc_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ CFLAGS="" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_c_werror_flag=$ac_save_c_werror_flag -+ CFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cc_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ ac_c_werror_flag=$ac_save_c_werror_flag -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } -+if test "$ac_test_CFLAGS" = set; then -+ CFLAGS=$ac_save_CFLAGS -+elif test $ac_cv_prog_cc_g = yes; then -+ if test "$GCC" = yes; then -+ CFLAGS="-g -O2" -+ else -+ CFLAGS="-g" -+ fi -+else -+ if test "$GCC" = yes; then -+ CFLAGS="-O2" -+ else -+ CFLAGS= -+ fi -+fi -+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } -+if test "${ac_cv_prog_cc_c89+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_prog_cc_c89=no -+ac_save_CC=$CC -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+#include -+#include -+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -+struct buf { int x; }; -+FILE * (*rcsopen) (struct buf *, struct stat *, int); -+static char *e (p, i) -+ char **p; -+ int i; -+{ -+ return p[i]; -+} -+static char *f (char * (*g) (char **, int), char **p, ...) -+{ -+ char *s; -+ va_list v; -+ va_start (v,p); -+ s = g (p, va_arg (v,int)); -+ va_end (v); -+ return s; -+} -+ -+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has -+ function prototypes and stuff, but not '\xHH' hex character constants. -+ These don't provoke an error unfortunately, instead are silently treated -+ as 'x'. The following induces an error, until -std is added to get -+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an -+ array size at least. It's necessary to write '\x00'==0 to get something -+ that's true only with -std. */ -+int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -+ -+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters -+ inside strings and character constants. */ -+#define FOO(x) 'x' -+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; -+ -+int test (int i, double x); -+struct s1 {int (*f) (int a);}; -+struct s2 {int (*f) (double a);}; -+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -+int argc; -+char **argv; -+int -+main () -+{ -+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; -+ ; -+ return 0; -+} -+_ACEOF -+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -+do -+ CC="$ac_save_CC $ac_arg" -+ rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cc_c89=$ac_arg -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext -+ test "x$ac_cv_prog_cc_c89" != "xno" && break -+done -+rm -f conftest.$ac_ext -+CC=$ac_save_CC -+ -+fi -+# AC_CACHE_VAL -+case "x$ac_cv_prog_cc_c89" in -+ x) -+ { echo "$as_me:$LINENO: result: none needed" >&5 -+echo "${ECHO_T}none needed" >&6; } ;; -+ xno) -+ { echo "$as_me:$LINENO: result: unsupported" >&5 -+echo "${ECHO_T}unsupported" >&6; } ;; -+ *) -+ CC="$CC $ac_cv_prog_cc_c89" -+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; -+esac -+ -+ -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ac_ext=cpp -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+if test -z "$CXX"; then -+ if test -n "$CCC"; then -+ CXX=$CCC -+ else -+ if test -n "$ac_tool_prefix"; then -+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -+ do -+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -+set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CXX"; then -+ ac_cv_prog_CXX="$CXX" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+CXX=$ac_cv_prog_CXX -+if test -n "$CXX"; then -+ { echo "$as_me:$LINENO: result: $CXX" >&5 -+echo "${ECHO_T}$CXX" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ test -n "$CXX" && break -+ done -+fi -+if test -z "$CXX"; then -+ ac_ct_CXX=$CXX -+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_CXX"; then -+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_ac_ct_CXX="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -+if test -n "$ac_ct_CXX"; then -+ { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -+echo "${ECHO_T}$ac_ct_CXX" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ test -n "$ac_ct_CXX" && break -+done -+ -+ if test "x$ac_ct_CXX" = x; then -+ CXX="g++" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&5 -+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+ac_tool_warned=yes ;; -+esac -+ CXX=$ac_ct_CXX -+ fi -+fi -+ -+ fi -+fi -+# Provide some information about the compiler. -+echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -+ac_compiler=`set X $ac_compile; echo $2` -+{ (ac_try="$ac_compiler --version >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler --version >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (ac_try="$ac_compiler -v >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler -v >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (ac_try="$ac_compiler -V >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compiler -V >&5") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ -+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } -+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+#ifndef __GNUC__ -+ choke me -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_compiler_gnu=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_compiler_gnu=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu -+ -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } -+GXX=`test $ac_compiler_gnu = yes && echo yes` -+ac_test_CXXFLAGS=${CXXFLAGS+set} -+ac_save_CXXFLAGS=$CXXFLAGS -+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } -+if test "${ac_cv_prog_cxx_g+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag -+ ac_cxx_werror_flag=yes -+ ac_cv_prog_cxx_g=no -+ CXXFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cxx_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ CXXFLAGS="" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag -+ CXXFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cxx_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } -+if test "$ac_test_CXXFLAGS" = set; then -+ CXXFLAGS=$ac_save_CXXFLAGS -+elif test $ac_cv_prog_cxx_g = yes; then -+ if test "$GXX" = yes; then -+ CXXFLAGS="-g -O2" -+ else -+ CXXFLAGS="-g" -+ fi -+else -+ if test "$GXX" = yes; then -+ CXXFLAGS="-O2" -+ else -+ CXXFLAGS= -+ fi -+fi -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ac_aux_dir= -+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do -+ if test -f "$ac_dir/install-sh"; then -+ ac_aux_dir=$ac_dir -+ ac_install_sh="$ac_aux_dir/install-sh -c" -+ break -+ elif test -f "$ac_dir/install.sh"; then -+ ac_aux_dir=$ac_dir -+ ac_install_sh="$ac_aux_dir/install.sh -c" -+ break -+ elif test -f "$ac_dir/shtool"; then -+ ac_aux_dir=$ac_dir -+ ac_install_sh="$ac_aux_dir/shtool install -c" -+ break -+ fi -+done -+if test -z "$ac_aux_dir"; then -+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+# These three variables are undocumented and unsupported, -+# and are intended to be withdrawn in a future Autoconf release. -+# They can cause serious problems if a builder's source tree is in a directory -+# whose full name contains unusual characters. -+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -+ -+ -+# Find a good install program. We prefer a C program (faster), -+# so one script is as good as another. But avoid the broken or -+# incompatible versions: -+# SysV /etc/install, /usr/sbin/install -+# SunOS /usr/etc/install -+# IRIX /sbin/install -+# AIX /bin/install -+# AmigaOS /C/install, which installs bootblocks on floppy discs -+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -+# AFS /usr/afsws/bin/install, which mishandles nonexistent args -+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -+# OS/2's system install, which has a completely different semantic -+# ./install, which can be erroneously created by make from ./install.sh. -+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } -+if test -z "$INSTALL"; then -+if test "${ac_cv_path_install+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ # Account for people who put trailing slashes in PATH elements. -+case $as_dir/ in -+ ./ | .// | /cC/* | \ -+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ -+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ -+ /usr/ucb/* ) ;; -+ *) -+ # OSF1 and SCO ODT 3.0 have their own names for install. -+ # Don't use installbsd from OSF since it installs stuff as root -+ # by default. -+ for ac_prog in ginstall scoinst install; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then -+ if test $ac_prog = install && -+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then -+ # AIX install. It has an incompatible calling convention. -+ : -+ elif test $ac_prog = install && -+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then -+ # program-specific install script used by HP pwplus--don't use. -+ : -+ else -+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -+ break 3 -+ fi -+ fi -+ done -+ done -+ ;; -+esac -+done -+IFS=$as_save_IFS -+ -+ -+fi -+ if test "${ac_cv_path_install+set}" = set; then -+ INSTALL=$ac_cv_path_install -+ else -+ # As a last resort, use the slow shell script. Don't cache a -+ # value for INSTALL within a source directory, because that will -+ # break other packages using the cache if that directory is -+ # removed, or if the value is a relative name. -+ INSTALL=$ac_install_sh -+ fi -+fi -+{ echo "$as_me:$LINENO: result: $INSTALL" >&5 -+echo "${ECHO_T}$INSTALL" >&6; } -+ -+# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -+# It thinks the first close brace ends the variable substitution. -+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' -+ -+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' -+ -+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -+ -+if test "$INSTALL" = "$ac_install_sh"; then -+ # Use full path to install-sh script... -+ INSTALL="`pwd`/install-sh -c" -+fi -+if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -+set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$RANLIB"; then -+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+RANLIB=$ac_cv_prog_RANLIB -+if test -n "$RANLIB"; then -+ { echo "$as_me:$LINENO: result: $RANLIB" >&5 -+echo "${ECHO_T}$RANLIB" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+fi -+if test -z "$ac_cv_prog_RANLIB"; then -+ ac_ct_RANLIB=$RANLIB -+ # Extract the first word of "ranlib", so it can be a program name with args. -+set dummy ranlib; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_RANLIB"; then -+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -+else -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_prog_ac_ct_RANLIB="ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+fi -+fi -+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -+if test -n "$ac_ct_RANLIB"; then -+ { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -+echo "${ECHO_T}$ac_ct_RANLIB" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ if test "x$ac_ct_RANLIB" = x; then -+ RANLIB=":" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&5 -+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -+whose name does not start with the host triplet. If you think this -+configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+ac_tool_warned=yes ;; -+esac -+ RANLIB=$ac_ct_RANLIB -+ fi -+else -+ RANLIB="$ac_cv_prog_RANLIB" -+fi -+ -+# Extract the first word of "ar", so it can be a program name with args. -+set dummy ar; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_path_AR+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $AR in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_AR="$AR" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+AR=$ac_cv_path_AR -+if test -n "$AR"; then -+ { echo "$as_me:$LINENO: result: $AR" >&5 -+echo "${ECHO_T}$AR" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+# Extract the first word of "cp", so it can be a program name with args. -+set dummy cp; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_path_CP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $CP in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_CP="$CP" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+CP=$ac_cv_path_CP -+if test -n "$CP"; then -+ { echo "$as_me:$LINENO: result: $CP" >&5 -+echo "${ECHO_T}$CP" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+# Extract the first word of "ln", so it can be a program name with args. -+set dummy ln; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_path_LN+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $LN in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_LN="$LN" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_LN="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+LN=$ac_cv_path_LN -+if test -n "$LN"; then -+ { echo "$as_me:$LINENO: result: $LN" >&5 -+echo "${ECHO_T}$LN" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+# Extract the first word of "mkdir", so it can be a program name with args. -+set dummy mkdir; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_path_MKDIR+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $MKDIR in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_MKDIR="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+MKDIR=$ac_cv_path_MKDIR -+if test -n "$MKDIR"; then -+ { echo "$as_me:$LINENO: result: $MKDIR" >&5 -+echo "${ECHO_T}$MKDIR" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+# Extract the first word of "rm", so it can be a program name with args. -+set dummy rm; ac_word=$2 -+{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -+if test "${ac_cv_path_RM+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $RM in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_RM="$RM" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+RM=$ac_cv_path_RM -+if test -n "$RM"; then -+ { echo "$as_me:$LINENO: result: $RM" >&5 -+echo "${ECHO_T}$RM" >&6; } -+else -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+fi -+ -+ -+ -+case "$uname" in -+ Darwin* | *BSD*) -+ ARFLAGS="-rcv" -+ ;; -+ *) -+ ARFLAGS="crvs" -+ ;; -+esac -+ -+ -+ -+ -+{ echo "$as_me:$LINENO: checking for inline" >&5 -+echo $ECHO_N "checking for inline... $ECHO_C" >&6; } -+if test "${ac_cv_c_inline+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_c_inline=no -+for ac_kw in inline __inline__ __inline; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifndef __cplusplus -+typedef int foo_t; -+static $ac_kw foo_t static_foo () {return 0; } -+$ac_kw foo_t foo () {return 0; } -+#endif -+ -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_c_inline=$ac_kw -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ test "$ac_cv_c_inline" != no && break -+done -+ -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 -+echo "${ECHO_T}$ac_cv_c_inline" >&6; } -+ -+ -+case $ac_cv_c_inline in -+ inline | yes) ;; -+ *) -+ case $ac_cv_c_inline in -+ no) ac_val=;; -+ *) ac_val=$ac_cv_c_inline;; -+ esac -+ cat >>confdefs.h <<_ACEOF -+#ifndef __cplusplus -+#define inline $ac_val -+#endif -+_ACEOF -+ ;; -+esac -+ -+ -+if test "x$use_ansi" != xyes; then -+ -+for ac_func in strdup -+do -+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -+{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+/* Define $ac_func to an innocuous variant, in case declares $ac_func. -+ For example, HP-UX 11i declares gettimeofday. */ -+#define $ac_func innocuous_$ac_func -+ -+/* System header to define __stub macros and hopefully few prototypes, -+ which can conflict with char $ac_func (); below. -+ Prefer to if __STDC__ is defined, since -+ exists even on freestanding compilers. */ -+ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ -+#undef $ac_func -+ -+/* Override any GCC internal prototype to avoid an error. -+ Use char because int might match the return type of a GCC -+ builtin and then its argument prototype would still apply. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+char $ac_func (); -+/* The GNU C library defines this for functions which it implements -+ to always fail with ENOSYS. Some functions are actually named -+ something starting with __ and the normal name is an alias. */ -+#if defined __stub_$ac_func || defined __stub___$ac_func -+choke me -+#endif -+ -+int -+main () -+{ -+return $ac_func (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && -+ $as_test_x conftest$ac_exeext; then -+ eval "$as_ac_var=yes" -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ eval "$as_ac_var=no" -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+ac_res=`eval echo '${'$as_ac_var'}'` -+ { echo "$as_me:$LINENO: result: $ac_res" >&5 -+echo "${ECHO_T}$ac_res" >&6; } -+if test `eval echo '${'$as_ac_var'}'` = yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+done -+ -+fi -+ -+if test "x$use_vsnprintf" != xyes; then -+ -+ -+for ac_func in snprintf vsnprintf -+do -+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -+{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+/* Define $ac_func to an innocuous variant, in case declares $ac_func. -+ For example, HP-UX 11i declares gettimeofday. */ -+#define $ac_func innocuous_$ac_func -+ -+/* System header to define __stub macros and hopefully few prototypes, -+ which can conflict with char $ac_func (); below. -+ Prefer to if __STDC__ is defined, since -+ exists even on freestanding compilers. */ -+ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ -+#undef $ac_func -+ -+/* Override any GCC internal prototype to avoid an error. -+ Use char because int might match the return type of a GCC -+ builtin and then its argument prototype would still apply. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+char $ac_func (); -+/* The GNU C library defines this for functions which it implements -+ to always fail with ENOSYS. Some functions are actually named -+ something starting with __ and the normal name is an alias. */ -+#if defined __stub_$ac_func || defined __stub___$ac_func -+choke me -+#endif -+ -+int -+main () -+{ -+return $ac_func (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && -+ $as_test_x conftest$ac_exeext; then -+ eval "$as_ac_var=yes" -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ eval "$as_ac_var=no" -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+ac_res=`eval echo '${'$as_ac_var'}'` -+ { echo "$as_me:$LINENO: result: $ac_res" >&5 -+echo "${ECHO_T}$ac_res" >&6; } -+if test `eval echo '${'$as_ac_var'}'` = yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+done -+ -+fi -+ -+{ echo "$as_me:$LINENO: checking for long long int" >&5 -+echo $ECHO_N "checking for long long int... $ECHO_C" >&6; } -+if test "${ac_cv_c_long_long+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test "$GCC" = yes; then -+ ac_cv_c_long_long=yes -+ else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+long long int i; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_c_long_long=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cv_c_long_long=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ fi -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_c_long_long" >&5 -+echo "${ECHO_T}$ac_cv_c_long_long" >&6; } -+ -+if test $ac_cv_c_long_long = yes; then -+ cat >>confdefs.h <<\_ACEOF -+#define HAVE_LONG_LONG 1 -+_ACEOF -+ -+fi -+ -+# Check whether --enable-threads was given. -+if test "${enable_threads+set}" = set; then -+ enableval=$enable_threads; -+fi -+ -+ -+have_pthread=no -+PTHREAD_FLAGS="" -+PTHREAD_LIBS="" -+ -+if test "x$enable_threads" != xno; then -+ ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } -+# On Suns, sometimes $CPP names a directory. -+if test -n "$CPP" && test -d "$CPP"; then -+ CPP= -+fi -+if test -z "$CPP"; then -+ if test "${ac_cv_prog_CPP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # Double quotes because CPP needs to be expanded -+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" -+ do -+ ac_preproc_ok=false -+for ac_c_preproc_warn_flag in '' yes -+do -+ # Use a header file that comes with gcc, so configuring glibc -+ # with a fresh cross-compiler works. -+ # Prefer to if __STDC__ is defined, since -+ # exists even on freestanding compilers. -+ # On the NeXT, cc -E runs the code through the compiler's parser, -+ # not just through cpp. "Syntax error" is here to catch this case. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (ac_try="$ac_cpp conftest.$ac_ext" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether nonexistent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (ac_try="$ac_cpp conftest.$ac_ext" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f conftest.err conftest.$ac_ext -+if $ac_preproc_ok; then -+ break -+fi -+ -+ done -+ ac_cv_prog_CPP=$CPP -+ -+fi -+ CPP=$ac_cv_prog_CPP -+else -+ ac_cv_prog_CPP=$CPP -+fi -+{ echo "$as_me:$LINENO: result: $CPP" >&5 -+echo "${ECHO_T}$CPP" >&6; } -+ac_preproc_ok=false -+for ac_c_preproc_warn_flag in '' yes -+do -+ # Use a header file that comes with gcc, so configuring glibc -+ # with a fresh cross-compiler works. -+ # Prefer to if __STDC__ is defined, since -+ # exists even on freestanding compilers. -+ # On the NeXT, cc -E runs the code through the compiler's parser, -+ # not just through cpp. "Syntax error" is here to catch this case. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (ac_try="$ac_cpp conftest.$ac_ext" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether nonexistent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (ac_try="$ac_cpp conftest.$ac_ext" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f conftest.err conftest.$ac_ext -+if $ac_preproc_ok; then -+ : -+else -+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -+See \`config.log' for more details." >&5 -+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ -+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } -+if test "${ac_cv_path_GREP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # Extract the first word of "grep ggrep" to use in msg output -+if test -z "$GREP"; then -+set dummy grep ggrep; ac_prog_name=$2 -+if test "${ac_cv_path_GREP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_path_GREP_found=false -+# Loop through the user's path and test for each of PROGNAME-LIST -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_prog in grep ggrep; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" -+ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -+ # Check for GNU ac_path_GREP and select it if it is found. -+ # Check for GNU $ac_path_GREP -+case `"$ac_path_GREP" --version 2>&1` in -+*GNU*) -+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -+*) -+ ac_count=0 -+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" -+ while : -+ do -+ cat "conftest.in" "conftest.in" >"conftest.tmp" -+ mv "conftest.tmp" "conftest.in" -+ cp "conftest.in" "conftest.nl" -+ echo 'GREP' >> "conftest.nl" -+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break -+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break -+ ac_count=`expr $ac_count + 1` -+ if test $ac_count -gt ${ac_path_GREP_max-0}; then -+ # Best one so far, save it but keep looking for a better one -+ ac_cv_path_GREP="$ac_path_GREP" -+ ac_path_GREP_max=$ac_count -+ fi -+ # 10*(2^10) chars as input seems more than enough -+ test $ac_count -gt 10 && break -+ done -+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -+esac -+ -+ -+ $ac_path_GREP_found && break 3 -+ done -+done -+ -+done -+IFS=$as_save_IFS -+ -+ -+fi -+ -+GREP="$ac_cv_path_GREP" -+if test -z "$GREP"; then -+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+else -+ ac_cv_path_GREP=$GREP -+fi -+ -+ -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -+echo "${ECHO_T}$ac_cv_path_GREP" >&6; } -+ GREP="$ac_cv_path_GREP" -+ -+ -+{ echo "$as_me:$LINENO: checking for egrep" >&5 -+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } -+if test "${ac_cv_path_EGREP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 -+ then ac_cv_path_EGREP="$GREP -E" -+ else -+ # Extract the first word of "egrep" to use in msg output -+if test -z "$EGREP"; then -+set dummy egrep; ac_prog_name=$2 -+if test "${ac_cv_path_EGREP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_path_EGREP_found=false -+# Loop through the user's path and test for each of PROGNAME-LIST -+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_prog in egrep; do -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" -+ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -+ # Check for GNU ac_path_EGREP and select it if it is found. -+ # Check for GNU $ac_path_EGREP -+case `"$ac_path_EGREP" --version 2>&1` in -+*GNU*) -+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -+*) -+ ac_count=0 -+ echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" -+ while : -+ do -+ cat "conftest.in" "conftest.in" >"conftest.tmp" -+ mv "conftest.tmp" "conftest.in" -+ cp "conftest.in" "conftest.nl" -+ echo 'EGREP' >> "conftest.nl" -+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break -+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break -+ ac_count=`expr $ac_count + 1` -+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then -+ # Best one so far, save it but keep looking for a better one -+ ac_cv_path_EGREP="$ac_path_EGREP" -+ ac_path_EGREP_max=$ac_count -+ fi -+ # 10*(2^10) chars as input seems more than enough -+ test $ac_count -gt 10 && break -+ done -+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -+esac -+ -+ -+ $ac_path_EGREP_found && break 3 -+ done -+done -+ -+done -+IFS=$as_save_IFS -+ -+ -+fi -+ -+EGREP="$ac_cv_path_EGREP" -+if test -z "$EGREP"; then -+ { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+else -+ ac_cv_path_EGREP=$EGREP -+fi -+ -+ -+ fi -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } -+ EGREP="$ac_cv_path_EGREP" -+ -+ -+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } -+if test "${ac_cv_header_stdc+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+#include -+#include -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_header_stdc=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cv_header_stdc=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+if test $ac_cv_header_stdc = yes; then -+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+ -+_ACEOF -+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | -+ $EGREP "memchr" >/dev/null 2>&1; then -+ : -+else -+ ac_cv_header_stdc=no -+fi -+rm -f conftest* -+ -+fi -+ -+if test $ac_cv_header_stdc = yes; then -+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+ -+_ACEOF -+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | -+ $EGREP "free" >/dev/null 2>&1; then -+ : -+else -+ ac_cv_header_stdc=no -+fi -+rm -f conftest* -+ -+fi -+ -+if test $ac_cv_header_stdc = yes; then -+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -+ if test "$cross_compiling" = yes; then -+ : -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+#if ((' ' & 0x0FF) == 0x020) -+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -+#else -+# define ISLOWER(c) \ -+ (('a' <= (c) && (c) <= 'i') \ -+ || ('j' <= (c) && (c) <= 'r') \ -+ || ('s' <= (c) && (c) <= 'z')) -+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -+#endif -+ -+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -+int -+main () -+{ -+ int i; -+ for (i = 0; i < 256; i++) -+ if (XOR (islower (i), ISLOWER (i)) -+ || toupper (i) != TOUPPER (i)) -+ return 2; -+ return 0; -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_try") 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ : -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+ac_cv_header_stdc=no -+fi -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+ -+ -+fi -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -+echo "${ECHO_T}$ac_cv_header_stdc" >&6; } -+if test $ac_cv_header_stdc = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define STDC_HEADERS 1 -+_ACEOF -+ -+fi -+ -+# On IRIX 5.3, sys/types and inttypes.h are conflicting. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ -+ inttypes.h stdint.h unistd.h -+do -+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -+{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+ -+#include <$ac_header> -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ eval "$as_ac_Header=yes" -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ eval "$as_ac_Header=no" -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ac_res=`eval echo '${'$as_ac_Header'}'` -+ { echo "$as_me:$LINENO: result: $ac_res" >&5 -+echo "${ECHO_T}$ac_res" >&6; } -+if test `eval echo '${'$as_ac_Header'}'` = yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+ -+done -+ -+ -+if test "${ac_cv_header_pthread_h+set}" = set; then -+ { echo "$as_me:$LINENO: checking for pthread.h" >&5 -+echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6; } -+if test "${ac_cv_header_pthread_h+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_header_pthread_h" >&5 -+echo "${ECHO_T}$ac_cv_header_pthread_h" >&6; } -+else -+ # Is the header compilable? -+{ echo "$as_me:$LINENO: checking pthread.h usability" >&5 -+echo $ECHO_N "checking pthread.h usability... $ECHO_C" >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+#include -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_header_compiler=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_header_compiler=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -+echo "${ECHO_T}$ac_header_compiler" >&6; } -+ -+# Is the header present? -+{ echo "$as_me:$LINENO: checking pthread.h presence" >&5 -+echo $ECHO_N "checking pthread.h presence... $ECHO_C" >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (ac_try="$ac_cpp conftest.$ac_ext" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ ac_header_preproc=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_header_preproc=no -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -+echo "${ECHO_T}$ac_header_preproc" >&6; } -+ -+# So? What about this header? -+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in -+ yes:no: ) -+ { echo "$as_me:$LINENO: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&5 -+echo "$as_me: WARNING: pthread.h: accepted by the compiler, rejected by the preprocessor!" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the compiler's result" >&5 -+echo "$as_me: WARNING: pthread.h: proceeding with the compiler's result" >&2;} -+ ac_header_preproc=yes -+ ;; -+ no:yes:* ) -+ { echo "$as_me:$LINENO: WARNING: pthread.h: present but cannot be compiled" >&5 -+echo "$as_me: WARNING: pthread.h: present but cannot be compiled" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: check for missing prerequisite headers?" >&5 -+echo "$as_me: WARNING: pthread.h: check for missing prerequisite headers?" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: see the Autoconf documentation" >&5 -+echo "$as_me: WARNING: pthread.h: see the Autoconf documentation" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&5 -+echo "$as_me: WARNING: pthread.h: section \"Present But Cannot Be Compiled\"" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: proceeding with the preprocessor's result" >&5 -+echo "$as_me: WARNING: pthread.h: proceeding with the preprocessor's result" >&2;} -+ { echo "$as_me:$LINENO: WARNING: pthread.h: in the future, the compiler will take precedence" >&5 -+echo "$as_me: WARNING: pthread.h: in the future, the compiler will take precedence" >&2;} -+ -+ ;; -+esac -+{ echo "$as_me:$LINENO: checking for pthread.h" >&5 -+echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6; } -+if test "${ac_cv_header_pthread_h+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_header_pthread_h=$ac_header_preproc -+fi -+{ echo "$as_me:$LINENO: result: $ac_cv_header_pthread_h" >&5 -+echo "${ECHO_T}$ac_cv_header_pthread_h" >&6; } -+ -+fi -+if test $ac_cv_header_pthread_h = yes; then -+ cat >>confdefs.h <<\_ACEOF -+#define HAVE_PTHREAD_H 1 -+_ACEOF -+ -+fi -+ -+ -+ -+ if test x$ac_cv_header_pthread_h = xyes; then -+ for flag in -lpthreads -lpthread -pthread; do -+ { echo "$as_me:$LINENO: checking for pthread_create using $flag" >&5 -+echo $ECHO_N "checking for pthread_create using $flag... $ECHO_C" >&6; } -+ SAVELIBS="$LIBS" -+ LIBS="$flag $LIBS" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+int -+main () -+{ -+pthread_create(0, 0, 0, 0); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 -+ (eval "$ac_link") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && -+ $as_test_x conftest$ac_exeext; then -+ have_pthread=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ -+ conftest$ac_exeext conftest.$ac_ext -+ { echo "$as_me:$LINENO: result: $have_pthread" >&5 -+echo "${ECHO_T}$have_pthread" >&6; } -+ LIBS="$SAVELIBS" -+ -+ if test $have_pthread = yes; then -+ PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" -+ PTHREAD_LIBS="$flag" -+ -+ # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to -+ # be POSIX-compliant... :( -+ if test $uname = SunOS; then -+ PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" -+ fi -+ break -+ fi -+ done -+ fi -+fi -+ -+ -+ -+ -+DSO="${DSO:=:}" -+DSOFLAGS="${DSOFLAGS:=}" -+ -+# Check whether --enable-shared was given. -+if test "${enable_shared+set}" = set; then -+ enableval=$enable_shared; -+fi -+ -+ -+if test x$enable_shared = xyes; then -+ { echo "$as_me:$LINENO: checking for shared library support" >&5 -+echo $ECHO_N "checking for shared library support... $ECHO_C" >&6; } -+ PICFLAG=1 -+ -+ case "$uname" in -+ SunOS* | UNIX_S*) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-h,libmxml.so.1 -G -R\$(libdir) \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -R\$(libdir)" -+ ;; -+ -+ HP-UX*) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.sl.1" -+ DSO="ld" -+ DSOFLAGS="$DSOFLAGS -b -z +h libmxml.sl.1 +s +b \$(libdir)" -+ LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)" -+ ;; -+ -+ IRIX) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi1.0,-soname,libmxml.so.1 -shared \$(OPTIM)" -+ ;; -+ -+ OSF1* | Linux | GNU) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)" -+ ;; -+ -+ *BSD*) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-R\$(libdir) -shared \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)" -+ ;; -+ -+ Darwin*) -+ { echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6; } -+ LIBMXML="libmxml.1.dylib" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc" -+ ;; -+ -+ *) -+ { echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6; } -+ { echo "$as_me:$LINENO: WARNING: shared libraries not supported on this platform." >&5 -+echo "$as_me: WARNING: shared libraries not supported on this platform." >&2;} -+ PICFLAG=0 -+ LIBMXML="libmxml.a" -+ ;; -+ esac -+else -+ PICFLAG=0 -+ LIBMXML="libmxml.a" -+fi -+ -+ -+ -+ -+ -+ -+if test -n "$GCC"; then -+ CFLAGS="-Wall $CFLAGS" -+ -+ if test "x$OPTIM" = x; then -+ OPTIM="-Os -g" -+ fi -+ -+ if test "x$use_ansi" = xyes; then -+ CFLAGS="-ansi -pedantic $CFLAGS" -+ fi -+ -+ if test $PICFLAG = 1 -a $uname != AIX; then -+ OPTIM="-fPIC $OPTIM" -+ fi -+else -+ case $uname in -+ HP-UX*) -+ CFLAGS="-Ae $CFLAGS" -+ -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ -+ OPTIM="+DAportable $OPTIM" -+ -+ if test $PICFLAG = 1; then -+ OPTIM="+z $OPTIM" -+ fi -+ ;; -+ -+ UNIX_SVR* | SunOS*) -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ -+ if test $PICFLAG = 1; then -+ OPTIM="-KPIC $OPTIM" -+ fi -+ ;; -+ -+ *) -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ ;; -+ esac -+fi -+ -+if test "$prefix" = "NONE"; then -+ prefix="/usr/local" -+fi -+ -+if test "$exec_prefix" = "NONE"; then -+ exec_prefix="$prefix" -+fi -+ -+if test "$docdir" = "NONE"; then -+ docdir="$datadir/doc/mxml" -+fi -+ -+if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then -+ case "$uname" in -+ *BSD* | Darwin* | Linux*) -+ # BSD, Darwin (MacOS X), and Linux -+ mandir="/usr/share/man" -+ ;; -+ IRIX*) -+ # SGI IRIX -+ mandir="/usr/share/catman/u_man" -+ ;; -+ *) -+ # All others -+ mandir="/usr/man" -+ ;; -+ esac -+fi -+ -+if test "$includedir" != /usr/include; then -+ PC_CFLAGS="-I$includedir" -+else -+ PC_CFLAGS="" -+fi -+ -+if test "$libdir" != /usr/lib; then -+ PC_LIBS="-L$libdir -lmxml" -+else -+ PC_LIBS="-lmxml" -+fi -+ -+ -+ -+ -+ac_config_files="$ac_config_files Makefile mxml.list mxml.pc" -+ -+cat >confcache <<\_ACEOF -+# This file is a shell script that caches the results of configure -+# tests run on this system so they can be shared between configure -+# scripts and configure runs, see configure's option --config-cache. -+# It is not useful on other systems. If it contains results you don't -+# want to keep, you may remove or edit it. -+# -+# config.status only pays attention to the cache file if you give it -+# the --recheck option to rerun configure. -+# -+# `ac_cv_env_foo' variables (set or unset) will be overridden when -+# loading this file, other *unset* `ac_cv_foo' will be assigned the -+# following values. -+ -+_ACEOF -+ -+# The following way of writing the cache mishandles newlines in values, -+# but we know of no workaround that is simple, portable, and efficient. -+# So, we kill variables containing newlines. -+# Ultrix sh set writes to stderr and can't be redirected directly, -+# and sets the high bit in the cache file unless we assign to the vars. -+( -+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do -+ eval ac_val=\$$ac_var -+ case $ac_val in #( -+ *${as_nl}*) -+ case $ac_var in #( -+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; -+ esac -+ case $ac_var in #( -+ _ | IFS | as_nl) ;; #( -+ *) $as_unset $ac_var ;; -+ esac ;; -+ esac -+ done -+ -+ (set) 2>&1 | -+ case $as_nl`(ac_space=' '; set) 2>&1` in #( -+ *${as_nl}ac_space=\ *) -+ # `set' does not quote correctly, so add quotes (double-quote -+ # substitution turns \\\\ into \\, and sed turns \\ into \). -+ sed -n \ -+ "s/'/'\\\\''/g; -+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" -+ ;; #( -+ *) -+ # `set' quotes correctly as required by POSIX, so do not add quotes. -+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" -+ ;; -+ esac | -+ sort -+) | -+ sed ' -+ /^ac_cv_env_/b end -+ t clear -+ :clear -+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ -+ t end -+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ -+ :end' >>confcache -+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else -+ if test -w "$cache_file"; then -+ test "x$cache_file" != "x/dev/null" && -+ { echo "$as_me:$LINENO: updating cache $cache_file" >&5 -+echo "$as_me: updating cache $cache_file" >&6;} -+ cat confcache >$cache_file -+ else -+ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -+echo "$as_me: not updating unwritable cache $cache_file" >&6;} -+ fi -+fi -+rm -f confcache -+ -+test "x$prefix" = xNONE && prefix=$ac_default_prefix -+# Let make expand exec_prefix. -+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -+ -+DEFS=-DHAVE_CONFIG_H -+ -+ac_libobjs= -+ac_ltlibobjs= -+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue -+ # 1. Remove the extension, and $U if already installed. -+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' -+ ac_i=`echo "$ac_i" | sed "$ac_script"` -+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR -+ # will be set to the directory where LIBOBJS objects are built. -+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" -+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -+done -+LIBOBJS=$ac_libobjs -+ -+LTLIBOBJS=$ac_ltlibobjs -+ -+ -+ -+: ${CONFIG_STATUS=./config.status} -+ac_clean_files_save=$ac_clean_files -+ac_clean_files="$ac_clean_files $CONFIG_STATUS" -+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -+echo "$as_me: creating $CONFIG_STATUS" >&6;} -+cat >$CONFIG_STATUS <<_ACEOF -+#! $SHELL -+# Generated by $as_me. -+# Run this file to recreate the current configuration. -+# Compiler output produced by configure, useful for debugging -+# configure, is in config.log if it exists. -+ -+debug=false -+ac_cs_recheck=false -+ac_cs_silent=false -+SHELL=\${CONFIG_SHELL-$SHELL} -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+## --------------------- ## -+## M4sh Initialization. ## -+## --------------------- ## -+ -+# Be more Bourne compatible -+DUALCASE=1; export DUALCASE # for MKS sh -+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then -+ emulate sh -+ NULLCMD=: -+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which -+ # is contrary to our usage. Disable this feature. -+ alias -g '${1+"$@"}'='"$@"' -+ setopt NO_GLOB_SUBST -+else -+ case `(set -o) 2>/dev/null` in -+ *posix*) set -o posix ;; -+esac -+ -+fi -+ -+ -+ -+ -+# PATH needs CR -+# Avoid depending upon Character Ranges. -+as_cr_letters='abcdefghijklmnopqrstuvwxyz' -+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -+as_cr_Letters=$as_cr_letters$as_cr_LETTERS -+as_cr_digits='0123456789' -+as_cr_alnum=$as_cr_Letters$as_cr_digits -+ -+# The user is always right. -+if test "${PATH_SEPARATOR+set}" != set; then -+ echo "#! /bin/sh" >conf$$.sh -+ echo "exit 0" >>conf$$.sh -+ chmod +x conf$$.sh -+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -+ PATH_SEPARATOR=';' -+ else -+ PATH_SEPARATOR=: -+ fi -+ rm -f conf$$.sh -+fi -+ -+# Support unset when possible. -+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -+ as_unset=unset -+else -+ as_unset=false -+fi -+ -+ -+# IFS -+# We need space, tab and new line, in precisely that order. Quoting is -+# there to prevent editors from complaining about space-tab. -+# (If _AS_PATH_WALK were called with IFS unset, it would disable word -+# splitting by setting IFS to empty value.) -+as_nl=' -+' -+IFS=" "" $as_nl" -+ -+# Find who we are. Look in the path if we contain no directory separator. -+case $0 in -+ *[\\/]* ) as_myself=$0 ;; -+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+# We did not find ourselves, most probably we were run as `sh COMMAND' -+# in which case we are not to be found in the path. -+if test "x$as_myself" = x; then -+ as_myself=$0 -+fi -+if test ! -f "$as_myself"; then -+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 -+ { (exit 1); exit 1; } -+fi -+ -+# Work around bugs in pre-3.0 UWIN ksh. -+for as_var in ENV MAIL MAILPATH -+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+done -+PS1='$ ' -+PS2='> ' -+PS4='+ ' -+ -+# NLS nuisances. -+for as_var in \ -+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -+ LC_TELEPHONE LC_TIME -+do -+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -+ eval $as_var=C; export $as_var -+ else -+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+ fi -+done -+ -+# Required to use basename. -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then -+ as_basename=basename -+else -+ as_basename=false -+fi -+ -+ -+# Name of the executable. -+as_me=`$as_basename -- "$0" || -+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)' \| . 2>/dev/null || -+echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ -+# CDPATH. -+$as_unset CDPATH -+ -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { -+ -+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO -+ # uniformly replaced by the line number. The first 'sed' inserts a -+ # line-number line after each line using $LINENO; the second 'sed' -+ # does the real work. The second script uses 'N' to pair each -+ # line-number line with the line containing $LINENO, and appends -+ # trailing '-' during substitution so that $LINENO is not a special -+ # case at line end. -+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -+ # scripts with optimization help from Paolo Bonzini. Blame Lee -+ # E. McMahon (1931-1989) for sed's syntax. :-) -+ sed -n ' -+ p -+ /[$]LINENO/= -+ ' <$as_myself | -+ sed ' -+ s/[$]LINENO.*/&-/ -+ t lineno -+ b -+ :lineno -+ N -+ :loop -+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ -+ t loop -+ s/-\n.*// -+ ' >$as_me.lineno && -+ chmod +x "$as_me.lineno" || -+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 -+ { (exit 1); exit 1; }; } -+ -+ # Don't try to exec as it changes $[0], causing all sort of problems -+ # (the dirname of $[0] is not the place where we might find the -+ # original and so on. Autoconf is especially sensitive to this). -+ . "./$as_me.lineno" -+ # Exit status is that of the last command. -+ exit -+} -+ -+ -+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then -+ as_dirname=dirname -+else -+ as_dirname=false -+fi -+ -+ECHO_C= ECHO_N= ECHO_T= -+case `echo -n x` in -+-n*) -+ case `echo 'x\c'` in -+ *c*) ECHO_T=' ';; # ECHO_T is single tab character. -+ *) ECHO_C='\c';; -+ esac;; -+*) -+ ECHO_N='-n';; -+esac -+ -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+rm -f conf$$ conf$$.exe conf$$.file -+if test -d conf$$.dir; then -+ rm -f conf$$.dir/conf$$.file -+else -+ rm -f conf$$.dir -+ mkdir conf$$.dir -+fi -+echo >conf$$.file -+if ln -s conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s='ln -s' -+ # ... but there are two gotchas: -+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. -+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -+ # In both cases, we have to default to `cp -p'. -+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -+ as_ln_s='cp -p' -+elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+else -+ as_ln_s='cp -p' -+fi -+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -+rmdir conf$$.dir 2>/dev/null -+ -+if mkdir -p . 2>/dev/null; then -+ as_mkdir_p=: -+else -+ test -d ./-p && rmdir ./-p -+ as_mkdir_p=false -+fi -+ -+if test -x / >/dev/null 2>&1; then -+ as_test_x='test -x' -+else -+ if ls -dL / >/dev/null 2>&1; then -+ as_ls_L_option=L -+ else -+ as_ls_L_option= -+ fi -+ as_test_x=' -+ eval sh -c '\'' -+ if test -d "$1"; then -+ test -d "$1/."; -+ else -+ case $1 in -+ -*)set "./$1";; -+ esac; -+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in -+ ???[sx]*):;;*)false;;esac;fi -+ '\'' sh -+ ' -+fi -+as_executable_p=$as_test_x -+ -+# Sed expression to map a string onto a valid CPP name. -+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -+ -+# Sed expression to map a string onto a valid variable name. -+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -+ -+ -+exec 6>&1 -+ -+# Save the log message, to keep $[0] and so on meaningful, and to -+# report actual input values of CONFIG_FILES etc. instead of their -+# values after options handling. -+ac_log=" -+This file was extended by $as_me, which was -+generated by GNU Autoconf 2.61. Invocation command line was -+ -+ CONFIG_FILES = $CONFIG_FILES -+ CONFIG_HEADERS = $CONFIG_HEADERS -+ CONFIG_LINKS = $CONFIG_LINKS -+ CONFIG_COMMANDS = $CONFIG_COMMANDS -+ $ $0 $@ -+ -+on `(hostname || uname -n) 2>/dev/null | sed 1q` -+" -+ -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<_ACEOF -+# Files that config.status was made for. -+config_files="$ac_config_files" -+config_headers="$ac_config_headers" -+ -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+ac_cs_usage="\ -+\`$as_me' instantiates files from templates according to the -+current configuration. -+ -+Usage: $0 [OPTIONS] [FILE]... -+ -+ -h, --help print this help, then exit -+ -V, --version print version number and configuration settings, then exit -+ -q, --quiet do not print progress messages -+ -d, --debug don't remove temporary files -+ --recheck update $as_me by reconfiguring in the same conditions -+ --file=FILE[:TEMPLATE] -+ instantiate the configuration file FILE -+ --header=FILE[:TEMPLATE] -+ instantiate the configuration header FILE -+ -+Configuration files: -+$config_files -+ -+Configuration headers: -+$config_headers -+ -+Report bugs to ." -+ -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF -+ac_cs_version="\\ -+config.status -+configured by $0, generated by GNU Autoconf 2.61, -+ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -+ -+Copyright (C) 2006 Free Software Foundation, Inc. -+This config.status script is free software; the Free Software Foundation -+gives unlimited permission to copy, distribute and modify it." -+ -+ac_pwd='$ac_pwd' -+srcdir='$srcdir' -+INSTALL='$INSTALL' -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+# If no file are specified by the user, then we need to provide default -+# value. By we need to know if files were specified by the user. -+ac_need_defaults=: -+while test $# != 0 -+do -+ case $1 in -+ --*=*) -+ ac_option=`expr "X$1" : 'X\([^=]*\)='` -+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` -+ ac_shift=: -+ ;; -+ *) -+ ac_option=$1 -+ ac_optarg=$2 -+ ac_shift=shift -+ ;; -+ esac -+ -+ case $ac_option in -+ # Handling of the options. -+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) -+ ac_cs_recheck=: ;; -+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) -+ echo "$ac_cs_version"; exit ;; -+ --debug | --debu | --deb | --de | --d | -d ) -+ debug=: ;; -+ --file | --fil | --fi | --f ) -+ $ac_shift -+ CONFIG_FILES="$CONFIG_FILES $ac_optarg" -+ ac_need_defaults=false;; -+ --header | --heade | --head | --hea ) -+ $ac_shift -+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" -+ ac_need_defaults=false;; -+ --he | --h) -+ # Conflict between --help and --header -+ { echo "$as_me: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&2 -+ { (exit 1); exit 1; }; };; -+ --help | --hel | -h ) -+ echo "$ac_cs_usage"; exit ;; -+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ -+ | -silent | --silent | --silen | --sile | --sil | --si | --s) -+ ac_cs_silent=: ;; -+ -+ # This is an error. -+ -*) { echo "$as_me: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&2 -+ { (exit 1); exit 1; }; } ;; -+ -+ *) ac_config_targets="$ac_config_targets $1" -+ ac_need_defaults=false ;; -+ -+ esac -+ shift -+done -+ -+ac_configure_extra_args= -+ -+if $ac_cs_silent; then -+ exec 6>/dev/null -+ ac_configure_extra_args="$ac_configure_extra_args --silent" -+fi -+ -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF -+if \$ac_cs_recheck; then -+ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 -+ CONFIG_SHELL=$SHELL -+ export CONFIG_SHELL -+ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -+fi -+ -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+exec 5>>config.log -+{ -+ echo -+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -+## Running $as_me. ## -+_ASBOX -+ echo "$ac_log" -+} >&5 -+ -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -+# Handling of arguments. -+for ac_config_target in $ac_config_targets -+do -+ case $ac_config_target in -+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; -+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; -+ "mxml.list") CONFIG_FILES="$CONFIG_FILES mxml.list" ;; -+ "mxml.pc") CONFIG_FILES="$CONFIG_FILES mxml.pc" ;; -+ -+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -+echo "$as_me: error: invalid argument: $ac_config_target" >&2;} -+ { (exit 1); exit 1; }; };; -+ esac -+done -+ -+ -+# If the user did not use the arguments to specify the items to instantiate, -+# then the envvar interface is used. Set only those that are not. -+# We use the long form for the default assignment because of an extremely -+# bizarre bug on SunOS 4.1.3. -+if $ac_need_defaults; then -+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers -+fi -+ -+# Have a temporary directory for convenience. Make it in the build tree -+# simply because there is no reason against having it here, and in addition, -+# creating and moving files from /tmp can sometimes cause problems. -+# Hook for its removal unless debugging. -+# Note that there is a small window in which the directory will not be cleaned: -+# after its creation but before its name has been assigned to `$tmp'. -+$debug || -+{ -+ tmp= -+ trap 'exit_status=$? -+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -+' 0 -+ trap '{ (exit 1); exit 1; }' 1 2 13 15 -+} -+# Create a (secure) tmp directory for tmp files. -+ -+{ -+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && -+ test -n "$tmp" && test -d "$tmp" -+} || -+{ -+ tmp=./conf$$-$RANDOM -+ (umask 077 && mkdir "$tmp") -+} || -+{ -+ echo "$me: cannot create a temporary directory in ." >&2 -+ { (exit 1); exit 1; } -+} -+ -+# -+# Set up the sed scripts for CONFIG_FILES section. -+# -+ -+# No need to generate the scripts if there are no CONFIG_FILES. -+# This happens for instance when ./config.status config.h -+if test -n "$CONFIG_FILES"; then -+ -+_ACEOF -+ -+ -+ -+ac_delim='%!_!# ' -+for ac_last_try in false false false false false :; do -+ cat >conf$$subs.sed <<_ACEOF -+SHELL!$SHELL$ac_delim -+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim -+PACKAGE_NAME!$PACKAGE_NAME$ac_delim -+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim -+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim -+PACKAGE_STRING!$PACKAGE_STRING$ac_delim -+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim -+exec_prefix!$exec_prefix$ac_delim -+prefix!$prefix$ac_delim -+program_transform_name!$program_transform_name$ac_delim -+bindir!$bindir$ac_delim -+sbindir!$sbindir$ac_delim -+libexecdir!$libexecdir$ac_delim -+datarootdir!$datarootdir$ac_delim -+datadir!$datadir$ac_delim -+sysconfdir!$sysconfdir$ac_delim -+sharedstatedir!$sharedstatedir$ac_delim -+localstatedir!$localstatedir$ac_delim -+includedir!$includedir$ac_delim -+oldincludedir!$oldincludedir$ac_delim -+docdir!$docdir$ac_delim -+infodir!$infodir$ac_delim -+htmldir!$htmldir$ac_delim -+dvidir!$dvidir$ac_delim -+pdfdir!$pdfdir$ac_delim -+psdir!$psdir$ac_delim -+libdir!$libdir$ac_delim -+localedir!$localedir$ac_delim -+mandir!$mandir$ac_delim -+DEFS!$DEFS$ac_delim -+ECHO_C!$ECHO_C$ac_delim -+ECHO_N!$ECHO_N$ac_delim -+ECHO_T!$ECHO_T$ac_delim -+LIBS!$LIBS$ac_delim -+build_alias!$build_alias$ac_delim -+host_alias!$host_alias$ac_delim -+target_alias!$target_alias$ac_delim -+VERSION!$VERSION$ac_delim -+LDFLAGS!$LDFLAGS$ac_delim -+OPTIM!$OPTIM$ac_delim -+ARCHFLAGS!$ARCHFLAGS$ac_delim -+CC!$CC$ac_delim -+CFLAGS!$CFLAGS$ac_delim -+CPPFLAGS!$CPPFLAGS$ac_delim -+ac_ct_CC!$ac_ct_CC$ac_delim -+EXEEXT!$EXEEXT$ac_delim -+OBJEXT!$OBJEXT$ac_delim -+CXX!$CXX$ac_delim -+CXXFLAGS!$CXXFLAGS$ac_delim -+ac_ct_CXX!$ac_ct_CXX$ac_delim -+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim -+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim -+INSTALL_DATA!$INSTALL_DATA$ac_delim -+RANLIB!$RANLIB$ac_delim -+AR!$AR$ac_delim -+CP!$CP$ac_delim -+LN!$LN$ac_delim -+MKDIR!$MKDIR$ac_delim -+RM!$RM$ac_delim -+ARFLAGS!$ARFLAGS$ac_delim -+CPP!$CPP$ac_delim -+GREP!$GREP$ac_delim -+EGREP!$EGREP$ac_delim -+PTHREAD_FLAGS!$PTHREAD_FLAGS$ac_delim -+PTHREAD_LIBS!$PTHREAD_LIBS$ac_delim -+DSO!$DSO$ac_delim -+DSOFLAGS!$DSOFLAGS$ac_delim -+LIBMXML!$LIBMXML$ac_delim -+PICFLAG!$PICFLAG$ac_delim -+PC_CFLAGS!$PC_CFLAGS$ac_delim -+PC_LIBS!$PC_LIBS$ac_delim -+LIBOBJS!$LIBOBJS$ac_delim -+LTLIBOBJS!$LTLIBOBJS$ac_delim -+_ACEOF -+ -+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 73; then -+ break -+ elif $ac_last_try; then -+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} -+ { (exit 1); exit 1; }; } -+ else -+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! " -+ fi -+done -+ -+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -+if test -n "$ac_eof"; then -+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` -+ ac_eof=`expr $ac_eof + 1` -+fi -+ -+cat >>$CONFIG_STATUS <<_ACEOF -+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof -+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end -+_ACEOF -+sed ' -+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -+s/^/s,@/; s/!/@,|#_!!_#|/ -+:n -+t n -+s/'"$ac_delim"'$/,g/; t -+s/$/\\/; p -+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -+' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -+:end -+s/|#_!!_#|//g -+CEOF$ac_eof -+_ACEOF -+ -+ -+# VPATH may cause trouble with some makes, so we remove $(srcdir), -+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -+# trailing colons and then remove the whole line if VPATH becomes empty -+# (actually we leave an empty line to preserve line numbers). -+if test "x$srcdir" = x.; then -+ ac_vpsub='/^[ ]*VPATH[ ]*=/{ -+s/:*\$(srcdir):*/:/ -+s/:*\${srcdir}:*/:/ -+s/:*@srcdir@:*/:/ -+s/^\([^=]*=[ ]*\):*/\1/ -+s/:*$// -+s/^[^=]*=[ ]*$// -+}' -+fi -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+fi # test -n "$CONFIG_FILES" -+ -+ -+for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS -+do -+ case $ac_tag in -+ :[FHLC]) ac_mode=$ac_tag; continue;; -+ esac -+ case $ac_mode$ac_tag in -+ :[FHL]*:*);; -+ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 -+echo "$as_me: error: Invalid tag $ac_tag." >&2;} -+ { (exit 1); exit 1; }; };; -+ :[FH]-) ac_tag=-:-;; -+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; -+ esac -+ ac_save_IFS=$IFS -+ IFS=: -+ set x $ac_tag -+ IFS=$ac_save_IFS -+ shift -+ ac_file=$1 -+ shift -+ -+ case $ac_mode in -+ :L) ac_source=$1;; -+ :[FH]) -+ ac_file_inputs= -+ for ac_f -+ do -+ case $ac_f in -+ -) ac_f="$tmp/stdin";; -+ *) # Look for the file first in the build tree, then in the source tree -+ # (if the path is not absolute). The absolute path cannot be DOS-style, -+ # because $ac_f cannot contain `:'. -+ test -f "$ac_f" || -+ case $ac_f in -+ [\\/$]*) false;; -+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; -+ esac || -+ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -+echo "$as_me: error: cannot find input file: $ac_f" >&2;} -+ { (exit 1); exit 1; }; };; -+ esac -+ ac_file_inputs="$ac_file_inputs $ac_f" -+ done -+ -+ # Let's still pretend it is `configure' which instantiates (i.e., don't -+ # use $as_me), people would be surprised to read: -+ # /* config.h. Generated by config.status. */ -+ configure_input="Generated from "`IFS=: -+ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." -+ if test x"$ac_file" != x-; then -+ configure_input="$ac_file. $configure_input" -+ { echo "$as_me:$LINENO: creating $ac_file" >&5 -+echo "$as_me: creating $ac_file" >&6;} -+ fi -+ -+ case $ac_tag in -+ *:-:* | *:-) cat >"$tmp/stdin";; -+ esac -+ ;; -+ esac -+ -+ ac_dir=`$as_dirname -- "$ac_file" || -+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_file" : 'X\(//\)[^/]' \| \ -+ X"$ac_file" : 'X\(//\)$' \| \ -+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -+echo X"$ac_file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)[^/].*/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ { as_dir="$ac_dir" -+ case $as_dir in #( -+ -*) as_dir=./$as_dir;; -+ esac -+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { -+ as_dirs= -+ while :; do -+ case $as_dir in #( -+ *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( -+ *) as_qdir=$as_dir;; -+ esac -+ as_dirs="'$as_qdir' $as_dirs" -+ as_dir=`$as_dirname -- "$as_dir" || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)[^/].*/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ test -d "$as_dir" && break -+ done -+ test -z "$as_dirs" || eval "mkdir $as_dirs" -+ } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -+echo "$as_me: error: cannot create directory $as_dir" >&2;} -+ { (exit 1); exit 1; }; }; } -+ ac_builddir=. -+ -+case "$ac_dir" in -+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -+*) -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A ".." for each directory in $ac_dir_suffix. -+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` -+ case $ac_top_builddir_sub in -+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;; -+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; -+ esac ;; -+esac -+ac_abs_top_builddir=$ac_pwd -+ac_abs_builddir=$ac_pwd$ac_dir_suffix -+# for backward compatibility: -+ac_top_builddir=$ac_top_build_prefix -+ -+case $srcdir in -+ .) # We are building in place. -+ ac_srcdir=. -+ ac_top_srcdir=$ac_top_builddir_sub -+ ac_abs_top_srcdir=$ac_pwd ;; -+ [\\/]* | ?:[\\/]* ) # Absolute name. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir -+ ac_abs_top_srcdir=$srcdir ;; -+ *) # Relative name. -+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_build_prefix$srcdir -+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -+esac -+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -+ -+ -+ case $ac_mode in -+ :F) -+ # -+ # CONFIG_FILE -+ # -+ -+ case $INSTALL in -+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; -+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; -+ esac -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+# If the template does not know about datarootdir, expand it. -+# FIXME: This hack should be removed a few years after 2.60. -+ac_datarootdir_hack=; ac_datarootdir_seen= -+ -+case `sed -n '/datarootdir/ { -+ p -+ q -+} -+/@datadir@/p -+/@docdir@/p -+/@infodir@/p -+/@localedir@/p -+/@mandir@/p -+' $ac_file_inputs` in -+*datarootdir*) ac_datarootdir_seen=yes;; -+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) -+ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF -+ ac_datarootdir_hack=' -+ s&@datadir@&$datadir&g -+ s&@docdir@&$docdir&g -+ s&@infodir@&$infodir&g -+ s&@localedir@&$localedir&g -+ s&@mandir@&$mandir&g -+ s&\\\${datarootdir}&$datarootdir&g' ;; -+esac -+_ACEOF -+ -+# Neutralize VPATH when `$srcdir' = `.'. -+# Shell code in configure.ac might set extrasub. -+# FIXME: do we really want to maintain this feature? -+cat >>$CONFIG_STATUS <<_ACEOF -+ sed "$ac_vpsub -+$extrasub -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+:t -+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -+s&@configure_input@&$configure_input&;t t -+s&@top_builddir@&$ac_top_builddir_sub&;t t -+s&@srcdir@&$ac_srcdir&;t t -+s&@abs_srcdir@&$ac_abs_srcdir&;t t -+s&@top_srcdir@&$ac_top_srcdir&;t t -+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -+s&@builddir@&$ac_builddir&;t t -+s&@abs_builddir@&$ac_abs_builddir&;t t -+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -+s&@INSTALL@&$ac_INSTALL&;t t -+$ac_datarootdir_hack -+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out -+ -+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && -+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && -+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && -+ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -+which seems to be undefined. Please make sure it is defined." >&5 -+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -+which seems to be undefined. Please make sure it is defined." >&2;} -+ -+ rm -f "$tmp/stdin" -+ case $ac_file in -+ -) cat "$tmp/out"; rm -f "$tmp/out";; -+ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; -+ esac -+ ;; -+ :H) -+ # -+ # CONFIG_HEADER -+ # -+_ACEOF -+ -+# Transform confdefs.h into a sed script `conftest.defines', that -+# substitutes the proper values into config.h.in to produce config.h. -+rm -f conftest.defines conftest.tail -+# First, append a space to every undef/define line, to ease matching. -+echo 's/$/ /' >conftest.defines -+# Then, protect against being on the right side of a sed subst, or in -+# an unquoted here document, in config.status. If some macros were -+# called several times there might be several #defines for the same -+# symbol, which is useless. But do not sort them, since the last -+# AC_DEFINE must be honored. -+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where -+# NAME is the cpp macro being defined, VALUE is the value it is being given. -+# PARAMS is the parameter list in the macro definition--in most cases, it's -+# just an empty string. -+ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' -+ac_dB='\\)[ (].*,\\1define\\2' -+ac_dC=' ' -+ac_dD=' ,' -+ -+uniq confdefs.h | -+ sed -n ' -+ t rset -+ :rset -+ s/^[ ]*#[ ]*define[ ][ ]*// -+ t ok -+ d -+ :ok -+ s/[\\&,]/\\&/g -+ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p -+ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p -+ ' >>conftest.defines -+ -+# Remove the space that was appended to ease matching. -+# Then replace #undef with comments. This is necessary, for -+# example, in the case of _POSIX_SOURCE, which is predefined and required -+# on some systems where configure will not decide to define it. -+# (The regexp can be short, since the line contains either #define or #undef.) -+echo 's/ $// -+s,^[ #]*u.*,/* & */,' >>conftest.defines -+ -+# Break up conftest.defines: -+ac_max_sed_lines=50 -+ -+# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" -+# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" -+# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" -+# et cetera. -+ac_in='$ac_file_inputs' -+ac_out='"$tmp/out1"' -+ac_nxt='"$tmp/out2"' -+ -+while : -+do -+ # Write a here document: -+ cat >>$CONFIG_STATUS <<_ACEOF -+ # First, check the format of the line: -+ cat >"\$tmp/defines.sed" <<\\CEOF -+/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def -+/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def -+b -+:def -+_ACEOF -+ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS -+ echo 'CEOF -+ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS -+ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in -+ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail -+ grep . conftest.tail >/dev/null || break -+ rm -f conftest.defines -+ mv conftest.tail conftest.defines -+done -+rm -f conftest.defines conftest.tail -+ -+echo "ac_result=$ac_in" >>$CONFIG_STATUS -+cat >>$CONFIG_STATUS <<\_ACEOF -+ if test x"$ac_file" != x-; then -+ echo "/* $configure_input */" >"$tmp/config.h" -+ cat "$ac_result" >>"$tmp/config.h" -+ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then -+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -+echo "$as_me: $ac_file is unchanged" >&6;} -+ else -+ rm -f $ac_file -+ mv "$tmp/config.h" $ac_file -+ fi -+ else -+ echo "/* $configure_input */" -+ cat "$ac_result" -+ fi -+ rm -f "$tmp/out12" -+ ;; -+ -+ -+ esac -+ -+done # for ac_tag -+ -+ -+{ (exit 0); exit 0; } -+_ACEOF -+chmod +x $CONFIG_STATUS -+ac_clean_files=$ac_clean_files_save -+ -+ -+# configure is writing to config.log, and then calls config.status. -+# config.status does its own redirection, appending to config.log. -+# Unfortunately, on DOS this fails, as config.log is still kept open -+# by configure, so config.status won't be able to write to it; its -+# output is simply discarded. So we exec the FD to /dev/null, -+# effectively closing config.log, so it can be properly (re)opened and -+# appended to by config.status. When coming back to configure, we -+# need to make the FD available again. -+if test "$no_create" != yes; then -+ ac_cs_success=: -+ ac_config_status_args= -+ test "$silent" = yes && -+ ac_config_status_args="$ac_config_status_args --quiet" -+ exec 5>/dev/null -+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false -+ exec 5>>config.log -+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which -+ # would make configure fail if this is the last instruction. -+ $ac_cs_success || { (exit 1); exit 1; } -+fi -+ -+ -diff -Naur mxml-2.6/configure.in mxml-2.6-haiku/configure.in ---- mxml-2.6/configure.in 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/configure.in 2009-04-18 17:05:52.000000000 +0000 -@@ -0,0 +1,340 @@ -+dnl -+dnl "$Id: configure.in 387 2009-04-18 17:05:52Z mike $" -+dnl -+dnl Configuration script for Mini-XML, a small XML-like file parsing library. -+dnl -+dnl Copyright 2003-2009 by Michael Sweet. -+dnl -+dnl This program is free software; you can redistribute it and/or -+dnl modify it under the terms of the GNU Library General Public -+dnl License as published by the Free Software Foundation; either -+dnl version 2, or (at your option) any later version. -+dnl -+dnl This program is distributed in the hope that it will be useful, -+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+dnl GNU General Public License for more details. -+dnl -+ -+dnl Specify a source file from the distribution... -+AC_INIT(mxml.h) -+ -+dnl Set the name of the config header file... -+AC_CONFIG_HEADER(config.h) -+ -+dnl Version number... -+VERSION=2.6 -+AC_SUBST(VERSION) -+AC_DEFINE_UNQUOTED(MXML_VERSION, "Mini-XML v$VERSION") -+ -+dnl Clear default debugging options and set normal optimization by -+dnl default unless the user asks for debugging specifically. -+CFLAGS="${CFLAGS:=}" -+CXXFLAGS="${CXXFLAGS:=}" -+LDFLAGS="${LDFLAGS:=}" -+AC_SUBST(LDFLAGS) -+OPTIM="" -+AC_SUBST(OPTIM) -+ -+AC_ARG_WITH(ansi, [ --with-ansi set full ANSI C mode, default=no], -+ use_ansi="$withval", -+ use_ansi="no") -+ -+AC_ARG_WITH(archflags, [ --with-archflags set additional architecture flags, default=none], -+ ARCHFLAGS="$withval", -+ ARCHFLAGS="") -+AC_SUBST(ARCHFLAGS) -+ -+AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no], -+if eval "test x$enable_debug = xyes"; then -+ OPTIM="-g" -+fi) -+ -+AC_ARG_WITH(docdir, [ --with-docdir set directory for documentation, default=${prefix}/share/doc/mxml], -+ docdir="$withval", -+ docdir="NONE") -+ -+AC_SUBST(docdir) -+ -+AC_ARG_WITH(vsnprintf, [ --with-vsnprintf use vsnprintf emulation functions, default=auto], -+ use_vsnprintf="$withval", -+ use_vsnprintf="no") -+ -+dnl Get the operating system and version number... -+uname=`uname` -+uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'` -+if test x$uname = xIRIX64; then -+ uname="IRIX" -+fi -+ -+dnl Checks for programs... -+AC_PROG_CC -+AC_PROG_CXX -+AC_PROG_INSTALL -+if test "$INSTALL" = "$ac_install_sh"; then -+ # Use full path to install-sh script... -+ INSTALL="`pwd`/install-sh -c" -+fi -+AC_PROG_RANLIB -+AC_PATH_PROG(AR,ar) -+AC_PATH_PROG(CP,cp) -+AC_PATH_PROG(LN,ln) -+AC_PATH_PROG(MKDIR,mkdir) -+AC_PATH_PROG(RM,rm) -+ -+dnl Flags for "ar" command... -+case "$uname" in -+ Darwin* | *BSD*) -+ ARFLAGS="-rcv" -+ ;; -+ *) -+ ARFLAGS="crvs" -+ ;; -+esac -+ -+AC_SUBST(ARFLAGS) -+ -+dnl Inline functions... -+AC_C_INLINE -+ -+dnl Checks for string functions. -+if test "x$use_ansi" != xyes; then -+ AC_CHECK_FUNCS(strdup) -+fi -+ -+if test "x$use_vsnprintf" != xyes; then -+ AC_CHECK_FUNCS(snprintf vsnprintf) -+fi -+ -+dnl Check for "long long" support... -+AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, -+ [if test "$GCC" = yes; then -+ ac_cv_c_long_long=yes -+ else -+ AC_TRY_COMPILE(,[long long int i;], -+ ac_cv_c_long_long=yes, -+ ac_cv_c_long_long=no) -+ fi]) -+ -+if test $ac_cv_c_long_long = yes; then -+ AC_DEFINE(HAVE_LONG_LONG) -+fi -+ -+dnl Threading support -+AC_ARG_ENABLE(threads, [ --enable-threads enable multi-threading support]) -+ -+have_pthread=no -+PTHREAD_FLAGS="" -+PTHREAD_LIBS="" -+ -+if test "x$enable_threads" != xno; then -+ AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H)) -+ -+ if test x$ac_cv_header_pthread_h = xyes; then -+ dnl Check various threading options for the platforms we support -+ for flag in -lpthreads -lpthread -pthread; do -+ AC_MSG_CHECKING([for pthread_create using $flag]) -+ SAVELIBS="$LIBS" -+ LIBS="$flag $LIBS" -+ AC_TRY_LINK([#include ], -+ [pthread_create(0, 0, 0, 0);], -+ have_pthread=yes) -+ AC_MSG_RESULT([$have_pthread]) -+ LIBS="$SAVELIBS" -+ -+ if test $have_pthread = yes; then -+ PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" -+ PTHREAD_LIBS="$flag" -+ -+ # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to -+ # be POSIX-compliant... :( -+ if test $uname = SunOS; then -+ PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" -+ fi -+ break -+ fi -+ done -+ fi -+fi -+ -+AC_SUBST(PTHREAD_FLAGS) -+AC_SUBST(PTHREAD_LIBS) -+ -+dnl Shared library support... -+DSO="${DSO:=:}" -+DSOFLAGS="${DSOFLAGS:=}" -+ -+AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries, default=no]) -+ -+if test x$enable_shared = xyes; then -+ AC_MSG_CHECKING(for shared library support) -+ PICFLAG=1 -+ -+ case "$uname" in -+ SunOS* | UNIX_S*) -+ AC_MSG_RESULT(yes) -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-h,libmxml.so.1 -G -R\$(libdir) \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -R\$(libdir)" -+ ;; -+ -+ HP-UX*) -+ AC_MSG_RESULT(yes) -+ LIBMXML="libmxml.sl.1" -+ DSO="ld" -+ DSOFLAGS="$DSOFLAGS -b -z +h libmxml.sl.1 +s +b \$(libdir)" -+ LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)" -+ ;; -+ -+ IRIX) -+ AC_MSG_RESULT(yes) -+ LIBMXML="libmxml.so.1.4" -+ 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" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)" -+ ;; -+ -+ *BSD*) -+ AC_MSG_RESULT(yes) -+ LIBMXML="libmxml.so.1.4" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-R\$(libdir) -shared \$(OPTIM)" -+ LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)" -+ ;; -+ -+ Darwin*) -+ AC_MSG_RESULT(yes) -+ LIBMXML="libmxml.1.dylib" -+ DSO="\$(CC)" -+ DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc" -+ ;; -+ -+ *) -+ AC_MSG_RESULT(no) -+ AC_MSG_WARN(shared libraries not supported on this platform.) -+ PICFLAG=0 -+ LIBMXML="libmxml.a" -+ ;; -+ esac -+else -+ PICFLAG=0 -+ LIBMXML="libmxml.a" -+fi -+ -+AC_SUBST(DSO) -+AC_SUBST(DSOFLAGS) -+AC_SUBST(LIBMXML) -+AC_SUBST(PICFLAG) -+ -+dnl Add -Wall for GCC... -+if test -n "$GCC"; then -+ CFLAGS="-Wall $CFLAGS" -+ -+ if test "x$OPTIM" = x; then -+ OPTIM="-Os -g" -+ fi -+ -+ if test "x$use_ansi" = xyes; then -+ CFLAGS="-ansi -pedantic $CFLAGS" -+ fi -+ -+ if test $PICFLAG = 1 -a $uname != AIX; then -+ OPTIM="-fPIC $OPTIM" -+ fi -+else -+ case $uname in -+ HP-UX*) -+ CFLAGS="-Ae $CFLAGS" -+ -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ -+ OPTIM="+DAportable $OPTIM" -+ -+ if test $PICFLAG = 1; then -+ OPTIM="+z $OPTIM" -+ fi -+ ;; -+ -+ UNIX_SVR* | SunOS*) -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ -+ if test $PICFLAG = 1; then -+ OPTIM="-KPIC $OPTIM" -+ fi -+ ;; -+ -+ *) -+ if test "x$OPTIM" = x; then -+ OPTIM="-O" -+ fi -+ ;; -+ esac -+fi -+ -+dnl Fix "prefix" variable if it hasn't been specified... -+if test "$prefix" = "NONE"; then -+ prefix="/usr/local" -+fi -+ -+dnl Fix "exec_prefix" variable if it hasn't been specified... -+if test "$exec_prefix" = "NONE"; then -+ exec_prefix="$prefix" -+fi -+ -+dnl Fix "docdir" variable if it hasn't been specified... -+if test "$docdir" = "NONE"; then -+ docdir="$datadir/doc/mxml" -+fi -+ -+dnl Fix "mandir" variable if it hasn't been specified... -+if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then -+ case "$uname" in -+ *BSD* | Darwin* | Linux*) -+ # BSD, Darwin (MacOS X), and Linux -+ mandir="/usr/share/man" -+ ;; -+ IRIX*) -+ # SGI IRIX -+ mandir="/usr/share/catman/u_man" -+ ;; -+ *) -+ # All others -+ mandir="/usr/man" -+ ;; -+ esac -+fi -+ -+dnl pkg-config stuff... -+if test "$includedir" != /usr/include; then -+ PC_CFLAGS="-I$includedir" -+else -+ PC_CFLAGS="" -+fi -+ -+if test "$libdir" != /usr/lib; then -+ PC_LIBS="-L$libdir -lmxml" -+else -+ PC_LIBS="-lmxml" -+fi -+ -+AC_SUBST(PC_CFLAGS) -+AC_SUBST(PC_LIBS) -+ -+dnl Output the makefile, etc... -+AC_OUTPUT(Makefile mxml.list mxml.pc) -+ -+dnl -+dnl End of "$Id: configure.in 387 2009-04-18 17:05:52Z mike $". -+dnl -diff -Naur mxml-2.6/doc/0.gif mxml-2.6-haiku/doc/0.gif ---- mxml-2.6/doc/0.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/0.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,5 @@ -+GIF89addç -+ -+ -+  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÿ H°`A5*\Ȱ¡Ã‡#*Tc°¢Å‹‡IÜȱ£ÇÃ0мhå£É“(­Œ\ù¯Ê—0;öay1¦Í›i$…³§Ï„¤tþkò³(Î&4a]jÆJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ® ydªæÎÝ5MDÀ*¬è’k–”ºÎ,ˆÐ°,)uß]ºRU”*äoE?RjdzͰÅ{QCþ‹ªÏ1ƨ™Þ³,’if£’9_<·ô¢'DLbôtQÕ+ÕÂ4{$dÙ'uâhD'n“ìXÆ‹(%¿ß…oŒÇ9Ç1Í9²äã\"K !D¯þp»ôØÜþ¦©äc••6Â7üÞëHtêzï8_}ý÷¹¯|vÒWûø3¬äšGçTC| ²v&Ù5Ò&ÐÏO„ùáG¡~ÒסsZ÷!r!FT¢l'v7âo):ÔbW/Ê·"n1.TãU7&”#f3æÔ£Z;îèÙ. £‘2Ž„!’62‰£“:BÉ£’( Yš”V¤”CR™—WziR–¯a ¦–fŠÞ–jrئ‡o:çMšá+)eU"¡ƒ"]rR,+åµdœ&žfgc*Š&¢>BŠœ&+…ðQ+qaB€2 -+§§›ÆH&SÉ>›*”K»lÔ K²¤ºKÄDD M²*dŠN4T‚N‚ä:km æj±•!l“ÈV´l’ÍöìB6D;ÐL øÓ\Í~‘ídLÙÑ-R­@¬‰›®hzý³˜THX6V¡uuÄ]U)_]É1 j &í´]ÔÁEqKÂİOU=|“VA%1J|b¤çÅ9Å’Åo”ñJV…ÅB™©a«|€Â–ñ˱Àµ½ËphÖš¶,E; -\ No newline at end of file -diff -Naur mxml-2.6/doc/1.gif mxml-2.6-haiku/doc/1.gif ---- mxml-2.6/doc/1.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/1.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,7 @@ -+GIF89addç -+ -+ -+  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÿ H°`A5*\Ȱ¡Ã‡#*Tc°¢Å‹‡IÜȱ£ÇÃ0мhå£É“(­Œ\ù¯Ê—0;öay1¦Í›i$…³§Ï„¤tþkò³(Î&4a]jÆJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9Vt¶lÄ™Í6ü*µ`Iµ -+©°ªr Ü…»Ôx÷€…¼\Cþë›P$X„iÖ;ø.‘‡Âý±¬dµ½XÆÚ@çæ¨„6þìsD:шIŸT EIèPT}RöbÚmÆÝQ÷\Þ}[Þ[ølâG\9Aæ?‡žSzjê75cÏ^y»MíÞaÞ‚r>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÿ H°`A5*\Ȱ¡Ã‡#*Tc°¢Å‹‡IÜȱ£ÇÃ0мhå£É“(­Œ\ù¯Ê—0;öay1¦Í›i$…³§Ï„¤tþkò³(Î&4a]jÆJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9VtÉÕ‹¿•vºÎ,ˆuŽÐÁ°,µÕÛŠRUŒ:âîEwQj\ͯH KCþcÊÏðÈ0K.Ýçx¥ £’‹&«Ì2HÑjàL³h蟤u†=y)5M<«½êôW‚á’·±;fQ QN9¹7Ò\'¶tðˆÆ‹¯<ÑËXbî0ÞJv&“SWøÜäîÛ¹þ/? >üòÑo_ -+¥zê+¸oþüÈóGÖO¸2A~‘ûÙàH_vøY‚ -+ö„À{ ÚÏJÑD¸àHþYØÓ=jxÒw+‰âáMv8bz,½qbL¼­xR-ºøQ :a £I¡èDÅ5FÓ<¢H“Ar„…P7¹Q=BA dD0 -+õdD•5Ï”9 5–9'\6dNô„ÙÐ[;š©Rª©"BçfB›é8gB…é樴yg:Ás§x,Y3(4•sèpjwgŒwŠBÓ'‹ -+è¤Ûap)nûµ)¦ð} -+*s¢Žœ ¥:JÝ,©š[«p®zt‹°êwE8Õj«M™ñªk7õJë¯åúÏ`ÃkÐMŠ-V©pÑõìCzí5íC‘uíBk±µíB_m[Õ·Z]Õ³T‰¤T¥N±tîé²dÕœåúifeÚNÙmeÒY­kȺØlª³*HÑ]; -\ No newline at end of file -diff -Naur mxml-2.6/doc/3.gif mxml-2.6-haiku/doc/3.gif ---- mxml-2.6/doc/3.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/3.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,6 @@ -+GIF89addç -+ -+ -+  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÿ H°`A5*\Ȱ¡Ã‡#*Tc°¢Å‹‡IÜȱ£ÇÃ0мhå£É“(­Œ\ù¯Ê—0;öay1¦Í›i$…³§Ï„¤tþkò³(Î&4a]jÆJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®búUÎ^»g¨€UXÑ%V]4ûÕà:³àUDB ÚÃZ°$SGy-JU9)‚ÀñD¨Ñ(Ä"ï1 ùoi(È+™ -+4ºóÊ~K7ÿ¼à™e*£ÿþ,MÓ¨jŸåX·^{R6Í´?*Ó™À¡(¡¹=Ò¬ QgðŽ,‘³$~<âï‘':F`É«yÄä±[w¸rÊÇ9Ú·þ3Ìl2¼x¶#k“?¿p}öôìÛÃ÷ê>~}ŽæÙß߸’_|©$¬ÆQͳ=å‡ NѬÄÜ‚>™  „0=1!…(Ñ4†19ðŠN,pXdˆ8b`&ª'”.)ª¨Ó$-ž˜—1*‡˜?5òç9æT=rÇA.„ÀxCË V$G…Ï“i “Tâ7[–Å]È¥B®TÈ—]HfB.xy¦šd²ù¥›`ÁÙœ\Ñ)ß|çÙ‰žâ陟‹™Ñ€j&æIþºÔ=v¦¨QC°4æ{#AAàp6 -+zœNOè¸e|'UÂCô‚¶·` ©²´…‘­Ž¤‡±b$b¨µDäO¯ùdF®=èEK=,n¨U¶”¹*Õ>©*hcLAÀš1WQ¦¬TØ€| äV IJ’87€EXagÊ([írT—]ñjYQ½eVd¾ iuTü*D•HJ|€S,\ïÀ,íÛ®¿ª®‰¼TÎëÙ¸=®kµ-j l¯RX@; -\ No newline at end of file -diff -Naur mxml-2.6/doc/4.gif mxml-2.6-haiku/doc/4.gif ---- mxml-2.6/doc/4.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/4.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,6 @@ -+GIF89addç -+ -+ -+  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÿ H°`A5*\Ȱ¡Ã‡#*Tc°¢Å‹‡IÜȱ£ÇÃ0мhå£É“(­Œ\ù¯Ê—0;öay1¦Í›i$…³§Ï„¤tþkò³(Î&4a]jÆJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9Vt¶lÄ™Í2¤HÓhÁ’j -+5ªr`\…éæº¨ñ.¡ÿ–† |÷`Â{ S9ÌT`áÈ‹þCwd¦”ãBŽ\øçfÎqùZ2éÒ=—}úåjÖ­MbœÆ2vÌ ¯´ #Ý#y£´•¸Há'‹WŽ\ìÅ\rw7ç‚yíé1ŽXx;ÄPÌ—þõî0¼x‹äú»¨©a÷ô -+-˜?_>CŒÊK·`ÑÅ|½ß| H>í‘Ó~é9@` ’‡Ñ8]µ#‘…Í=]péÁsQÙEØ\~xœ„ãUh¢p`\´MGÚ–"w/ÚFÎE@xT#jµ¸aŽ­Ýx‘¥-qQ_>"š‘G‚ˆÜkTÂfV•¯¡†åjZn¹Y—^2VZ˜—I&``žÙ–™j®ùd›nvgœü-(e²9‰g€zîé^Ÿ~âxg %J¨‹†Êg¢ŠþÉh£‚®©’•›•þDQl?ÆäX‘€&g¥Zöö“o>Ó`£NŠè?Kp¹êQ]vÉÚ$AdÙ*Zié:d}¾.Z‘UÁ.¤ÕEP{U")U¬S,%k+³,ëê±zMºZ®„òºZ¬xÒŠ%ªé±ªæ¥¼±X@; -\ No newline at end of file -diff -Naur mxml-2.6/doc/5.gif mxml-2.6-haiku/doc/5.gif ---- mxml-2.6/doc/5.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/5.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,5 @@ -+GIF89addç  -+  -+ -+    ! "! #"!$#"%$#&%#'&$'&$('%)(&*)'+*(,+)-,*.-,0/-10.21/320431542653665886997::8;;9<<:=<;>==@?>A@?BA@CBADCBEDCFEDGFEHGFIHHKJILKJMLKNMLONNQPORQPSRQTSRUTSUUTVVUWWVXXWYYY[[Z\\[]]\^^]__^``_a``baacbbdcbedcfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~€€€‚‚ƒƒ‚„ƒƒ…„„†……‡††ˆ‡ˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽŽ‘’‘’“““””•–––———˜˜˜™™™ššš››œžžžŸŸŸ   ¡¡¡¢¢¡££¢¤¤£¥¥¤¦¦¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬¬®­­¯®®°¯¯±°°²±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááââãäääåååææçèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþé H°`A1*\Ȱ¡Ã‡#*c°¢Å‹sIÜȱ£G¹0мøä£É“(ŸŒ\IÏÊ—0;Úay1¦Í›iÔ„³§Ï„štÒ3ò³(N#4U]jSÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9Vt¶lÄ™"ÊV`Ï‚%‹új˶§ÊKéÖ}+P£Q½B}†¤Ç°ÎŸnóf‰˜°Q‹û¤‡Ð(©È+Vþ‹y¤Y”=6ZähÒ¥¿žÞh!µêÕa„mÖ4í°¶owÍ­+ÆU½¹À¸#8Ö9³_=—\yTÞÎ9¿ŽÞØ"·†^äU´&„ºGŒlþÚ ùÇ{D,Ð6˜y‡Ïf—ŒãýB×ÃÙOˆßàþþþ½`€Ô1`A¢xWË@ƒ*ÇÖ*9°€©´Ct4­Q69Ç’  “Ê¡°R ß±r›ŒôÍGÐ$¡hIÃ’zûÅÄR‚=Âdc/ ‘ e†d’8.é•’N>Ùd”bAIe•S^Ñ‘ZJÄe—9Y d–i¦™2 ÝjóäJY|¹Ú-+Í¡&F¤ô††œÀRš· À§—ƒžÆ']¶’:ÆÑ”@GiШn¡Ð”ÂFÚv#M==@?>A@?BA@CBADCBEDCFEDGFEHGFIHGJIHKJILKJMLKNMLONMPONQPORQPSRQTSRUTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_a``baacbbdcbedcfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwvxxwyyxzzy{{{}}|~~~€€€‚‚ƒƒ‚„ƒƒ…„„†……‡††ˆ‡‡‰ˆˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽ‘’‘‘“’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸ ¡¡¡¢¢¡££¢¤¤£¥¥¤¦¦¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬¬®­­¯®®°¯¯±°°²±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÅÆÆÇÈÈÈÉÉÉÊÊÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþó H°`A3*\Ȱ¡Ã‡#*4c°¢Å‹{IÜȱ£G½0м(å£É“(¥Œ\™/Ê—0;æay1¦Í›iô„³§Ï„žtæCò³(N$4U]jSÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ® s0R6n¶R[€­è¬Ö‘é\Y°k -+¡YI-Xòª¼1U9«8À™Ô¸ñÅFCæ“*À±ÈF6¶Œ1BQÍŠ9üŒp©è•ø~–6 -+éôJ`aºf¥ÎRuÖ6YµD*, íöÈG8´‡s\iøJåÍ=÷:zÄ•WL®ÑÕ-Æ=IÊñ£YõñK¡V$çÈQ%’R({äTœ-s¤2K"ÇìPÉÂÚ¬gÛ¬1g ,ñlþRLðµéÞG`; -\ No newline at end of file -diff -Naur mxml-2.6/doc/7.gif mxml-2.6-haiku/doc/7.gif ---- mxml-2.6/doc/7.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/7.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,8 @@ -+GIF89addç  -+  -+ -+    ! #"!$#"%$#&%#'&$'&$('%)(&*)'+*)-,*.-+/.,0/-10.21/320431542653664775886997::8;;9<<:=<;>==@?>A@ADCBEDFIHGJIHKJILKKNMLONMPONQPORQPSRQTSRUTSUUUWWWYYXZZY[[[]]\^^]__^``_a`acbbdcbedehgfihgjihkjilkjmlknmlonorqpsrqtsrttsuutvvuwwvxxwyyxzzy{{{}}|~~}~€€€‚‚‚„ƒƒ…„„†……‡††ˆ‡ˆŠ‰ŠŒ‹‹ŒŽ’‘’““”•••––˜™™™ššš›››œœœžžŸ   ¡¡¡¢¢£¥¥¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬­¯®®°¯¯±°°²±²³³µ¶¶·¸¸¸¹¹¹ººº»»»¼¼½¾¾¿ÀÀÀÁÁÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÈÉÉÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããääåæææçççèèèéééêêêëëìíííîíîïîðððòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþ£ H°`Á+*\Ȱ¡Ã‡#*¼b°¢Å‹3IÜȱ£G™0мˆä£É“(‘Œ\ Ê—0;¢ay1¦Í›i„³§Ï„ƒtFûñ³(Î4Q]jÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9Vt¶lÄ™m -+]KfÁ’1ÙÊ SåÀ›sóVŒ+P£Z½€Æ  gàÀ Ö›ïâ¼j:~,צäɔך}˜¹òæ†Ù~Zçè°V*8 våÖ]Wö‚ÍÕØJÚX·ÜÆ-5õȼ¥®ì<ê®Ýņ@ž¼èÊÍ6É,zQÌ­+éA»Ïc#þyï)!ûx·#yœ¿ Éüú“îß{ùJ>Ìò#í£ÉF?Ê#ñù'ÑJDh’]t8ŸHB(è:Hva… -+%3-nta‡`|ˆáJCt8`~&B¤‰ˆ®¤TŠœ¡cCŒ°(áJ\ÌèòÀ£‚ÏühàJ`è8!FF2dƒÚ¤,%¹ÐJ‰H©ÐJ9X ÀOê÷I—öE©¥˜V’)¥™£]ÆT -+hnFÑU}´i–`RA#gYtFÕk} w'X„¦eDÁ5hCæy蔑µhBh¥õhB_ZÕ¢Z]••T‰ôb’N±´éŒ²dŒ™ -+£^Ž:©^†ú—èa~Éhij&G[; -\ No newline at end of file -diff -Naur mxml-2.6/doc/8.gif mxml-2.6-haiku/doc/8.gif ---- mxml-2.6/doc/8.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/8.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,7 @@ -+GIF89addç  -+  -+ -+    ! "! #"!$#"%$#&%#'&$'&$('%)(&*)'+*(,+)-,*.-+/.,0/-10.21/320431542653664775886997::8;;9<<:=<;>==@?>A@?BA@CBADCBEDCFEDGFEHGFIHGJIHKJILKJMLKNMLONMPONQPORQPSRQTSRUTSUUTVVUWWVXXXZZY[[Z\\[]]\^^]__^``_a``baacbbdcbedcfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~€€€‚‚ƒƒ‚„ƒƒ…„„†……‡††ˆ‡‡‰ˆˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽŽ‘’‘‘“’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¡££¢¤¤£¥¥¥§¦¦¨§§©¨¨ª©ª¬««­¬¬®­­¯®¯±°°²±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþù H°`A3*\Ȱ¡Ã‡#*4c°¢Å‹}IÜȱ£G¾0м8å£É“(§Œ\ÉOÊ—0;êay1¦Í›i…³§Ï„¢tòKò³(Î$4W]jsÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ® yT -+ö-Þ7Ym€MXÑ%Öâh¢á:³ VhB R¸Z°dTvy+:ˆªr`TŠ-Ò‹:PãÒz‰EX’ÓÈ+5,¸óJF9õL34ŸH—þyú§jš”ÖžÔ÷zµl:M= 0æ¨Û…±,ÆÑ6ðˆ,kxl·òøÆ•`L®Ôäâ†æ'±Wo¨iä”òFþnwÈL„ÂŽ-Ö#DáÙÈÀS›HBTî4Ùq %PY-Mú ¥Að Y×ŃãBÒU4Ý2£NHãJp˜ KútD†qðñ)Q,¥`0,Ô›ŒÛ±´„~+MÖ'¢61ðõ±Ò5/ P¨z,ÅùÒ¦ãʨˆ²‰š¤À™š!…Ω:!©åk¹ú¬`ÉÚ‘­¥®”…{¨ÞægG=àºÖ"ÂæTl­+ÙsR ,¥øèJ:¬*ÒwðÙC“³ö -+œ¦4}²Ñ:9k_^v<C^B@&F娸îW¾k8r ï@ã yǽ–ÕšOŠÈkEKAf”¡õkTZªq™ÂKŲ£T9U8ª=UeGµo`ÜpE_\ÏJˆ€U˜aW&L[-÷T—]1÷oÍŸ^dÎ(iuT<Ä&FJÝ‘S,m4DC¯´óÒ ù,ÔSbóÒ3{F2Î+×fñ•ù/‡ˆå; -\ No newline at end of file -diff -Naur mxml-2.6/doc/9.gif mxml-2.6-haiku/doc/9.gif ---- mxml-2.6/doc/9.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/9.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,6 @@ -+GIF89addç  -+  -+ -+    ! "! #"!$#"%$#&%#'&$'&$('%)(&*)'+*(,+)-,*.-+/.,0/-10.21/320431542653664775886997::8;;9<<:=<;>==@?>A@?BA@CBADCCFEDGFEHGFIHGJIHKJILKKNMLONMPONQPORQPSRQTSRUTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_a``baacbbdcbedcfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~€€€‚‚ƒƒ‚„ƒƒ…„„†……‡††ˆ‡‡‰ˆˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽ‘’‘‘“’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸ ¡¡¡¢¢¡££¢¤¤£¥¥¤¦¦¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬¬®­­¯®®°¯¯±°°²±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþù H°`Á2*\Ȱ¡Ã‡#*,c°¢Å‹}IÜȱ£G¾0мå£É“(£Œ\É/Ê—0;æay1¦Í›iü„³§Ï„Ÿtò;ò³(Î#4W]jsÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®~Xb–Ž]5MHÀ.¬è«)–˜ÀÎ,xU‡Ð¸,É4Ã]ƒXUŒzïoE5Wj\jø¢;©!ù-eÐX¤TF TsÑÍ#á1å‡ð'è•|––ö‰ëôJµ0]³„}Rg;‡tZ¡í•e‚ˆhòîÈn6G–|‡GdyÀ£qåA¬ ÷ñÍkèé]ï-òv‡Ï=þεüáÊ(·—O¨ž;F¨ë´÷˜oä»õ ;Íïxh¿òhþmÔC€¼ÅC`D›> -+>¤ÙH àçMƒ°’ø CaCg¬ ~lÈ4áa‡ƒˆk•ˆÝJ¤§"t+åsÂá÷¢D:á€=+=ó‘9â§K8¤76t—ŽìCÓ!ð“ èDC6%“²m©£] -+ÅdB †™äŠf¢–ir6fBzÈ6Fò¼©~ 1ÀJªØ©›Ý·çHWø©P­£ÐJEªPw­6(yŽ.äKÇ(éf¥ ñME±à jrêP&¥šjÞHŒ¨jÓJá¸Sª²Ð­²–‰Q/câ’˯À lm#ÅÊd9(r‚kT¥0êÞE¢éÃJûÐçì›,)µÑ-g¢¹ÒÃÒ~Š£“¨ YW£ŸmZdˆ£íVÄi¼=Àé1ôòÓŒªùJ%iOñú+™Qm&60Á]Þƒ•gK)âzñ³SøTvW‘U5w £AÉI%@.#B›`ƒÕê“Am©lÓœ)»<«E2Çv‘U5¤ÕEðå¼U"iësDN±ÔóÐ ÍÎH+´³˜M³WYË9ÃÜXȵ¢,ÛĪfÜî¿LRôW@; -\ No newline at end of file -diff -Naur mxml-2.6/doc/A.gif mxml-2.6-haiku/doc/A.gif ---- mxml-2.6/doc/A.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/A.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,6 @@ -+GIF89addç  -+  -+ -+   ! "! #""%$#&%$'&$('%)(&*)'+*)-,*.-,0/-10.21/320431542653664775887::8;;9<<:=<;>==@?>A@?BA@CBADCBEDCFEDGFEHGFIHGJIHKJJMLKNMLONMPONQPPSRQTSRUTSUUTVVUWWVXXWYYY[[Z\\]__^``_a``babdcbedehgfihhkjknmmponqporqqtstvvuwwvxxwyyxzzz|||~~}~€€€‚‚‚„ƒƒ…„„†……‡††ˆ‡‡‰ˆˆŠ‰‰‹ŠŠŒ‹ŒŽŽŽ‘’‘‘“’’“““”””•••–––———˜˜˜™™™ššš››œžŸŸŸ   ¡¡¡££¢¤¤£¥¥¤¦¦¦¨§§©¨ª¬««­¬­¯®®°¯¯±°°²±³´´µ¶¶¶···¸¸¸¹¹¹ºº»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÂÃÃÃÄÄÅÆÆÇÈÈÈÉÉÉÊÊËÌËÌÍÌÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããäääåååæææçççèèéêêêëëëìììíííîíïðïðððñññóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþ¥ H°`Á+*\Ȱ¡Ã‡#*¼b°¢Å‹9IÜȱ£Gœ0м¨ä£É“(•Œ\)m Ê—0;Žay1¦Í›i4„³§Ï„†tJ ò³(Î 4K]j³ÄJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9VtÉU(×™»~Ú¢,Á’nÍbU9¬P]jäšè®´"\CJ³ëw°[Â~óÆÚª°4,eÆ-ÌU2VŽñ†½Ê,³46›¥zÖÚ¨ÓÑ¥—ŽH(uÑÕ¤]ß„{±l›µ¥]º}“e,–¼cÒY +ðà/YÀ²r”ǯ|nRñ„ÆW îQ¹B–¸þsÌ>r!¬ãâ#[ùj!y‘ÒGô¾¥3ù+ Wx~:þ†,¹ÒÐ{yðCô!¸ß<,¨Ð+ÊàC^Tà %`„Ü­åßC~ˆ_sUh‘jèMÿ!ÂáB®¼‰™XQ#®´ÜF,¦×˜ˆýX^z,±Ò‘Õ!f@JÔ#u5¤Œ©ù’)B T®ØeXOzÄÊ—ˆå&”'ÈÑffb3®é׎·¹é—-¼Í!'›²Ýé—qê)”1²Yç§\U*Ô©aihEѤ¶Þ¢: -+iR¡Q0)¡eŠ$€Oa*&%L4ýVƒ+íò“^EÓ¦?¥*™­^±DEW^°”‹QF¸ªK¬¾+n¿ÆºX¹¸.L©ùiD–uDœFé -+E&I‹M~Äúј+ÑÖn(ìHÐ—{mÄä¹=ÑIG‚ÙÑ2,Õ‚Uá~7\2EW]ý2eYÿ„VZ·jQÂí^dÃ0iuTŸD•HJUüÑiOiÜÑÅ,=ìñCc:r}™|òÁžñ[ñ¿µ¥[p¼w6+E~; -\ No newline at end of file -diff -Naur mxml-2.6/doc/B.gif mxml-2.6-haiku/doc/B.gif ---- mxml-2.6/doc/B.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/B.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,4 @@ -+GIF89addç  -+  -+ -+    ! #"!$#"%$#&%#'&$'&%)(&*)'+*(,+)-,*.-+/.,0/-10.21/320431542653664775886997::8;;9<<:=<;>==@??BA@CBADCBEDCFEDGFFIHGJIHKJJMLKNMLONMPONQPORQPSRQTSRUTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_a`acbbdcbeddgfehggjihkjilkjmlknmlonmponqporqpsrqtssuutvvuwwvxxwyyxzzy{{z||{}}|~~}€‚‚ƒƒ‚„ƒƒ…„„†……‡†‡‰ˆˆŠ‰‰‹ŠŠŒ‹ŒŽŽ‘’‘‘“’’“““”””••–———˜˜˜™™š››œžžžŸŸ ¡¡¡¢¢¡££¢¤¤£¥¥¤¦¦¦¨§§©¨¨ª©©«ªª¬««­¬¬®­­¯®®°¯¯±°±²²²³³³´´´µµµ¶¶·¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÜÜÜÝÝÝßßßààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþÑ H°`Á/*\Ȱ¡Ã‡#*üb°¢Å‹]IÜȱ£G®0мèä£É“(Œ\‰NÊ—0;Êay1¦Í›i”„³§Ï„’t¢#ò³(N"4S]j3ÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9VtiR¨Ù‚¤0YåÙ· -Xò$Ü»üT9ð%Þ¿ß~Ôèöïß=C¢ƒiØð…ž7þ»gd¿“ÿZFˆ93Þ›œ;{†Ë(lÃÑšM/Dw˜j…4?ÈÅÔÛ× cÃì!tnÝ1ƒéüͧ0঑ÇT–ùK>Å_;‘øJŸÑUO/<ÒzwÈ×¥þg¿9>ìv“nV’ó.üÈÊâÃÛ´UÞ|ý“¹XFÀ àüÆ49Ã_÷A4ÀMˆbÖ€²¶ ƒ>a„,Ià lŽtÄ…fø‡ zX æ&âEДxb{®(Ò º(ÒÊxTìÙhPüùç1ÔŽ„Úø64•“ã‡0 @Óñ}g™‘Rùè‘TFe¥G,uR¤|8y‘åR[r fWev4æ\kzu&WiŠõ&VqnÔ¦`wª9çUuFÄIžîI9åžU%}Ú”hC9ÐtÇ—‚Â4Êp²¢BE©£E2hº©AK~*P ¡ŠÚ£¨ žŠê@ð•jc z8…fתètëbÔmŠ®Ümª ž’é¨ ›„Í*ã K)ÆkY"~BŸÕU¢i|õ5mr‘u-Wlµµ-œ} ­EV‰k”V7š[U")¥.NN±„ã»S U.½&¡›)¾nÂ¥-¿u‹—´/TídŬ¬ƒ²nKÑY; -\ No newline at end of file -diff -Naur mxml-2.6/doc/C.gif mxml-2.6-haiku/doc/C.gif ---- mxml-2.6/doc/C.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/C.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,9 @@ -+GIF89addç  -+  -+ -+    ! "! #"!$#"%$#&%#'&$'&$('%)(&*)'+*(,+)-,*.-+/.,0/-10.21/320431542653664775886997::8;;9<<:=<;>==@?>A@?BA@CBADCBEDCFEDGFEHGFIHGJIHKJILKJMLKNMLONMPONQPQTSRUTSUUTVVUWWVXXWYYXZZY[[Z\\[]]\^^]__^``_a``baacbbdccfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwvxxwyyxzzy{{z||{}}|~~}~€€€‚‚ƒƒ‚„ƒƒ…„„†……‡†ˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽŽ‘’‘‘“’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¡££¢¤¤£¥¥¤¦¦¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬­¯®®°¯¯±°°²±±²²²³³³´´µ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþó H°`A2*\Ȱ¡Ã‡#*$c°¢Å‹wIÜȱ£G»0мå£É“(£Œ\™Ê—0;âay1¦Í›iô„³§Ï„žtæKò³(Î$4W]jsÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãV®ˆhvpµ¢K©<„üÂtfA©âÔb`´`É¥òä®$ëSåÀ¥¨ôÒ”÷s Æ¢‚Õšè2_Q$‰åë)ðgàÈrñá¬Ü³æÄ7ó!ÄéêsbÍ1Gß¼b:²³®´Æ öÃÈìè舰`Fv m3§wÊF:z…+, —ÃG(jù -+W›í¥Zå/„f‰)T¹Ð!¡iþæ±=Aç)Ê4mwï)(=lˆYÂÖC3UQcò»Â¯»²…~–Â,ÅÒ\µà#ÑÁÕ9*÷K‹88]~>¸R…°áÐ †R]ÂÒ2rEKZ„ˆÕ†& -+HaŠL¡Èba+¾ß…2ªHc3Ž„#‚:îã>ncÜ I¤uFyƒ+¡¤M‡°Ë“1à"•]‰%GZn)Mf0ÕÌJ·pEL—EŽô W   Kkü·Ò%6ŠäWûýÔH’KAÓ9Фž›±@¨OîäÞJÓLÈ!8ýB޲$„M>(Ú•l:‰Ó:aã Zè Ìz£ªUbG6ÈU!!®z%DÜ’†³a ‡¹Ç!s½^—b -+ÁêD‹5»Ò8©†ÓÊb”C³Ž­@ ·T8× -+„š¶Kµ­ -+ñ¶”ÁÞaTcÕFuBk/´8Ð]W­!ØvQùõ—mG#R((È9ÐY^ÞäÖ[/jPÂiVdÃ&iuTwD•HJU¼‘S,Q¬±C³ôðÇ IŒ*ÉDFpÅGFoÁú¶f.•ì*ëlÉ; -\ No newline at end of file -diff -Naur mxml-2.6/doc/D.gif mxml-2.6-haiku/doc/D.gif ---- mxml-2.6/doc/D.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/D.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,8 @@ -+GIF89addç  -+  -+ -+    ! "! #"!$#"%$#&%#'&$'&$('%)(&*)'+*(,+)-,*.--10.21/320432653664776997::8;;9<<:=<=@?>A@?BA@CBADCBEDCFEDGFEHGFIHGJIHKJILKJMLKNMLONMPONQPORQPSRQTSRUTTVVUWWVXXWYYXZZY[[Z\\[]]\^^]___a``baacbbdcbedcfedgfehgfihgjihkjilkjmlknmlonmponqporqpsrqtsrttsuutvvuwwwyyxzzy{{z|||~~}~€€ƒƒ‚„ƒƒ…„…‡††ˆ‡‡‰ˆˆŠ‰‰‹ŠŠŒ‹‹ŒŒŽŽŽ‘’‘’“““”””•••––—˜˜™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¡£££¥¥¤¦¦¥§¦¦¨§§©¨¨ª©©«ªª¬««­¬¬®­­¯®®°¯¯±°°²±±²²³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËÊËÌËÌÍÌÍÎÍÎÏÎÏÐÏÐÑÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕ×××ÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞààààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîíîïîïðïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,ddþ× H°`Á/*\Ȱ¡Ã‡#*üb°¢Å‹aIÜȱ£G°0мÈä£É“(™Œ\¹.Ê—0;Æay1¦Í›iœ„³§Ï„“t®ò³(Î!4S]j3ÅJ¢L£¾DŠ‘§Ô«'ƒÖÄÊõãÖ®`9VtéU¨ÙuäÆ`YðäÙ·5D-XÒ$Ü»ë -+-U9%^¼TŒÔèö/Þ¢!×½4ü7ÀO‹ã-à²_ɇ{®CxóÝžœ;{†Öáh¼J3šblâÉEgÆ=žW|ÊjEh<¢UŒÚCZDi(¦MOyÇ#Õ.V¯nɪ5 -+×®O¾‚m"vì’²fçMMëmZ·f᎕ –nW»Zñ^ÕK•¯H¿¡~*¸ÊÍÂF#&¢x±ÆŽ!/¾#¤ckp¨hŒçñ¸É1[æÌŒØhÐo”‰ötÙs7Zlïìâ»jRµß¬b•û3íÞ¬­XÎEÓHÄ£P£(ùGl;W²œÍðéÆMp wîÝ·`§ÝÌtWÕì*O¤r*; -\ No newline at end of file -diff -Naur mxml-2.6/doc/F.gif mxml-2.6-haiku/doc/F.gif ---- mxml-2.6/doc/F.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/F.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1 @@ -+GIF89add¥  $'&&*)-100437:::=F *tœÄ¢ E"ÝVr)S”Nƒ}Œ*ê(Õ.D¯f¥º5jW§_—†E:¶hY¡g¦Í¸ÖbÛ‰o!Æm8Wa݃wi‹8"•¤MÕòä«”íàR}é¦F8°Åb‡±Z…;DÖU;¸r]¶c„Ôf4ªb~–jdtã=¦»hº)5Jb¹vâˆMëÙI`³±„{µ ܵ -+ -+ -+

3More Mini-XML -+Programming Techniques

-+ -+

This chapter shows additional ways to use the Mini-XML -+library in your programs.

-+ -+

Load Callbacks

-+ -+

Chapter 2 introduced the mxmlLoadFile() and mxmlLoadString() functions. -+The last argument to these functions is a callback function -+which is used to determine the value type of each data node in -+an XML document.

-+ -+

Mini-XML defines several standard callbacks for simple -+XML data files:

-+ -+
    -+ -+
  • MXML_INTEGER_CALLBACK - All data nodes -+ contain whitespace-separated integers.
  • -+ -+
  • MXML_OPAQUE_CALLBACK - All data nodes -+ contain opaque strings ("CDATA").
  • -+ -+
  • MXML_REAL_CALLBACK - All data nodes contain -+ whitespace-separated floating-point numbers.
  • -+ -+
  • MXML_TEXT_CALLBACK - All data nodes contain -+ whitespace-separated strings.
  • -+ -+
-+ -+

You can provide your own callback functions for more complex -+XML documents. Your callback function will receive a pointer to -+the current element node and must return the value type of the -+immediate children for that element node: MXML_INTEGER, -+MXML_OPAQUE, MXML_REAL, or MXML_TEXT. -+The function is called after the element and its -+attributes have been read, so you can look at the element name, -+attributes, and attribute values to determine the proper value -+type to return.

-+ -+ -+

The following callback function looks for an attribute named -+"type" or the element name to determine the value type for its -+child nodes:

-+ -+
-+    mxml_type_t
-+    type_cb(mxml_node_t *node)
-+    {
-+      const char *type;
-+
-+     /*
-+      * You can lookup attributes and/or use the
-+      * element name, hierarchy, etc...
-+      */
-+
-+      type = mxmlElementGetAttr(node, "type");
-+      if (type == NULL)
-+	type = node->value.element.name;
-+
-+      if (!strcmp(type, "integer"))
-+	return (MXML_INTEGER);
-+      else if (!strcmp(type, "opaque"))
-+	return (MXML_OPAQUE);
-+      else if (!strcmp(type, "real"))
-+	return (MXML_REAL);
-+      else
-+	return (MXML_TEXT);
-+    }
-+
-+ -+

To use this callback function, simply use the name when you -+call any of the load functions:

-+ -+
-+    FILE *fp;
-+    mxml_node_t *tree;
-+
-+    fp = fopen("filename.xml", "r");
-+    tree = mxmlLoadFile(NULL, fp, type_cb);
-+    fclose(fp);
-+
-+ -+ -+

Save Callbacks

-+ -+

Chapter 2 also introduced the mxmlSaveFile(), mxmlSaveString(), and mxmlSaveAllocString() -+functions. The last argument to these 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 and 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 *
-+    whitespace_cb(mxml_node_t *node,
-+                  int where)
-+    {
-+      const char *name;
-+
-+     /*
-+      * We can conditionally break to a new line
-+      * before or after any element. These are
-+      * just common HTML elements...
-+      */
-+
-+      name = node->value.element.name;
-+
-+      if (!strcmp(name, "html") ||
-+          !strcmp(name, "head") ||
-+          !strcmp(name, "body") ||
-+	  !strcmp(name, "pre") ||
-+          !strcmp(name, "p") ||
-+	  !strcmp(name, "h1") ||
-+          !strcmp(name, "h2") ||
-+          !strcmp(name, "h3") ||
-+	  !strcmp(name, "h4") ||
-+          !strcmp(name, "h5") ||
-+          !strcmp(name, "h6"))
-+      {
-+       /*
-+	* Newlines before open and after
-+        * close...
-+	*/
-+
-+	if (where == MXML_WS_BEFORE_OPEN ||
-+            where == MXML_WS_AFTER_CLOSE)
-+	  return ("\n");
-+      }
-+      else if (!strcmp(name, "dl") ||
-+               !strcmp(name, "ol") ||
-+               !strcmp(name, "ul"))
-+      {
-+       /*
-+	* Put a newline before and after list
-+        * elements...
-+	*/
-+
-+	return ("\n");
-+      }
-+      else if (!strcmp(name, "dd") ||
-+               !strcmp(name, "dt") ||
-+               !strcmp(name, "li"))
-+      {
-+       /*
-+	* Put a tab before <li>'s, * <dd>'s,
-+        * and <dt>'s, and a newline after them...
-+	*/
-+
-+	if (where == MXML_WS_BEFORE_OPEN)
-+	  return ("\t");
-+	else if (where == MXML_WS_AFTER_CLOSE)
-+	  return ("\n");
-+      }
-+
-+     /*
-+      * Return NULL for no added whitespace...
-+      */
-+
-+      return (NULL);
-+    }
-+
-+ -+

To use this callback function, simply use the name when you -+call any of the save functions:

-+ -+
-+    FILE *fp;
-+    mxml_node_t *tree;
-+
-+    fp = fopen("filename.xml", "w");
-+    mxmlSaveFile(tree, fp, whitespace_cb);
-+    fclose(fp);
-+
-+ -+ -+ -+

Custom Data Types

-+ -+

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

-+ -+

The load callback receives a pointer to the current data node -+and a string of opaque character data from the XML source with -+character entities converted to the corresponding UTF-8 -+characters. For example, if we wanted to support a custom -+date/time type whose value is encoded as "yyyy-mm-ddThh:mm:ssZ" -+(ISO format), the load callback would look like the -+following:

-+ -+
-+    typedef struct
-+    {
-+      unsigned      year,    /* Year */
-+                    month,   /* Month */
-+                    day,     /* Day */
-+                    hour,    /* Hour */
-+                    minute,  /* Minute */
-+                    second;  /* Second */
-+      time_t        unix;    /* UNIX time */
-+    } iso_date_time_t;
-+
-+    int
-+    load_custom(mxml_node_t *node,
-+                const char *data)
-+    {
-+      iso_date_time_t *dt;
-+      struct tm tmdata;
-+
-+     /*
-+      * Allocate data structure...
-+      */
-+
-+      dt = calloc(1, sizeof(iso_date_time_t));
-+
-+     /*
-+      * Try reading 6 unsigned integers from the
-+      * data string...
-+      */
-+
-+      if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
-+                 &(dt->year), &(dt->month),
-+                 &(dt->day), &(dt->hour),
-+                 &(dt->minute),
-+                 &(dt->second)) != 6)
-+      {
-+       /*
-+        * Unable to read numbers, free the data
-+        * structure and return an error...
-+        */
-+
-+        free(dt);
-+
-+        return (-1);
-+      }
-+
-+     /*
-+      * Range check values...
-+      */
-+
-+      if (dt->month < 1 || dt->month > 12 ||
-+          dt->day < 1 || dt->day > 31 ||
-+          dt->hour < 0 || dt->hour > 23 ||
-+          dt->minute < 0 || dt->minute > 59 ||
-+          dt->second < 0 || dt->second > 59)
-+      {
-+       /*
-+        * Date information is out of range...
-+        */
-+
-+        free(dt);
-+
-+        return (-1);
-+      }
-+
-+     /*
-+      * Convert ISO time to UNIX time in
-+      * seconds...
-+      */
-+
-+      tmdata.tm_year = dt->year - 1900;
-+      tmdata.tm_mon  = dt->month - 1;
-+      tmdata.tm_day  = dt->day;
-+      tmdata.tm_hour = dt->hour;
-+      tmdata.tm_min  = dt->minute;
-+      tmdata.tm_sec  = dt->second;
-+
-+      dt->unix = gmtime(&tmdata);
-+
-+     /*
-+      * Assign custom node data and destroy
-+      * function pointers...
-+      */
-+
-+      node->value.custom.data    = dt;
-+      node->value.custom.destroy = free;
-+
-+     /*
-+      * Return with no errors...
-+      */
-+
-+      return (0);
-+    }
-+
-+ -+

The function itself can return 0 on success or -1 if it is -+unable to decode the custom data or the data contains an error. -+Custom data nodes contain a 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:

-+ -+
-+    char *
-+    save_custom(mxml_node_t *node)
-+    {
-+      char data[255];
-+      iso_date_time_t *dt;
-+
-+
-+      dt = (iso_date_time_t *)node->custom.data;
-+
-+      snprintf(data, sizeof(data),
-+               "%04u-%02u-%02uT%02u:%02u:%02uZ",
-+               dt->year, dt->month, dt->day,
-+               dt->hour, dt->minute, dt->second);
-+
-+      return (strdup(data));
-+    }
-+
-+ -+

You register the callback functions using the mxmlSetCustomHandlers() -+function:

-+ -+
-+    mxmlSetCustomHandlers(load_custom,
-+                          save_custom);
-+
-+ -+ -+ -+

Changing Node Values

-+ -+

All of the examples so far have concentrated on creating and -+loading new XML data nodes. Many applications, however, need to -+manipulate or change the nodes during their operation, so -+Mini-XML provides functions to change node values safely and -+without leaking memory.

-+ -+

Existing nodes can be changed using the mxmlSetElement(), mxmlSetInteger(), mxmlSetOpaque(), mxmlSetReal(), mxmlSetText(), and mxmlSetTextf() functions. For -+example, use the following function call to change a text node -+to contain the text "new" with leading whitespace:

-+ -+
-+    mxml_node_t *node;
-+
-+    mxmlSetText(node, 1, "new");
-+
-+ -+ -+

Formatted Text

-+ -+

The mxmlNewTextf() and mxmlSetTextf() functions create -+and change text nodes, respectively, using printf-style -+format strings and arguments. For example, use the following -+function call to create a new text node containing a constructed -+filename:

-+ -+
-+    mxml_node_t *node;
-+
-+    node = mxmlNewTextf(node, 1, "%s/%s",
-+                        path, filename);
-+
-+ -+ -+

Indexing

-+ -+

Mini-XML provides functions for managing indices of nodes. -+The current implementation provides the same functionality as -+mxmlFindElement(). -+The advantage of using an index is that searching and -+enumeration of elements is significantly faster. The only -+disadvantage is that each index is a static snapshot of the XML -+document, so indices are not well suited to XML data that is -+updated more often than it is searched. The overhead of creating -+an index is approximately equal to walking the XML document -+tree. Nodes in the index are sorted by element name and -+attribute value.

-+ -+

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

-+ -+
-+    mxml_node_t *tree;
-+    mxml_index_t *ind;
-+
-+    ind = mxmlIndexNew(tree, "element",
-+                       "attribute");
-+
-+ -+

The first argument is the XML node tree to index. Normally this -+will be a pointer to the ?xml element.

-+ -+

The second argument contains the element to index; passing -+NULL indexes all element nodes alphabetically.

-+ -+

The third argument contains the attribute to index; passing -+NULL causes only the element name to be indexed.

-+ -+

Once the index is created, the mxmlIndexEnum(), mxmlIndexFind(), and mxmlIndexReset() functions -+are used to access the nodes in the index. The mxmlIndexReset() function -+resets the "current" node pointer in the index, allowing you to -+do new searches and enumerations on the same index. Typically -+you will call this function prior to your calls to mxmlIndexEnum() and mxmlIndexFind().

-+ -+

The mxmlIndexEnum() -+function enumerates each of the nodes in the index and can be -+used in a loop as follows:

-+ -+
-+    mxml_node_t *node;
-+
-+    mxmlIndexReset(ind);
-+
-+    while ((node = mxmlIndexEnum(ind)) != NULL)
-+    {
-+      // do something with node
-+    }
-+
-+ -+

The mxmlIndexFind() -+function locates the next occurrence of the named element and -+attribute value in the index. It can be used to find all -+matching elements in an index, as follows:

-+ -+
-+    mxml_node_t *node;
-+
-+    mxmlIndexReset(ind);
-+
-+    while ((node = mxmlIndexFind(ind, "element",
-+                                 "attr-value"))
-+                != NULL)
-+    {
-+      // do something with node
-+    }
-+
-+ -+

The second and third arguments represent the element name and -+attribute value, respectively. A NULL pointer is used -+to return all elements or attributes in the index. Passing -+NULL for both the element name and attribute value -+is equivalent to calling mxmlIndexEnum.

-+ -+

When you are done using the index, delete it using the -+mxmlIndexDelete() -+function:

-+ -+
-+    mxmlIndexDelete(ind);
-+
-+ -+

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. Each function works like the -+corresponding mxmlLoad function but uses a callback to -+process each node as it is read.

-+ -+

The callback function receives the node, an event code, and -+a user data pointer you supply:

-+ -+
-+    void
-+    sax_cb(mxml_node_t *node,
-+           mxml_sax_event_t event,
-+           void *data)
-+    {
-+      ... do something ...
-+    }
-+
-+ -+

The event will be one of the following:

-+ -+
    -+ -+
  • MXML_SAX_CDATA - CDATA was just read
  • -+ -+
  • MXML_SAX_COMMENT - A comment was just read
  • -+ -+
  • MXML_SAX_DATA - Data (custom, integer, opaque, real, or text) was just read
  • -+ -+
  • MXML_SAX_DIRECTIVE - A processing directive was just read
  • -+ -+
  • MXML_SAX_ELEMENT_CLOSE - A close element was just read (</element>)
  • -+ -+
  • MXML_SAX_ELEMENT_OPEN - An open element was just read (<element>)
  • -+ -+
-+ -+

Elements are released after the close element is -+processed. All other nodes are released after they are processed. -+The SAX callback can retain the node using the mxmlRetain function. For example, -+the following SAX callback will retain all nodes, effectively -+simulating a normal in-memory load:

-+ -+
-+    void
-+    sax_cb(mxml_node_t *node,
-+           mxml_sax_event_t event,
-+           void *data)
-+    {
-+      if (event != MXML_SAX_ELEMENT_CLOSE)
-+        mxmlRetain(node);
-+    }
-+
-+ -+

More typically the SAX callback will only retain a small portion -+of the document that is needed for post-processing. For example, the -+following SAX callback will retain the title and headings in an -+XHTML file. It also retains the (parent) elements like <html>, <head>, and <body>, and processing -+directives like <?xml ... ?> and <!DOCTYPE ... >:

-+ -+ -+
-+    void
-+    sax_cb(mxml_node_t *node,
-+           mxml_sax_event_t event,
-+           void *data)
-+    {
-+      if (event == MXML_SAX_ELEMENT_OPEN)
-+      {
-+       /*
-+        * Retain headings and titles...
-+        */
-+
-+        char *name = node->value.element.name;
-+
-+        if (!strcmp(name, "html") ||
-+            !strcmp(name, "head") ||
-+            !strcmp(name, "title") ||
-+            !strcmp(name, "body") ||
-+            !strcmp(name, "h1") ||
-+            !strcmp(name, "h2") ||
-+            !strcmp(name, "h3") ||
-+            !strcmp(name, "h4") ||
-+            !strcmp(name, "h5") ||
-+            !strcmp(name, "h6"))
-+          mxmlRetain(node);
-+      }
-+      else if (event == MXML_SAX_DIRECTIVE)
-+        mxmlRetain(node);
-+      else if (event == MXML_SAX_DATA &&
-+               node->parent->ref_count > 1)
-+      {
-+       /*
-+        * If the parent was retained, then retain
-+        * this data node as well.
-+        */
-+
-+        mxmlRetain(node);
-+      }
-+    }
-+
-+ -+

The resulting skeleton document tree can then be searched just -+like one loaded using the mxmlLoad functions. For example, -+a filter that reads an XHTML document from stdin and then shows the -+title and headings in the document would look like:

-+ -+
-+    mxml_node_t *doc, *title, *body, *heading;
-+
-+    doc = mxmlSAXLoadFd(NULL, 0,
-+                        MXML_TEXT_CALLBACK,
-+                        sax_cb, NULL);
-+
-+    title = mxmlFindElement(doc, doc, "title",
-+                            NULL, NULL,
-+                            MXML_DESCEND);
-+
-+    if (title)
-+      print_children(title);
-+
-+    body = mxmlFindElement(doc, doc, "body",
-+                           NULL, NULL,
-+                           MXML_DESCEND);
-+
-+    if (body)
-+    {
-+      for (heading = body->child;
-+           heading;
-+           heading = heading->next)
-+        print_children(heading);
-+    }
-+
-+ -+ -+ -diff -Naur mxml-2.6/doc/basics.html mxml-2.6-haiku/doc/basics.html ---- mxml-2.6/doc/basics.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/basics.html 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,526 @@ -+ -+ -+ -+

2Getting Started -+with Mini-XML

-+ -+

This chapter describes how to write programs that use Mini-XML to -+access data in an XML file. Mini-XML provides the following -+functionality:

-+ -+
    -+ -+
  • Functions for creating and managing XML documents -+ in memory.
  • -+ -+
  • Reading of UTF-8 and UTF-16 encoded XML files and -+ strings.
  • -+ -+
  • 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 "leaf" nodes.
  • -+ -+
  • "Find", "index", and "walk" functions for easily -+ accessing data in an XML document.
  • -+ -+
-+ -+

Mini-XML doesn't do validation or other types of processing -+on the data based upon schema files or other sources of -+definition information, nor does it support character entities -+other than those required by the XML specification.

-+ -+ -+

The Basics

-+ -+

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

-+ -+
-+    #include <mxml.h>
-+
-+ -+

The Mini-XML library is included with your program using the -+-lmxml option:

-+ -+
-+    gcc -o myprogram myprogram.c -lmxml ENTER
-+
-+ -+

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

-+ -+
-+    pkg-config --cflags mxml ENTER
-+    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 mxmlNewXML functions. Only -+elements can have child nodes, and the top node must be an element, -+usually the <?xml version="1.0"?> 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:

-+ -+
-+    <?xml version="1.0"?>
-+    <data>
-+        <node>val1</node>
-+        <node>val2</node>
-+        <node>val3</node>
-+        <group>
-+            <node>val4</node>
-+            <node>val5</node>
-+            <node>val6</node>
-+        </group>
-+        <node>val7</node>
-+        <node>val8</node>
-+    </data>
-+
-+ -+

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

-+ -+
-+    ?xml
-+      |
-+    data
-+      |
-+    node - node - node - group - node - node
-+      |      |      |      |       |      |
-+    val1   val2   val3     |     val7   val8
-+                           |
-+                         node - node - node
-+                           |      |      |
-+                         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);
-+
-+ -+ -+

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> */
-+    mxml_node_t *node;   /* <node> */
-+    mxml_node_t *group;  /* <group> */
-+
-+    xml = mxmlNewXML("1.0");
-+
-+    data = mxmlNewElement(xml, "data");
-+
-+        node = mxmlNewElement(data, "node");
-+        mxmlNewText(node, 0, "val1");
-+        node = mxmlNewElement(data, "node");
-+        mxmlNewText(node, 0, "val2");
-+        node = mxmlNewElement(data, "node");
-+        mxmlNewText(node, 0, "val3");
-+
-+        group = mxmlNewElement(data, "group");
-+
-+            node = mxmlNewElement(group, "node");
-+            mxmlNewText(node, 0, "val4");
-+            node = mxmlNewElement(group, "node");
-+            mxmlNewText(node, 0, "val5");
-+            node = mxmlNewElement(group, "node");
-+            mxmlNewText(node, 0, "val6");
-+
-+        node = mxmlNewElement(data, "node");
-+        mxmlNewText(node, 0, "val7");
-+        node = mxmlNewElement(data, "node");
-+        mxmlNewText(node, 0, "val8");
-+
-+ -+

We start by creating the <?xml version="1.0"?> -+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):

-+ -+
-+    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:

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

-+ -+ -+

Loading XML

-+ -+

You load an XML file using the mxmlLoadFile -+function:

-+ -+
-+    FILE *fp;
-+    mxml_node_t *tree;
-+
-+    fp = fopen("filename.xml", "r");
-+    tree = mxmlLoadFile(NULL, fp,
-+                        MXML_TEXT_CALLBACK);
-+    fclose(fp);
-+
-+ -+

The first argument specifies an existing XML parent node, if -+any. Normally you will pass NULL for this argument -+unless you are combining multiple XML sources. The XML file must -+contain a complete XML document including the ?xml -+element if the parent node is NULL.

-+ -+

The second argument specifies the stdio file to read from, as -+opened by fopen() or popen(). You can also use -+stdin if you are implementing an XML filter -+program.

-+ -+

The third argument specifies a callback function which returns -+the value type of the immediate children for a new element node: -+MXML_CUSTOM, MXML_IGNORE, -+MXML_INTEGER, MXML_OPAQUE, MXML_REAL, -+or MXML_TEXT. Load callbacks are described in detail in -+Chapter 3. The example code uses -+the MXML_TEXT_CALLBACK constant which specifies that all -+data nodes in the document contain whitespace-separated text -+values. Other standard callbacks include -+MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -+MXML_OPAQUE_CALLBACK, and -+MXML_REAL_CALLBACK.

-+ -+

The mxmlLoadString -+function loads XML node trees from a string:

-+ -+ -+
-+    char buffer[8192];
-+    mxml_node_t *tree;
-+
-+    ...
-+    tree = mxmlLoadString(NULL, buffer,
-+                          MXML_TEXT_CALLBACK);
-+
-+ -+

The first and third arguments are the same as used for -+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:

-+ -+
-+    FILE *fp;
-+    mxml_node_t *tree;
-+
-+    fp = fopen("filename.xml", "w");
-+    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
-+    fclose(fp);
-+
-+ -+

The first argument is the XML node tree to save. It should -+normally be a pointer to the top-level ?xml node in -+your XML document.

-+ -+

The second argument is the stdio file to write to, as opened -+by fopen() or popen(). You can also use -+stdout if you are implementing an XML filter -+program.

-+ -+

The third argument is the whitespace callback to use when -+saving the file. Whitespace callbacks are covered in detail in Chapter 3. The previous example code -+uses the MXML_NO_CALLBACK constant to specify that no -+special whitespace handling is required.

-+ -+

The mxmlSaveAllocString, -+and mxmlSaveString -+functions save XML node trees to strings:

-+ -+
-+    char buffer[8192];
-+    char *ptr;
-+    mxml_node_t *tree;
-+
-+    ...
-+    mxmlSaveString(tree, buffer, sizeof(buffer),
-+                   MXML_NO_CALLBACK);
-+
-+    ...
-+    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
-+
-+ -+

The first and last arguments are the same as used for -+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 mxmlSetWrapMargin function -+overrides the default wrap margin:

-+ -+
-+    /* Set the margin to 132 columns */
-+    mxmlSetWrapMargin(132);
-+
-+    /* Disable wrapping */
-+    mxmlSetWrapMargin(0);
-+
-+ -+ -+ -+

Finding and Iterating Nodes

-+ -+

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

-+ -+
-+    mxml_node_t *node;
-+    
-+    node = mxmlWalkPrev(current, tree,
-+                        MXML_DESCEND);
-+
-+    node = mxmlWalkNext(current, tree,
-+                        MXML_DESCEND);
-+
-+ -+

In addition, you can find a named element/node using the mxmlFindElement -+function:

-+ -+
-+    mxml_node_t *node;
-+    
-+    node = mxmlFindElement(tree, tree, "name",
-+                           "attr", "value",
-+                           MXML_DESCEND);
-+
-+ -+

The name, attr, and value -+arguments can be passed as NULL to act as wildcards, -+e.g.:

-+ -+ -+
-+    /* Find the first "a" element */
-+    node = mxmlFindElement(tree, tree, "a",
-+                           NULL, NULL,
-+                           MXML_DESCEND);
-+
-+ -+
-+    /* Find the first "a" element with "href"
-+       attribute */
-+    node = mxmlFindElement(tree, tree, "a",
-+                           "href", NULL,
-+                           MXML_DESCEND);
-+
-+ -+
-+    /* Find the first "a" element with "href"
-+       to a URL */
-+    node = mxmlFindElement(tree, tree, "a",
-+                           "href",
-+                           "http://www.easysw.com/",
-+                           MXML_DESCEND);
-+
-+ -+
-+    /* Find the first element with a "src"
-+       attribute */
-+    node = mxmlFindElement(tree, tree, NULL,
-+                           "src", NULL,
-+                           MXML_DESCEND);
-+
-+ -+
-+    /* Find the first element with a "src"
-+       = "foo.jpg" */
-+    node = mxmlFindElement(tree, tree, NULL,
-+                           "src", "foo.jpg",
-+                           MXML_DESCEND);
-+
-+ -+

You can also iterate with the same function:

-+ -+
-+    mxml_node_t *node;
-+
-+    for (node = mxmlFindElement(tree, tree,
-+                                "name",
-+                                NULL, NULL,
-+                                MXML_DESCEND);
-+         node != NULL;
-+         node = mxmlFindElement(node, tree,
-+                                "name",
-+                                NULL, NULL,
-+                                MXML_DESCEND))
-+    {
-+      ... do something ...
-+    }
-+
-+ -+ -+

The MXML_DESCEND argument can actually be one of -+three constants:

-+ -+
    -+ -+
  • MXML_NO_DESCEND means to not to look at any -+ child nodes in the element hierarchy, just look at -+ siblings at the same level or parent nodes until the top -+ node or top-of-tree is reached. -+ -+

    The previous node from "group" would be the "node" -+ element to the left, while the next node from "group" would -+ be the "node" element to the right.

  • -+ -+
  • MXML_DESCEND_FIRST means that it is OK to -+ descend to the first child of a node, but not to descend -+ further when searching. You'll normally use this when -+ iterating through direct children of a parent node, e.g. all -+ of the "node" and "group" elements under the "?xml" parent -+ node in the example above. -+ -+

    This mode is only applicable to the search function; the -+ walk functions treat this as MXML_DESCEND since -+ every call is a first time.

  • -+ -+
  • MXML_DESCEND means to keep descending until -+ you hit the bottom of the tree. The previous node from -+ "group" would be the "val3" node and the next node would -+ be the first node element under "group". -+ -+

    If you were to walk from the root node "?xml" to the end -+ of the tree with mxmlWalkNext(), the order would -+ be:

    -+ -+

    ?xml data node val1 node val2 node val3 group node -+ val4 node val5 node val6 node val7 node val8

    -+ -+

    If you started at "val8" and walked using -+ mxmlWalkPrev(), the order would be reversed, -+ ending at "?xml".

  • -+ -+
-+ -+ -+ -diff -Naur mxml-2.6/doc/chapters.xcf.gz mxml-2.6-haiku/doc/chapters.xcf.gz ---- mxml-2.6/doc/chapters.xcf.gz 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/chapters.xcf.gz 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,26 @@ -+‹µY x•Źž“L˜IÈ ä„$'$8‚¶ÚÛZ)¸A±>UHB€”Å‚õ†VkÕkoëm+¹]½VPÛZm+¨m-VêÒ6t×.6¸`Ep’fîûÍr’ˆ}žÞ{ŸËó̼_þÿüËüïÌ7ï÷²º³ûòø–öUñUë:c±é®Ùt †®Mžu3cÔðoGË@+ö1ýn<à `Îjܶ¡}}wwGÏ&æORcùöLgwëꎆÕ:Wú“1Y·qÓÖuñΞM6v´oê\ß³1‘U·juûúuë7Äë,4lXÝÖoœÑhÿ½G0Ë \Úö—Îz÷O èÒ-/omïìYŸ[ßë ?Ö°¹§s^¾}M½õ–õ«VmìØyõ©‡Ü‘Ñ—²á±=ø¸3F¸Çõ2­‰Ž¤ù3c<†xÁG¦é_Öˆxìˆ8{Dœ3"Îó÷ú€1æ q.ðŸî9?/Å즎-›ÖµníØ˜mª£cñʦJ¢s}ÂÅÝm›7Æ/jíÙÿHü¬õëV†s ;¯êˆ75ŽøJ©ÃîC]Þ¹¥c}ã5˜*ÄÆVûÅ[7oZOGŸ8׺®³u£ÿ{]kÏê͘sñÊŽžåK/¢ÇµµnìhXÙ¹Á͵øºMpð=cÖnÞ¸©sÕÖøºŽU›èy= a¾4Ì1œ¶õ[º×¯ìˆ¯ÜÚÓÚÝÙîÛÎÓ¿õ.òñÙÓ`bàGÅXzÅ•£ÏóÙhg¡]ˆÖ†ø5hŸÇ,Yÿ¬Þƒ™…<ö`÷ÈÍÛ–ûŸ°Ò7ƒÝ[Áêh =†ãã  Òƒ¶å33¢úwæÃfDû¿ý>]±(}zkaïˆ÷_÷ããÆ°f6TqùÞ· 7³Y¿ò #ÍL‰e˜±¦E%×39f‹jv½còL‚Eå}ʘZåÝôŽ)2SY[vØŒ7ÕLU>h&˜JXqÜ”˜)L~ÛL4q¦¦ÿÕ”™ -+¦–œ0åf2ÓWšÉ¦œ©´Ï™ -+Süª‰›‰Lžl¦˜RàvS Ô[L•)aú|Sm&05󰘩‚gÌT3¿ºÇÔõZSkÆ1Uõ&°‡dê€z™I˜B¦²ž·ˆGÖ›¦ò^±ˆ[O3ùLÉ-êf:Ác€<¦g˜‚›pN:ËX¥=ËÔž\–Ëô| -+7ǰ¢õx”Ò—"³ë? Ô+)šDÑ Ï¼ o¤N§ðkxWub -+R¿~¡¾Š¢:x8“¡ƒW"èz» b4uײ粧³êÚ¾»ô«gž?òê[o¾vôÅ?ÿòáïíºvÝy3rX‹vÜßû䑟|aÍÁJY•<ùø¿ŸW€¤RkÕ½1¼à43ôì¿ÍŒa(3LôÛî|¤¬F½õ•zä´&£î‡åà/ -+öïw@“uäËfúë G ÏÖ¿ h1ž«b¯cÙ©·2inŽ££?¤ós(ÚLÑEͧ¨›~¨³)¼¡þ†¦¿BÑ>Šî¡èKí§è“ý–¢6ŠþJÑ"ŠþNÑé½AQEïP§hˆ¢bŠ4E¹ˆ°r„î fa[ÖöQã«ez/¦`½ƒ: *vÄŒ3uL?ààF+|ØAƒƒ‰ -+H鲌wPá`†ƒ…:\ïà^=þïõd÷R—8ØÀÄ•Ç-êóÜt~€I>ÓÍõÛXI¬,ˆô~‹z+ÖÖÉY -+ˆu?âRð”—‚«Ù¬Î}ë 98ã—ƒßÿ,F,ÄÆ;‘{‹±M|p¾oJ›»ó0’S³z¾ý2²i:{#6&g\YÝ™í¾á»OGÈ–šQÙ!1œdætja&i†vco2H#Ç—Ç>æ"mT@ïÌ1Ñ+8À¨»'A·˜èäÍ%83)éú—i^¼ÌešÇNyŠïF.mÌìkÜÿ†ƒüÂÁ3Ž98îà¤=ê/O:øƒ¯9èup±ƒ&@QÑX‹ºß-Á/;¸€ÕŠL¨wkø“â,÷‡Ýª¿ kÔ c,êMXWHGs-ênÌq¤‘?±¨ÏEVKC.AæQ/‘‰ÔÙHA™tÿ‰HSê¾4 ÒÖ/³‘¯ÆþV‚4†´v¸iãQ5HsH~ÏMEÖC2üm9’ąç³),2}9R¯bÛbŸaú4$ÏH}. ‡ð‹?ÍÇ/ÒL¤oʰyS˜ì2æ±…¸õ¨,ëÃ,ñqM©L+ìz EïP”KÑqŠŠ):J}ý Es(úEçSôcŠ:)º›¢ë)úE÷Qô Š(ú8íÆù´/ è\ŠŠ)Ú‰HÅ^¥þŽ~øs:XM§o¥èŠVÑþ>F»z&>ò$Ę·éè´•â-pôÃõ"ROIqö<\Ÿ1jÜï5mÿaw„ÅÒÒy†ÈÊ-,©H4Ÿ½¤ó3·=þžPÄNƪ?öù_)¬Í6”÷±»Þ„d*cQn×ïüzþo쥵u;ç¸ÛíÎÅÚßv{eÓKn“¬ü³Û' ¸DXõ’MLjÁt]‚é. *öÖT=S“߀î›F †@e>kòÍt¦×XPY/C60}ƒ:À ¦Ÿ4¹W;h± Ò_‡¤œÉôOÜì ÃÁ9¦;(që ÃtPä ÂA£ƒ lvp«ƒƒ<7WYÄ#ìÛ|ÐÀÉ¢>Û½øwNµ¶¨¿„Ña°õß ¶ƒ¯gú£ø$ø4“_â‹eìǧ™„Æ`)\³â@Ý’îdÁ}™V¨}™N­¸?ÃI€]1·÷o¶ 0Ù쮬ÜmðVGжO Þ©²ÙFý †)WD‹‚@=•]:ÎèK,¨?¦Cw7z‰ƒÅFWAÒÓš!PÏÆ '=ÛÁ5~ (1zŠÛšønp°ß‚z-ÅXjôg:Xãà³¾âàûžpðŒƒÃ^qð¦å rð–ƒ×qðO:Øçà79èqpƒFÞWeZÄõv÷:èuð!€ ”ìG¸ÙÁBÀȵœ…$ð­÷¡9´ÞwSAp¸Œ -+‚K¨dx’Ê•’âÇ -+¨d¸u…ê/Ç÷F1Ó€$~.î¨ÄQ3ƒQ6‰Ž™eÆ#¹$ ,$y”dl9rOÛgKÕ¨qû*,T1Õ5…$[TÚOl²P¯#WA¸]jAžŽt‡Ò)³;:J©)/C¼¡´š÷¶Í'êŠ …W`"¥¿J’ÒRaÉI›bÔÙ¯¡|ƒ„¨yÊIõü{­Tb—:>û÷V£GâÚ!—ifüÔfTŠÏÚe^þw›T¢¬M/Øü¹´ß.Ë¡XË®ã¨=g±¡ìKî9‰r´™òÜmGL†iaƒiM¿{ÄÄÌéøaÕEײm|Û»DžŠ}Õ ªkÕðìØ§ðld½´[ð.ÐIÅûI ÆKb~c %ßD¦Œ^]Ÿ……ö¾ŽáEÇ®¯À²Œ¦í¶¸j~ëg¿ÿšÙ–ñ¼:…LùÍlå=Ý"ª«zT­S=_v:çÕñNçôXe£žà@ä¶ÁéNÓü«Ó4?¥â™ðå2|rdFõA§fzœšAb´jæ{  õ'ÒɘŸå:ó£±NÆ ÁZs ©#ê -+*â NŽœeõËÏÊ!VÔUéø ?üŸû(±÷™íÔ¿Ù#fD#kç"´g½Ÿ”@»b„Ý7×›’#ýá±gµ¶w­Þ°~sÏÊÿo2ü{/2møtñïßõšé8ö&c³¾ˆöM´ïŒ>?¡ƒ±òCŒM½&Å›ŒûU>ÃXÕhÿö ´o3V}ÚZ´+Ñ®AÛ¶‹±šçÐ^Eb¬ï–8—±†f´n´­ŒÍXFO»Ê öïZ“Ì3§™¡þí‹‹x:o2ÑÞ®j.x£‰öw•ò,Þ`¢£ÛyŸf¢þ5<#_ï_Ê y­Q^ÈÇñ©F=½œó*L¸«y ¯4êÎ^ÊãF½´œ—ñ -+£î(åå|²Ñ]|2/Goá¼Ì¨Û2yœOD]Î+9rH¯âŒ:¾Ws¬­’|*Çjhä5ëg ×r,œyÇŠ9žä  ^Èëy]=çÓ½¦sˆþÛxÇéÏ´¨[ø žCÏŸÉ!òïàËã¥R‹z9ŸÅ³Œ¾“Ïæ¤õk,ê«y—F?Í› –„ÑòÓ.ŒÁþÍç,d @á-kXú]¶_cû¤íóЃӃ}] ŠˆÓƒ;/˜ Ó%8Ý×S+…§ô”Ë, Níl–9œìÊ”yœ>²LJpz`©'‰ÓVY,‰Ó^Y"ÁéÝõ²T‚Ó#­²L‚Ó=å²\‚Ó9Y‚ÓƒIY!Áéí92.Áé§e¥§+e•$NËj N/S%qÚ,k$q:KÖJpz¸YÖIâtLõbY/ èêi2Ÿî5]‚ÓÛeƒ§s,ꤜ!sèù3%8Ý#%8=RnQ·ÊYœÞ-gKâ´Þ¢î•M’8•Í­y@žF°2‘s–@æAÙBЧÇ2-êr.A3 ®˜GÐã ÷É$AƒZ@Œîv:ÁN8˜Pæ œ¾Ïö]¶_`û"ô´NûÖÎ/´ëtÇùÅ"]§Ý5Bâ´»Ld âtG“È´N×J‘',§¢P§KÄ8Aœ®ÅÂr*J8½+!JqºB” pº»L” pÚ-& Z§IQ!ˆÓlÄ©¨à´]T ât‘¨Äé|1U§M¢F§¢V§M¢N§óE¨‰zQ@WOÄ©˜.ˆSÑ hf[ÔI1CPQ.f -+pº[4 -+â´Ì¢^!f pz—˜-ˆÓ„EÝ+šq*š VˆSqÁq*æ,Ð:-kÄ©´¨wˆ¹MâTÌ#èvP NE’ ÛA €Ö©8`‡ƒó°NÅ|ô}¶_kûù¶/DbàÁ]W·-l©)ÍËäÛòNðõõ®\œ¬//Ê‘8 íöEÉDYa¶ÀÝ”£I4ç'2óJkZ¶]½ëÁHÀi|0/¹fW?*³F>T´x{¿É4Í<ªîÚ‹"ª…G¥]ûM:Å`ãö£Æ Dkúù¶Ü3y\žÈ)*¯O.^ÙÛ÷½—,ZÐÕGÕ^£špÁ΃t/Õöì£{ɨ¼çº—lÞyÌÌß(³ë Ä½d\œÈ.,K$µ‡{‰ÁÂùkûì{‰¡âówØ÷QM·½—ˆÊºí½Ä`ÓÜ ß-’kûî%¶ÅšZºŠ;ÆÕ…Bi§sµüi(ì ®®VÐÔc¸ª¹u»Äñ— ©3¹*½¢s,GÍ=ÉdsÕÒEšÃUæmPzy\oƒVÍçÐå%¦€«…Ç¡á -+¹J¾‰[ÄUãï8®P†ŽÇß/`Å8Õê®Jèê|SJ÷Ê3¹¾ r{"§R Ç”qÔæ9¦œžŸm&q}ø$¼ÕK&ËLæz9 ‚ë;ñ *ðî -+ª<ÎQÕK3…ë§ X¨äúQ|À…€*®÷Cµ–ª¹î7œ`•qp*×Û4jèŠ4‚.¥€Z®÷Bñ×ÒA Õ€:õc:Ôòh»ƒÅŠu\õÛ~—íר>I½Î3–e;R-=@ìHÕjÙ‘ª×²#UýÝÄŽ!v¤*ßCìHÝCìH•Ø‘z±ƒ·:BìHÝJìH™`ïnÙ‘º—Ø‘Žú Ø‘ú±#ÁØ‘úbGêeÄŽÔ‰‰L 2-RïtÐLìÐi=ʉ‰Š4FÐã –Ø‘ÑA,°Zítpƒ €:©Ú¾Ïö]¶_@½.ÉŽPK,;B­°ìÏŽP‰»ˆ·ìU¶›Øº›Ø*i׎PÙ–áØºØj‘eG¨ù–¡š,;‚ÖØÁß–œ·ì½ˆØ¡«ÁŽpìÇž`׎pìÐóÁŽÐ»‰¼•eGèÄŽÐw;xwËŽpìÇýìÇŽÐKˆáØŽáÖŽÐk-(iÙz‡ƒ&bG8vè=,”;±C-Ô;‚Ö6»h‡ƒóêÖõ}¶_kûùÔk2Áù®¤nuWS×FÝBêZ¨«¡®”º<ê°Iäôr= Hýu}ÔõR·’ºÅÔ%©«§®œº"ê°™äôJ= ýu}ÔõR×NÝ"ê’Ô%¨+£®:l:9½£6×ã½ Å1  (AJЀ4  (AJЀ4 „Pf¯Ç›AñaH R‚†” !%hH R‚†” !%hH ;¤Ì2Y/0¨ *AƒJР4¨ *AƒJР4¨ *a•YöO jT<ñXÄcË÷ÑË^JS\µ¤økKqº+Å31îzPëkF¨xRô^Þ‹}/ý©ðeÁp‘@%ƒ/ †Ë *.|©‘*<\âË_¤`ôà )OÍšdj&­LÍ®¾ÔŒ£¹çi§]#D+ X¯f‡µ­Wº¤{½ -+ÖĤ½^VϤ¥½²Nél'»½ -+÷šC 2Ã\-KÍßdjN·§æy_jîÓ*pú+h±µ#4é5/Þ†¥œv$ó¼è–€$½<‹$½LÉJ§2½èôôŸšx¤ÉÖLijµ¤ÖV[j½íJ­ÁÚ¨ó†·k¿uï -+[ºß߇w{¿÷“¨qº`X%fð -+bXOºðZÃ+ DRºÄfZ €¦ZX¹å©ÕœL­ð•©Uß—Ê´— ïh~wë »žß‡7D¿=ÒfYã¶Îá”·ßd‡·\Jñ~;ö›sØ«S[·ÝÈ1šh!”¥rJ2•gÚS¹§/•(Ý'}¿ô…ÁïÃ{†ßAh?©q»Ëð^càö¡á]ÉÀíX~ÿ -+ÛYjw³ x»Þ»ðN†÷5¼Ëá=`xGÄû#Á.ñî‰÷R¼³Œï»xÆ{2Þ¡ †M0p‚¡ ž`øÈûAÞ -+fQ0¼—¬¥`5ë)XQÁš -+VU°®R^VÊÝJù])lNÊKŸì ãïx×À{ÞQðþ‚w‚ùà½ïL£ÂûÞÅðžF°8¼ãáýï†xo$X%Á: VJ°V‚Õ¬ïÄx_&Ø4Á¶ñ.N0u‚ÉLŸ`S(˜DÁ4J¹H)_)å4¥¼§9);**÷5]iNº¯×}õîky_Ùû:?”ýÞðž@°¼càýï&sÁ{ Þyð>„w%‚IL‹`bS#˜ÁôðˆwD‚A ïŸ;%Ø+Án öK°c‚=ìš”“rtROÊõ™“2‚’Á:ÃlËz˜²š8ÉQÆB“Ä!1ÊZh-o2ÿÕ9ó‚S0'x)7aØ`á:œâHàNΘ|‚9Á9Hy ÃöÂÏá?wr®À¼àÌ ¾AÊI6F8§¸¾„öµ/¯}±íKo_ˆû²÷Õº¯ÝC)JûPê‡Ò?XÁðN÷ ‚lï2Ó!˜Á”&E0-‚‰AE³ý(®`ôå£/&}ié M_vú"4Ô¤¾Dõk¨_}9ë‹[_ê†Ê×¾,öE²/™C*êPa‡Š;Tà¡"÷º/×Cõªy_܇Z?ÔþÁ Þ@ð -+‚w> -+c싾ѿ…¾Ñ¿©¾±ÿd º1 -\ No newline at end of file -diff -Naur mxml-2.6/doc/docset.css mxml-2.6-haiku/doc/docset.css ---- mxml-2.6/doc/docset.css 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/docset.css 2008-11-28 10:56:50.000000000 +0000 -@@ -0,0 +1,114 @@ -+body { -+ background: white; -+ color: black; -+ font-family: lucida grande, geneva, helvetica, arial, sans-serif; -+} -+ -+h1, h2, h3, h4, h5, h6, p, td, th { -+ font-family: lucida grande, geneva, helvetica, arial, sans-serif; -+} -+ -+kbd { -+ color: #006600; -+ font-family: monaco, courier, monospace; -+ font-weight: bold; -+} -+ -+pre { -+ font-family: monaco, courier, monospace; -+} -+ -+pre.example { -+ background: white; -+ border: dotted thin #999999; -+ margin-left: 36pt; -+ padding: 10px; -+} -+ -+pre.example em { -+ color: #3f0000; -+ font-family: lucida grande, geneva, helvetica, arial, sans-serif; -+} -+ -+div.summary table { -+ border: solid thin #999999; -+ border-collapse: collapse; -+ border-spacing: 0; -+ margin: 10px; -+ width: 33%; -+} -+ -+div.summary table td, div.summary table th { -+ background: white; -+ border: solid thin #999999; -+ border-spacing: 0; -+ padding: 5px; -+ text-align: left; -+ vertical-align: top; -+} -+ -+div.summary table thead th { -+ background: #f0f0f0; -+} -+ -+div.body h1 { -+ margin: 0; -+} -+div.body h2 { -+ margin-top: 1.5em; -+} -+div.body h3, div.body h4, div.body h5 { -+ margin-bottom: 0.5em; -+ margin-top: 1.5em; -+} -+.class, .enumeration, .function, .struct, .typedef, .union { -+ border-bottom: solid thin #999999; -+ margin-bottom: 0; -+ margin-top: 2em; -+} -+.description { -+ margin-top: 0.5em; -+} -+code, p.code, pre, ul.code li { -+ font-family: monaco, courier, monospace; -+ font-size: 90%; -+} -+ul.code, ul.contents, ul.subcontents { -+ list-style-type: none; -+ margin: 0; -+ padding-left: 0; -+} -+ul.code li { -+ margin: 0; -+} -+ul.contents > li { -+ margin-top: 1em; -+} -+ul.contents li ul.code, ul.contents li ul.subcontents { -+ padding-left: 2em; -+} -+div.body dl { -+ margin-left: 0; -+ margin-top: 0; -+} -+div.body dt { -+ font-style: italic; -+ margin-left: 0; -+ margin-top: 0; -+} -+div.body dd { -+ margin-bottom: 0.5em; -+} -+span.info { -+ background: black; -+ border: thin solid black; -+ color: white; -+ font-size: 80%; -+ font-style: italic; -+ font-weight: bold; -+ white-space: nowrap; -+} -+h2 span.info, h3 span.info, h4 span.info { -+ float: right; -+ font-size: 100%; -+} -diff -Naur mxml-2.6/doc/docset.header mxml-2.6-haiku/doc/docset.header ---- mxml-2.6/doc/docset.header 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/docset.header 2008-11-28 10:56:50.000000000 +0000 -@@ -0,0 +1,16 @@ -+

Mini-XML API Reference

-+ -+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Headermxml.h
Library-lmxml
-diff -Naur mxml-2.6/doc/docset.intro mxml-2.6-haiku/doc/docset.intro ---- mxml-2.6/doc/docset.intro 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/docset.intro 2008-11-28 10:56:50.000000000 +0000 -@@ -0,0 +1,155 @@ -+

Introduction

-+ -+

Mini-XML is a small XML parsing library that you can use to read XML and -+XML-like data files in your application without requiring large non-standard -+libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works, -+as do most vendors' ANSI C compilers) and a "make" program.

-+ -+

Mini-XML provides the following functionality:

-+ -+
    -+ -+
  • Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files -+ and strings.
  • -+ -+
  • Data is stored in a linked-list tree structure, preserving the XML -+ data hierarchy.
  • -+ -+
  • 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 -+ "leaf" nodes.
  • -+ -+
  • Functions for creating, indexing, and managing trees of data.
  • -+ -+
  • "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, nor does it -+support character entities other than those required by the XML -+specification.

-+ -+

Using Mini-XML

-+ -+

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

-+ -+
-+#include <mxml.h>
-+
-+ -+

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. -+New nodes can be created using the -+"mxmlNewElement()", -+"mxmlNewInteger()", -+"mxmlNewOpaque()", -+"mxmlNewReal()", and -+"mxmlNewText()" functions. Only elements can have -+child nodes, and the top node must be an element, usually "?xml".

-+ -+

You load an XML file using the "mxmlLoadFile()" function:

-+ -+
-+FILE *fp;
-+mxml_node_t *tree;
-+
-+fp = fopen("filename.xml", "r");
-+tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
-+fclose(fp);
-+
-+ -+

Similarly, you save an XML file using the -+"mxmlSaveFile()" function: -+ -+

-+FILE *fp;
-+mxml_node_t *tree;
-+
-+fp = fopen("filename.xml", "w");
-+mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
-+fclose(fp);
-+
-+ -+

The "mxmlLoadString()", -+"mxmlSaveAllocString()", and -+"mxmlSaveString()" functions load XML node trees -+from and save XML node trees to strings:

-+ -+
-+char buffer[8192];
-+char *ptr;
-+mxml_node_t *tree;
-+
-+...
-+tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK);
-+
-+...
-+mxmlSaveString(tree, buffer, sizeof(buffer),
-+	       MXML_NO_CALLBACK);
-+
-+...
-+ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
-+
-+ -+

You can find a named element/node using the -+"mxmlFindElement()" function:

-+ -+
-+mxml_node_t *node = mxmlFindElement(tree, tree, "name",
-+				    "attr", "value",
-+				    MXML_DESCEND);
-+
-+ -+

The "name", "attr", and "value" arguments can be passed as -+NULL to act as wildcards, e.g.:

-+ -+
-+/* Find the first "a" element */
-+node = mxmlFindElement(tree, tree, "a", NULL, NULL,
-+		       MXML_DESCEND);
-+
-+/* Find the first "a" element with "href" attribute */
-+node = mxmlFindElement(tree, tree, "a", "href", NULL,
-+		       MXML_DESCEND);
-+
-+/* Find the first "a" element with "href" to a URL */
-+node = mxmlFindElement(tree, tree, "a", "href",
-+		       "http://www.easysw.com/~mike/mxml/",
-+		       MXML_DESCEND);
-+
-+/* Find the first element with a "src" attribute*/
-+node = mxmlFindElement(tree, tree, NULL, "src", NULL,
-+		       MXML_DESCEND);
-+
-+/* Find the first element with a "src" = "foo.jpg" */
-+node = mxmlFindElement(tree, tree, NULL, "src",
-+		       "foo.jpg", MXML_DESCEND);
-+
-+ -+

You can also iterate with the same function:

-+ -+
-+mxml_node_t *node;
-+
-+for (node = mxmlFindElement(tree, tree, "name", NULL,
-+			    NULL, MXML_DESCEND);
-+     node != NULL;
-+     node = mxmlFindElement(node, tree, "name", NULL,
-+			    NULL, MXML_DESCEND))
-+{
-+  ... do something ...
-+}
-+
-+ -+

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:

-+ -+
-+mxmlDelete(tree);
-+
-diff -Naur mxml-2.6/doc/footer.man mxml-2.6-haiku/doc/footer.man ---- mxml-2.6/doc/footer.man 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/footer.man 2008-01-29 05:28:31.000000000 +0000 -@@ -0,0 +1,4 @@ -+.SH SEE ALSO -+mxmldoc(1), Mini-XML Programmers Manual, http://www.minixml.org/ -+.SH COPYRIGHT -+Copyright 2003-2008 by Michael Sweet. -diff -Naur mxml-2.6/doc/install.html mxml-2.6-haiku/doc/install.html ---- mxml-2.6/doc/install.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/install.html 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,119 @@ -+ -+ -+ -+

1Building, -+Installing, and Packaging Mini-XML

-+ -+

This chapter describes how to build, install, and package -+Mini-XML on your system from the source archive. You will need an -+ANSI/ISO-C compatible compiler to build Mini-XML - GCC works, as -+do most vendors' C compilers. If you are building Mini-XML on -+Windows, we recommend using the Visual C++ environment with the -+supplied solution file. For other operating systems, you'll need a -+POSIX-compatible shell and make program in addition to -+the C compiler.

-+ -+

Compiling Mini-XML

-+ -+

Mini-XML comes with both an autoconf-based configure script -+and a Visual C++ solution that can be used to compile the library -+and associated tools.

-+ -+

Compiling with Visual C++

-+ -+

Open the mxml.sln solution in the vcnet -+folder. Choose the desired build configuration, "Debug" (the -+default) or "Release", and then choose Build Solution -+from the Build menu.

-+ -+

Compiling with Command-Line Tools

-+ -+

Type the following command to configure the Mini-XML source -+code for your system:

-+ -+
-+    ./configure ENTER
-+
-+ -+

The default install prefix is /usr/local, which -+can be overridden using the --prefix option:

-+ -+
-+    ./configure --prefix=/foo ENTER
-+
-+ -+

Other configure options can be found using the -+--help option:

-+ -+
-+    ./configure --help ENTER
-+
-+ -+

Once you have configured the software, use the -+make(1) program to do the build and run the test -+program to verify that things are working, as follows:

-+ -+
-+    make ENTER
-+
-+ -+ -+

Installing Mini-XML

-+ -+

If you are using Visual C++, copy the mxml.lib and -+and mxml.h files to the Visual C++ lib and -+include directories, respectively.

-+ -+

Otherwise, use the make command with the -+install target to install Mini-XML in the configured -+directories:

-+ -+
-+    make install ENTER
-+
-+ -+ -+

Creating Mini-XML Packages

-+ -+

Mini-XML includes two files that can be used to create binary -+packages. The first file is mxml.spec which is used -+by the rpmbuild(8) software to create Red Hat Package -+Manager ("RPM") packages which are commonly used on Linux. Since -+rpmbuild wants to compile the software on its own, you -+can provide it with the Mini-XML tar file to build the -+package:

-+ -+
-+    rpmbuild -ta mxml-version.tar.gz ENTER
-+
-+ -+

The second file is mxml.list which is used by the -+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/
-+
-+ -+

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

-+ -+
-+    make epm ENTER
-+
-+ -+

The packages are stored in a subdirectory named -+dist for your convenience. The portable packages -+utilize scripts and tar files to install the software on the -+target system. After extracting the package archive, use the -+mxml.install script to install the software.

-+ -+

The native packages will be in the local OS's native format: -+RPM for Red Hat Linux, DPKG for Debian Linux, PKG for Solaris, -+and so forth. Use the corresponding commands to install the -+native packages.

-+ -+ -+ -diff -Naur mxml-2.6/doc/intro.html mxml-2.6-haiku/doc/intro.html ---- mxml-2.6/doc/intro.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/intro.html 2009-05-17 06:04:58.000000000 +0000 -@@ -0,0 +1,197 @@ -+ -+ -+ Mini-XML Programmers Manual, Version 2.6 -+ -+ -+ -+ -+ -+ -+

0Introduction

-+ -+

This programmers manual describes Mini-XML version 2.6, a small -+XML parsing library that you can use to read and write XML data -+files in your C and C++ applications.

-+ -+

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

I then replied with:

-+ -+
Given the limited scope of what you use in XML, it -+should be trivial to code a mini-XML API in a few hundred lines of -+code.
-+ -+

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 3,441 -+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:

-+ -+ -+ -+

Please email me (mxml @ easysw . com) if you would like your -+project added or removed from this list, or if you have any -+comments/quotes you would like me to publish about your -+experiences with Mini-XML.

-+ -+ -+

Organization of This Document

-+ -+

This manual is organized into the following chapters and -+appendices:

-+ -+ -+ -+ -+

Notation Conventions

-+ -+

Various font and syntax conventions are used in this guide. -+Examples and their meanings and uses are explained below:

-+ -+
-+ -+
mxmldoc
-+ mxmldoc(1)
-+ -+
The names of commands; the first mention of a command -+ or function in a chapter is followed by a manual page -+ section number.

-+ -+
/var
-+ /etc/hosts
-+ -+
File and directory names.

-+ -+
Request ID is Printer-123
-+ -+
Screen output.

-+ -+
lp -d printer filename ENTER
-+ -+
Literal user input; special keys like -+ ENTER are in ALL CAPS.

-+ -+
12.3
-+ -+
Numbers in the text are written using the period (.) -+ to indicate the decimal point.

-+ -+
-+ -+ -+

Abbreviations

-+ -+

The following abbreviations are used throughout this -+manual:

-+ -+
-+ -+
Gb
-+
Gigabytes, or 1073741824 bytes

-+ -+
kb
-+
Kilobytes, or 1024 bytes

-+ -+
Mb
-+
Megabytes, or 1048576 bytes

-+ -+
UTF-8, UTF-16
-+
Unicode Transformation Format, 8-bit or 16-bit

-+ -+
W3C
-+
World Wide Web Consortium

-+ -+
XML
-+
Extensible Markup Language

-+ -+
-+ -+ -+

Other References

-+ -+
-+ -+
The Unicode Standard, Version 4.0, Addison-Wesley, -+ ISBN 0-321-18578-1
-+ -+
The definition of the Unicode character set which is -+ used for XML.

-+ -+
Extensible -+ Markup Language (XML) 1.0 (Third Edition)
-+ -+
The XML specification from the World Wide Web -+ Consortium (W3C)

-+ -+
-+ -+ -+

Legal Stuff

-+ -+

The Mini-XML library is copyright 2003-2009 by Michael Sweet. License terms -+are described in Appendix A - Mini-XML License.

-+ -+ -+ -diff -Naur mxml-2.6/doc/intro.man mxml-2.6-haiku/doc/intro.man ---- mxml-2.6/doc/intro.man 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/intro.man 2008-01-29 05:28:31.000000000 +0000 -@@ -0,0 +1,150 @@ -+.SH INCLUDE FILE -+#include -+.SH LIBRARY -+\-lmxml -+.SH DESCRIPTION -+Mini-XML is a small XML parsing library that you can use to -+read XML and XML-like data files in your application without -+requiring large non-standard libraries. Mini-XML only -+requires an ANSI C compatible compiler (GCC works, as do -+most vendors' ANSI C compilers) and a "make" program. -+.PP -+Mini-XML provides the following functionality: -+.IP \(bu 4 -+Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and strings. -+.IP \(bu 4 -+Data is stored in a linked-list tree structure, -+preserving the XML data hierarchy. -+.IP \(bu 4 -+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 -+"leaf" nodes. -+.IP \(bu 4 -+Functions for creating, indexing, and managing trees of data. -+.IP \(bu 4 -+"Find" and "walk" functions for easily locating and navigating -+trees of data. -+.PP -+Mini-XML doesn't do validation or other types of processing -+on the data based upon schema files or other sources of -+definition information, nor does it support character -+entities other than those required by the XML -+specification. -+.SH USING MINI-XML -+Mini-XML provides a single header file which you include: -+.nf -+ -+ #include -+.fi -+.PP -+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. New nodes can be created using the -+"mxmlNewElement()", "mxmlNewInteger()", "mxmlNewOpaque()", -+"mxmlNewReal()", and "mxmlNewText()" functions. Only -+elements can have child nodes, and the top node must be an -+element, usually "?xml". -+.PP -+You load an XML file using the "mxmlLoadFile()" function: -+.nf -+ -+ FILE *fp; -+ mxml_node_t *tree; -+ -+ fp = fopen("filename.xml", "r"); -+ tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); -+ fclose(fp); -+.fi -+.PP -+Similarly, you save an XML file using the "mxmlSaveFile()" -+function: -+.nf -+ -+ FILE *fp; -+ mxml_node_t *tree; -+ -+ fp = fopen("filename.xml", "w"); -+ mxmlSaveFile(tree, fp, MXML_NO_CALLBACK); -+ fclose(fp); -+.fi -+.PP -+The "mxmlLoadString()", "mxmlSaveAllocString()", and -+"mxmlSaveString()" functions load XML node trees from and save -+XML node trees to strings: -+.nf -+ -+ char buffer[8192]; -+ char *ptr; -+ mxml_node_t *tree; -+ -+ ... -+ tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK); -+ -+ ... -+ mxmlSaveString(tree, buffer, sizeof(buffer), -+ MXML_NO_CALLBACK); -+ -+ ... -+ ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK); -+.fi -+.PP -+You can find a named element/node using the "mxmlFindElement()" -+function: -+.nf -+ -+ mxml_node_t *node = mxmlFindElement(tree, tree, "name", -+ "attr", "value", -+ MXML_DESCEND); -+.fi -+.PP -+The "name", "attr", and "value" arguments can be passed as -+NULL to act as wildcards, e.g.: -+.nf -+ -+ /* Find the first "a" element */ -+ node = mxmlFindElement(tree, tree, "a", NULL, NULL, -+ MXML_DESCEND); -+ -+ /* Find the first "a" element with "href" attribute */ -+ node = mxmlFindElement(tree, tree, "a", "href", NULL, -+ MXML_DESCEND); -+ -+ /* Find the first "a" element with "href" to a URL */ -+ node = mxmlFindElement(tree, tree, "a", "href", -+ "http://www.easysw.com/~mike/mxml/", -+ MXML_DESCEND); -+ -+ /* Find the first element with a "src" attribute*/ -+ node = mxmlFindElement(tree, tree, NULL, "src", NULL, -+ MXML_DESCEND); -+ -+ /* Find the first element with a "src" = "foo.jpg" */ -+ node = mxmlFindElement(tree, tree, NULL, "src", -+ "foo.jpg", MXML_DESCEND); -+.fi -+.PP -+You can also iterate with the same function: -+.nf -+ -+ mxml_node_t *node; -+ -+ for (node = mxmlFindElement(tree, tree, "name", NULL, -+ NULL, MXML_DESCEND); -+ node != NULL; -+ node = mxmlFindElement(node, tree, "name", NULL, -+ NULL, MXML_DESCEND)) -+ { -+ ... do something ... -+ } -+.fi -+.PP -+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: -+.nf -+ -+ mxmlDelete(tree); -+.fi -diff -Naur mxml-2.6/doc/license.html mxml-2.6-haiku/doc/license.html ---- mxml-2.6/doc/license.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/license.html 2009-05-17 06:04:58.000000000 +0000 -@@ -0,0 +1,598 @@ -+ -+ -+ -+

AMini-XML -+License

-+ -+

The Mini-XML library and included programs are provided under -+the terms of the GNU Library General Public License (LGPL) 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. -+ -+

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

GNU LIBRARY GENERAL PUBLIC LICENSE

-+

Version 2, June 1991 -+
Copyright (C) 1991 Free Software Foundation, Inc. -+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -+
Everyone is permitted to copy and distribute verbatim copies of -+this license document, but changing it is not allowed. -+
[This is the first released version of the library GPL. It is -+numbered 2 because it goes with version 2 of the ordinary GPL.]

-+ -+

Preamble

-+ -+

The licenses for most software are designed to take away your freedom -+to share and change it. By contrast, the GNU General Public Licenses -+are intended to guarantee your freedom to share and change free -+software--to make sure the software is free for all its users.

-+ -+

This license, the Library General Public License, applies to some -+specially designated Free Software Foundation software, and to any -+other libraries whose authors decide to use it. You can use it for -+your libraries, too.

-+ -+

When we speak of free software, we are referring to freedom, -+not price. Our General Public Licenses are designed to make sure -+that you have the freedom to distribute copies of free software -+(and charge for this service if you wish), that you receive -+source code or can get it if you want it, that you can change -+the software or use pieces of it in new free programs; and that -+you know you can do these things.

-+ -+

To protect your rights, we need to make restrictions that -+forbid anyone to deny you these rights or to ask you to -+surrender the rights. These restrictions translate to certain -+responsibilities for you if you distribute copies of the -+library, or if you modify it.

-+ -+

For example, if you distribute copies of the library, whether -+gratis or for a fee, you must give the recipients all the rights -+that we gave you. You must make sure that they, too, receive or -+can get the source code. If you link a program with the library, -+you must provide complete object files to the recipients so that -+they can relink them with the library, after making changes to -+the library and recompiling it. And you must show them these -+terms so they know their rights.

-+ -+

Our method of protecting your rights has two steps: (1) -+copyright the library, and (2) offer you this license which -+gives you legal permission to copy, distribute and/or modify the -+library.

-+ -+

Also, for each distributor's protection, we want to make -+certain that everyone understands that there is no warranty for -+this free library. If the library is modified by someone else -+and passed on, we want its recipients to know that what they -+have is not the original version, so that any problems -+introduced by others will not reflect on the original authors' -+reputations.

-+ -+

Finally, any free program is threatened constantly by -+software patents. We wish to avoid the danger that companies -+distributing free software will individually obtain patent -+licenses, thus in effect transforming the program into -+proprietary software. To prevent this, we have made it clear -+that any patent must be licensed for everyone's free use or not -+licensed at all.

-+ -+

Most GNU software, including some libraries, is covered by -+the ordinary GNU General Public License, which was designed for -+utility programs. This license, the GNU Library General Public -+License, applies to certain designated libraries. This license -+is quite different from the ordinary one; be sure to read it in -+full, and don't assume that anything in it is the same as in the -+ordinary license.

-+ -+

The reason we have a separate public license for some -+libraries is that they blur the distinction we usually make -+between modifying or adding to a program and simply using it. -+Linking a program with a library, without changing the library, -+is in some sense simply using the library, and is analogous to -+running a utility program or application program. However, in a -+textual and legal sense, the linked executable is a combined -+work, a derivative of the original library, and the ordinary -+General Public License treats it as such.

-+ -+

Because of this blurred distinction, using the ordinary -+General Public License for libraries did not effectively promote -+software sharing, because most developers did not use the -+libraries. We concluded that weaker conditions might promote -+sharing better.

-+ -+

However, unrestricted linking of non-free programs would -+deprive the users of those programs of all benefit from the free -+status of the libraries themselves. This Library General Public -+License is intended to permit developers of non-free programs to -+use free libraries, while preserving your freedom as a user of -+such programs to change the free libraries that are incorporated -+in them. (We have not seen how to achieve this as regards -+changes in header files, but we have achieved it as regards -+changes in the actual functions of the Library.) The hope is -+that this will lead to faster development of free libraries.

-+ -+

The precise terms and conditions for copying, distribution -+and modification follow. Pay close attention to the difference -+between a "work based on the libary" and a "work -+that uses the library". The former contains code derived -+from the library, while the latter only works together with the -+library.

-+ -+

Note that it is possible for a library to be covered by the -+ordinary General Public License rather than by this special -+one.

-+ -+

TERMS AND CONDITIONS FOR COPYING, -+DISTRIBUTION AND MODIFICATION

-+ -+

0. This License Agreement applies to any -+software library which contains a notice placed by the copyright -+holder or other authorized party saying it may be distributed -+under the terms of this Library General Public License (also -+called "this License"). Each licensee is addressed as -+"you". -+ -+

A "library" means a collection of software -+functions and/or data prepared so as to be conveniently linked -+with application programs (which use some of those functions and -+data) to form executables.

-+ -+

The "Library", below, refers to any such software -+library or work which has been distributed under these terms. A -+"work based on the Library" means either the Library -+or any derivative work under copyright law: that is to say, a -+work containing the Library or a portion of it, either verbatim -+or with modifications and/or translated straightforwardly into -+another language. (Hereinafter, translation is included without -+limitation in the term "modification".)

-+ -+

"Source code" for a work means the preferred form -+of the work for making modifications to it. For a library, -+complete source code means all the source code for all modules -+it contains, plus any associated interface definition files, -+plus the scripts used to control compilation and installation of -+the library.

-+ -+

Activities other than copying, distribution and modification -+are not covered by this License; they are outside its scope. The -+act of running a program using the Library is not restricted, -+and output from such a program is covered only if its contents -+constitute a work based on the Library (independent of the use -+of the Library in a tool for writing it). Whether that is true -+depends on what the Library does and what the program that uses -+the Library does.

-+ -+

1. You may copy and distribute verbatim -+copies of the Library's complete source code as you receive it, -+in any medium, provided that you conspicuously and appropriately -+publish on each copy an appropriate copyright notice and -+disclaimer of warranty; keep intact all the notices that refer -+to this License and to the absence of any warranty; and -+distribute a copy of this License along with the Library.

-+ -+

You may charge a fee for the physical act of transferring a -+copy, and you may at your option offer warranty protection in -+exchange for a fee.

-+ -+

2. You may modify your copy or copies of the -+Library or any portion of it, thus forming a work based on the -+Library, and copy and distribute such modifications or work -+under the terms of Section 1 above, provided that you also meet -+all of these conditions:

-+ -+
    -+ -+

    a) The modified work must itself be -+ a software library. -+ -+

    b) You must cause the files modified -+ to carry prominent notices stating that you changed the -+ files and the date of any change.

    -+ -+

    c) You must cause the whole of the -+ work to be licensed at no charge to all third parties -+ under the terms of this License.

    -+ -+

    d) If a facility in the modified -+ Library refers to a function or a table of data to be -+ supplied by an application program that uses the -+ facility, other than as an argument passed when the -+ facility is invoked, then you must make a good faith -+ effort to ensure that, in the event an application does -+ not supply such function or table, the facility still -+ operates, and performs whatever part of its purpose -+ remains meaningful.

    -+ -+

    (For example, a function in a library to compute -+ square roots has a purpose that is entirely well-defined -+ independent of the application. Therefore, Subsection 2d -+ requires that any application-supplied function or table -+ used by this function must be optional: if the -+ application does not supply it, the square root function -+ must still compute square roots.)

    -+ -+
-+ -+

These requirements apply to the modified work as a whole. If -+identifiable sections of that work are not derived from the -+Library, and can be reasonably considered independent and -+separate works in themselves, then this License, and its terms, -+do not apply to those sections when you distribute them as -+separate works. But when you distribute the same sections as -+part of a whole which is a work based on the Library, the -+distribution of the whole must be on the terms of this License, -+whose permissions for other licensees extend to the entire -+whole, and thus to each and every part regardless of who wrote -+it.

-+ -+

Thus, it is not the intent of this section to claim rights or -+contest your rights to work written entirely by you; rather, the -+intent is to exercise the right to control the distribution of -+derivative or collective works based on the Library.

-+ -+

In addition, mere aggregation of another work not based on -+the Library with the Library (or with a work based on the -+Library) on a volume of a storage or distribution medium does -+not bring the other work under the scope of this License.

-+ -+

3. You may opt to apply the terms of the -+ordinary GNU General Public License instead of this License to a -+given copy of the Library. To do this, you must alter all the -+notices that refer to this License, so that they refer to the -+ordinary GNU General Public License, version 2, instead of to -+this License. (If a newer version than version 2 of the ordinary -+GNU General Public License has appeared, then you can specify -+that version instead if you wish.) Do not make any other change -+in these notices.

-+ -+

Once this change is made in a given copy, it is irreversible -+for that copy, so the ordinary GNU General Public License -+applies to all subsequent copies and derivative works made from -+that copy.

-+ -+

This option is useful when you wish to copy part of the code -+of the Library into a program that is not a library.

-+ -+

4. You may copy and distribute the Library -+(or a portion or derivative of it, under Section 2) in object -+code or executable form under the terms of Sections 1 and 2 -+above provided that you accompany it with the complete -+corresponding machine-readable source code, which must be -+distributed under the terms of Sections 1 and 2 above on a -+medium customarily used for software interchange.

-+ -+

If distribution of object code is made by offering access to -+copy from a designated place, then offering equivalent access to -+copy the source code from the same place satisfies the -+requirement to distribute the source code, even though third -+parties are not compelled to copy the source along with the -+object code.

-+ -+

5. A program that contains no derivative of -+any portion of the Library, but is designed to work with the -+Library by being compiled or linked with it, is called a -+"work that uses the Library". Such a work, in -+isolation, is not a derivative work of the Library, and -+therefore falls outside the scope of this License.

-+ -+

However, linking a "work that uses the Library" -+with the Library creates an executable that is a derivative of -+the Library (because it contains portions of the Library), -+rather than a "work that uses the library". The -+executable is therefore covered by this License. Section 6 -+states terms for distribution of such executables.

-+ -+

When a "work that uses the Library" uses material -+from a header file that is part of the Library, the object code -+for the work may be a derivative work of the Library even though -+the source code is not. Whether this is true is especially -+significant if the work can be linked without the Library, or if -+the work is itself a library. The threshold for this to be true -+is not precisely defined by law.

-+ -+

If such an object file uses only numerical parameters, data -+structure layouts and accessors, and small macros and small -+inline functions (ten lines or less in length), then the use of -+the object file is unrestricted, regardless of whether it is -+legally a derivative work. (Executables containing this object -+code plus portions of the Library will still fall under Section -+6.)

-+ -+

Otherwise, if the work is a derivative of the Library, you -+may distribute the object code for the work under the terms of -+Section 6. Any executables containing that work also fall under -+Section 6, whether or not they are linked directly with the -+Library itself.

-+ -+

6. As an exception to the Sections above, -+you may also compile or link a "work that uses the -+Library" with the Library to produce a work containing -+portions of the Library, and distribute that work under terms of -+your choice, provided that the terms permit modification of the -+work for the customer's own use and reverse engineering for -+debugging such modifications.

-+ -+

You must give prominent notice with each copy of the work -+that the Library is used in it and that the Library and its use -+are covered by this License. You must supply a copy of this -+License. If the work during execution displays copyright -+notices, you must include the copyright notice for the Library -+among them, as well as a reference directing the user to the -+copy of this License. Also, you must do one of these things:

-+ -+
    -+ -+ a) Accompany the work with the complete -+ corresponding machine-readable source code for the -+ Library including whatever changes were used in the work -+ (which must be distributed under Sections 1 and 2 -+ above); and, if the work is an executable linked with -+ the Library, with the complete machine-readable -+ "work that uses the Library", as object code -+ and/or source code, so that the user can modify the -+ Library and then relink to produce a modified executable -+ containing the modified Library. (It is understood that -+ the user who changes the contents of definitions files -+ in the Library will not necessarily be able to recompile -+ the application to use the modified definitions.) -+ -+

    b) Accompany the work with a written -+ offer, valid for at least three years, to give the same -+ user the materials specified in Subsection 6a, above, -+ for a charge no more than the cost of performing this -+ distribution.

    -+ -+

    c) If distribution of the work is -+ made by offering access to copy from a designated place, -+ offer equivalent access to copy the above specified -+ materials from the same place.

    -+ -+

    d) Verify that the user has already -+ received a copy of these materials or that you have -+ already sent this user a copy.

    -+ -+
-+ -+

For an executable, the required form of the "work that -+uses the Library" must include any data and utility -+programs needed for reproducing the executable from it. However, -+as a special exception, the source code distributed need not -+include anything that is normally distributed (in either source -+or binary form) with the major components (compiler, kernel, and -+so on) of the operating system on which the executable runs, -+unless that component itself accompanies the executable.

-+ -+

It may happen that this requirement contradicts the license -+restrictions of other proprietary libraries that do not normally -+accompany the operating system. Such a contradiction means you -+cannot use both them and the Library together in an executable -+that you distribute.

-+ -+

7. You may place library facilities that are -+a work based on the Library side-by-side in a single library -+together with other library facilities not covered by this -+License, and distribute such a combined library, provided that -+the separate distribution of the work based on the Library and -+of the other library facilities is otherwise permitted, and -+provided that you do these two things:

-+ -+
    -+ -+ a) Accompany the combined library with -+ a copy of the same work based on the Library, uncombined -+ with any other library facilities. This must be -+ distributed under the terms of the Sections above. -+ -+

    b) Give prominent notice with the -+ combined library of the fact that part of it is a work -+ based on the Library, and explaining where to find the -+ accompanying uncombined form of the same work.

    -+ -+
-+ -+

8. You may not copy, modify, sublicense, -+link with, or distribute the Library except as expressly -+provided under this License. Any attempt otherwise to copy, -+modify, sublicense, link with, or distribute the Library is -+void, and will automatically terminate your rights under this -+License. However, parties who have received copies, or rights, -+from you under this License will not have their licenses -+terminated so long as such parties remain in full -+compliance.

-+ -+

9. You are not required to accept this -+License, since you have not signed it. However, nothing else -+grants you permission to modify or distribute the Library or its -+derivative works. These actions are prohibited by law if you do -+not accept this License. Therefore, by modifying or distributing -+the Library (or any work based on the Library), you indicate -+your acceptance of this License to do so, and all its terms and -+conditions for copying, distributing or modifying the Library or -+works based on it.

-+ -+

10. Each time you redistribute the Library -+(or any work based on the Library), the recipient automatically -+receives a license from the original licensor to copy, -+distribute, link with or modify the Library subject to these -+terms and conditions. You may not impose any further -+restrictions on the recipients' exercise of the rights granted -+herein. You are not responsible for enforcing compliance by -+third parties to this License.

-+ -+

11. If, as a consequence of a court judgment -+or allegation of patent infringement or for any other reason -+(not limited to patent issues), conditions are imposed on you -+(whether by court order, agreement or otherwise) that contradict -+the conditions of this License, they do not excuse you from the -+conditions of this License. If you cannot distribute so as to -+satisfy simultaneously your obligations under this License and -+any other pertinent obligations, then as a consequence you may -+not distribute the Library at all. For example, if a patent -+license would not permit royalty-free redistribution of the -+Library by all those who receive copies directly or indirectly -+through you, then the only way you could satisfy both it and -+this License would be to refrain entirely from distribution of -+the Library.

-+ -+

If any portion of this section is held invalid or -+unenforceable under any particular circumstance, the balance of -+the section is intended to apply, and the section as a whole is -+intended to apply in other circumstances.

-+ -+

It is not the purpose of this section to induce you to -+infringe any patents or other property right claims or to -+contest validity of any such claims; this section has the sole -+purpose of protecting the integrity of the free software -+distribution system which is implemented by public license -+practices. Many people have made generous contributions to the -+wide range of software distributed through that system in -+reliance on consistent application of that system; it is up to -+the author/donor to decide if he or she is willing to distribute -+software through any other system and a licensee cannot impose -+that choice.

-+ -+

This section is intended to make thoroughly clear what is -+believed to be a consequence of the rest of this License.

-+ -+

12. If the distribution and/or use of the -+Library is restricted in certain countries either by patents or -+by copyrighted interfaces, the original copyright holder who -+places the Library under this License may add an explicit -+geographical distribution limitation excluding those countries, -+so that distribution is permitted only in or among countries not -+thus excluded. In such case, this License incorporates the -+limitation as if written in the body of this License.

-+ -+

13. The Free Software Foundation may publish -+revised and/or new versions of the Library General Public -+License from time to time. Such new versions will be similar in -+spirit to the present version, but may differ in detail to -+address new problems or concerns.

-+ -+

Each version is given a distinguishing version number. If the -+Library specifies a version number of this License which applies -+to it and "any later version", you have the option of -+following the terms and conditions either of that version or of -+any later version published by the Free Software Foundation. If -+the Library does not specify a license version number, you may -+choose any version ever published by the Free Software -+Foundation.

-+ -+

14. If you wish to incorporate parts of the -+Library into other free programs whose distribution conditions -+are incompatible with these, write to the author to ask for -+permission. For software which is copyrighted by the Free -+Software Foundation, write to the Free Software Foundation; we -+sometimes make exceptions for this. Our decision will be guided -+by the two goals of preserving the free status of all -+derivatives of our free software and of promoting the sharing -+and reuse of software generally.

-+ -+

NO WARRANTY

-+ -+

15. BECAUSE THE LIBRARY IS LICENSED FREE OF -+CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT -+PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN -+WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE -+LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF -+THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU -+ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR -+CORRECTION.

-+ -+

16. IN NO EVENT UNLESS REQUIRED BY -+APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT -+HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE -+THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -+DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY -+(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES -+OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), -+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -+POSSIBILITY OF SUCH DAMAGES.

-+ -+

END OF TERMS AND CONDITIONS

-+ -+

How to Apply These Terms to Your New Libraries

-+ -+

If you develop a new library, and you want it to be of the -+greatest possible use to the public, we recommend making it free -+software that everyone can redistribute and change. You can do so -+by permitting redistribution under these terms (or, alternatively, -+under the terms of the ordinary General Public License). -+ -+

To apply these terms, attach the following notices to the -+library. It is safest to attach them to the start of each source -+file to most effectively convey the exclusion of warranty; and each -+file should have at least the "copyright" line and a pointer to -+where the full notice is found. -+ -+

    -+ -+

    one line to give the library's name and an idea of what it -+does.
    -+Copyright (C) year name of author -+ -+

    This library is free software; you can redistribute it and/or -+modify it under the terms of the GNU Lesser General Public License -+as published by the Free Software Foundation; either version 2.1 of -+the License, or (at your option) any later version. -+ -+

    This library is distributed in the hope that it will be useful, -+but WITHOUT ANY WARRANTY; without even the implied warranty of -+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+Lesser General Public License for more details. -+ -+

    You should have received a copy of the GNU Lesser General Public -+License along with this library; if not, write to the Free Software -+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+02111-1307 USA -+ -+

-+ -+

Also add information on how to contact you by electronic and paper mail. -+ -+

You should also get your employer (if you work as a programmer) -+or your school, if any, to sign a "copyright disclaimer" for the -+library, if necessary. Here is a sample; alter the names: -+ -+

    -+ -+

    Yoyodyne, Inc., hereby disclaims all copyright interest in the -+library `Frob' (a library for tweaking knobs) written by James -+Random Hacker. -+ -+

    signature of Ty Coon, 1 April 1990 Ty Coon, President -+of Vice -+ -+

-+ -+

That's all there is to it! -+ -+ -+ -diff -Naur mxml-2.6/doc/logo.gif mxml-2.6-haiku/doc/logo.gif ---- mxml-2.6/doc/logo.gif 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/logo.gif 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,54 @@ -+GIF87a,,çL -+ -+ -+  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,,,@þÿ H° Áƒ*DøNÙ)Dl¨üpñBƒ2jÜȱ£Ç CŠI²¤É“%4 ðÁÅ*lRön¡Í›8sêÜI°ž# (ƒ -+J´¨Ñ£H“Ðà¨ϧPÎâ´ªÕ«X³jÍŠe^Ô¯{5ØJ¶¬Ù³hÑ6è6¡˜´pãÊK¥˜¨ŽêêÝË·o\G6×õK8+«Ãˆ'.LÔ‡âLJëðm°Î Ƙ¯âÌ4ËMV„ÑTƹ´éÓ¨5*£à—ÕÍ lÚ -+T•ñ‘lŸNnéÚf©nÿ3çÁ¤g›  ³n­3ƒ6àí\VdŒv8 ‘Ü-²7Î{—Eþv€–óÉÈã “§–ë]a—“è‚ÿyûM’íz?¡zý!ôßziå‡Pô!—`zöÙ„ßMvVŸH4 gxP„%UhÐ…!yXˆq’†q¸ B$n$"A-b¨Š©xÞ„â’‰ ÑH9*H¡Ž2šåã@@†HäBŠÄãGG -+”äM¸d‘Xf©å–\véå—`†)æ˜d–iæ™h¦©¦Œ/䣓E…àNúÐ`eT¥õÇW1j¥”kî5„?9ñRR"9áÓB_Ý1mõ™ÑŸÿLè\[äÔŽYÀNõœÀN¬(£'= Bxú „þ—fF‡pòˆpÔ‹0€t u@Ò1 -+Qq®Iz¥–ÆêW#;¹ãkUÄ -+¤ -+¡# -+ ¢Q´ÿ‹¬²™•ÑIq;à -+íÒQòqdÛ×91‘'9 BÔ»¹¡P#a@(BßxÄow8%+ïViääÍ`ÙÐON‰¬È"H•@Õ§»Ê[Âg²±—:i+Ô0:AÂd•±¥“J^Ù¥Â!„^±Å²ðÎ<‹ A÷,4Ïß$dOuC'}¦öìžÒPo)ÚmóØõÕœÙàUÍ õ2Ö`›5Ë\ „­¶H ÁkÙpõM#A(°v™ -+ÑHþÑq÷Ý÷:•ìpw ;TR™ßˆ/ Òƒ7¾‘?'þ”*;nùP ¨"¹@T]îùVXÜvLÚŸ—žÀæÄ‰é¬ë…/B·®Û}]FkìYÌÔ‡ìA=‰¥í…õñ°}ýy³F@â&NÍ’–à£S2C åṵ̂nt+çÔ¤£|aÄ¿yâ´5¸¼ç$8• ‚ýg=˜dNWØ/3G×sD©Õ(ÙÅMN¿‹É/{Œ2`ý£>…°/! -+ûÈøb?¬ý)‚.Ú_ÇXö‘þmä‚£â`G&x5Gƒ#DaF<è'ZL@dàãuBÞ©‚;¢Âh(>’wþ@ ¢‡HÄ"ñˆHL¢—ÈÄ@ÉB'›ÊtbŠò$/D¹ ŸÁ&& 9Á†Ý>"Œœx¢‡m CPN o¬‰y7蔂 Ì&•(Ê»¼¡˜¤ -+éÁÁNôF8z$‡ƒ -+#”¯ì#!øp€H4—5dd=*¤!=âmðä+—Ç2B…Hã#oPH&2¨Âcir“ØFÍÔ‘£`ò™J)6RÊ„ #…­üåøtdj7i$$3A(ä»Jˆ<Æè®QÒ…cú@_ МÌÂ$PGNà¡M+Â$ÁáÉ -+nˆÃL¶ÏfzùÀ;è>æD -+Gþ±MNæ1 Zó#äy%0mè¿w³.5ùGú6ÉÐIn¨¡ÝÖMꂈ2QNQ‰‡ ,DÄ£oª &GæJ´ Œ¨ÜH×Ôl”j`ÜJOãFlí¥8%H;TÌ”,*@ƒ*°“ӢĜxÁOKóN4ͨe;F–Ú¥¤ª9IÆF©z&€«YÆ2¹ -+.,#§ŸÀY‡–€OlNc]+Ö8 ¸%C¥r [¾ -+xÈ4¯óÀÛv -+ÀÊ:‰ay—;…øb±DôEBÞ·D®ç‡tÙAÚ!R%Z65˜¥‹ˆúslò³¨ m]Î!ŠBV‰!øþ"¾ä‚0¢©P(qt¶$  ‚,QŠU~è Â×%`¡–0Å*F‰?€jU"\À›/ ÒƒJ2j©âŽO1PòY6 `Y‡ÐØN¾¸ »{¡™pα<áPƒ¹9tÐÇlB ~”­ <'að›ß§|ƒrø‚è0ŠDB¥¨ÀCº‡N˜c'7h`B¸ˆ“v¼"fà‚òp -+qê„$QíÐ(ŽúÙÀ‰?€@\c€"F‰Ò¹’Ì'X¤ Kx“ÙÖp!Úx¡…‚|!ÄB‰ A%ºåž™0ÁS~ò’AÒ^l‚ùCæDóþ ‚A.×WÉ2t’¯Éæ¾¹š]æÙ—cÜJ7¹ƒsvg™ygVZh{N󈤬f9 x‡ƒ¦ïŸ:é¤%ze•ögžPf2zјŽ3“=­è\‰YÔd4”ÌÌç<ËѬf'ªC­à¯oÀ‘þ´©á\ë¨]š×a>3¨}kH+¤Íx>ô%ûüÚf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{Ž`؉Ž"Öæä š†ŠŒBî=űæ]À¡“E ¥7 l½+ oDÆß¤̈3q"Œw}Ò -+$%þI…¸aƒ–Ï=aÐß…°#”q‚NP¥ë]sdF:è•B¤[ù—^ërŠŒ[Ÿ##ðT7 iw™6P±:8kb7€ñ€ÜU Ðy{«‚Qt s8¥æ~q<ñM²Æ€…WTÇC?@@u‘N81nDƒ7Ñ ¿åg·wJ ¤ÑoFg9µ‚sÑz27á”eu°V~§ç8!X,'w>BM0>õm£‘…^ˆ5Apy4†`“1 ¡Th¨4/pómÈ3pSÏ7Us¨,9`v:¡3y¨&‘#‹ô‡câRp³ þ_CˆZ2gu>ŸpƒŠˆ -+àVE%щ}auVo‰p!ʼn9Ñ àZ ˆ! -+|HŠmá Y°©x ’åŠPu±ÐM€ŠÕMб`n¸XŒ¡‹¼è‹ÔŒÂHŒÆUsS7Š˜7{óŒç‹²˜Šµx‹ÖS5‹"QSvØ8aŠÊŽB±Š­HŽq6ÿ‡ŽDÑ6ƒEŽže!ŠÝ˜Rö¨†È‰–¸s¡‰Xå5©cƒVXq1‰R -+Y%µ9ˆø™Áˆ~S5iZ7ƒ˜‘§Ñm¡Q¹%~8’ˆPñ4(I È´ý€þ‡-)#{¸5“Y‚Q8‡8©%uxGÓ“[Â46Á†B©%oxlGY; q†•¥j¿Ãld¡†4L„Z§ñjpÁ7!†H„•¦¡•iQ†±PW •E"–iaRÿÐ…M–¥¡–h†q’o‰–2"—h9E¸”a²…óä—dò.(˜br -+"Óuˆ1!ˆ0| ñ¥`ï¸ Ô°çÐ 8Œ‰$±˜¡éÁ`O“y -+QP€%á¡)…ÁŸÙ`Þ¥=@o<± -×Sàb;á˜Ð›³óh@ØE¸Á`+3×k|ñåÄÆsq€^OÑ ‰þˆš ÈÅYlÇy ´è{m18Ð~ÒÂqñ'°ŽOZW3öRÆflW3&x}йîùžìh}ik„k -+·Á !g…k6 G7ùyR“àŸÁ6j9 J°q ãˆé€xµn“g@eq…q Qpƒ –ߘ|(8c91 -+$!…9± P…Ñ *Z,:ôà•wr¤·#/”’&ÑX &’ÿY"x‰{71'AË™gDkêk7‘ '¡ÏGy#¡¦›V¡ Q B(®&•Êò'2Ø Ñ êÙ-CJEŠnAÑþ>d§±òk'X¦dúƒ©fœ‚¦”„–ƒ•'©;ƒ¨ ¨¨>(‚€æ¨;Wqzê§‹:l -+©Ÿú¤“z£§ä©¨ºl›¶0– -+…­j£YÊ?[ÚB‡¡Œ*«µ -+k¹š¨»š©JljlÈùœ˜J«ÉŠ£¿z©Á -+¬¢Ú¨âù¨ÇÚ§’¢—à«”6«¶×«¡ªŪÞzªãZ©Ì×­ËÊ«éú­·ŠzÍ*¬ëªšª4Úª¬Ïê¬Ñº©ÓÚ©¤j­N6õŠ®÷ª®Ë®œÚ€žª«ùº­å -+«çŠƒ ëªÊ®)bg’Š­wú°K©»®+Ԯ˗°ÿ*¯Ã:ªÕ:²¥ú§Q¤È&þ° k¯/ˬ"‹¯ó -+­5k«›‚ýzj㊱‡ª±äê±.{³© -+²˰ë³—r´Ë­[°›³õ®6[²4kµPãY°µ\Ûµ\ëœ%!^;¶[kš&!¶dëµfK!iëµ$¡µmûµB¶q›k t·wk˜|Û·~û·€¸‚;¸„[¸†{¸ˆ›¸Š»¸ŒÛ¸Žû¸¹’;¹”[¹–›‡ :QüVÝ—U®É-‘˜E[„ ;+DtŠïð£C -+õ¯ -+Ñ Ga §k¬';Dì’öBÁ7±$kWG+`r¨›»CDôû°N&±Ö )qUµ6þq E È‹»«ŠD P 9áéIPsÔw™O«µyðH·;žÝ›DÆ—G0$¦Ù³<á¥A±‘R¤•ÒD$“È÷9  áÕ£¿<Bÿ›¼ñ«D67‘¢A9‘ëÕ§6±J(A¨̽áÚD0£7á(9¡ «¶€„1y(ш¡’”šL$@8ádA¥ ‘j÷‘¿& -+a„7µT{Dƒ˜l©ýÀûB*€—‚g® u°Ä\ÚÄGÄ9 -+Æ€äÀ¦â -+C7º%€ qµv:›ºpÚ'v9Ä -+"³[þ ‹Ƹ*ÆH´Ñpq€ü‚ -+Q¼!ÑšWËDÈîjÈIÔ `±5 Jb -+a #qdºÔ´ÜªÃ %.Pñ àéÉM -+±¾!™áGA+´¨ÜPGȨ`ó"üëU.é³a<³ %ã ‹ìËÖÄ•áÀ2 Á~· µ!‹Ì›dlÇÁ§#m J6WÌD[ÈÚ GŸË ìÊ8”£(yjœ·ŽgÊåšË†„eÔðŒüO€`ÄÁ4³ÆŒÎÞ G@ZQa¥çzDÒ¾ZÌ`ˆÀ*}ΗœÎI„.ÂÍA8—¤{ -+¢þqC«ÑÙ¼ÐKT81 -+QXßÌA"ðÇQŸñH‹ËâwD@Í6! ¼Ùr/Ì€ý—œc 1挵ËÑDÄ­­wм7¡(|üf5Ê¡~ QE=Íú|DI\§€Â6Ñpkœ¬<Œw×ÑÉiÐíÒEt9Ñ‘¡›‰híÁ$ÒÖ ñ -+0 |J°jýÓA„ÅsdcÝйŸ -+ª!q 1{ qŸ}ÍÒkÝ%®9°¤7±#1 -+9¡2ÀÀ÷ÊPA Ö¯$\±e’óLK  <«{mðÙ1²‰;1» ÚðkPHþŠà˜zqÜ ±FIþ’ÆÆ©´ëðŽ–ÜÒ/5ÝgáåC pÆ8tA¡Á9QcÃËÛ‘};'ÏMq8…ÞfA><P7q6;ÐÍ’bû-O<Ûž-Ù~mÞ'åße=8dœ×0¡C1t:‘ÙWKÕAG½‘PßÐM­ç­¦rŽg±:! H®}ý™Ñ$¾—0¾Ò;~Ìý]±õ»s¹{!<¥…ä{AŒ,Éäpñ’œå ™ÕŠEå¸sKˆå[¡Y!\N”‘æZ¼¡€fn¯³W¾æGÄmçH:AÓt>ˆÅœ£“ç(:QáW~^‚ÕŸ8è ¡E²qWˆÞ{U6EÖèJ7p…èt•8bAçkÑ>iæmõR”å™cTbe¹fʼnS!¹]aŒZŸ^5 ‹c¸¡!U€kU´®>!‡BÉ‘—ë@™T#ÙTø ì<8[Š…caÆ^6;ÕShTCÕìFÕQñS*Á.2A; -\ No newline at end of file -diff -Naur mxml-2.6/doc/logo.xcf.gz mxml-2.6-haiku/doc/logo.xcf.gz ---- mxml-2.6/doc/logo.xcf.gz 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/logo.xcf.gz 2007-05-23 21:38:42.000000000 +0000 -@@ -0,0 +1,50 @@ -+‹äš xTE¶ÇÏíNÒ IY „¤“@ÈB‡„}Ç EAGBÂ#áãŒÁuÔ§8"¢>QŸ#Œ¨£‚Š".#âs@QÑÙ•}‰„¾Ugþ§ª3“D?}‹ŸAÍ÷üNÕ½·»êÔ©SçvÕ”²3ýs'NöO.›^JDÞ¬˜¿xˆãà_"$òœ;ˆDð— Irˆr_K ?;˜X1cFiy….ŠP s¥lFÉ”ÒÀ”Ye“BÈÜʪyÓKýeåU¥³*K'V•U”Wæ5Ëe6\ÏŸUZ>nÔHùº %•¥Ie³¬Ëù§WÍBåÿÙq¦Í®¬*›<Ï?±TüX¾±¬¼4Pç8âú=šP170£bR©Ò¼ò’eCU ºWϼnäï¸ÈÈzÈ&ȧ ï ß9ÁHF¤@r!=!ƒ —C¦BæBn†,,‡¼y ² ‚ç#ð¼Ïûð¼Ïûð¼Ïûð¼ÏG&@ÖBÞ…l‡ÓÝg+‚“áûcGÁ‘ÎF G”=q8œçsÄŒk‰Z%J{§ž$jƒÏNëEÔv QúÅD¸ß?Ÿ(ó>¢,LƒìÕDížÚ·‚ ¯9³‰:´‡|H”{#Q^7È^¢ü»!Bp>îËß -+Ù Áw„Cà­x®÷|@Ôq(Q r5Q!¼¿ðîí4òäY¢âeD]`×nhw÷D½#êó4Q??QÿŽD`°ÇY’gO#:7è¼|¢ ž#Œø6Saè5DÃ@– _Ht ¾ëÒîD£Î!úU¢ÑLj~qƒÙ8c0özH Ñ•˜ÙWN„¤Þ¿»bX -Á׺ˈÙË?C˃G‹ÆœY›¹=»íà „ëô~ž3ÙÝ:È¡Rý·q[vkf‡SRQwqVw¤ R\Naµ:Ž2ÑOÍɬžŒ lÒ•Ü’Õ3áÔŽ”ó$'²ÚK9¤RŽr<«#Ù”KzT=‰òHEà8VëÊ'}#7g¥;RéŽPõr -+Þα¬óE{cX¿B…¤§ˆ6F´s9šÕ‰f¢fAÕOS'Ò ¢M-B´,*"ÜuÈ1Ô/S±à6 ¢¡» ÖÔ‹jâ†ÞºŽ·Ýy¶—:S0ïê·‡³»çŽÎh…›2w¾Ý]?:q{?äìî˜,=wó_EßÝÏíŸTÑËœÊêµµ%7á~ ùnuµ&5rg°z«µ"Õü1Îbut0\NuÙÎíØÕsøœ*©å¬îòˆ£ynÆp©‡Â0XÊ·’;B÷ˆ{E¿( *î q¯â^Ñâ^*ØWœÊ·N¥ö¤ˆ+y‡+©gø’^ þ3®¤Ká>µ‡nåŠÿÜMmö‹ÿ¸Ös_ÖGá>)\sdõõãûeµŠñÂ[ƒÍïäÅgqP¯ìîÀ·;±z:ž`µk5'´ïå$´»€Õ¢0jAhûBs'eé[.«µað4ôogÞQ:°‚þçÈ'S{V§Ó õX¨+7ÃP? .²1 †z¥ -+J,Ú0è—Ž¡^{g‰‰Z7 ˆô*íq2Οróc/¾÷ùc§ô©Ã»·oÞ°òöÙ-žÚ“> ‡>ýÉc•b1–i<ýRyFÒÏî–kÛš ª§zÐ0LœOÆzÐþìnœI”~¾ÒýÌg·¶ÒÀ ¯ùaèØP¨•*Ã`±Z ‰áZæÁ("Ü -+ ̆YÆb<»²ªÉG¬ÀØmŠ„Ýî0~+z°Ú†ÑíɺÌ@}‡îÅúfu$£Ü›õ4µÍƒ Ñ‡õË ‚ÇðÒˆpá²Xb±×Cð•+ÿOŽ£è–¹'/yWKlZŒ¸Ic_”èõ.Úê¶»ßeøA0Jœ1÷/Ðu=s=s´DáâºCjàºú*@_+árl¢ÇжVÒ÷K8]MÅÉy¬7ÂgôdÑ>–ÈëÛ#‘w ««E;,ZÑjat½ Z’|ˆA©ÅÙ™ @KŒR}i –Ÿ)Þ’F6èõ|¤kMÝ¢G¿ÑólN³|Ñ8™Ü!'A¹ö(V~¤‘¿9¯Þ/ELNzÎ O¾p/ü«~Ø­ðyÄäĵĘ9Ÿ! -+cÝïúæ¢ò9lj±â÷—µ]–ûãˆÆXëG°ª#:§~ŒU>æ=d,ñÎãÇY+{3–ù~®DeJÜ#«º³Rbó8îÇúÒÐňE›ÿój<üàÆþјÒÝØÝuM&ÂCvß¹8 Ñ£˜Ý.µÁÚ V‡cj"mAZ+AéÙXµo÷Ú¨}›c£ö=¡¨½Ök£ö®dL4Ì·6h?h‚¶:œlƒ÷omð>oƒ÷BužÝmìžkÑÙ†ðc^Â_@°nžß¢ÝùC+î\¾vãίž¿>¸óãž^T5ªGªƒì£Öi7yé{§%Hxnþà–øœ`äEì@úÜ~{ÿ04PËÈ‰ð†œ«õ2å9@ïhu2©„ÕÈÈ„? -+GDæý#²ÑTd`ïÂC‘C¤CŽÖ†ôUÊûzžFú"åÙ„ £-éi*ñ4§s:ég-fX(ç ¼ Ò¯ZüÁbºÅ%½€†3æ™ÿÇ‹”NCrËjƒÄ ‰Þu" ²Á×êH-X4P†!#D¾8Á@}‰\1AÖ3Úì LdÝËb™ú:ÙY’d« TMu –¬/´øƒÅg@2ëVHR“åšÁÕOZ|´b-‰Pd1Ô¢ÌâF‹‡-ÖY¼c±Õâ3‹½G,jÎù†ÄrƒWMç²3àµòÇ‘ú~ÖÔ¯“M-õm&©“ywnÑÅ"Ý"É"ÚÂkÐåg/ _á²dÆ›„˜E±…MØu¢E´…× íg/õ Ô8ëý¥I}[4}zæäþ¿”¼ÿö>-o¦æ×„ÉçZäX´¶ˆ³3hó³—úÊ7j“¶´ˆµ·p?¥ÿb¤¾iš}K.÷K’†ykSç’M-?¥\¶:¢áF\ØÞ}OêרÅMi}·TG´ýIåb­Ûô«ô÷ä3Ú{¦ç4áßhqS/ñß-Õ ãYS¯ºß»*7²î™¾2ÇÚÿdVÏêðÙMø§qù»EßBúÙ°Z)»¤™5¢vƒªç‰¶V*#þµé³€hÒp±ü¤ßêq é2å}ÛüŒ«º(.俤ï2Pq²Gz´r^æŽÜ‚T‡Ó\Àñ¤¯7PQ²óž@z0Рu1g‘HýH½ë¡¾¤xþ»üq8õ!G^Djw3êMÖs ÔáxêE^Ö¿7P5­©'…ɶ©@¹í©¢Œ^DÈÏEÝk€†f¹•ô t´©°-†z²œOxH »}V’ÄL×Kí8©M«‘ÚuŽÔ>$ê©©î¬eú·¢:ë¤zk„Ü1Lžë#µáÛä†%%¿[ãúÞR÷•Ô^&µ7Kíjù\•qJöOú¥úrC¥hÝå†÷ÃÌW¼.7¨.äkÔŸù¤>‰² çþ /g?>]ö Ó -Ö¨Zµ¥ ù-Ú ÊâIµÏ¡4òËqƒ1‹-6(ÝœÚP¦lìT[¬1PGíVº°ñ^vôJc?·ày-‹\a±Èâ ®4Ô}9APe±ÈÃì6Ôm9Qp™Åí€\R¾ZC݃“3-–-T„ ñCHÃÏ]Jí9õÆ­àž?ˆ|WôI$ý„ÙêQmOØ]èJþÙøÑ}€dÒØíŸ¤ƒfûGO´»@ž7í.P¡kvômv3(v—Ù Ò—Ú=!çy»”}ÊnýÎnE~l7ƒé¤³Û>©GíËú ö>§aÙTÝå J&é{ d#¾5g‘¾Ò@9¯r*g“Êr -+·#ý{½ƒ[q{Ù}j……L?Íɀʨá–Èsô\‰­Æ_y7ĵT«ÃÖ §(ï—Uü¹#é; $¶Æq€ôåÊy‰›s!©œZŽåN¤¯3PQŸr I4‹ábÒs4 ÒŽcéï,©¶‰£ðö {]å¸@$ °»‘ž` —ÇN—k°]´°ÖÎÞûœ³Oÿs¿þaªtÞ­h#3>,=4QÑ -+Eoe'®Y°[¢ºìl¶÷ÇÔ2ž%õ“ÓulOéfsÌõ%uûð4“×Ý*ÞÞA™×IýŒ20i²¨bt`ŽS6³(@ÝÁkðÁµ¤%õ1©y·=ŸË'õ7|÷ç~’å¼½…î$5×øÎ Êú®à·î)h@Bl‹?##D²>(&B=|–š|–êªT³=æ‹P›L„ºû,uy„jŽó(÷ ´³%Ý¥âÚ‘)Dë¿Î7/„‘x1ùmq¡ŒÛ‹þœQ>ȸ÷Ât„u`ŸõÙÁ´Y|vˆ ?i­l°‘é‹û‰ü ¼eJŒÛß”ça±äÿNþœ"ÂŽ%¢ Þ:¯Á[ãö Æ‚í§Ø³v£¿vã@žc‰¢U™~\0 óhØœØò[Ðk £"†j¯fà>} kú"ƒßÈÈÜa]—™§+ñÃI>BëšÀnú/ÙÁÜÂó›`yøù9Dü ÅÜhGa×\;»eöW°\°ùÝ)ȉþ-Œš4ûÛn+}­{’'KÚÊq¥Ûa¹Sa"9uÚHþ×i9…‹h¥9´MÄÐ6‘ÃO÷ñjì‡g†î?ѶÚN¹nMší{¿ †vx?&I§ì®Æofï à'ëc!HÍ {“fLû_ÑŒé4cHŒt0Zâlà0oz![©É–FA™œÍZgÖáѦæ.¦s³=?1&*˜žú7èqÖù"M0¶‚-øWüÀP³šòaÑÇÒîK³_¬`w¨éGŸë£¦¿‰†‘"ØhÐ?û‚8`ÆNf ½¸sL1ºïEcµ…®3ˆ®ß9®ì¡V@ŽÇ·Á‡ŸX8K}Ûë㨜DÇñÑ6â8~ ?}t}ŠÇ¸>¨ã…ê1nê®®â~uOUWñéê*~J]Å#ÅUL»„N (hâ˨cW@·©æZˆ-ò,ÐÙäDšv…°m`é9N?Mù…!()¿³4å÷«MùÝâ¥ü^«)¿‡“4å÷ç@0±iªïoZhŽï=^Žožfõ¾èƒ}vÉzúvëI”Ó¨tº´èTÚk™Öu”^mÏO k1E‡Ñbó:œ@’ç1Ü·h<¬!õ©ÿ$5wÓhod“ºŠ"‡|$ïçí>¸ƒÔ´e¢Ä¡0€· eµ 9_å“l9w) cx7…/O%%¦ï‡¼+þ‡U¤^$5•ï|I²'ì)3B¬ž)ÚßÞL˜Gj¯Ž4üÕ|ùCR<¹—¥Q/÷W:{;HGÉØÄƒÝ¼AÛáìJáy f‘Ú££2‰»éë>y…ú p®• \†7L¯³ð3’é| ¡»Ÿ·ÅEò8©IM#õ©ŠÄ‡ùò“Ê\Æ«/ò¾LÓù¤~Iê‡òòOø¤ÛŠOæð껼ÿcRÕ¤–‘ú{R2’ò(+óâSùOÊ2µž÷eὓ”8e†:È›‚|0ƒ_çÅkH-!UIêRµ¤Úóå-¸Ò¹ ¼ØŸךNêV¶lIeŒ ·ˆìp² ü-§¢ÀŸ;ZÀ*»˜á’EyÉ¢üîeH«AÆŸ¶qŒBŽ´ñ¶KJƒ`· &Eq -+ÂÀ½±®¾nÝ[lK6ÛŸŒ% £ŸWJPŸáU î—k¿0 œ/y(²ÿ‰Fç;|©Ñùuêr­ÞńջX)ŽDÚdmé4 Ô©Ópºø#?á³ê -+£^¿Äƒêõ«R?_8²oª/o†zï2O©÷n½:èÆbGÉÐ41À(¥N_¸½„™s±¾Ãvä~˜u -+8ËèF˸î8›ÇpwËC‚Ýå¶3ƒáý]àT¿c»pce»2rKµ+wlß&ÛÛø56ŸÛ~«ß vWØîL¸àC‰Þc{PG™m{R­É9­Çw}[l/jKãmoª[I‡È. ÚVìê¡Þèwa´Æs (´æø¹žËs„>~ê@˜BmY‘£Í Æþæ²ÌÂ]ŒŠgõŽàGŒ^½›O_˜yVúð¿E+z$­èa´¢·INÍ&fÌ„h-w§ í> Ü­–Peë>¤Ÿb³Ü$2ÆßÓ:Ÿ'óx}üïìœÉuýz†@bX;B£x”~Ã¥oú9}1Ôa­WÀÆ•’'P -+ó$ꉦÎhd@öa“Fß~Gjí¥Xŧüÿ.0í¨VäXçãwÌêÉæÚAuggŸ” -+%ŸI7“ªN†u^õ™,fòt°î@–ÉùšAåµ /—³Hs ‰$czCÑ3XRäD*H§Å~«ç0l=£Ûù]$ã) VweòìÃ=#Ã?™AAÌó­¬û‚‘D–)ÉÞI¤ªÙ‹½ËôLHöN<•£öÌücI Ù;Aú8ŠØ;°|÷ÇÀÆEïÄÐRícÜîX ]>µõ/S[ƒÚúá|µõ«ÕÖ?•.Ø-Sßù$AMþ©jò¿%Ø-?ÀŠåß_Lþ§hÕ7u¤É_E[??ΩԢx’Õù,E«>ªÇU‡Ê Sú"òìœ/ˆ¡ÐN ‰â—t4홊@ÄÀi.§Oe0BĪÎþ º*“ fDŒ&K¢Ók~Mmš¦©M'ÚkõÑ\õ¦çZç£×-ä8!ͽÐhÜ ÆÊÒˆÛFŸÆØÆiŒíPK §­Ä`«„ÎöDKy ÷.­²q:Wªl0TË#Þ2Ê{HLš570|“å.ÑÊ{c¤ò†{Ÿà8Ós¦@²ØL!Ç(<Ž‚)çÐkõWÔ‘ªé´ªrJbòÒŸÇɇ«M=x“¯PÜ*Aξ"vmP&_¡xW‚œ}Et°ÄqòqÎeòáþ?Çì+¢”ÉW(î– g_‘x\beöÑëäìÃÕ/3¼œº":_‚œ}!ú_beò‰æ’_ä¿ò‹¤Òÿ*™W=õä=¬¦^¹Ï)š«h¨æcÁ*”|¬7-U4^Q{ têÑÌÑrŸP4MQoïøþ MÜz^Ñ}Š®Ð4®„°¦qéÑ~l™‚®UÔ+ë=î¿FÑ-Š -+¼Ãÿ_j¾×VE¥Š†kö %‰˜½­èE?V”©)a nÍ ƒ>!¨HuRcu/*š¯èš5–èh”o·¢Š&(ÊÊ¥#Á§MWÔGÓË¢Ni˜q›¢ŠFh²Y+Wã”{­T4QQŽ&¢ùa?·ca„=“|“ž'+Ž‘Ÿ2Mèg’:|F’‡²ë…„“…¿‰Þè¨ÓÜ»~Ë¢3ö1îÍ!>ð°ðõäo!?ù¾à£lópc¶òÃNG+?Ïøó…;°XGÙðóX’%¾*Ü ¿øÅ®‡m±—„ÍS”¹é=J½Ì/]2ƒ…7‹;“ìùZVäs¿fmÑD¹Š†y¢´ÊÈ[º·< h‚¢l-6rȧ¹G5š*r‡¢þš‰ÔØB3‘^Ñ=k‘¢1ŠR5=éCMÇ]¥hª¢žš³$þu†ä¨'$‡nÉ`rZ -+vßÑ]óAEåJV{N²›ÖiFñ, KÖø%küâ²ÆKc†ž_¶$¦ÎôÖJ‡ÿйÍ''H -+鲋•ÌëB)MËŒ“"-Üæ$Éá‰Ý~^­æÕᤑú•¨n¢º½yu¯>Ê«EûkÌ0¥‰¯þÙ/±´¬B´–äˆD‘DÙbŲ*â*¤eÅã,´ªx&•œg9%çYÆëyØQ¶4qÇ·*‹Þùv,H¢½•£jû/‰îZÕÞ'éZ] ÔéOÞKOÃZMHº]Q_Mþê©Léyôׂ˜î&9PïÂ`ûæ+Å ,y _Çhh­Z*劮V”®É¡ûÅšqW4 -ûÑw^]Kwç5è›_]êª×Ι#ј,MaJƒóí9ð¿ÏÇÞiÏV—xÀ«Žþ(`—G_¸Ñ£»B^õÈŸ6`iüø+&ßpëM3oŸ=]žô{Ÿ•ô#ÿ¾­’¾ÿ·'Wãsqò¯Ù¸ ðàiÀ–óŸ™r%àyµ1·Ll¼xð1àKcnÅ︵5`¼1·AvÆí€R@•1³Ó7æ𠳟<xðàÀcîÄÿåÎLcî9p°vì¼88•ïž5e~ 00ð€<°¿÷Ÿ;ó³_Ö^¼øð) É˜ûÑÎ÷·t Œü-àc¡«í|mÌbôÏâv€|@1`$``ànÀbÀC´Ýâ­È/†übÈ/†|äË _ù2È—A¾ òe/ƒ|äË _ù2È—A¾ òe/ƒ|9äË!_ùrÈ—C¾òå/‡|9äË!_ùrÈ—C¾òå/‡|ä+ _ù -+ÈW@¾ò¯€|ä+ _ù -+ÈW@¾ò¯€|%ä+!_ ùJÈWB¾ò•¯„|%ä+!_ ùJÈWB¾ò•¯„üÈ/üÈ/üÈ/üÈW¡ªÐGUè£*ôQú¨ -+}T…>ZŠ>ZŠ>ZŠ>ZŠ>ZŠ>ZŠ>ZŠ>ZvŸ1+Ñ÷+Ñ÷+Ñ÷+Ñ÷+Ñ÷+—VÖ0vVbì¬ÄØY‰±ósŒ_ÔóðýƬÂ4^…ɹêã«Vžlìüð;À)cÃy siÍAÀIcž óôÃÆÔ`üÕàjð 5ø†|C ¾¡ßPƒo¨Á7¬K5f=Þ¿í±í±í±í±aó`æÁ̃ ˜06`lÀ<ØØ€öÙˆöݸø[kìG¿d]Vòc‰TVúcõ?V^eIÖɤ,°t"ѽ”ó†Î(nxé²Ðs§äÿØËÙ0‹yþ8lX¨ímžœîå‰ï¶– +ÝMŠeZKO)Þʘ–¶P*ã%ØT6ˆ³}MÐ2çf€¨UѶ–Ô ˜bƒ/}ê÷õ©zÁ`žÞ`M±qn;`}LÕ›Zo<6afÞˆ—m ƒ<…ÏØ Ã:­—ÙxÆsf· àŒª³-²ÉZm“«™Ùh“œ)©µ) Ç*l*u›1û Ût2N|5¡ŽÆÛ`Û1ƵBc,Ã÷Ú :a@ÓÉ0Nþv›MOÏäF £@›”°I¨Îvb¼äÇæÑYµÌv‘ÀÈ6 ŒŒ8l»12]"!îrÛƒ‘¤Íù(xÏöbÈãG' ƒ$0˜/!Ž{õðrhŽAú›$-/øœ-M«Õ¢¥÷hÑÒõZ´4tд¥fºzžg÷²[YH‚]Énd÷±ëØm©6_º+Éö–.b÷°kØ-ì¿b\kJã¶›‹ê¥& M0ýMSþu ××c…LSIËwž‚•ÖË4%Z°õ8ÆK¾iN¿ümŒÎ¦9~tÕnÛc š³ ƒ!Ë4G©>€aÐÁ4'Oz†#é&ÜfÊôyª ÇOÚd;³dè˜5Íèæ$ÈUB'âÖ͵èÒx.~¨*}ãe'º±… g/<‚D‡ Zó窭¶Ø†Í¤:LO÷[7Ïržli«_›o¥ÌgÉÝJÆM¹kQõ“›wÔím8|ìdc3“0ætrh܌ʵµ ;Íó×ì: -+‘¹{Åœc·\P¾¿‰ÅïÙa¾‰;ÚÏœæÆ“Ç7ì­Û±ùÉêEwMWÒ-ê\{º±¡vmåŒq¡d3‰¥»Úð–)m ôð¦IñŠ 7¯c¸Ü‡UàaÚ…koŽ—âæáÆ‡Š¥œ¹³s24hŒÊ# ³¡Ê±áÕƒ Su·bx¾dK£ w“ŒÞ!Ƀ¤UbÑ¥qxIÞÈl!k)ØQØRiøštì(¬oÄñ·DÂH9**†]1̺È0S1Rº,¢(reèežU#Š#!ÓæŠQ"#Š$¡¶bB¤O¤HS[ªÝD¸ô_þò_6nˆ9=Ò èXÏ=Íi{¬ÁZ=Òóœé~,'y–ë ž{õÏ=¹ó#=¹SpBOî$½§'w6kzØrM›®ia#4-,û°`w›f…-Ól°$Œ51$+¬N³ÁªµšËd­ß’ߨÉ`Û5 l& ×$°¨½š¶BO“ŽÕƒ£ñ šV­¹_cô8h`Ÿæ€UhîW‰ÆkkõˆçL=͙ը`«5ók”Œë4l†&€µ>~n˜[¨ëg4ýk„ƶ_–,0w‚FÃ÷hØT œ×k -+Ømb? ™`h- Ê7hØ4è¿TÀ}Ø ¨Ý´šgþÖ8Ž@ñõ§ø¨ü=…âc<4à(½#¶´¥û½k­’¿L>ºÕÚ;ŸÐ¸Ê6Šß˜j[SI¢Ñ®´êª!¢2¶ÆÄNëB«Dº -+"](ÅMÅ…SJ.,Åà"n…º.„Æ?YT£4‹2 ¨P,¦*¥¨¨Ì¢ä^ßó<ç¼÷i¢ñOJ¦ò>oó}¦æÎ§÷Ü3¿çÜÏý‚Ý“ùE»7ô)zôúУ¸xo =ºÉzôÁУ;íBŽÅÅü¦Ð£¸ ÷³Gqa =ª‹;ÖPèQôçmÖŸÛãÅ^.7ú(è½y‡õæQ`Ýe½y{XèKE¡)"o;ûrØúòV  X½Ý`Ý¿£67f±iKc>ývqÔÇÞ.T|ìí§Ÿw[¼ÛæÝ–¿Ùê“n ›}Òíc‰A$Á* -+’ R1(lÛo‚1ÂÚ~¾ÏÚ¾ð¶Ù°õã[ "ƒ@ƒ•?æZòü6dÅI“”AÔ #Oäy_[®øc(êþŠg÷žsv¯9ììÞgvûÄ#®eù£ŽìÙàÈÞ;Žì=íÈ^£Ï?úšÉpMÌ÷ºý¾×iƒ·L•æUçØ{Õ%jóŽ2g#(ÕÇýƒ¿º Váz—nöÏýÞÎp•Îï÷ýŽ»ˆ}Ì™½/<cŸ‡^|“áúž¿ààÞ¢Ýæ/·—Ÿu•ûŠÓ{ »ùKᎱ]mâôñôßÂÓ3Oú¸É»“¸×ü?y€Zé3H¶Ø=r¥%OöF»ãØ}B­MvR®v72}Ät]ow(å‚EÔ¾zí¦u]gw4­«Çîp|u?&½ç“Wwäý)‹”Ëçœx÷hÉ÷ÜîÝæ¹“S¾]púý9 ¥ÌOŸyb廆À/÷5…Ñc-œ„¯XØeþ–o猋ZÑ‚cf/÷]vëxÒ)ƒî y”æ~ß>r?y°xÛ¤oÇö)ÈÓ¦íáOÝQ*aÛYŸ¯;±½æÛIŸïó¡ô'};êÛ×>$¾ÕçןñmÚ·¯|b|Àf܃`µí°os¾]²iò|ćâ'}›öí”o¿ú€ù°Ñ?ëÛ”oú¶èCç›mâ>üð¶í Ûµ¤ÿÎ×h°{Ù`÷±ÁÔ\éÃ*l.5ÖŽ¤±v&¥†M*m¦´‘Ú›(mžöÆ©¶4-¢ê -+¥Ö»'ëÔÿå îA"áü“æ…]?!Ê¡þ97ÆÆé -+Æü±mNöOùvÁܲ ¬Œï?e.t>æOÝ|×´¦?.Ñ·gÅ|ê l;çæÚ^{"gPŠö`ÎË}þ`ÎIßN¸å6dO ÂѶ܀ô‡uNúvÜ,×ÜàÏìÜëÛŒogíisá¿oð|Í·“|˜¼ÏŸßù¤oG}ûÚ}ó­îå=ãÛ´o_ù3ê¬>nõ°Õ9«—ÌjA±ç -+N£œBù5(°¢¨egqѳbéÉÊuUþÅðw. ägQ¦P>DÁ„øoá:‚±»¬Ø¨íMµÊjÅ7Ù–¼ÓߺޮÇ|;íÛE 0´@—ŠÕ «¬±úÕ« «MXƒ8ÛQª((ûQ¢¼‰2ƒò>Ê,Ê&(‰ŽP"MP2 ^¡ìÓµ’w·’Ç·’Øî¶û‰©×ØîC¦eê]¦ž¦|ÎÔûL=Qù¤òMS/Uþ*¼Öîñ¯óã÷»Ðòž”w¨‡J³t;7òmNhé‹Nµx¦pPé§–îêt‹ó:⩤—Z<ÚÃ-þ-Ü\z»¥ÓKß.0=áÒ!¦_ÜçY¦'[œeøÌtKÚi7¨éW—î5¼l:Û¥Ï=äOŽ:áV¸;ânÓ/§{N/½tÖá³Óu¼[òtèé×Ó½§—Og¿ôùáúó3~"ÀÏ:~Uù§_o¨­&vµõd{?¦}ØÞƒiÿ¥½—šê¹ÔMÍRõ› ÕÔdU¯¡Ïº‡pMB²7§£å9B4z¢‡¯t š¨¥¥Jƒv븛¯¥Kc6-MÛÒÂ…¡K{·4{aýÊ ŽÆ°lb˜Æ´KCö2ÍfZÏr¢£1m65MëÒ†¡M{›f·¼ïh…›1N›œ¦9-ôÒPßæ–yÏ=÷q² Œøvû*]«8¾µìÛU¿åê|Ûf‹¦MvÈ d3’7gÙbô˜§¢ï<œ…o³«¡>‰¾•`ŠðAá„ … -+?Ž(<0Œ°EaŒ€f„7 -+wú( ÀðH ’r„O¥°#¼¨%Ká—@1dͦ dè&à  œ@:v -+óò ôpÑî"ëÿz?~‡ˆ H ž@$“€&qM›D9 vó$ôI”@(ñP¢DG ’Š+%fJè”*Tñ©ÄU ¯e%Ø*ΕØ+!X1±Dd ÌŠŸ%NK¸–¨­È[‚¸Är éŠÙ%ÂK —x¯h_¿D 5,Š˜P1cÇÄ #M'©ü0Ée‚ÌN5W³¬Ò"¯úç’V;¯ñþâ׸œë“nݸˆ #(fP ¡˜B1†bѪbÅ&¢MÅ,ŠaD›ŠmD›Šyÿˆ‰')f- -+ŽRL%Zœ%xK±—à0Ác‚ËD{‚Ó¯)v'xNphÏîñ¯ïã'ÿ@‚lI ’”ä*IY’¹$I“t&YM’›ä8Iu’ñ$ñIþS8(éP²¢$GÉ‘ -++%eJæ”*yTᩤUÉ® -+e%ÙJÎUØ+)X2±$dÌ’Ÿ%MK¶V¨-É[r¸¤ré’Ù%ÁKž—t¯`_Á¿dI“&5L†˜D±cÇ$ P¾bÆÊÿÊÓÊöø½–L'™J2Žp›$3Hæ ˜<2u$a$Yðþ—<,‘Á{\òC²ïeÉ È É -+H -+H ¼O!!  v›ÜÞP+º?{g~vŸmá ‹æ^4£É}Mòk²_“þšügcÀÈ%(Q@  `ü€Ò”NÀ°e(Ë€ÑJ:Pòƒ”‹ œå&(GA¹ -+ÊYPî‚r”Ë œå6(ÇA¹ÊyPîƒr Æ™ ±Ëc"ªˆŒ€!‚gHÛ;ï¼3ð®À;ï¼p…ÂÙÇgggggâggóZþÃAV@U¹ŠP¬@ÌPð@L"ˆÙ1­ æÄDƒ˜qPÆ”Q1¡ L(C’d…$o¡ÓÚ´¶ÅþÚÛ W +8S-*%  -+×ÈÑW`ÿaŸÇHóùØüq¦?Nùǹÿ˜³ʸ€2B ¦ -+”Aeø@’HäÔzj²e1ÊB”e(›Ö ¬@éFéD¼҄ЂҀÐÒ|ÒzÐxÒvx‰¤åðRA¿A»A·A¯A«A§a&Ëþ>Þ]tâÿà'Î -+ÜÏî -+òª¢¡öqθqæ]3ð‰ç€<Çå9<¯YzÍÖkÖž£÷Ä×\¾æô9¶¯)~MõsÈ_3ÿÊ`$€” % -+(a@‰J P" -+”X %(á@‰J@P"‚”˜ *„ÛŒðÂf˜+ÄëŒ9C¼Öý»‹µýOÅãdžéå£YøÿVHøã¯áRAâ eÕß—<»<”ç >tƒ<[í÷{_3Þžj³züÍøÌ¿ýuÖD®MKý$ͱ¹kÕ¸ÜBÞŽo®XéwIòK̃©eŸþéëß_Ø? ­¿ôe¿~à¯\øõWö;||jžÁ² -\ No newline at end of file -diff -Naur mxml-2.6/doc/makedocs.sh mxml-2.6-haiku/doc/makedocs.sh ---- mxml-2.6/doc/makedocs.sh 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/makedocs.sh 2007-09-09 07:16:52.000000000 +0000 -@@ -0,0 +1,30 @@ -+#!/bin/sh -+# -+# "$Id: makedocs.sh 297 2007-09-09 07:16:52Z mike $" -+# -+# Script to make documentation... -+# -+# Copyright 2003-2007 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 -+# License as published by the Free Software Foundation; either -+# version 2, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+ -+htmldoc --verbose --path "hires;." --batch mxml.book -f mxml.pdf -+ -+htmldoc --verbose --batch mxml.book --no-title -f mxml.html -+ -+rm -rf mxml.d -+mkdir mxml.d -+htmldoc --verbose --batch mxml.book --no-title -t html -d mxml.d -+ -+# -+# End of "$Id: makedocs.sh 297 2007-09-09 07:16:52Z mike $". -+# -diff -Naur mxml-2.6/doc/mxml.book mxml-2.6-haiku/doc/mxml.book ---- mxml-2.6/doc/mxml.book 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/mxml.book 2008-01-25 07:50:40.000000000 +0000 -@@ -0,0 +1,11 @@ -+#HTMLDOC 1.8.27.1 -+-t pdf14 -f "mxml.pdf" --book --toclevels 3 --no-numbered --toctitle "Table of Contents" --title --titleimage "title.html" --linkstyle plain --size 4.25x6.875in --left 0.750in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=95 --fontsize 9.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Helvetica --headfootsize 8.0 --headfootfont Helvetica-Oblique --charset iso-8859-1 --links --embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 300 --no-strict --no-overflow -+intro.html -+install.html -+basics.html -+advanced.html -+mxmldoc.html -+license.html -+relnotes.html -+reference.html -+schema.html -diff -Naur mxml-2.6/doc/mxml.html mxml-2.6-haiku/doc/mxml.html ---- mxml-2.6/doc/mxml.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/mxml.html 2009-05-17 17:31:51.000000000 +0000 -@@ -0,0 +1,3952 @@ -+ -+ -+ -+Mini-XML Programmers Manual, Version 2.6 -+ -+ -+ -+ -+ -+ -+

Table of Contents

-+
-+
Introduction -+ -+Building, Installing, and Packaging Mini-XML -+ -+Getting Started with Mini-XML -+ -+More Mini-XML Programming Techniques -+ -+Using the mxmldoc Utility -+ -+Mini-XML License -+
-+
Release Notes -+
    -+Library Reference -+ -+XML Schema -+
      -+
      -+

      0Introduction

      -+

      This programmers manual describes Mini-XML version 2.6, a small XML -+ parsing library that you can use to read and write XML data files in -+ your C and C++ applications.

      -+

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

      I then replied with:

      -+
      Given the limited scope of what you use in XML, it -+ should be trivial to code a mini-XML API in a few hundred lines of -+ code.
      -+

      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 3,441 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:

      -+ -+

      Please email me (mxml @ easysw . com) if you would like your project -+ added or removed from this list, or if you have any comments/quotes you -+ would like me to publish about your experiences with Mini-XML.

      -+ -+ -+

      Organization of This Document

      -+

      This manual is organized into the following chapters and appendices:

      -+ -+ -+ -+

      Notation Conventions

      -+

      Various font and syntax conventions are used in this guide. Examples -+ and their meanings and uses are explained below:

      -+
      -+
      mxmldoc -+
      mxmldoc(1)
      -+
      The names of commands; the first mention of a command or function in -+ a chapter is followed by a manual page section number. -+
      -+
      -+
      /var -+
      /etc/hosts
      -+
      File and directory names. -+
      -+
      -+
      Request ID is Printer-123
      -+
      Screen output. -+
      -+
      -+
      lp -d printer filename ENTER
      -+
      Literal user input; special keys like ENTER are in ALL -+ CAPS. -+
      -+
      -+
      12.3
      -+
      Numbers in the text are written using the period (.) to indicate the -+ decimal point. -+
      -+
      -+
      -+ -+ -+

      Abbreviations

      -+

      The following abbreviations are used throughout this manual:

      -+
      -+
      Gb
      -+
      Gigabytes, or 1073741824 bytes -+
      -+
      -+
      kb
      -+
      Kilobytes, or 1024 bytes -+
      -+
      -+
      Mb
      -+
      Megabytes, or 1048576 bytes -+
      -+
      -+
      UTF-8, UTF-16
      -+
      Unicode Transformation Format, 8-bit or 16-bit -+
      -+
      -+
      W3C
      -+
      World Wide Web Consortium -+
      -+
      -+
      XML
      -+
      Extensible Markup Language -+
      -+
      -+
      -+ -+ -+

      Other References

      -+
      -+
      The Unicode Standard, Version 4.0, Addison-Wesley, ISBN -+ 0-321-18578-1
      -+
      The definition of the Unicode character set which is used for XML. -+
      -+
      -+
      Extensible -+ Markup Language (XML) 1.0 (Third Edition)
      -+
      The XML specification from the World Wide Web Consortium (W3C) -+
      -+
      -+
      -+ -+ -+

      Legal Stuff

      -+

      The Mini-XML library is copyright 2003-2009 by Michael Sweet. License -+ terms are described in Appendix A - Mini-XML License -+.

      -+
      -+

      1Building, Installing, and -+ Packaging Mini-XML

      -+

      This chapter describes how to build, install, and package Mini-XML on -+ your system from the source archive. You will need an ANSI/ISO-C -+ compatible compiler to build Mini-XML - GCC works, as do most vendors' -+ C compilers. If you are building Mini-XML on Windows, we recommend -+ using the Visual C++ environment with the supplied solution file. For -+ other operating systems, you'll need a POSIX-compatible shell and -+make program in addition to the C compiler.

      -+

      Compiling Mini-XML

      -+

      Mini-XML comes with both an autoconf-based configure script and a -+ Visual C++ solution that can be used to compile the library and -+ associated tools.

      -+

      Compiling with Visual C++

      -+

      Open the mxml.sln solution in the vcnet folder. -+ Choose the desired build configuration, "Debug" (the default) or -+ "Release", and then choose Build Solution from the -+ Build menu.

      -+

      Compiling with Command-Line Tools

      -+

      Type the following command to configure the Mini-XML source code for -+ your system:

      -+
      -+    ./configure ENTER
      -+
      -+

      The default install prefix is /usr/local, which can be -+ overridden using the --prefix option:

      -+
      -+    ./configure --prefix=/foo ENTER
      -+
      -+

      Other configure options can be found using the --help -+ option:

      -+
      -+    ./configure --help ENTER
      -+
      -+

      Once you have configured the software, use the make(1) -+ program to do the build and run the test program to verify that things -+ are working, as follows:

      -+
      -+    make ENTER
      -+
      -+

      Installing Mini-XML

      -+

      If you are using Visual C++, copy the mxml.lib and and -+ mxml.h files to the Visual C++ lib and include -+ directories, respectively.

      -+

      Otherwise, use the make command with the install -+ target to install Mini-XML in the configured directories:

      -+
      -+    make install ENTER
      -+
      -+

      Creating Mini-XML Packages

      -+

      Mini-XML includes two files that can be used to create binary -+ packages. The first file is mxml.spec which is used by the -+rpmbuild(8) software to create Red Hat Package Manager ("RPM") -+ packages which are commonly used on Linux. Since rpmbuild -+ wants to compile the software on its own, you can provide it with the -+ Mini-XML tar file to build the package:

      -+
      -+    rpmbuild -ta mxml-version.tar.gz ENTER
      -+
      -+

      The second file is mxml.list which is used by the -+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/
      -+
      -+

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

      -+
      -+    make epm ENTER
      -+
      -+

      The packages are stored in a subdirectory named dist for -+ your convenience. The portable packages utilize scripts and tar files -+ to install the software on the target system. After extracting the -+ package archive, use the mxml.install script to install the -+ software.

      -+

      The native packages will be in the local OS's native format: RPM for -+ Red Hat Linux, DPKG for Debian Linux, PKG for Solaris, and so forth. -+ Use the corresponding commands to install the native packages.

      -+
      -+

      2Getting Started with Mini-XML

      -+

      This chapter describes how to write programs that use Mini-XML to -+ access data in an XML file. Mini-XML provides the following -+ functionality:

      -+
        -+
      • Functions for creating and managing XML documents in memory.
      • -+
      • Reading of UTF-8 and UTF-16 encoded XML files and strings.
      • -+
      • 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 -+ "leaf" nodes.
      • -+
      • "Find", "index", and "walk" functions for easily accessing data in -+ an XML document.
      • -+
      -+

      Mini-XML doesn't do validation or other types of processing on the -+ data based upon schema files or other sources of definition -+ information, nor does it support character entities other than those -+ required by the XML specification.

      -+

      The Basics

      -+

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

      -+
      -+    #include <mxml.h>
      -+
      -+

      The Mini-XML library is included with your program using the -+-lmxml option:

      -+
      -+    gcc -o myprogram myprogram.c -lmxml ENTER
      -+
      -+

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

      -+
      -+    pkg-config --cflags mxml ENTER
      -+    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 -+mxmlNewXML functions. Only elements can have child nodes, -+ and the top node must be an element, usually the <?xml -+ version="1.0"?> 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:

      -+
      -+    <?xml version="1.0"?>
      -+    <data>
      -+        <node>val1</node>
      -+        <node>val2</node>
      -+        <node>val3</node>
      -+        <group>
      -+            <node>val4</node>
      -+            <node>val5</node>
      -+            <node>val6</node>
      -+        </group>
      -+        <node>val7</node>
      -+        <node>val8</node>
      -+    </data>
      -+
      -+

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

      -+
      -+    ?xml
      -+      |
      -+    data
      -+      |
      -+    node - node - node - group - node - node
      -+      |      |      |      |       |      |
      -+    val1   val2   val3     |     val7   val8
      -+                           |
      -+                         node - node - node
      -+                           |      |      |
      -+                         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);
      -+
      -+ -+ -+

      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> */
      -+    mxml_node_t *node;   /* <node> */
      -+    mxml_node_t *group;  /* <group> */
      -+
      -+    xml = mxmlNewXML("1.0");
      -+
      -+    data = mxmlNewElement(xml, "data");
      -+
      -+        node = mxmlNewElement(data, "node");
      -+        mxmlNewText(node, 0, "val1");
      -+        node = mxmlNewElement(data, "node");
      -+        mxmlNewText(node, 0, "val2");
      -+        node = mxmlNewElement(data, "node");
      -+        mxmlNewText(node, 0, "val3");
      -+
      -+        group = mxmlNewElement(data, "group");
      -+
      -+            node = mxmlNewElement(group, "node");
      -+            mxmlNewText(node, 0, "val4");
      -+            node = mxmlNewElement(group, "node");
      -+            mxmlNewText(node, 0, "val5");
      -+            node = mxmlNewElement(group, "node");
      -+            mxmlNewText(node, 0, "val6");
      -+
      -+        node = mxmlNewElement(data, "node");
      -+        mxmlNewText(node, 0, "val7");
      -+        node = mxmlNewElement(data, "node");
      -+        mxmlNewText(node, 0, "val8");
      -+
      -+

      We start by creating the <?xml version="1.0"?> 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):

      -+
      -+    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:

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

      -+ -+ -+

      Loading XML

      -+

      You load an XML file using the -+mxmlLoadFile function:

      -+
      -+    FILE *fp;
      -+    mxml_node_t *tree;
      -+
      -+    fp = fopen("filename.xml", "r");
      -+    tree = mxmlLoadFile(NULL, fp,
      -+                        MXML_TEXT_CALLBACK);
      -+    fclose(fp);
      -+
      -+

      The first argument specifies an existing XML parent node, if any. -+ Normally you will pass NULL for this argument unless you are -+ combining multiple XML sources. The XML file must contain a complete -+ XML document including the ?xml element if the parent node is -+NULL.

      -+

      The second argument specifies the stdio file to read from, as opened -+ by fopen() or popen(). You can also use stdin -+ if you are implementing an XML filter program.

      -+

      The third argument specifies a callback function which returns the -+ value type of the immediate children for a new element node: -+MXML_CUSTOM, MXML_IGNORE, MXML_INTEGER, -+MXML_OPAQUE, MXML_REAL, or MXML_TEXT. Load -+ callbacks are described in detail in Chapter -+ 3. The example code uses the MXML_TEXT_CALLBACK constant -+ which specifies that all data nodes in the document contain -+ whitespace-separated text values. Other standard callbacks include -+MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -+MXML_OPAQUE_CALLBACK, and MXML_REAL_CALLBACK.

      -+

      The mxmlLoadString function -+ loads XML node trees from a string:

      -+ -+ -+
      -+    char buffer[8192];
      -+    mxml_node_t *tree;
      -+
      -+    ...
      -+    tree = mxmlLoadString(NULL, buffer,
      -+                          MXML_TEXT_CALLBACK);
      -+
      -+

      The first and third arguments are the same as used for -+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:

      -+
      -+    FILE *fp;
      -+    mxml_node_t *tree;
      -+
      -+    fp = fopen("filename.xml", "w");
      -+    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
      -+    fclose(fp);
      -+
      -+

      The first argument is the XML node tree to save. It should normally -+ be a pointer to the top-level ?xml node in your XML document.

      -+

      The second argument is the stdio file to write to, as opened by -+fopen() or popen(). You can also use stdout if -+ you are implementing an XML filter program.

      -+

      The third argument is the whitespace callback to use when saving the -+ file. Whitespace callbacks are covered in detail in -+Chapter 3. The previous example code uses the MXML_NO_CALLBACK -+ constant to specify that no special whitespace handling is required.

      -+

      The mxmlSaveAllocString, -+ and mxmlSaveString functions -+ save XML node trees to strings:

      -+
      -+    char buffer[8192];
      -+    char *ptr;
      -+    mxml_node_t *tree;
      -+
      -+    ...
      -+    mxmlSaveString(tree, buffer, sizeof(buffer),
      -+                   MXML_NO_CALLBACK);
      -+
      -+    ...
      -+    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
      -+
      -+

      The first and last arguments are the same as used for -+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 -+mxmlSetWrapMargin function overrides the default wrap -+ margin:

      -+
      -+    /* Set the margin to 132 columns */
      -+    mxmlSetWrapMargin(132);
      -+
      -+    /* Disable wrapping */
      -+    mxmlSetWrapMargin(0);
      -+
      -+ -+ -+

      Finding and Iterating Nodes

      -+

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

      -+
      -+    mxml_node_t *node;
      -+    
      -+    node = mxmlWalkPrev(current, tree,
      -+                        MXML_DESCEND);
      -+
      -+    node = mxmlWalkNext(current, tree,
      -+                        MXML_DESCEND);
      -+
      -+

      In addition, you can find a named element/node using the -+mxmlFindElement function:

      -+
      -+    mxml_node_t *node;
      -+    
      -+    node = mxmlFindElement(tree, tree, "name",
      -+                           "attr", "value",
      -+                           MXML_DESCEND);
      -+
      -+

      The name, attr, and value arguments can be -+ passed as NULL to act as wildcards, e.g.:

      -+ -+ -+
      -+    /* Find the first "a" element */
      -+    node = mxmlFindElement(tree, tree, "a",
      -+                           NULL, NULL,
      -+                           MXML_DESCEND);
      -+
      -+ -+ -+
      -+    /* Find the first "a" element with "href"
      -+       attribute */
      -+    node = mxmlFindElement(tree, tree, "a",
      -+                           "href", NULL,
      -+                           MXML_DESCEND);
      -+
      -+ -+ -+
      -+    /* Find the first "a" element with "href"
      -+       to a URL */
      -+    node = mxmlFindElement(tree, tree, "a",
      -+                           "href",
      -+                           "http://www.easysw.com/",
      -+                           MXML_DESCEND);
      -+
      -+ -+ -+
      -+    /* Find the first element with a "src"
      -+       attribute */
      -+    node = mxmlFindElement(tree, tree, NULL,
      -+                           "src", NULL,
      -+                           MXML_DESCEND);
      -+
      -+ -+ -+
      -+    /* Find the first element with a "src"
      -+       = "foo.jpg" */
      -+    node = mxmlFindElement(tree, tree, NULL,
      -+                           "src", "foo.jpg",
      -+                           MXML_DESCEND);
      -+
      -+

      You can also iterate with the same function:

      -+
      -+    mxml_node_t *node;
      -+
      -+    for (node = mxmlFindElement(tree, tree,
      -+                                "name",
      -+                                NULL, NULL,
      -+                                MXML_DESCEND);
      -+         node != NULL;
      -+         node = mxmlFindElement(node, tree,
      -+                                "name",
      -+                                NULL, NULL,
      -+                                MXML_DESCEND))
      -+    {
      -+      ... do something ...
      -+    }
      -+
      -+ -+ -+

      The MXML_DESCEND argument can actually be one of three -+ constants:

      -+
        -+
      • MXML_NO_DESCEND means to not to look at any child nodes in -+ the element hierarchy, just look at siblings at the same level or -+ parent nodes until the top node or top-of-tree is reached. -+

        The previous node from "group" would be the "node" element to the -+ left, while the next node from "group" would be the "node" element to -+ the right. -+
        -+

        -+
      • -+
      • MXML_DESCEND_FIRST means that it is OK to descend to the -+ first child of a node, but not to descend further when searching. -+ You'll normally use this when iterating through direct children of a -+ parent node, e.g. all of the "node" and "group" elements under the -+ "?xml" parent node in the example above. -+

        This mode is only applicable to the search function; the walk -+ functions treat this as MXML_DESCEND since every call is a -+ first time. -+
        -+

        -+
      • -+
      • MXML_DESCEND means to keep descending until you hit the -+ bottom of the tree. The previous node from "group" would be the "val3" -+ node and the next node would be the first node element under "group". -+

        If you were to walk from the root node "?xml" to the end of the tree -+ with mxmlWalkNext(), the order would be:

        -+

        ?xml data node val1 node val2 node val3 group node val4 node val5 -+ node val6 node val7 node val8

        -+

        If you started at "val8" and walked using mxmlWalkPrev(), -+ the order would be reversed, ending at "?xml".

        -+
      • -+
      -+
      -+

      3More Mini-XML Programming -+ Techniques

      -+

      This chapter shows additional ways to use the Mini-XML library in -+ your programs.

      -+

      Load Callbacks

      -+

      Chapter 2 introduced the -+mxmlLoadFile() and -+mxmlLoadString() functions. The last argument to these -+ functions is a callback function which is used to determine the value -+ type of each data node in an XML document.

      -+

      Mini-XML defines several standard callbacks for simple XML data -+ files:

      -+
        -+
      • MXML_INTEGER_CALLBACK - All data nodes contain -+ whitespace-separated integers.
      • -+
      • MXML_OPAQUE_CALLBACK - All data nodes contain opaque -+ strings ("CDATA").
      • -+
      • MXML_REAL_CALLBACK - All data nodes contain -+ whitespace-separated floating-point numbers.
      • -+
      • MXML_TEXT_CALLBACK - All data nodes contain -+ whitespace-separated strings.
      • -+
      -+

      You can provide your own callback functions for more complex XML -+ documents. Your callback function will receive a pointer to the current -+ element node and must return the value type of the immediate children -+ for that element node: MXML_INTEGER, MXML_OPAQUE, -+MXML_REAL, or MXML_TEXT. The function is called after -+ the element and its attributes have been read, so you can look at the -+ element name, attributes, and attribute values to determine the proper -+ value type to return.

      -+ -+ -+

      The following callback function looks for an attribute named "type" -+ or the element name to determine the value type for its child nodes:

      -+
      -+    mxml_type_t
      -+    type_cb(mxml_node_t *node)
      -+    {
      -+      const char *type;
      -+
      -+     /*
      -+      * You can lookup attributes and/or use the
      -+      * element name, hierarchy, etc...
      -+      */
      -+
      -+      type = mxmlElementGetAttr(node, "type");
      -+      if (type == NULL)
      -+	type = node->value.element.name;
      -+
      -+      if (!strcmp(type, "integer"))
      -+	return (MXML_INTEGER);
      -+      else if (!strcmp(type, "opaque"))
      -+	return (MXML_OPAQUE);
      -+      else if (!strcmp(type, "real"))
      -+	return (MXML_REAL);
      -+      else
      -+	return (MXML_TEXT);
      -+    }
      -+
      -+

      To use this callback function, simply use the name when you call any -+ of the load functions:

      -+
      -+    FILE *fp;
      -+    mxml_node_t *tree;
      -+
      -+    fp = fopen("filename.xml", "r");
      -+    tree = mxmlLoadFile(NULL, fp, type_cb);
      -+    fclose(fp);
      -+
      -+

      Save Callbacks

      -+

      Chapter 2 also introduced the -+mxmlSaveFile(), -+mxmlSaveString(), and -+mxmlSaveAllocString() functions. The last argument to these -+ 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 -+ and 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 *
      -+    whitespace_cb(mxml_node_t *node,
      -+                  int where)
      -+    {
      -+      const char *name;
      -+
      -+     /*
      -+      * We can conditionally break to a new line
      -+      * before or after any element. These are
      -+      * just common HTML elements...
      -+      */
      -+
      -+      name = node->value.element.name;
      -+
      -+      if (!strcmp(name, "html") ||
      -+          !strcmp(name, "head") ||
      -+          !strcmp(name, "body") ||
      -+	  !strcmp(name, "pre") ||
      -+          !strcmp(name, "p") ||
      -+	  !strcmp(name, "h1") ||
      -+          !strcmp(name, "h2") ||
      -+          !strcmp(name, "h3") ||
      -+	  !strcmp(name, "h4") ||
      -+          !strcmp(name, "h5") ||
      -+          !strcmp(name, "h6"))
      -+      {
      -+       /*
      -+	* Newlines before open and after
      -+        * close...
      -+	*/
      -+
      -+	if (where == MXML_WS_BEFORE_OPEN ||
      -+            where == MXML_WS_AFTER_CLOSE)
      -+	  return ("\n");
      -+      }
      -+      else if (!strcmp(name, "dl") ||
      -+               !strcmp(name, "ol") ||
      -+               !strcmp(name, "ul"))
      -+      {
      -+       /*
      -+	* Put a newline before and after list
      -+        * elements...
      -+	*/
      -+
      -+	return ("\n");
      -+      }
      -+      else if (!strcmp(name, "dd") ||
      -+               !strcmp(name, "dt") ||
      -+               !strcmp(name, "li"))
      -+      {
      -+       /*
      -+	* Put a tab before <li>'s, * <dd>'s,
      -+        * and <dt>'s, and a newline after them...
      -+	*/
      -+
      -+	if (where == MXML_WS_BEFORE_OPEN)
      -+	  return ("\t");
      -+	else if (where == MXML_WS_AFTER_CLOSE)
      -+	  return ("\n");
      -+      }
      -+
      -+     /*
      -+      * Return NULL for no added whitespace...
      -+      */
      -+
      -+      return (NULL);
      -+    }
      -+
      -+

      To use this callback function, simply use the name when you call any -+ of the save functions:

      -+
      -+    FILE *fp;
      -+    mxml_node_t *tree;
      -+
      -+    fp = fopen("filename.xml", "w");
      -+    mxmlSaveFile(tree, fp, whitespace_cb);
      -+    fclose(fp);
      -+
      -+ -+ -+

      Custom Data Types

      -+

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

      -+

      The load callback receives a pointer to the current data node and a -+ string of opaque character data from the XML source with character -+ entities converted to the corresponding UTF-8 characters. For example, -+ if we wanted to support a custom date/time type whose value is encoded -+ as "yyyy-mm-ddThh:mm:ssZ" (ISO format), the load callback would look -+ like the following:

      -+
      -+    typedef struct
      -+    {
      -+      unsigned      year,    /* Year */
      -+                    month,   /* Month */
      -+                    day,     /* Day */
      -+                    hour,    /* Hour */
      -+                    minute,  /* Minute */
      -+                    second;  /* Second */
      -+      time_t        unix;    /* UNIX time */
      -+    } iso_date_time_t;
      -+
      -+    int
      -+    load_custom(mxml_node_t *node,
      -+                const char *data)
      -+    {
      -+      iso_date_time_t *dt;
      -+      struct tm tmdata;
      -+
      -+     /*
      -+      * Allocate data structure...
      -+      */
      -+
      -+      dt = calloc(1, sizeof(iso_date_time_t));
      -+
      -+     /*
      -+      * Try reading 6 unsigned integers from the
      -+      * data string...
      -+      */
      -+
      -+      if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
      -+                 &(dt->year), &(dt->month),
      -+                 &(dt->day), &(dt->hour),
      -+                 &(dt->minute),
      -+                 &(dt->second)) != 6)
      -+      {
      -+       /*
      -+        * Unable to read numbers, free the data
      -+        * structure and return an error...
      -+        */
      -+
      -+        free(dt);
      -+
      -+        return (-1);
      -+      }
      -+
      -+     /*
      -+      * Range check values...
      -+      */
      -+
      -+      if (dt->month <1 || dt->month > 12 ||
      -+          dt->day  <1 || dt->day > 31 ||
      -+          dt->hour  <0 || dt->hour > 23 ||
      -+          dt->minute  <0 || dt->minute > 59 ||
      -+          dt->second  <0 || dt->second > 59)
      -+      {
      -+       /*
      -+        * Date information is out of range...
      -+        */
      -+
      -+        free(dt);
      -+
      -+        return (-1);
      -+      }
      -+
      -+     /*
      -+      * Convert ISO time to UNIX time in
      -+      * seconds...
      -+      */
      -+
      -+      tmdata.tm_year = dt->year - 1900;
      -+      tmdata.tm_mon  = dt->month - 1;
      -+      tmdata.tm_day  = dt->day;
      -+      tmdata.tm_hour = dt->hour;
      -+      tmdata.tm_min  = dt->minute;
      -+      tmdata.tm_sec  = dt->second;
      -+
      -+      dt->unix = gmtime(&tmdata);
      -+
      -+     /*
      -+      * Assign custom node data and destroy
      -+      * function pointers...
      -+      */
      -+
      -+      node->value.custom.data    = dt;
      -+      node->value.custom.destroy = free;
      -+
      -+     /*
      -+      * Return with no errors...
      -+      */
      -+
      -+      return (0);
      -+    }
      -+
      -+

      The function itself can return 0 on success or -1 if it is unable to -+ decode the custom data or the data contains an error. Custom data nodes -+ contain a 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:

      -+
      -+    char *
      -+    save_custom(mxml_node_t *node)
      -+    {
      -+      char data[255];
      -+      iso_date_time_t *dt;
      -+
      -+
      -+      dt = (iso_date_time_t *)node->custom.data;
      -+
      -+      snprintf(data, sizeof(data),
      -+               "%04u-%02u-%02uT%02u:%02u:%02uZ",
      -+               dt->year, dt->month, dt->day,
      -+               dt->hour, dt->minute, dt->second);
      -+
      -+      return (strdup(data));
      -+    }
      -+
      -+

      You register the callback functions using the -+mxmlSetCustomHandlers() function:

      -+
      -+    mxmlSetCustomHandlers(load_custom,
      -+                          save_custom);
      -+
      -+ -+ -+

      Changing Node Values

      -+

      All of the examples so far have concentrated on creating and loading -+ new XML data nodes. Many applications, however, need to manipulate or -+ change the nodes during their operation, so Mini-XML provides functions -+ to change node values safely and without leaking memory.

      -+

      Existing nodes can be changed using the -+mxmlSetElement(), -+mxmlSetInteger(), mxmlSetOpaque() -+, mxmlSetReal(), -+mxmlSetText(), and -+mxmlSetTextf() functions. For example, use the following -+ function call to change a text node to contain the text "new" with -+ leading whitespace:

      -+
      -+    mxml_node_t *node;
      -+
      -+    mxmlSetText(node, 1, "new");
      -+
      -+

      Formatted Text

      -+

      The mxmlNewTextf() and -+mxmlSetTextf() functions create and change text nodes, -+ respectively, using printf-style format strings and arguments. -+ For example, use the following function call to create a new text node -+ containing a constructed filename:

      -+
      -+    mxml_node_t *node;
      -+
      -+    node = mxmlNewTextf(node, 1, "%s/%s",
      -+                        path, filename);
      -+
      -+

      Indexing

      -+

      Mini-XML provides functions for managing indices of nodes. The -+ current implementation provides the same functionality as -+mxmlFindElement(). The advantage of using an index is that -+ searching and enumeration of elements is significantly faster. The only -+ disadvantage is that each index is a static snapshot of the XML -+ document, so indices are not well suited to XML data that is updated -+ more often than it is searched. The overhead of creating an index is -+ approximately equal to walking the XML document tree. Nodes in the -+ index are sorted by element name and attribute value.

      -+

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

      -+
      -+    mxml_node_t *tree;
      -+    mxml_index_t *ind;
      -+
      -+    ind = mxmlIndexNew(tree, "element",
      -+                       "attribute");
      -+
      -+

      The first argument is the XML node tree to index. Normally this will -+ be a pointer to the ?xml element.

      -+

      The second argument contains the element to index; passing NULL -+ indexes all element nodes alphabetically.

      -+

      The third argument contains the attribute to index; passing NULL -+ causes only the element name to be indexed.

      -+

      Once the index is created, the -+mxmlIndexEnum(), mxmlIndexFind() -+, and mxmlIndexReset() -+ functions are used to access the nodes in the index. The -+mxmlIndexReset() function resets the "current" node pointer -+ in the index, allowing you to do new searches and enumerations on the -+ same index. Typically you will call this function prior to your calls -+ to mxmlIndexEnum() and -+mxmlIndexFind().

      -+

      The mxmlIndexEnum() function -+ enumerates each of the nodes in the index and can be used in a loop as -+ follows:

      -+
      -+    mxml_node_t *node;
      -+
      -+    mxmlIndexReset(ind);
      -+
      -+    while ((node = mxmlIndexEnum(ind)) != NULL)
      -+    {
      -+      // do something with node
      -+    }
      -+
      -+

      The mxmlIndexFind() function -+ locates the next occurrence of the named element and attribute value in -+ the index. It can be used to find all matching elements in an index, as -+ follows:

      -+
      -+    mxml_node_t *node;
      -+
      -+    mxmlIndexReset(ind);
      -+
      -+    while ((node = mxmlIndexFind(ind, "element",
      -+                                 "attr-value"))
      -+                != NULL)
      -+    {
      -+      // do something with node
      -+    }
      -+
      -+

      The second and third arguments represent the element name and -+ attribute value, respectively. A NULL pointer is used to -+ return all elements or attributes in the index. Passing NULL -+ for both the element name and attribute value is equivalent to calling -+mxmlIndexEnum.

      -+

      When you are done using the index, delete it using the -+mxmlIndexDelete() function:

      -+
      -+    mxmlIndexDelete(ind);
      -+
      -+

      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. Each -+ function works like the corresponding mxmlLoad function but -+ uses a callback to process each node as it is read.

      -+

      The callback function receives the node, an event code, and a user -+ data pointer you supply:

      -+
      -+    void
      -+    sax_cb(mxml_node_t *node,
      -+           mxml_sax_event_t event,
      -+           void *data)
      -+    {
      -+      ... do something ...
      -+    }
      -+
      -+

      The event will be one of the following:

      -+
        -+
      • MXML_SAX_CDATA - CDATA was just read
      • -+
      • MXML_SAX_COMMENT - A comment was just read
      • -+
      • MXML_SAX_DATA - Data (custom, integer, opaque, real, or -+ text) was just read
      • -+
      • MXML_SAX_DIRECTIVE - A processing directive was just read
      • -+
      • MXML_SAX_ELEMENT_CLOSE - A close element was just read ( -+</element>)
      • -+
      • MXML_SAX_ELEMENT_OPEN - An open element was just read ( -+<element>)
      • -+
      -+

      Elements are released after the close element is processed. -+ All other nodes are released after they are processed. The SAX callback -+ can retain the node using the -+mxmlRetain function. For example, the following SAX callback -+ will retain all nodes, effectively simulating a normal in-memory load:

      -+
      -+    void
      -+    sax_cb(mxml_node_t *node,
      -+           mxml_sax_event_t event,
      -+           void *data)
      -+    {
      -+      if (event != MXML_SAX_ELEMENT_CLOSE)
      -+        mxmlRetain(node);
      -+    }
      -+
      -+

      More typically the SAX callback will only retain a small portion of -+ the document that is needed for post-processing. For example, the -+ following SAX callback will retain the title and headings in an XHTML -+ file. It also retains the (parent) elements like <html>, -+<head>, and <body>, and processing directives like -+<?xml ... ?> and <!DOCTYPE ... >:

      -+ -+ -+
      -+    void
      -+    sax_cb(mxml_node_t *node,
      -+           mxml_sax_event_t event,
      -+           void *data)
      -+    {
      -+      if (event == MXML_SAX_ELEMENT_OPEN)
      -+      {
      -+       /*
      -+        * Retain headings and titles...
      -+        */
      -+
      -+        char *name = node->value.element.name;
      -+
      -+        if (!strcmp(name, "html") ||
      -+            !strcmp(name, "head") ||
      -+            !strcmp(name, "title") ||
      -+            !strcmp(name, "body") ||
      -+            !strcmp(name, "h1") ||
      -+            !strcmp(name, "h2") ||
      -+            !strcmp(name, "h3") ||
      -+            !strcmp(name, "h4") ||
      -+            !strcmp(name, "h5") ||
      -+            !strcmp(name, "h6"))
      -+          mxmlRetain(node);
      -+      }
      -+      else if (event == MXML_SAX_DIRECTIVE)
      -+        mxmlRetain(node);
      -+      else if (event == MXML_SAX_DATA &&
      -+               node->parent->ref_count > 1)
      -+      {
      -+       /*
      -+        * If the parent was retained, then retain
      -+        * this data node as well.
      -+        */
      -+
      -+        mxmlRetain(node);
      -+      }
      -+    }
      -+
      -+

      The resulting skeleton document tree can then be searched just like -+ one loaded using the mxmlLoad functions. For example, a filter -+ that reads an XHTML document from stdin and then shows the title and -+ headings in the document would look like:

      -+
      -+    mxml_node_t *doc, *title, *body, *heading;
      -+
      -+    doc = mxmlSAXLoadFd(NULL, 0,
      -+                        MXML_TEXT_CALLBACK,
      -+                        sax_cb, NULL);
      -+
      -+    title = mxmlFindElement(doc, doc, "title",
      -+                            NULL, NULL,
      -+                            MXML_DESCEND);
      -+
      -+    if (title)
      -+      print_children(title);
      -+
      -+    body = mxmlFindElement(doc, doc, "body",
      -+                           NULL, NULL,
      -+                           MXML_DESCEND);
      -+
      -+    if (body)
      -+    {
      -+      for (heading = body->child;
      -+           heading;
      -+           heading = heading->next)
      -+        print_children(heading);
      -+    }
      -+
      -+
      -+

      4Using the mxmldoc Utility

      -+

      This chapter describes how to use mxmldoc(1) program to -+ automatically generate documentation from C and C++ source files.

      -+

      The Basics

      -+

      Originally developed to generate the Mini-XML and CUPS API -+ documentation, mxmldoc is now a general-purpose utility which -+ scans C and C++ source files to produce HTML and man page documentation -+ along with an XML file representing the functions, types, and -+ definitions in those source files. Unlike popular documentation -+ generators like Doxygen or Javadoc, mxmldoc uses in-line -+ comments rather than comment headers, allowing for more "natural" code -+ documentation.

      -+

      By default, mxmldoc produces HTML documentation. For -+ example, the following command will scan all of the C source and header -+ files in the current directory and produce a HTML documentation file -+ called filename.html:

      -+
      -+    mxmldoc *.h *.c >filename.html ENTER
      -+
      -+

      You can also specify an XML file to create which contains all of the -+ information from the source files. For example, the following command -+ creates an XML file called filename.xml in addition to the -+ HTML file:

      -+
      -+    mxmldoc filename.xml *.h *.c >filename.html ENTER
      -+
      -+

      The --no-output option disables the normal HTML output:

      -+
      -+    mxmldoc --no-output filename.xml *.h *.c ENTER
      -+
      -+

      You can then run mxmldoc again with the XML file alone to -+ generate the HTML documentation:

      -+
      -+    mxmldoc filename.xml >filename.html ENTER
      -+
      -+

      Creating Man Pages

      -+

      The --man filename option tells mxmldoc to create a -+ man page instead of HTML documentation, for example:

      -+
      -+    mxmldoc --man filename filename.xml \
      -+        >filename.man ENTER
      -+
      -+    mxmldoc --man filename *.h *.c \
      -+        >filename.man ENTER
      -+
      -+

      Creating Xcode Documentation Sets

      -+

      The --docset directory.docset option tells mxmldoc -+ to create an Xcode documentation set containing the HTML documentation, -+ for example:

      -+
      -+    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
      -+
      -+

      Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 -+ or higher installed.

      -+

      Commenting Your Code

      -+

      As noted previously, mxmldoc looks for in-line comments to -+ describe the functions, types, and constants in your code. Mxmldoc -+ 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.

      -+

      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 -+ document that argument, definition, return type, or variable. For -+ example, the following code excerpt defines a key/value structure and a -+ function that creates a new instance of that structure:

      -+
      -+    /* A key/value pair. This is used with the
      -+       dictionary structure. */
      -+
      -+    struct keyval
      -+    {
      -+      char *key; /* Key string */
      -+      char *val; /* Value string */
      -+    };
      -+
      -+    /* Create a new key/value pair. */
      -+
      -+    struct keyval * /* New key/value pair */
      -+    new_keyval(
      -+        const char *key, /* Key string */
      -+	const char *val) /* Value string */
      -+    {
      -+      ...
      -+    }
      -+
      -+

      Mxmldoc also knows to remove extra asterisks (*) from the -+ comment string, so the comment string:

      -+
      -+    /*
      -+     * Compute the value of PI.
      -+     *
      -+     * The function connects to an Internet server
      -+     * that streams audio of mathematical monks
      -+     * chanting the first 100 digits of PI.
      -+     */
      -+
      -+

      will be shown as:

      -+
      -+    Compute the value of PI.
      -+
      -+    The function connects to an Internet server
      -+    that streams audio of mathematical monks
      -+    chanting the first 100 digits of PI.
      -+
      -+

      Comments can also include the following -+ special @name ...@ directive strings:

      -+
        -+
      • @deprecated@ - flags the item as deprecated to discourage -+ its use
      • -+
      • @private@ - flags the item as private so it will not be -+ 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@.
      • -+
      -+ -+ -+

      Titles, Sections, and Introductions

      -+

      Mxmldoc also provides options to set the title, section, and -+ introduction text for the generated documentation. The --title text -+ option specifies the title for the documentation. The title string is -+ usually put in quotes:

      -+
      -+    mxmldoc filename.xml \
      -+        --title "My Famous Documentation" \
      -+        >filename.html ENTER
      -+
      -+

      The --section name option specifies the section for the -+ documentation. For HTML documentation, the name is placed in a HTML -+ comment such as:

      -+
      -+    <!-- SECTION: name -->
      -+
      -+

      For man pages, the section name is usually just a number ("3"), or a -+ number followed by a vendor name ("3acme"). The section name is used in -+ the .TH directive in the man page:

      -+
      -+    .TH mylibrary 3acme "My Title" ...
      -+
      -+

      The default section name for man page output is "3". There is no -+ default section name for HTML output.

      -+

      Finally, the --intro filename option specifies a file to -+ embed after the title and section but before the generated -+ documentation. For HTML documentation, the file must consist of valid -+ HTML without the usual DOCTYPE, html, and body -+ elements. For man page documentation, the file must consist of valid -+nroff(1) text.

      -+
      -+

      AMini-XML License

      -+

      The Mini-XML library and included programs are provided under the -+ terms of the GNU Library General Public License (LGPL) 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. -+

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

      GNU LIBRARY GENERAL PUBLIC LICENSE

      -+

      Version 2, June 1991 -+
      Copyright (C) 1991 Free Software Foundation, Inc. -+
      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -+
      Everyone is permitted to copy and distribute verbatim copies of -+ this license document, but changing it is not allowed. -+
      [This is the first released version of the library GPL. It is -+ numbered 2 because it goes with version 2 of the ordinary GPL.]

      -+

      Preamble

      -+

      The licenses for most software are designed to take away your freedom -+ to share and change it. By contrast, the GNU General Public Licenses -+ are intended to guarantee your freedom to share and change free -+ software--to make sure the software is free for all its users.

      -+

      This license, the Library General Public License, applies to some -+ specially designated Free Software Foundation software, and to any -+ other libraries whose authors decide to use it. You can use it for your -+ libraries, too.

      -+

      When we speak of free software, we are referring to freedom, not -+ price. Our General Public Licenses are designed to make sure that you -+ have the freedom to distribute copies of free software (and charge for -+ this service if you wish), that you receive source code or can get it -+ if you want it, that you can change the software or use pieces of it in -+ new free programs; and that you know you can do these things.

      -+

      To protect your rights, we need to make restrictions that forbid -+ anyone to deny you these rights or to ask you to surrender the rights. -+ These restrictions translate to certain responsibilities for you if you -+ distribute copies of the library, or if you modify it.

      -+

      For example, if you distribute copies of the library, whether gratis -+ or for a fee, you must give the recipients all the rights that we gave -+ you. You must make sure that they, too, receive or can get the source -+ code. If you link a program with the library, you must provide complete -+ object files to the recipients so that they can relink them with the -+ library, after making changes to the library and recompiling it. And -+ you must show them these terms so they know their rights.

      -+

      Our method of protecting your rights has two steps: (1) copyright the -+ library, and (2) offer you this license which gives you legal -+ permission to copy, distribute and/or modify the library.

      -+

      Also, for each distributor's protection, we want to make certain that -+ everyone understands that there is no warranty for this free library. -+ If the library is modified by someone else and passed on, we want its -+ recipients to know that what they have is not the original version, so -+ that any problems introduced by others will not reflect on the original -+ authors' reputations.

      -+

      Finally, any free program is threatened constantly by software -+ patents. We wish to avoid the danger that companies distributing free -+ software will individually obtain patent licenses, thus in effect -+ transforming the program into proprietary software. To prevent this, we -+ have made it clear that any patent must be licensed for everyone's free -+ use or not licensed at all.

      -+

      Most GNU software, including some libraries, is covered by the -+ ordinary GNU General Public License, which was designed for utility -+ programs. This license, the GNU Library General Public License, applies -+ to certain designated libraries. This license is quite different from -+ the ordinary one; be sure to read it in full, and don't assume that -+ anything in it is the same as in the ordinary license.

      -+

      The reason we have a separate public license for some libraries is -+ that they blur the distinction we usually make between modifying or -+ adding to a program and simply using it. Linking a program with a -+ library, without changing the library, is in some sense simply using -+ the library, and is analogous to running a utility program or -+ application program. However, in a textual and legal sense, the linked -+ executable is a combined work, a derivative of the original library, -+ and the ordinary General Public License treats it as such.

      -+

      Because of this blurred distinction, using the ordinary General -+ Public License for libraries did not effectively promote software -+ sharing, because most developers did not use the libraries. We -+ concluded that weaker conditions might promote sharing better.

      -+

      However, unrestricted linking of non-free programs would deprive the -+ users of those programs of all benefit from the free status of the -+ libraries themselves. This Library General Public License is intended -+ to permit developers of non-free programs to use free libraries, while -+ preserving your freedom as a user of such programs to change the free -+ libraries that are incorporated in them. (We have not seen how to -+ achieve this as regards changes in header files, but we have achieved -+ it as regards changes in the actual functions of the Library.) The hope -+ is that this will lead to faster development of free libraries.

      -+

      The precise terms and conditions for copying, distribution and -+ modification follow. Pay close attention to the difference between a -+ "work based on the libary" and a "work that uses the library". The -+ former contains code derived from the library, while the latter only -+ works together with the library.

      -+

      Note that it is possible for a library to be covered by the ordinary -+ General Public License rather than by this special one.

      -+

      TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND -+ MODIFICATION

      -+

      0. This License Agreement applies to any software -+ library which contains a notice placed by the copyright holder or other -+ authorized party saying it may be distributed under the terms of this -+ Library General Public License (also called "this License"). Each -+ licensee is addressed as "you".

      -+

      A "library" means a collection of software functions and/or data -+ prepared so as to be conveniently linked with application programs -+ (which use some of those functions and data) to form executables.

      -+

      The "Library", below, refers to any such software library or work -+ which has been distributed under these terms. A "work based on the -+ Library" means either the Library or any derivative work under -+ copyright law: that is to say, a work containing the Library or a -+ portion of it, either verbatim or with modifications and/or translated -+ straightforwardly into another language. (Hereinafter, translation is -+ included without limitation in the term "modification".)

      -+

      "Source code" for a work means the preferred form of the work for -+ making modifications to it. For a library, complete source code means -+ all the source code for all modules it contains, plus any associated -+ interface definition files, plus the scripts used to control -+ compilation and installation of the library.

      -+

      Activities other than copying, distribution and modification are not -+ covered by this License; they are outside its scope. The act of running -+ a program using the Library is not restricted, and output from such a -+ program is covered only if its contents constitute a work based on the -+ Library (independent of the use of the Library in a tool for writing -+ it). Whether that is true depends on what the Library does and what the -+ program that uses the Library does.

      -+

      1. You may copy and distribute verbatim copies of -+ the Library's complete source code as you receive it, in any medium, -+ provided that you conspicuously and appropriately publish on each copy -+ an appropriate copyright notice and disclaimer of warranty; keep intact -+ all the notices that refer to this License and to the absence of any -+ warranty; and distribute a copy of this License along with the Library.

      -+

      You may charge a fee for the physical act of transferring a copy, and -+ you may at your option offer warranty protection in exchange for a fee.

      -+

      2. You may modify your copy or copies of the Library -+ or any portion of it, thus forming a work based on the Library, and -+ copy and distribute such modifications or work under the terms of -+ Section 1 above, provided that you also meet all of these conditions:

      -+
        -+

        a) The modified work must itself be a software -+ library.

        -+

        b) You must cause the files modified to carry -+ prominent notices stating that you changed the files and the date of -+ any change.

        -+

        c) You must cause the whole of the work to be -+ licensed at no charge to all third parties under the terms of this -+ License.

        -+

        d) If a facility in the modified Library refers to a -+ function or a table of data to be supplied by an application program -+ that uses the facility, other than as an argument passed when the -+ facility is invoked, then you must make a good faith effort to ensure -+ that, in the event an application does not supply such function or -+ table, the facility still operates, and performs whatever part of its -+ purpose remains meaningful.

        -+

        (For example, a function in a library to compute square roots has a -+ purpose that is entirely well-defined independent of the application. -+ Therefore, Subsection 2d requires that any application-supplied -+ function or table used by this function must be optional: if the -+ application does not supply it, the square root function must still -+ compute square roots.)

        -+
      -+

      These requirements apply to the modified work as a whole. If -+ identifiable sections of that work are not derived from the Library, -+ and can be reasonably considered independent and separate works in -+ themselves, then this License, and its terms, do not apply to those -+ sections when you distribute them as separate works. But when you -+ distribute the same sections as part of a whole which is a work based -+ on the Library, the distribution of the whole must be on the terms of -+ this License, whose permissions for other licensees extend to the -+ entire whole, and thus to each and every part regardless of who wrote -+ it.

      -+

      Thus, it is not the intent of this section to claim rights or contest -+ your rights to work written entirely by you; rather, the intent is to -+ exercise the right to control the distribution of derivative or -+ collective works based on the Library.

      -+

      In addition, mere aggregation of another work not based on the -+ Library with the Library (or with a work based on the Library) on a -+ volume of a storage or distribution medium does not bring the other -+ work under the scope of this License.

      -+

      3. You may opt to apply the terms of the ordinary -+ GNU General Public License instead of this License to a given copy of -+ the Library. To do this, you must alter all the notices that refer to -+ this License, so that they refer to the ordinary GNU General Public -+ License, version 2, instead of to this License. (If a newer version -+ than version 2 of the ordinary GNU General Public License has appeared, -+ then you can specify that version instead if you wish.) Do not make any -+ other change in these notices.

      -+

      Once this change is made in a given copy, it is irreversible for that -+ copy, so the ordinary GNU General Public License applies to all -+ subsequent copies and derivative works made from that copy.

      -+

      This option is useful when you wish to copy part of the code of the -+ Library into a program that is not a library.

      -+

      4. You may copy and distribute the Library (or a -+ portion or derivative of it, under Section 2) in object code or -+ executable form under the terms of Sections 1 and 2 above provided that -+ you accompany it with the complete corresponding machine-readable -+ source code, which must be distributed under the terms of Sections 1 -+ and 2 above on a medium customarily used for software interchange.

      -+

      If distribution of object code is made by offering access to copy -+ from a designated place, then offering equivalent access to copy the -+ source code from the same place satisfies the requirement to distribute -+ the source code, even though third parties are not compelled to copy -+ the source along with the object code.

      -+

      5. A program that contains no derivative of any -+ portion of the Library, but is designed to work with the Library by -+ being compiled or linked with it, is called a "work that uses the -+ Library". Such a work, in isolation, is not a derivative work of the -+ Library, and therefore falls outside the scope of this License.

      -+

      However, linking a "work that uses the Library" with the Library -+ creates an executable that is a derivative of the Library (because it -+ contains portions of the Library), rather than a "work that uses the -+ library". The executable is therefore covered by this License. Section -+ 6 states terms for distribution of such executables.

      -+

      When a "work that uses the Library" uses material from a header file -+ that is part of the Library, the object code for the work may be a -+ derivative work of the Library even though the source code is not. -+ Whether this is true is especially significant if the work can be -+ linked without the Library, or if the work is itself a library. The -+ threshold for this to be true is not precisely defined by law.

      -+

      If such an object file uses only numerical parameters, data structure -+ layouts and accessors, and small macros and small inline functions (ten -+ lines or less in length), then the use of the object file is -+ unrestricted, regardless of whether it is legally a derivative work. -+ (Executables containing this object code plus portions of the Library -+ will still fall under Section 6.)

      -+

      Otherwise, if the work is a derivative of the Library, you may -+ distribute the object code for the work under the terms of Section 6. -+ Any executables containing that work also fall under Section 6, whether -+ or not they are linked directly with the Library itself.

      -+

      6. As an exception to the Sections above, you may -+ also compile or link a "work that uses the Library" with the Library to -+ produce a work containing portions of the Library, and distribute that -+ work under terms of your choice, provided that the terms permit -+ modification of the work for the customer's own use and reverse -+ engineering for debugging such modifications.

      -+

      You must give prominent notice with each copy of the work that the -+ Library is used in it and that the Library and its use are covered by -+ this License. You must supply a copy of this License. If the work -+ during execution displays copyright notices, you must include the -+ copyright notice for the Library among them, as well as a reference -+ directing the user to the copy of this License. Also, you must do one -+ of these things:

      -+
        a) Accompany the work with the complete -+ corresponding machine-readable source code for the Library including -+ whatever changes were used in the work (which must be distributed under -+ Sections 1 and 2 above); and, if the work is an executable linked with -+ the Library, with the complete machine-readable "work that uses the -+ Library", as object code and/or source code, so that the user can -+ modify the Library and then relink to produce a modified executable -+ containing the modified Library. (It is understood that the user who -+ changes the contents of definitions files in the Library will not -+ necessarily be able to recompile the application to use the modified -+ definitions.) -+

        b) Accompany the work with a written offer, valid -+ for at least three years, to give the same user the materials specified -+ in Subsection 6a, above, for a charge no more than the cost of -+ performing this distribution.

        -+

        c) If distribution of the work is made by offering -+ access to copy from a designated place, offer equivalent access to copy -+ the above specified materials from the same place.

        -+

        d) Verify that the user has already received a copy -+ of these materials or that you have already sent this user a copy.

        -+
      -+

      For an executable, the required form of the "work that uses the -+ Library" must include any data and utility programs needed for -+ reproducing the executable from it. However, as a special exception, -+ the source code distributed need not include anything that is normally -+ distributed (in either source or binary form) with the major components -+ (compiler, kernel, and so on) of the operating system on which the -+ executable runs, unless that component itself accompanies the -+ executable.

      -+

      It may happen that this requirement contradicts the license -+ restrictions of other proprietary libraries that do not normally -+ accompany the operating system. Such a contradiction means you cannot -+ use both them and the Library together in an executable that you -+ distribute.

      -+

      7. You may place library facilities that are a work -+ based on the Library side-by-side in a single library together with -+ other library facilities not covered by this License, and distribute -+ such a combined library, provided that the separate distribution of the -+ work based on the Library and of the other library facilities is -+ otherwise permitted, and provided that you do these two things:

      -+
        a) Accompany the combined library with a copy of -+ the same work based on the Library, uncombined with any other library -+ facilities. This must be distributed under the terms of the Sections -+ above. -+

        b) Give prominent notice with the combined library -+ of the fact that part of it is a work based on the Library, and -+ explaining where to find the accompanying uncombined form of the same -+ work.

        -+
      -+

      8. You may not copy, modify, sublicense, link with, -+ or distribute the Library except as expressly provided under this -+ License. Any attempt otherwise to copy, modify, sublicense, link with, -+ or distribute the Library is void, and will automatically terminate -+ your rights under this License. However, parties who have received -+ copies, or rights, from you under this License will not have their -+ licenses terminated so long as such parties remain in full compliance.

      -+

      9. You are not required to accept this License, -+ since you have not signed it. However, nothing else grants you -+ permission to modify or distribute the Library or its derivative works. -+ These actions are prohibited by law if you do not accept this License. -+ Therefore, by modifying or distributing the Library (or any work based -+ on the Library), you indicate your acceptance of this License to do so, -+ and all its terms and conditions for copying, distributing or modifying -+ the Library or works based on it.

      -+

      10. Each time you redistribute the Library (or any -+ work based on the Library), the recipient automatically receives a -+ license from the original licensor to copy, distribute, link with or -+ modify the Library subject to these terms and conditions. You may not -+ impose any further restrictions on the recipients' exercise of the -+ rights granted herein. You are not responsible for enforcing compliance -+ by third parties to this License.

      -+

      11. If, as a consequence of a court judgment or -+ allegation of patent infringement or for any other reason (not limited -+ to patent issues), conditions are imposed on you (whether by court -+ order, agreement or otherwise) that contradict the conditions of this -+ License, they do not excuse you from the conditions of this License. If -+ you cannot distribute so as to satisfy simultaneously your obligations -+ under this License and any other pertinent obligations, then as a -+ consequence you may not distribute the Library at all. For example, if -+ a patent license would not permit royalty-free redistribution of the -+ Library by all those who receive copies directly or indirectly through -+ you, then the only way you could satisfy both it and this License would -+ be to refrain entirely from distribution of the Library.

      -+

      If any portion of this section is held invalid or unenforceable under -+ any particular circumstance, the balance of the section is intended to -+ apply, and the section as a whole is intended to apply in other -+ circumstances.

      -+

      It is not the purpose of this section to induce you to infringe any -+ patents or other property right claims or to contest validity of any -+ such claims; this section has the sole purpose of protecting the -+ integrity of the free software distribution system which is implemented -+ by public license practices. Many people have made generous -+ contributions to the wide range of software distributed through that -+ system in reliance on consistent application of that system; it is up -+ to the author/donor to decide if he or she is willing to distribute -+ software through any other system and a licensee cannot impose that -+ choice.

      -+

      This section is intended to make thoroughly clear what is believed to -+ be a consequence of the rest of this License.

      -+

      12. If the distribution and/or use of the Library is -+ restricted in certain countries either by patents or by copyrighted -+ interfaces, the original copyright holder who places the Library under -+ this License may add an explicit geographical distribution limitation -+ excluding those countries, so that distribution is permitted only in or -+ among countries not thus excluded. In such case, this License -+ incorporates the limitation as if written in the body of this License.

      -+

      13. The Free Software Foundation may publish revised -+ and/or new versions of the Library General Public License from time to -+ time. Such new versions will be similar in spirit to the present -+ version, but may differ in detail to address new problems or concerns.

      -+

      Each version is given a distinguishing version number. If the Library -+ specifies a version number of this License which applies to it and "any -+ later version", you have the option of following the terms and -+ conditions either of that version or of any later version published by -+ the Free Software Foundation. If the Library does not specify a license -+ version number, you may choose any version ever published by the Free -+ Software Foundation.

      -+

      14. If you wish to incorporate parts of the Library -+ into other free programs whose distribution conditions are incompatible -+ with these, write to the author to ask for permission. For software -+ which is copyrighted by the Free Software Foundation, write to the Free -+ Software Foundation; we sometimes make exceptions for this. Our -+ decision will be guided by the two goals of preserving the free status -+ of all derivatives of our free software and of promoting the sharing -+ and reuse of software generally.

      -+

      NO WARRANTY

      -+

      15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, -+ THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY -+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT -+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT -+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -+ PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -+ OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU -+ ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

      -+

      16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR -+ AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO -+ MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE -+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL -+ OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -+ LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -+ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -+ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -+ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -+ DAMAGES.

      -+

      END OF TERMS AND CONDITIONS

      -+

      How to Apply These Terms to Your New Libraries

      -+

      If you develop a new library, and you want it to be of the greatest -+ possible use to the public, we recommend making it free software that -+ everyone can redistribute and change. You can do so by permitting -+ redistribution under these terms (or, alternatively, under the terms of -+ the ordinary General Public License).

      -+

      To apply these terms, attach the following notices to the library. It -+ is safest to attach them to the start of each source file to most -+ effectively convey the exclusion of warranty; and each file should have -+ at least the "copyright" line and a pointer to where the full notice is -+ found.

      -+
        -+

        one line to give the library's name and an idea of what it does. -+
        Copyright (C) year name of author

        -+

        This library is free software; you can redistribute it and/or modify -+ it under the terms of the GNU Lesser General Public License as -+ published by the Free Software Foundation; either version 2.1 of the -+ License, or (at your option) any later version.

        -+

        This library is distributed in the hope that it will be useful, but -+ WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser -+ General Public License for more details.

        -+

        You should have received a copy of the GNU Lesser General Public -+ License along with this library; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

        -+
      -+

      Also add information on how to contact you by electronic and paper -+ mail.

      -+

      You should also get your employer (if you work as a programmer) or -+ your school, if any, to sign a "copyright disclaimer" for the library, -+ if necessary. Here is a sample; alter the names:

      -+
        -+

        Yoyodyne, Inc., hereby disclaims all copyright interest in the -+ library `Frob' (a library for tweaking knobs) written by James Random -+ Hacker.

        -+

        signature of Ty Coon, 1 April 1990 Ty Coon, President of -+ Vice

        -+
      -+

      That's all there is to it!

      -+
      -+

      BRelease Notes

      -+

      Changes in Mini-XML 2.6

      -+
        -+
      • Documentation fixes (STR #91, STR #92)
      • -+
      • The mxmldoc program did not handle typedef comments properly (STR -+ #72)
      • -+
      • Added support for "long long" printf formats.
      • -+
      • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
      • -+
      • The mxmldoc program now supports generating Xcode documentation -+ sets.
      • -+
      • mxmlSave*() did not output UTF-8 correctly on some platforms.
      • -+
      • mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to -+ avoid problems with non-conformant XML parsers that assume something -+ other than UTF-8 as the default encoding.
      • -+
      • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and -+ "<?xml ... ?>" was always followed by a newline (STR #76)
      • -+
      • The mxml.pc.in file was broken (STR #79)
      • -+
      • The mxmldoc program now handles "typedef enum name {} name" -+ correctly (STR #72)
      • -+
      -+

      Changes in Mini-XML 2.5

      -+
        -+
      • The mxmldoc program now makes greater use of CSS and supports a -+ --css option to embed an alternate stylesheet.
      • -+
      • The mxmldoc program now supports --header and --footer options to -+ insert documentation content before and after the generated content.
      • -+
      • The mxmldoc program now supports a --framed option to generate -+ framed HTML output.
      • -+
      • The mxmldoc program now creates a table of contents including any -+ headings in the --intro file when generating HTML output.
      • -+
      • The man pages and man page output from mxmldoc did not use "\-" for -+ dashes (STR #68)
      • -+
      • The debug version of the Mini-XML DLL could not be built (STR #65)
      • -+
      • Processing instructions and directives did not work when not at the -+ top level of a document (STR #67)
      • -+
      • Spaces around the "=" in attributes were not supported (STR #67)
      • -+
      -+

      Changes in Mini-XML 2.4

      -+
        -+
      • Fixed shared library build problems on HP-UX and Mac OS X.
      • -+
      • The mxmldoc program did not output argument descriptions for -+ functions properly.
      • -+
      • All global settings (custom, error, and entity callbacks and the -+ wrap margin) are now managed separately for each thread.
      • -+
      • Added mxmlElementDeleteAttr() function (STR #59)
      • -+
      • mxmlElementSetAttrf() did not work (STR #57)
      • -+
      • mxmlLoad*() incorrectly treated declarations as parent elements (STR -+ #56)
      • -+
      • mxmlLoad*() incorrectly allowed attributes without values (STR #47)
      • -+
      • Fixed Visual C++ build problems (STR #49)
      • -+
      • mxmlLoad*() did not return NULL when an element contained an error -+ (STR #46)
      • -+
      • Added support for the apos character entity (STR #54)
      • -+
      • Fixed whitespace detection with Unicode characters (STR #48)
      • -+
      • mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called -+ with a node with no children as the top node (STR #53)
      • -+
      -+

      Changes in Mini-XML 2.3

      -+
        -+
      • Added two exceptions to the LGPL to support static linking of -+ applications against Mini-XML
      • -+
      • The mxmldoc utility can now generate man pages, too.
      • -+
      • Added a mxmlNewXML() function
      • -+
      • Added a mxmlElementSetAttrf() function (STR #43)
      • -+
      • Added a snprintf() emulation function for the test program (STR #32)
      • -+
      • Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++ -+ 2005 (STR #36)
      • -+
      • mxmlLoad*() did not detect missing > characters in elements (STR -+ #41)
      • -+
      • mxmlLoad*() did not detect missing close tags at the end of an XML -+ document (STR #45)
      • -+
      • Added user_data and ref_count members to mxml_node_t structure
      • -+
      • Added mxmlReleaseNode() and mxmlRetainNode() APIs for -+ reference-counted nodes
      • -+
      • Added mxmlSetWrapMargin() to control the wrapping of XML output
      • -+
      • Added conditional check for EINTR error code for certain Windows -+ compilers that do not define it (STR #33)
      • -+
      • The mxmldoc program now generates correct HTML 4.0 output - -+ previously it generated invalid XHTML
      • -+
      • The mxmldoc program now supports "@deprecated@, "@private@", and -+ "@since version@" comments
      • -+
      • Fixed function and enumeration type bugs in mxmldoc
      • -+
      • Fixed the XML schema for mxmldoc
      • -+
      • The mxmldoc program now supports --intro, --section, and --title -+ options
      • -+
      • The mxmlLoad*() functions could leak a node on an error (STR #27)
      • -+
      • The mxml_vsnprintf() function could get in an infinite loop on a -+ buffer overflow (STR #25)
      • -+
      • Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and -+ set CDATA nodes, which are really just special element nodes
      • -+
      • Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore -+ non-element nodes, e.g. whitespace
      • -+
      • mxmlLoad*() did not treat custom data as opaque, so whitespace -+ characters would be lost
      • -+
      -+

      Changes in Mini-XML 2.2.2

      -+
        -+
      • mxmlLoad*() did not treat custom data as opaque, so whitespace -+ characters would be lost.
      • -+
      -+

      Changes in Mini-XML 2.2.1

      -+
        -+
      • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly -+ return NULL on error (STR #21)
      • -+
      • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and -+ mxmlNewTextf() incorrectly required a parent node (STR #22)
      • -+
      • Fixed an XML output bug in mxmldoc.
      • -+
      • The "make install" target now uses the install command to set the -+ proper permissions on UNIX/Linux/OSX.
      • -+
      • Fixed a MingW/Cygwin compilation problem (STR #18)
      • -+
      -+

      Changes in Mini-XML 2.2

      -+
        -+
      • Added shared library support (STR #17)
      • -+
      • mxmlLoad*() now returns an error when an XML stream contains illegal -+ control characters (STR #10)
      • -+
      • mxmlLoad*() now returns an error when an element contains two -+ attributes with the same name in conformance with the XML spec (STR -+ #16)
      • -+
      • Added support for CDATA (STR #14, STR #15)
      • -+
      • Updated comment and processing instruction handling - no entity -+ support per XML specification.
      • -+
      • Added checking for invalid comment termination ("--->" is not -+ allowed)
      • -+
      -+

      Changes in Mini-XML 2.1

      -+
        -+
      • Added support for custom data nodes (STR #6)
      • -+
      • Now treat UTF-8 sequences which are longer than necessary as an -+ error (STR #4)
      • -+
      • Fixed entity number support (STR #8)
      • -+
      • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
      • -+
      • Fixed entity lookup bug (STR #5)
      • -+
      • Added mxmlLoadFd() and mxmlSaveFd() functions.
      • -+
      • Fixed multi-word UTF-16 handling.
      • -+
      -+

      Changes in Mini-XML 2.0

      -+
        -+
      • New programmers manual.
      • -+
      • Added Visual C++ project files for Microsoft Windows users.
      • -+
      • Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew() -+ (STR #2)
      • -+
      • mxmlEntityAddCallback() now returns an integer status (STR #2)
      • -+
      • Added UTF-16 support (input only; all output is UTF-8)
      • -+
      • Added index functions to build a searchable index of XML nodes.
      • -+
      • Added character entity callback interface to support additional -+ character entities beyond those defined in the XHTML specification.
      • -+
      • Added support for XHTML character entities.
      • -+
      • The mxmldoc utility now produces XML output which conforms to an -+ updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -+
      • Changed the whitespace callback interface to return strings instead -+ of a single character, allowing for greater control over the formatting -+ of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES -+ TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -+
      • The mxmldoc utility now produces XML output which conforms to an -+ updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -+
      • Changed the whitespace callback interface to return strings instead -+ of a single character, allowing for greater control over the formatting -+ of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES -+ TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -+
      • The mxmldoc utility is now capable of documenting C++ classes, -+ functions, and structures, and correctly handles C++ comments.
      • -+
      • Added new modular tests for mxmldoc.
      • -+
      • Updated the mxmldoc output to be more compatible with embedding in -+ manuals produced with HTMLDOC.
      • -+
      • The makefile incorrectly included a "/" separator between the -+ destination path and install path. This caused problems when building -+ and installing with MingW.
      • -+
      -+

      Changes in Mini-XML 1.3

      -+
        -+
      • Fixes for mxmldoc.
      • -+
      • Added support for reading standard HTML entity names.
      • -+
      • mxmlLoadString/File() did not decode character entities in element -+ names, attribute names, or attribute values.
      • -+
      • mxmlLoadString/File() would crash when loading non- conformant XML -+ data under an existing parent (top) node.
      • -+
      • Fixed several bugs in the mxmldoc utility.
      • -+
      • Added new error callback function to catch a variety of errors and -+ log them to someplace other than stderr.
      • -+
      • The mxmlElementSetAttr() function now allows for NULL attribute -+ values.
      • -+
      • The load and save functions now properly handle quoted element and -+ attribute name strings properly, e.g. for !DOCTYPE declarations.
      • -+
      -+

      Changes in Mini-XML 1.2

      -+
        -+
      • Added new "set" methods to set the value of a node.
      • -+
      • Added new formatted text methods mxmlNewTextf() and mxmlSetTextf() -+ to create/set a text node value using printf-style formats.
      • -+
      • Added new standard callbacks for use with the mxmlLoad functions.
      • -+
      • Updated the HTML documentation to include examples of the walk and -+ load function output.
      • -+
      • Added --with/without-ansi configure option to control the strdup() -+ function check.
      • -+
      • Added --with/without-snprintf configure option to control the -+ snprintf() and vsnprintf() function checks.
      • -+
      -+

      Changes in Mini-XML 1.1.2

      -+
        -+
      • The mxml(3) man page wasn't updated for the string functions.
      • -+
      • mxmlSaveString() returned the wrong number of characters.
      • -+
      • mxml_add_char() updated the buffer pointer in the wrong place.
      • -+
      -+

      Changes in Mini-XML 1.1.1

      -+
        -+
      • The private mxml_add_ch() function did not update the -+ start-of-buffer pointer which could cause a crash when using -+ mxmlSaveString().
      • -+
      • The private mxml_write_ws() function called putc() instead of using -+ the proper callback which could cause a crash when using -+ mxmlSaveString().
      • -+
      • Added a mxmlSaveAllocString() convenience function for saving an XML -+ node tree to an allocated string.
      • -+
      -+

      Changes in Mini-XML 1.1

      -+
        -+
      • The mxmlLoadFile() function now uses dynamically allocated string -+ buffers for element names, attribute names, and attribute values. -+ Previously they were capped at 16383, 255, and 255 bytes, respectively.
      • -+
      • Added a new mxmlLoadString() function for loading an XML node tree -+ from a string.
      • -+
      • Added a new mxmlSaveString() function for saving an XML node tree to -+ a string.
      • -+
      • Add emulation of strdup() if the local platform does not provide the -+ function.
      • -+
      -+

      Changes in Mini-XML 1.0

      -+
        -+
      • The mxmldoc program now handles function arguments, structures, -+ unions, enumerations, classes, and typedefs properly.
      • -+
      • Documentation provided via mxmldoc and more in-line comments in the -+ code.
      • -+
      • Added man pages and packaging files.
      • -+
      -+

      Changes in Mini-XML 0.93

      -+
        -+
      • New mxmldoc example program that is also used to create and update -+ code documentation using XML and produce HTML reference pages.
      • -+
      • Added mxmlAdd() and mxmlRemove() functions to add and remove nodes -+ from a tree. This provides more flexibility over where the nodes are -+ inserted and allows nodes to be moved within the tree as needed.
      • -+
      • mxmlLoadFile() now correctly handles comments.
      • -+
      • mxmlLoadFile() now supports the required "gt", "quot", and "nbsp" -+ character entities.
      • -+
      • mxmlSaveFile() now uses newlines as whitespace when valid to do so.
      • -+
      • mxmlFindElement() now also takes attribute name and attribute value -+ string arguments to limit the search to specific elements with -+ attributes and/or values.
      • -+ NULL pointers can be used as "wildcards". -+
      • Added uninstall target to makefile, and auto-reconfig if Makefile.in -+ or configure.in are changed.
      • -+
      • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all -+ provide "descend" arguments to control whether they descend into child -+ nodes in the tree.
      • -+
      • Fixed some whitespace issues in mxmlLoadFile().
      • -+
      • Fixed Unicode output and whitespace issues in mxmlSaveFile().
      • -+
      • mxmlSaveFile() now supports a whitespace callback to provide more -+ human-readable XML output under program control.
      • -+
      -+

      Changes in Mini-XML 0.92

      -+
        -+
      • mxmlSaveFile() didn't return a value on success.
      • -+
      -+

      Changes in Mini-XML 0.91

      -+
        -+
      • mxmlWalkNext() would go into an infinite loop.
      • -+
      -+

      Changes in Mini-XML 0.9

      -+
        -+
      • Initial public release.
      • -+
      -+
      -+
      -+

      CLibrary Reference

      -+

      Contents

      -+
        -+
      • Functions -+ -+
      • -+
      • Data Types -+ -+
      • -+
      • Structures -+ -+
      • -+
      • Unions -+ -+
      • -+
      • Constants -+ -+
      • -+

        Functions

        -+

        mxmlAdd

        -+

        Add a node to a tree.

        -+

        void mxmlAdd ( -+
            mxml_node_t *parent, -+
            int where, -+
            mxml_node_t *child, -+
            mxml_node_t *node -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node
        -+
        where
        -+
        Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
        -+
        child
        -+
        Child node for where or MXML_ADD_TO_PARENT
        -+
        node
        -+
        Node to add
        -+
        -+

        Discussion

        -+

        Adds the specified node to the parent. If the -+ child argument is not NULL, puts the new node before or after the -+ specified child depending on the value of the where argument. If the -+ child argument is NULL, puts the new node at the beginning of the child -+ list (MXML_ADD_BEFORE) or at the end of the child list -+ (MXML_ADD_AFTER). The constant MXML_ADD_TO_PARENT can be used to -+ specify a NULL child pointer.

        -+

        mxmlDelete

        -+

        Delete a node and all of its children.

        -+

        void mxmlDelete ( -+
            mxml_node_t *node -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to delete
        -+
        -+

        Discussion

        -+

        If the specified node has a parent, this function -+ first removes the node from its parent using the mxmlRemove() function.

        -+

        -+ -+ Mini-XML 2.4 mxmlElementDeleteAttr -+

        -+

        Delete an attribute.

        -+

        void mxmlElementDeleteAttr ( -+
            mxml_node_t *node, -+
            const char *name -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Element
        -+
        name
        -+
        Attribute name
        -+
        -+

        mxmlElementGetAttr

        -+

        Get an attribute.

        -+

        const char *mxmlElementGetAttr ( -+
            mxml_node_t *node, -+
            const char *name -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        -+

        Return Value

        -+

        Attribute value or NULL

        -+

        Discussion

        -+

        This function returns NULL if the node is not an -+ element or the named attribute does not exist.

        -+

        mxmlElementSetAttr

        -+

        Set an attribute.

        -+

        void mxmlElementSetAttr ( -+
            mxml_node_t *node, -+
            const char *name, -+
            const char *value -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        value
        -+
        Attribute value
        -+
        -+

        Discussion

        -+

        If the named attribute already exists, the value -+ of the attribute is replaced by the new string value. The string value -+ is copied into the element node. This function does nothing if the node -+ is not an element.

        -+

        -+ -+ Mini-XML 2.3 mxmlElementSetAttrf

        -+

        Set an attribute with a formatted value.

        -+

        void mxmlElementSetAttrf ( -+
            mxml_node_t *node, -+
            const char *name, -+
            const char *format, -+
            ... -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        format
        -+
        Printf-style attribute value
        -+
        ...
        -+
        Additional arguments as needed
        -+
        -+

        Discussion

        -+

        If the named attribute already exists, the value -+ of the attribute is replaced by the new formatted string. The formatted -+ string value is copied into the element node. This function does -+ nothing if the node is not an element.

        -+

        -+mxmlEntityAddCallback

        -+

        Add a callback to convert entities to Unicode.

        -+

        int mxmlEntityAddCallback ( -+
            mxml_entity_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        cb
        -+
        Callback function to add
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        mxmlEntityGetName

        -+

        Get the name that corresponds to the character -+ value.

        -+

        const char *mxmlEntityGetName ( -+
            int val -+
        );

        -+

        Parameters

        -+
        -+
        val
        -+
        Character value
        -+
        -+

        Return Value

        -+

        Entity name or NULL

        -+

        Discussion

        -+

        If val does not need to be represented by a named -+ entity, NULL is returned.

        -+

        mxmlEntityGetValue

        -+

        Get the character corresponding to a named -+ entity.

        -+

        int mxmlEntityGetValue ( -+
            const char *name -+
        );

        -+

        Parameters

        -+
        -+
        name
        -+
        Entity name
        -+
        -+

        Return Value

        -+

        Character value or -1 on error

        -+

        Discussion

        -+

        The entity name can also be a numeric constant. -1 -+ is returned if the name is not known.

        -+

        -+mxmlEntityRemoveCallback

        -+

        Remove a callback.

        -+

        void mxmlEntityRemoveCallback ( -+
            mxml_entity_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        cb
        -+
        Callback function to remove
        -+
        -+

        mxmlFindElement

        -+

        Find the named element.

        -+

        mxml_node_t *mxmlFindElement -+ ( -+
            mxml_node_t *node, -+
            mxml_node_t *top, -+
            const char *name, -+
            const char *attr, -+
            const char *value, -+
            int descend -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        name
        -+
        Element name or NULL for any
        -+
        attr
        -+
        Attribute name, or NULL for none
        -+
        value
        -+
        Attribute value, or NULL for any
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, -+ MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Element node or NULL

        -+

        Discussion

        -+

        The search is constrained by the name, attribute -+ name, and value; any NULL names or values are treated as wildcards, so -+ different kinds of searches can be implemented by looking for all -+ elements of a given name or all elements with a specific attribute. The -+ descend argument determines 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.

        -+

        mxmlIndexDelete

        -+

        Delete an index.

        -+

        void mxmlIndexDelete ( -+
            mxml_index_t *ind -+
        );

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to delete
        -+
        -+

        mxmlIndexEnum

        -+

        Return the next node in the index.

        -+

        mxml_node_t *mxmlIndexEnum ( -+
            mxml_index_t *ind -+
        );

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to enumerate
        -+
        -+

        Return Value

        -+

        Next node or NULL if there is none

        -+

        Discussion

        -+

        Nodes are returned in the sorted order of the -+ index.

        -+

        mxmlIndexFind

        -+

        Find the next matching node.

        -+

        mxml_node_t *mxmlIndexFind ( -+
            mxml_index_t *ind, -+
            const char *element, -+
            const char *value -+
        );

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to search
        -+
        element
        -+
        Element name to find, if any
        -+
        value
        -+
        Attribute value, if any
        -+
        -+

        Return Value

        -+

        Node or NULL if none found

        -+

        Discussion

        -+

        You should call mxmlIndexReset() prior to using -+ 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().

        -+

        mxmlIndexNew

        -+

        Create a new index.

        -+

        mxml_index_t *mxmlIndexNew -+ ( -+
            mxml_node_t *node, -+
            const char *element, -+
            const char *attr -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        XML node tree
        -+
        element
        -+
        Element to index or NULL for all
        -+
        attr
        -+
        Attribute to index or NULL for none
        -+
        -+

        Return Value

        -+

        New index

        -+

        Discussion

        -+

        The index will contain all nodes that contain the -+ named element and/or attribute. If both "element" and "attr" are NULL, -+ then the index will contain a sorted list of the elements in the node -+ tree. Nodes are sorted by element name and optionally by attribute -+ value if the "attr" argument is not NULL.

        -+

        mxmlIndexReset

        -+

        Reset the enumeration/find pointer in the index -+ and return the first node in the index.

        -+

        mxml_node_t *mxmlIndexReset -+ ( -+
            mxml_index_t *ind -+
        );

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to reset
        -+
        -+

        Return Value

        -+

        First node or NULL if there is none

        -+

        Discussion

        -+

        This function should be called prior to using -+ mxmlIndexEnum() or mxmlIndexFind() for the first time.

        -+

        mxmlLoadFd

        -+

        Load a file descriptor into an XML node tree.

        -+

        mxml_node_t *mxmlLoadFd ( -+
            mxml_node_t *top, -+
            int fd, -+
            mxml_load_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fd
        -+
        File descriptor to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the -+ specified top node. If no top node is provided, the XML file MUST be -+ well-formed with a single parent node like <?xml> for the entire file. -+ The callback function returns the value type that should be used for -+ child nodes. If MXML_NO_CALLBACK is specified then all child nodes will -+ be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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.

        -+

        mxmlLoadFile

        -+

        Load a file into an XML node tree.

        -+

        mxml_node_t *mxmlLoadFile ( -+
            mxml_node_t *top, -+
            FILE *fp, -+
            mxml_load_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fp
        -+
        File to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the -+ specified top node. If no top node is provided, the XML file MUST be -+ well-formed with a single parent node like <?xml> for the entire file. -+ The callback function returns the value type that should be used for -+ child nodes. If MXML_NO_CALLBACK is specified then all child nodes will -+ be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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.

        -+

        mxmlLoadString

        -+

        Load a string into an XML node tree.

        -+

        mxml_node_t *mxmlLoadString -+ ( -+
            mxml_node_t *top, -+
            const char *s, -+
            mxml_load_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        s
        -+
        String to load
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the string has errors.

        -+

        Discussion

        -+

        The nodes in the specified string are added to the -+ specified top node. If no top node is provided, the XML string MUST be -+ well-formed with a single parent node like <?xml> for the entire -+ string. The callback function returns the value type that should be -+ used for child nodes. If MXML_NO_CALLBACK is specified then all child -+ nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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.

        -+

        mxml_node_t *mxmlNewCDATA ( -+
            mxml_node_t *parent, -+
            const char *data -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        data
        -+
        Data string
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new CDATA node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new 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.

        -+

        mxml_node_t *mxmlNewCustom ( -+
            mxml_node_t *parent, -+
            void *data, -+
            mxml_custom_destroy_cb_t -+ destroy -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        data
        -+
        Pointer to data
        -+
        destroy
        -+
        Function to destroy data
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new custom node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new element node has no parent. NULL can be passed -+ when the data in the node is not dynamically allocated or is separately -+ managed.

        -+

        mxmlNewElement

        -+

        Create a new element node.

        -+

        mxml_node_t *mxmlNewElement -+ ( -+
            mxml_node_t *parent, -+
            const char *name -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        name
        -+
        Name of element
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new element node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new element node has no parent.

        -+

        mxmlNewInteger

        -+

        Create a new integer node.

        -+

        mxml_node_t *mxmlNewInteger -+ ( -+
            mxml_node_t *parent, -+
            int integer -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        integer
        -+
        Integer value
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new integer node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new integer node has no parent.

        -+

        mxmlNewOpaque

        -+

        Create a new opaque string.

        -+

        mxml_node_t *mxmlNewOpaque ( -+
            mxml_node_t *parent, -+
            const char *opaque -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        opaque
        -+
        Opaque string
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new opaque node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new opaque node has no parent. The opaque string -+ must be nul-terminated and is copied into the new node.

        -+

        mxmlNewReal

        -+

        Create a new real number node.

        -+

        mxml_node_t *mxmlNewReal ( -+
            mxml_node_t *parent, -+
            double real -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        real
        -+
        Real number value
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new real number node is added to the end of -+ the specified parent's child list. The constant MXML_NO_PARENT can be -+ used to specify that the new real number node has no parent.

        -+

        mxmlNewText

        -+

        Create a new text fragment node.

        -+

        mxml_node_t *mxmlNewText ( -+
            mxml_node_t *parent, -+
            int whitespace, -+
            const char *string -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        string
        -+
        String
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new text node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new text node has no parent. The whitespace -+ parameter is used to specify whether leading whitespace is present -+ before the node. The text string must be nul-terminated and is copied -+ into the new node.

        -+

        mxmlNewTextf

        -+

        Create a new formatted text fragment node.

        -+

        mxml_node_t *mxmlNewTextf ( -+
            mxml_node_t *parent, -+
            int whitespace, -+
            const char *format, -+
            ... -+
        );

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        format
        -+
        Printf-style frmat string
        -+
        ...
        -+
        Additional args as needed
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new text node is added to the end of the -+ specified parent's child list. The constant MXML_NO_PARENT can be used -+ to specify that the new text node has no parent. The whitespace -+ 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.

        -+

        mxml_node_t *mxmlNewXML ( -+
            const char *version -+
        );

        -+

        Parameters

        -+
        -+
        version
        -+
        Version number to use
        -+
        -+

        Return Value

        -+

        New ?xml node

        -+

        Discussion

        -+

        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.

        -+

        int mxmlRelease ( -+
            mxml_node_t *node -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node
        -+
        -+

        Return Value

        -+

        New reference count

        -+

        Discussion

        -+

        When the reference count reaches zero, the node -+ (and any children) is deleted via mxmlDelete().

        -+

        mxmlRemove

        -+

        Remove a node from its parent.

        -+

        void mxmlRemove ( -+
            mxml_node_t *node -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to remove
        -+
        -+

        Discussion

        -+

        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.

        -+

        int mxmlRetain ( -+
            mxml_node_t *node -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node
        -+
        -+

        Return Value

        -+

        New reference count

        -+

        -+ -+ Mini-XML 2.3 mxmlSAXLoadFd

        -+

        Load a file descriptor into an XML node tree -+ using a SAX callback.

        -+

        mxml_node_t *mxmlSAXLoadFd ( -+
            mxml_node_t *top, -+
            int fd, -+
            mxml_load_cb_t cb, -+
            mxml_sax_cb_t sax_cb, -+
            void *sax_data -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fd
        -+
        File descriptor to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the -+ specified top node. If no top node is provided, the XML file MUST be -+ well-formed with a single parent node like <?xml> for the entire file. -+ The callback function returns the value type that should be used for -+ child nodes. If MXML_NO_CALLBACK is specified then all child nodes will -+ be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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. -+
        -+
        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 -+ callback.

        -+

        mxml_node_t *mxmlSAXLoadFile -+ ( -+
            mxml_node_t *top, -+
            FILE *fp, -+
            mxml_load_cb_t cb, -+
            mxml_sax_cb_t sax_cb, -+
            void *sax_data -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fp
        -+
        File to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the -+ specified top node. If no top node is provided, the XML file MUST be -+ well-formed with a single parent node like <?xml> for the entire file. -+ The callback function returns the value type that should be used for -+ child nodes. If MXML_NO_CALLBACK is specified then all child nodes will -+ be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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. -+
        -+
        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 -+ callback.

        -+

        mxml_node_t -+ *mxmlSAXLoadString ( -+
            mxml_node_t *top, -+
            const char *s, -+
            mxml_load_cb_t cb, -+
            mxml_sax_cb_t sax_cb, -+
            void *sax_data -+
        );

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        s
        -+
        String to load
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the string has errors.

        -+

        Discussion

        -+

        The nodes in the specified string are added to the -+ specified top node. If no top node is provided, the XML string MUST be -+ well-formed with a single parent node like <?xml> for the entire -+ string. The callback function returns the value type that should be -+ used for child nodes. If MXML_NO_CALLBACK is specified then all child -+ nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -+
        -+
        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. -+
        -+
        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.

        -+

        mxmlSaveAllocString -+

        -+

        Save an XML node tree to an allocated string.

        -+

        char *mxmlSaveAllocString ( -+
            mxml_node_t *node, -+
            mxml_save_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        Allocated string or NULL

        -+

        Discussion

        -+

        This function returns a pointer to a string -+ containing the textual representation of the XML node tree. The string -+ should be freed using the free() function when you are done with it. -+ NULL is returned if the node would produce an empty string or if the -+ string cannot be allocated. -+
        -+
        The callback argument specifies a function that returns a -+ whitespace string or NULL before and after each element. If -+ MXML_NO_CALLBACK is specified, whitespace will only be added before -+ MXML_TEXT nodes with leading whitespace and before attribute names -+ inside opening element tags.

        -+

        mxmlSaveFd

        -+

        Save an XML tree to a file descriptor.

        -+

        int mxmlSaveFd ( -+
            mxml_node_t *node, -+
            int fd, -+
            mxml_save_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        fd
        -+
        File descriptor to write to
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        0 on success, -1 on error.

        -+

        Discussion

        -+

        The callback argument specifies a function that -+ returns a whitespace string or NULL before and after each element. If -+ MXML_NO_CALLBACK is specified, whitespace will only be added before -+ MXML_TEXT nodes with leading whitespace and before attribute names -+ inside opening element tags.

        -+

        mxmlSaveFile

        -+

        Save an XML tree to a file.

        -+

        int mxmlSaveFile ( -+
            mxml_node_t *node, -+
            FILE *fp, -+
            mxml_save_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        fp
        -+
        File to write to
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        0 on success, -1 on error.

        -+

        Discussion

        -+

        The callback argument specifies a function that -+ returns a whitespace string or NULL before and after each element. If -+ MXML_NO_CALLBACK is specified, whitespace will only be added before -+ MXML_TEXT nodes with leading whitespace and before attribute names -+ inside opening element tags.

        -+

        mxmlSaveString

        -+

        Save an XML node tree to a string.

        -+

        int mxmlSaveString ( -+
            mxml_node_t *node, -+
            char *buffer, -+
            int bufsize, -+
            mxml_save_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        buffer
        -+
        String buffer
        -+
        bufsize
        -+
        Size of string buffer
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        Size of string

        -+

        Discussion

        -+

        This function returns the total number of bytes -+ that would be required for the string but only copies (bufsize - 1) -+ characters into the specified buffer. -+
        -+
        The callback argument specifies a function that returns a -+ whitespace string or NULL before and after each element. If -+ MXML_NO_CALLBACK is specified, whitespace will only be added before -+ MXML_TEXT nodes with leading whitespace and before attribute names -+ inside opening element tags.

        -+

        -+ -+ Mini-XML 2.3 mxmlSetCDATA

        -+

        Set the element name of a CDATA node.

        -+

        int mxmlSetCDATA ( -+
            mxml_node_t *node, -+
            const char *data -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        data
        -+
        New data string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

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

        -+

        int mxmlSetCustom ( -+
            mxml_node_t *node, -+
            void *data, -+
            mxml_custom_destroy_cb_t -+ destroy -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        data
        -+
        New data pointer
        -+
        destroy
        -+
        New destructor function
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not a custom -+ node.

        -+

        -+mxmlSetCustomHandlers

        -+

        Set the handling functions for custom data.

        -+

        void mxmlSetCustomHandlers ( -+
            mxml_custom_load_cb_t -+ load, -+
            mxml_custom_save_cb_t save -+
        );

        -+

        Parameters

        -+
        -+
        load
        -+
        Load function
        -+
        save
        -+
        Save function
        -+
        -+

        Discussion

        -+

        The load function accepts a node pointer and a -+ data string and must return 0 on success and non-zero on error. -+
        -+
        The save function accepts a node pointer and must return a malloc'd -+ string on success and NULL on error.

        -+

        mxmlSetElement

        -+

        Set the name of an element node.

        -+

        int mxmlSetElement ( -+
            mxml_node_t *node, -+
            const char *name -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        name
        -+
        New name string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an element -+ node.

        -+

        mxmlSetErrorCallback -+

        -+

        Set the error message callback.

        -+

        void mxmlSetErrorCallback ( -+
            mxml_error_cb_t cb -+
        );

        -+

        Parameters

        -+
        -+
        cb
        -+
        Error callback function
        -+
        -+

        mxmlSetInteger

        -+

        Set the value of an integer node.

        -+

        int mxmlSetInteger ( -+
            mxml_node_t *node, -+
            int integer -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        integer
        -+
        Integer value
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an integer -+ node.

        -+

        mxmlSetOpaque

        -+

        Set the value of an opaque node.

        -+

        int mxmlSetOpaque ( -+
            mxml_node_t *node, -+
            const char *opaque -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        opaque
        -+
        Opaque string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an opaque -+ node.

        -+

        mxmlSetReal

        -+

        Set the value of a real number node.

        -+

        int mxmlSetReal ( -+
            mxml_node_t *node, -+
            double real -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        real
        -+
        Real number value
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not a real number -+ node.

        -+

        mxmlSetText

        -+

        Set the value of a text node.

        -+

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

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        string
        -+
        String
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

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

        -+

        mxmlSetTextf

        -+

        Set the value of a text node to a formatted -+ string.

        -+

        int mxmlSetTextf ( -+
            mxml_node_t *node, -+
            int whitespace, -+
            const char *format, -+
            ... -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        format
        -+
        Printf-style format string
        -+
        ...
        -+
        Additional arguments as needed
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

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

        -+

        -+ -+ Mini-XML 2.3 mxmlSetWrapMargin

        -+

        Set the the wrap margin when saving XML data.

        -+

        void mxmlSetWrapMargin ( -+
            int column -+
        );

        -+

        Parameters

        -+
        -+
        column
        -+
        Column for wrapping, 0 to disable wrapping
        -+
        -+

        Discussion

        -+

        Wrapping is disabled when "column" is 0.

        -+

        mxmlWalkNext

        -+

        Walk to the next logical node in the tree.

        -+

        mxml_node_t *mxmlWalkNext ( -+
            mxml_node_t *node, -+
            mxml_node_t *top, -+
            int descend -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, -+ MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Next node or NULL

        -+

        Discussion

        -+

        The descend argument controls whether the first -+ child is considered to be the next node. The top node argument -+ constrains the walk to the node's children.

        -+

        mxmlWalkPrev

        -+

        Walk to the previous logical node in the tree.

        -+

        mxml_node_t *mxmlWalkPrev ( -+
            mxml_node_t *node, -+
            mxml_node_t *top, -+
            int descend -+
        );

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, -+ MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Previous node or NULL

        -+

        Discussion

        -+

        The descend argument controls whether the previous -+ node's last child is considered to be the previous node. The top node -+ argument constrains the walk to the node's children.

        -+

        Data Types

        -+

        mxml_attr_t

        -+

        An XML element attribute value.

        -+

        typedef struct mxml_attr_s -+ mxml_attr_t;

        -+

        -+mxml_custom_destroy_cb_t

        -+

        Custom data destructor

        -+

        typedef void (*mxml_custom_destroy_cb_t)(void *);

        -+

        -+mxml_custom_load_cb_t

        -+

        Custom data load callback function

        -+

        typedef int (*mxml_custom_load_cb_t)( -+mxml_node_t *, const char *);

        -+

        -+mxml_custom_save_cb_t

        -+

        Custom data save callback function

        -+

        typedef char *(*mxml_custom_save_cb_t)( -+mxml_node_t *);

        -+

        -+ -+ Mini-XML 2.1 mxml_custom_t

        -+

        An XML custom value.

        -+

        typedef struct mxml_custom_s -+ mxml_custom_t;

        -+

        mxml_element_t

        -+

        An XML element value.

        -+

        typedef struct mxml_element_s -+ mxml_element_t;

        -+

        mxml_entity_cb_t

        -+

        Entity callback function

        -+

        typedef int (*mxml_entity_cb_t)(const char *);

        -+

        mxml_error_cb_t

        -+

        Error callback function

        -+

        typedef void (*mxml_error_cb_t)(const char *);

        -+

        mxml_index_t

        -+

        An XML node index.

        -+

        typedef struct mxml_index_s -+ mxml_index_t;

        -+

        mxml_load_cb_t

        -+

        Load callback function

        -+

        typedef mxml_type_t -+ (*mxml_load_cb_t)(mxml_node_t *);

        -+

        mxml_node_t

        -+

        An XML node.

        -+

        typedef struct mxml_node_s -+ mxml_node_t;

        -+

        mxml_save_cb_t

        -+

        Save callback function

        -+

        typedef const char *(*mxml_save_cb_t)( -+mxml_node_t *, int);

        -+

        mxml_sax_cb_t

        -+

        SAX callback function

        -+

        typedef void (*mxml_sax_cb_t)( -+mxml_node_t *, mxml_sax_event_t, void *);

        -+

        mxml_sax_event_t

        -+

        SAX event type.

        -+

        typedef enum -+mxml_sax_event_e mxml_sax_event_t;

        -+

        mxml_text_t

        -+

        An XML text value.

        -+

        typedef struct mxml_text_s -+ mxml_text_t;

        -+

        mxml_type_t

        -+

        The XML node type.

        -+

        typedef enum mxml_type_e -+ mxml_type_t;

        -+

        mxml_value_t

        -+

        An XML node value.

        -+

        typedef union mxml_value_u -+ mxml_value_t;

        -+

        Structures

        -+

        mxml_attr_s

        -+

        An XML element attribute value.

        -+

        struct mxml_attr_s { -+
            char *name; -+
            char *value; -+
        };

        -+

        Members

        -+
        -+
        name
        -+
        Attribute name
        -+
        value
        -+
        Attribute value
        -+
        -+

        -+ -+ Mini-XML 2.1 mxml_custom_s

        -+

        An XML custom value.

        -+

        struct mxml_custom_s { -+
            void *data; -+
            mxml_custom_destroy_cb_t -+ destroy; -+
        };

        -+

        Members

        -+
        -+
        data
        -+
        Pointer to (allocated) custom data
        -+
        destroy
        -+
        Pointer to destructor function
        -+
        -+

        mxml_element_s

        -+

        An XML element value.

        -+

        struct mxml_element_s { -+
            mxml_attr_t *attrs; -+
            char *name; -+
            int num_attrs; -+
        };

        -+

        Members

        -+
        -+
        attrs
        -+
        Attributes
        -+
        name
        -+
        Name of element
        -+
        num_attrs
        -+
        Number of attributes
        -+
        -+

        mxml_index_s

        -+

        An XML node index.

        -+

        struct mxml_index_s { -+
            int alloc_nodes; -+
            char *attr; -+
            int cur_node; -+
            mxml_node_t **nodes; -+
            int num_nodes; -+
        };

        -+

        Members

        -+
        -+
        alloc_nodes
        -+
        Allocated nodes in index
        -+
        attr
        -+
        Attribute used for indexing or NULL
        -+
        cur_node
        -+
        Current node
        -+
        nodes
        -+
        Node array
        -+
        num_nodes
        -+
        Number of nodes in index
        -+
        -+

        mxml_node_s

        -+

        An XML node.

        -+

        struct mxml_node_s { -+
            struct mxml_node_s *child; -+
            struct mxml_node_s *last_child; -+
            struct mxml_node_s *next; -+
            struct mxml_node_s *parent; -+
            struct mxml_node_s *prev; -+
            int ref_count; -+
            mxml_type_t type; -+
            void *user_data; -+
            mxml_value_t value; -+
        };

        -+

        Members

        -+
        -+
        child
        -+
        First child node
        -+
        last_child
        -+
        Last child node
        -+
        next
        -+
        Next node under same parent
        -+
        parent
        -+
        Parent node
        -+
        prev
        -+
        Previous node under same parent
        -+
        ref_count
        -+
        Use count
        -+
        type
        -+
        Node type
        -+
        user_data
        -+
        User data
        -+
        value
        -+
        Node value
        -+
        -+

        mxml_text_s

        -+

        An XML text value.

        -+

        struct mxml_text_s { -+
            char *string; -+
            int whitespace; -+
        };

        -+

        Members

        -+
        -+
        string
        -+
        Fragment string
        -+
        whitespace
        -+
        Leading whitespace?
        -+
        -+

        Unions

        -+

        mxml_value_u

        -+

        An XML node value.

        -+

        union mxml_value_u { -+
            mxml_custom_t custom; -+
            mxml_element_t element; -+
            int integer; -+
            char *opaque; -+
            double real; -+
            mxml_text_t text; -+
        };

        -+

        Members

        -+
        -+
        custom -+ -+  Mini-XML 2.1 
        -+
        Custom data
        -+
        element
        -+
        Element
        -+
        integer
        -+
        Integer number
        -+
        opaque
        -+
        Opaque string
        -+
        real
        -+
        Real number
        -+
        text
        -+
        Text fragment
        -+
        -+

        Constants

        -+

        mxml_sax_event_e

        -+

        SAX event type.

        -+

        Constants

        -+
        -+
        MXML_SAX_CDATA
        -+
        CDATA node
        -+
        MXML_SAX_COMMENT
        -+
        Comment node
        -+
        MXML_SAX_DATA
        -+
        Data node
        -+
        MXML_SAX_DIRECTIVE
        -+
        Processing directive node
        -+
        MXML_SAX_ELEMENT_CLOSE
        -+
        Element closed
        -+
        MXML_SAX_ELEMENT_OPEN
        -+
        Element opened
        -+
        -+

        mxml_type_e

        -+

        The XML node type.

        -+

        Constants

        -+
        -+
        MXML_CUSTOM -+ -+  Mini-XML 2.1 
        -+
        Custom data
        -+
        MXML_ELEMENT
        -+
        XML element with attributes
        -+
        MXML_IGNORE -+ -+  Mini-XML 2.3 
        -+
        Ignore/throw away node
        -+
        MXML_INTEGER
        -+
        Integer value
        -+
        MXML_OPAQUE
        -+
        Opaque string
        -+
        MXML_REAL
        -+
        Real value
        -+
        MXML_TEXT
        -+
        Text fragment
        -+
        -+
      -+

      -+

      DXML 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
      -+
      -+

      mxmldoc.xsd

      -+
      
      -+<?xml version="1.0"?>
      -+<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.
      -+    </xsd:documentation>
      -+  </xsd:annotation>
      -+
      -+  <!-- basic element definitions -->
      -+  <xsd:element name="argument" type="argumentType"/>
      -+  <xsd:element name="class" type="classType"/>
      -+  <xsd:element name="constant" type="constantType"/>
      -+  <xsd:element name="description" type="xsd:string"/>
      -+  <xsd:element name="enumeration" type="enumerationType"/>
      -+  <xsd:element name="function" type="functionType"/>
      -+  <xsd:element name="mxmldoc" type="mxmldocType"/>
      -+  <xsd:element name="namespace" type="namespaceType"/>
      -+  <xsd:element name="returnvalue" type="returnvalueType"/>
      -+  <xsd:element name="seealso" type="identifierList"/>
      -+  <xsd:element name="struct" type="structType"/>
      -+  <xsd:element name="typedef" type="typedefType"/>
      -+  <xsd:element name="type" type="xsd:string"/>
      -+  <xsd:element name="union" type="unionType"/>
      -+  <xsd:element name="variable" type="variableType"/>
      -+
      -+  <!-- descriptions of complex elements -->
      -+  <xsd:complexType name="argumentType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="default" type="xsd:string" use="optional"/>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="direction" type="direction" use="optional"
      -+     default="I"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="classType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="class"/>
      -+	<xsd:element ref="enumeration"/>
      -+	<xsd:element ref="function"/>
      -+	<xsd:element ref="struct"/>
      -+	<xsd:element ref="typedef"/>
      -+	<xsd:element ref="union"/>
      -+	<xsd:element ref="variable"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="parent" type="xsd:string" use="optional"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="constantType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="enumerationType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="functionType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
      -+      <xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="scope" type="scope" use="optional"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="mxmldocType">
      -+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+      <xsd:element ref="class"/>
      -+      <xsd:element ref="enumeration"/>
      -+      <xsd:element ref="function"/>
      -+      <xsd:element ref="namespace"/>
      -+      <xsd:element ref="struct"/>
      -+      <xsd:element ref="typedef"/>
      -+      <xsd:element ref="union"/>
      -+      <xsd:element ref="variable"/>
      -+    </xsd:choice>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="namespaceType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="class"/>
      -+	<xsd:element ref="enumeration"/>
      -+	<xsd:element ref="function"/>
      -+	<xsd:element ref="struct"/>
      -+	<xsd:element ref="typedef"/>
      -+	<xsd:element ref="union"/>
      -+	<xsd:element ref="variable"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="returnvalueType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="structType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="variable"/>
      -+	<xsd:element ref="function"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="typedefType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="unionType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="variableType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <!-- data types -->
      -+  <xsd:simpleType name="direction">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:enumeration value="I"/>
      -+      <xsd:enumeration value="O"/>
      -+      <xsd:enumeration value="IO"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="identifier">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="identifierList">
      -+    <xsd:list itemType="identifier"/>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="scope">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:enumeration value=""/>
      -+      <xsd:enumeration value="private"/>
      -+      <xsd:enumeration value="protected"/>
      -+      <xsd:enumeration value="public"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+</xsd:schema>
      -+
      -+ -+ -diff -Naur mxml-2.6/doc/mxmldoc.html mxml-2.6-haiku/doc/mxmldoc.html ---- mxml-2.6/doc/mxmldoc.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/mxmldoc.html 2009-05-17 06:04:58.000000000 +0000 -@@ -0,0 +1,204 @@ -+ -+ -+ -+

      4Using the mxmldoc -+Utility

      -+ -+

      This chapter describes how to use mxmldoc(1) program to -+automatically generate documentation from C and C++ source -+files.

      -+ -+ -+

      The Basics

      -+ -+

      Originally developed to generate the Mini-XML and CUPS API -+documentation, mxmldoc is now a general-purpose utility -+which scans C and C++ source files to produce HTML and man page -+documentation along with an XML file representing the functions, -+types, and definitions in those source files. Unlike popular -+documentation generators like Doxygen or Javadoc, mxmldoc -+uses in-line comments rather than comment headers, allowing for more -+"natural" code documentation.

      -+ -+

      By default, mxmldoc produces HTML documentation. For -+example, the following command will scan all of the C source and -+header files in the current directory and produce a HTML -+documentation file called filename.html:

      -+ -+
      -+    mxmldoc *.h *.c >filename.html ENTER
      -+
      -+ -+

      You can also specify an XML file to create which contains all of -+the information from the source files. For example, the following -+command creates an XML file called filename.xml in -+addition to the HTML file:

      -+ -+
      -+    mxmldoc filename.xml *.h *.c >filename.html ENTER
      -+
      -+ -+

      The --no-output option disables the normal HTML -+output:

      -+ -+
      -+    mxmldoc --no-output filename.xml *.h *.c ENTER
      -+
      -+ -+

      You can then run mxmldoc again with the XML file alone -+to generate the HTML documentation:

      -+ -+
      -+    mxmldoc filename.xml >filename.html ENTER
      -+
      -+ -+

      Creating Man Pages

      -+ -+

      The --man filename option tells mxmldoc to -+create a man page instead of HTML documentation, for example:

      -+ -+
      -+    mxmldoc --man filename filename.xml \
      -+        >filename.man ENTER
      -+
      -+    mxmldoc --man filename *.h *.c \
      -+        >filename.man ENTER
      -+
      -+ -+

      Creating Xcode Documentation Sets

      -+ -+

      The --docset directory.docset option tells mxmldoc to -+create an Xcode documentation set containing the HTML documentation, for -+example:

      -+ -+
      -+    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
      -+
      -+ -+

      Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 or -+higher installed.

      -+ -+ -+

      Commenting Your Code

      -+ -+

      As noted previously, mxmldoc looks for in-line comments -+to describe the functions, types, and constants in your code. -+Mxmldoc 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.

      -+ -+

      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 document that argument, definition, return type, or variable. For -+example, the following code excerpt defines a key/value structure -+and a function that creates a new instance of that structure:

      -+ -+
      -+    /* A key/value pair. This is used with the
      -+       dictionary structure. */
      -+
      -+    struct keyval
      -+    {
      -+      char *key; /* Key string */
      -+      char *val; /* Value string */
      -+    };
      -+
      -+    /* Create a new key/value pair. */
      -+
      -+    struct keyval * /* New key/value pair */
      -+    new_keyval(
      -+        const char *key, /* Key string */
      -+	const char *val) /* Value string */
      -+    {
      -+      ...
      -+    }
      -+
      -+ -+

      Mxmldoc also knows to remove extra asterisks (*) from -+the comment string, so the comment string:

      -+ -+
      -+    /*
      -+     * Compute the value of PI.
      -+     *
      -+     * The function connects to an Internet server
      -+     * that streams audio of mathematical monks
      -+     * chanting the first 100 digits of PI.
      -+     */
      -+
      -+ -+

      will be shown as:

      -+ -+
      -+    Compute the value of PI.
      -+
      -+    The function connects to an Internet server
      -+    that streams audio of mathematical monks
      -+    chanting the first 100 digits of PI.
      -+
      -+ -+

      Comments can also include the -+following special @name ...@ directive strings:

      -+ -+
        -+ -+
      • @deprecated@ - flags the item as deprecated to -+ discourage its use
      • -+ -+
      • @private@ - flags the item as private so it -+ will not be 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@.
      • -+ -+
      -+ -+ -+ -+

      Titles, Sections, and Introductions

      -+ -+

      Mxmldoc also provides options to set the title, section, -+and introduction text for the generated documentation. The -+--title text option specifies the title for the -+documentation. The title string is usually put in quotes:

      -+ -+
      -+    mxmldoc filename.xml \
      -+        --title "My Famous Documentation" \
      -+        >filename.html ENTER
      -+
      -+ -+

      The --section name option specifies the section for -+the documentation. For HTML documentation, the name is placed in -+a HTML comment such as:

      -+ -+
      -+    <!-- SECTION: name -->
      -+
      -+ -+

      For man pages, the section name is usually just a number ("3"), -+or a number followed by a vendor name ("3acme"). The section name is -+used in the .TH directive in the man page:

      -+ -+
      -+    .TH mylibrary 3acme "My Title" ...
      -+
      -+ -+

      The default section name for man page output is "3". There is no -+default section name for HTML output.

      -+ -+

      Finally, the --intro filename option specifies a file to -+embed after the title and section but before the generated -+documentation. For HTML documentation, the file must consist of -+valid HTML without the usual DOCTYPE, html, and -+body elements. For man page documentation, the file must -+consist of valid nroff(1) text.

      -+ -+ -+ -diff -Naur mxml-2.6/doc/mxmldoc.man mxml-2.6-haiku/doc/mxmldoc.man ---- mxml-2.6/doc/mxmldoc.man 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/mxmldoc.man 2009-05-05 13:38:00.000000000 +0000 -@@ -0,0 +1,198 @@ -+.\" -+.\" "$Id: mxmldoc.man 390 2009-05-05 13:38:00Z mike $" -+.\" -+.\" mxmldoc man page for mini-XML, a small XML-like file parsing library. -+.\" -+.\" Copyright 2003-2009 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 -+.\" License as published by the Free Software Foundation; either -+.\" version 2, or (at your option) any later version. -+.\" -+.\" This program is distributed in the hope that it will be useful, -+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+.\" GNU General Public License for more details. -+.\" -+.TH mxmldoc 1 "Mini-XML" "4 May 2009" "Michael Sweet" -+.SH NAME -+mxmldoc \- mini-xml documentation generator -+.SH SYNOPSIS -+.B mxmldoc -+\-\-no-output [ -+.I filename.xml -+] -+.I source file(s) -+] -+.br -+.B mxmldoc -+[ \-\-footer -+.I footerfile -+] [ \-\-header -+.I headerfile -+] [ \-\-intro -+.I introfile -+] [ \-\-section -+.I section -+] [ \-\-title -+.I title -+] [ -+.I filename.xml -+] [ -+.I source file(s) -+] > -+.I filename.html -+.br -+.B mxmldoc -+\-\-docset -+.I directory.docset -+[ \-\-docversion -+.I version -+] [ \-\-feedname -+.I name -+] [ \-\-feedurl -+.I url -+] [ \-\-footer -+.I footerfile -+] [ \-\-header -+.I headerfile -+] [ \-\-intro -+.I introfile -+] [ \-\-section -+.I section -+] [ \-\-title -+.I title -+] [ -+.I filename.xml -+] [ -+.I source file(s) -+] -+.br -+.B mxmldoc -+\-\-tokens -+.I path -+[ -+.I filename.xml -+] [ -+.I source file(s) -+] > tokens.xml -+.br -+.B mxmldoc -+\-\-framed -+.I basename -+[ \-\-footer -+.I footerfile -+] [ \-\-header -+.I headerfile -+] [ \-\-intro -+.I introfile -+] [ \-\-section -+.I section -+] [ \-\-title -+.I title -+] [ -+.I filename.xml -+] [ -+.I source file(s) -+] -+.br -+.B mxmldoc -+[ \-\-footer -+.I footerfile -+] [ \-\-header -+.I headerfile -+] [ \-\-intro -+.I introfile -+] \-\-man -+.I manpage -+[ \-\-section -+.I section -+] [ \-\-title -+.I title -+] [ -+.I filename.xml -+] [ -+.I source file(s) -+] > -+.I filename.man -+.SH DESCRIPTION -+\fImxmldoc\fR scans the specified C and C++ source files to produce -+an XML representation of globally accessible classes, constants, -+enumerations, functions, structures, typedefs, unions, and variables -+- the XML file is updated as necessary. By default, a HTML -+representation of the XML file is written to the standard output. -+Use the \fI\-\-no-output\fR option to disable the HTML output. -+.PP -+Man page source can be generated using the \fI\-\-man\fR option. -+.PP -+If no source files are specified then the current XML file is -+converted to the standard output. -+.PP -+In general, any C or C++ source code is handled by \fImxmldoc\fR, -+however it was specifically written to handle code with -+documentation that is formatted according to the CUPS Developer -+Guide which is available at "http://www.cups.org/documentation.php". -+.SH OPTIONS -+.TP 5 -+\-\-docset directory.docset -+.br -+Creates an Xcode documentation set in the specified directory. -+.TP 5 -+\-\-docversion version -+.br -+Specifies the version number for the Xcode documentation set. -+.TP 5 -+\-\-feedname name -+.br -+Specifies the Xcode documentation set feed name, typically the project or -+company name. -+.TP 5 -+\-\-feedurl url -+.br -+Specifies the Xcode documentation set feed URL which must point to an ATOM file -+linking to updates. -+.TP 5 -+\-\-footer footerfile -+.br -+Inserts the specified file at the bottom of the output documentation. -+.TP 5 -+\-\-framed basename -+.br -+Creates HTML documentation using frames - one for the table-of-contents and -+one for the body. -+.TP 5 -+\-\-header headerfile -+.br -+Inserts the specified file at the top of the output documentation. -+.TP 5 -+\-\-intro introfile -+.br -+Inserts the specified file before the table of contents. -+.TP 5 -+\-\-man manpage -+.br -+Generated a man page instead of HTML documentation. -+.TP 5 -+\-\-no-output -+.br -+Disables generation of documentation on the standard output. -+.TP 5 -+\-\-section section -+.br -+Sets the section/keywords in the output documentation. -+.TP 5 -+\-\-title title -+.br -+Sets the title of the output documentation. -+.TP 5 -+\-\-tokens -+.br -+Generates a Tokens.xml file for use with the Xcode documentation tools. -+.SH SEE ALSO -+mxml(3), Mini-XML Programmers Manual, http://www.minixml.org/ -+.SH COPYRIGHT -+Copyright 2003-2009 by Michael Sweet. -+.\" -+.\" End of "$Id: mxmldoc.man 390 2009-05-05 13:38:00Z mike $". -+.\" -diff -Naur mxml-2.6/doc/mxmldoc.xsd mxml-2.6-haiku/doc/mxmldoc.xsd ---- mxml-2.6/doc/mxmldoc.xsd 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/mxmldoc.xsd 2007-04-18 19:25:26.000000000 +0000 -@@ -0,0 +1,189 @@ -+ -+ -+ -+ -+ Mini-XML 2.3 documentation schema for mxmldoc output. -+ Copyright 2003-2007 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 -+ License as published by the Free Software Foundation; either -+ version 2, or (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff -Naur mxml-2.6/doc/reference.heading mxml-2.6-haiku/doc/reference.heading ---- mxml-2.6/doc/reference.heading 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/reference.heading 2008-01-26 20:50:28.000000000 +0000 -@@ -0,0 +1,4 @@ -+

      CLibrary -+Reference

      -+ -diff -Naur mxml-2.6/doc/reference.html mxml-2.6-haiku/doc/reference.html ---- mxml-2.6/doc/reference.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/reference.html 2009-10-26 02:35:54.000000000 +0000 -@@ -0,0 +1,1635 @@ -+ -+ -+ -+Documentation -+ -+ -+ -+ -+
      -+

      CLibrary -+Reference

      -+ -+

      Contents

      -+
        -+
      • Functions
      • -+
      • Data Types
      • -+
      • Structures
      • -+
      • Unions
      • -+
      • Constants
      • -+

        Functions

        -+

        mxmlAdd

        -+

        Add a node to a tree.

        -+

        -+void mxmlAdd (
        -+    mxml_node_t *parent,
        -+    int where,
        -+    mxml_node_t *child,
        -+    mxml_node_t *node
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node
        -+
        where
        -+
        Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
        -+
        child
        -+
        Child node for where or MXML_ADD_TO_PARENT
        -+
        node
        -+
        Node to add
        -+
        -+

        Discussion

        -+

        Adds the specified node to the parent. If the child argument is not -+NULL, puts the new node before or after the specified child depending -+on the value of the where argument. If the child argument is NULL, -+puts the new node at the beginning of the child list (MXML_ADD_BEFORE) -+or at the end of the child list (MXML_ADD_AFTER). The constant -+MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.

        -+

        mxmlDelete

        -+

        Delete a node and all of its children.

        -+

        -+void mxmlDelete (
        -+    mxml_node_t *node
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to delete
        -+
        -+

        Discussion

        -+

        If the specified node has a parent, this function first removes the -+node from its parent using the mxmlRemove() function.

        -+

         Mini-XML 2.4 mxmlElementDeleteAttr

        -+

        Delete an attribute.

        -+

        -+void mxmlElementDeleteAttr (
        -+    mxml_node_t *node,
        -+    const char *name
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Element
        -+
        name
        -+
        Attribute name
        -+
        -+

        mxmlElementGetAttr

        -+

        Get an attribute.

        -+

        -+const char *mxmlElementGetAttr (
        -+    mxml_node_t *node,
        -+    const char *name
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        -+

        Return Value

        -+

        Attribute value or NULL

        -+

        Discussion

        -+

        This function returns NULL if the node is not an element or the -+named attribute does not exist.

        -+

        mxmlElementSetAttr

        -+

        Set an attribute.

        -+

        -+void mxmlElementSetAttr (
        -+    mxml_node_t *node,
        -+    const char *name,
        -+    const char *value
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        value
        -+
        Attribute value
        -+
        -+

        Discussion

        -+

        If the named attribute already exists, the value of the attribute -+is replaced by the new string value. The string value is copied -+into the element node. This function does nothing if the node is -+not an element.

        -+

         Mini-XML 2.3 mxmlElementSetAttrf

        -+

        Set an attribute with a formatted value.

        -+

        -+void mxmlElementSetAttrf (
        -+    mxml_node_t *node,
        -+    const char *name,
        -+    const char *format,
        -+    ...
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Element node
        -+
        name
        -+
        Name of attribute
        -+
        format
        -+
        Printf-style attribute value
        -+
        ...
        -+
        Additional arguments as needed
        -+
        -+

        Discussion

        -+

        If the named attribute already exists, the value of the attribute -+is replaced by the new formatted string. The formatted string value is -+copied into the element node. This function does nothing if the node -+is not an element. -+ -+

        -+

        mxmlEntityAddCallback

        -+

        Add a callback to convert entities to Unicode.

        -+

        -+int mxmlEntityAddCallback (
        -+    mxml_entity_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        cb
        -+
        Callback function to add
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        mxmlEntityGetName

        -+

        Get the name that corresponds to the character value.

        -+

        -+const char *mxmlEntityGetName (
        -+    int val
        -+);

        -+

        Parameters

        -+
        -+
        val
        -+
        Character value
        -+
        -+

        Return Value

        -+

        Entity name or NULL

        -+

        Discussion

        -+

        If val does not need to be represented by a named entity, NULL is returned.

        -+

        mxmlEntityGetValue

        -+

        Get the character corresponding to a named entity.

        -+

        -+int mxmlEntityGetValue (
        -+    const char *name
        -+);

        -+

        Parameters

        -+
        -+
        name
        -+
        Entity name
        -+
        -+

        Return Value

        -+

        Character value or -1 on error

        -+

        Discussion

        -+

        The entity name can also be a numeric constant. -1 is returned if the -+name is not known.

        -+

        mxmlEntityRemoveCallback

        -+

        Remove a callback.

        -+

        -+void mxmlEntityRemoveCallback (
        -+    mxml_entity_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        cb
        -+
        Callback function to remove
        -+
        -+

        mxmlFindElement

        -+

        Find the named element.

        -+

        -+mxml_node_t *mxmlFindElement (
        -+    mxml_node_t *node,
        -+    mxml_node_t *top,
        -+    const char *name,
        -+    const char *attr,
        -+    const char *value,
        -+    int descend
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        name
        -+
        Element name or NULL for any
        -+
        attr
        -+
        Attribute name, or NULL for none
        -+
        value
        -+
        Attribute value, or NULL for any
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Element node or NULL

        -+

        Discussion

        -+

        The search is constrained by the name, attribute name, and value; any -+NULL names or values are treated as wildcards, so different kinds of -+searches can be implemented by looking for all elements of a given name -+or all elements with a specific attribute. The descend argument determines -+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.

        -+

        mxmlIndexDelete

        -+

        Delete an index.

        -+

        -+void mxmlIndexDelete (
        -+    mxml_index_t *ind
        -+);

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to delete
        -+
        -+

        mxmlIndexEnum

        -+

        Return the next node in the index.

        -+

        -+mxml_node_t *mxmlIndexEnum (
        -+    mxml_index_t *ind
        -+);

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to enumerate
        -+
        -+

        Return Value

        -+

        Next node or NULL if there is none

        -+

        Discussion

        -+

        Nodes are returned in the sorted order of the index.

        -+

        mxmlIndexFind

        -+

        Find the next matching node.

        -+

        -+mxml_node_t *mxmlIndexFind (
        -+    mxml_index_t *ind,
        -+    const char *element,
        -+    const char *value
        -+);

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to search
        -+
        element
        -+
        Element name to find, if any
        -+
        value
        -+
        Attribute value, if any
        -+
        -+

        Return Value

        -+

        Node or NULL if none found

        -+

        Discussion

        -+

        You should call mxmlIndexReset() prior to using 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().

        -+

        mxmlIndexNew

        -+

        Create a new index.

        -+

        -+mxml_index_t *mxmlIndexNew (
        -+    mxml_node_t *node,
        -+    const char *element,
        -+    const char *attr
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        XML node tree
        -+
        element
        -+
        Element to index or NULL for all
        -+
        attr
        -+
        Attribute to index or NULL for none
        -+
        -+

        Return Value

        -+

        New index

        -+

        Discussion

        -+

        The index will contain all nodes that contain the named element and/or -+attribute. If both "element" and "attr" are NULL, then the index will -+contain a sorted list of the elements in the node tree. Nodes are -+sorted by element name and optionally by attribute value if the "attr" -+argument is not NULL.

        -+

        mxmlIndexReset

        -+

        Reset the enumeration/find pointer in the index and -+return the first node in the index.

        -+

        -+mxml_node_t *mxmlIndexReset (
        -+    mxml_index_t *ind
        -+);

        -+

        Parameters

        -+
        -+
        ind
        -+
        Index to reset
        -+
        -+

        Return Value

        -+

        First node or NULL if there is none

        -+

        Discussion

        -+

        This function should be called prior to using mxmlIndexEnum() or -+mxmlIndexFind() for the first time.

        -+

        mxmlLoadFd

        -+

        Load a file descriptor into an XML node tree.

        -+

        -+mxml_node_t *mxmlLoadFd (
        -+    mxml_node_t *top,
        -+    int fd,
        -+    mxml_load_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fd
        -+
        File descriptor to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the specified top node. -+If no top node is provided, the XML file MUST be well-formed with a -+single parent node like <?xml> for the entire file. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.

        -+

        mxmlLoadFile

        -+

        Load a file into an XML node tree.

        -+

        -+mxml_node_t *mxmlLoadFile (
        -+    mxml_node_t *top,
        -+    FILE *fp,
        -+    mxml_load_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fp
        -+
        File to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the specified top node. -+If no top node is provided, the XML file MUST be well-formed with a -+single parent node like <?xml> for the entire file. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.

        -+

        mxmlLoadString

        -+

        Load a string into an XML node tree.

        -+

        -+mxml_node_t *mxmlLoadString (
        -+    mxml_node_t *top,
        -+    const char *s,
        -+    mxml_load_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        s
        -+
        String to load
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        First node or NULL if the string has errors.

        -+

        Discussion

        -+

        The nodes in the specified string are added to the specified top node. -+If no top node is provided, the XML string MUST be well-formed with a -+single parent node like <?xml> for the entire string. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.

        -+

        -+mxml_node_t *mxmlNewCDATA (
        -+    mxml_node_t *parent,
        -+    const char *data
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        data
        -+
        Data string
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new CDATA node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+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.

        -+

        -+mxml_node_t *mxmlNewCustom (
        -+    mxml_node_t *parent,
        -+    void *data,
        -+    mxml_custom_destroy_cb_t destroy
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        data
        -+
        Pointer to data
        -+
        destroy
        -+
        Function to destroy data
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new custom node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+element node has no parent. NULL can be passed when the data in the -+node is not dynamically allocated or is separately managed. -+ -+

        -+

        mxmlNewElement

        -+

        Create a new element node.

        -+

        -+mxml_node_t *mxmlNewElement (
        -+    mxml_node_t *parent,
        -+    const char *name
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        name
        -+
        Name of element
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new element node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+element node has no parent.

        -+

        mxmlNewInteger

        -+

        Create a new integer node.

        -+

        -+mxml_node_t *mxmlNewInteger (
        -+    mxml_node_t *parent,
        -+    int integer
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        integer
        -+
        Integer value
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new integer node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+integer node has no parent.

        -+

        mxmlNewOpaque

        -+

        Create a new opaque string.

        -+

        -+mxml_node_t *mxmlNewOpaque (
        -+    mxml_node_t *parent,
        -+    const char *opaque
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        opaque
        -+
        Opaque string
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new opaque node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+opaque node has no parent. The opaque string must be nul-terminated and -+is copied into the new node.

        -+

        mxmlNewReal

        -+

        Create a new real number node.

        -+

        -+mxml_node_t *mxmlNewReal (
        -+    mxml_node_t *parent,
        -+    double real
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        real
        -+
        Real number value
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new real number node is added to the end of the specified parent's -+child list. The constant MXML_NO_PARENT can be used to specify that -+the new real number node has no parent.

        -+

        mxmlNewText

        -+

        Create a new text fragment node.

        -+

        -+mxml_node_t *mxmlNewText (
        -+    mxml_node_t *parent,
        -+    int whitespace,
        -+    const char *string
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        string
        -+
        String
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new text node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+text node has no parent. The whitespace parameter is used to specify -+whether leading whitespace is present before the node. The text -+string must be nul-terminated and is copied into the new node.

        -+

        mxmlNewTextf

        -+

        Create a new formatted text fragment node.

        -+

        -+mxml_node_t *mxmlNewTextf (
        -+    mxml_node_t *parent,
        -+    int whitespace,
        -+    const char *format,
        -+    ...
        -+);

        -+

        Parameters

        -+
        -+
        parent
        -+
        Parent node or MXML_NO_PARENT
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        format
        -+
        Printf-style frmat string
        -+
        ...
        -+
        Additional args as needed
        -+
        -+

        Return Value

        -+

        New node

        -+

        Discussion

        -+

        The new text node is added to the end of the specified parent's child -+list. The constant MXML_NO_PARENT can be used to specify that the new -+text node has no parent. The whitespace 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.

        -+

        -+mxml_node_t *mxmlNewXML (
        -+    const char *version
        -+);

        -+

        Parameters

        -+
        -+
        version
        -+
        Version number to use
        -+
        -+

        Return Value

        -+

        New ?xml node

        -+

        Discussion

        -+

        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.

        -+

        -+int mxmlRelease (
        -+    mxml_node_t *node
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node
        -+
        -+

        Return Value

        -+

        New reference count

        -+

        Discussion

        -+

        When the reference count reaches zero, the node (and any children) -+is deleted via mxmlDelete(). -+ -+

        -+

        mxmlRemove

        -+

        Remove a node from its parent.

        -+

        -+void mxmlRemove (
        -+    mxml_node_t *node
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to remove
        -+
        -+

        Discussion

        -+

        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.

        -+

        -+int mxmlRetain (
        -+    mxml_node_t *node
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node
        -+
        -+

        Return Value

        -+

        New reference count

        -+

         Mini-XML 2.3 mxmlSAXLoadFd

        -+

        Load a file descriptor into an XML node tree -+using a SAX callback.

        -+

        -+mxml_node_t *mxmlSAXLoadFd (
        -+    mxml_node_t *top,
        -+    int fd,
        -+    mxml_load_cb_t cb,
        -+    mxml_sax_cb_t sax_cb,
        -+    void *sax_data
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fd
        -+
        File descriptor to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the specified top node. -+If no top node is provided, the XML file MUST be well-formed with a -+single parent node like <?xml> for the entire file. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.
        -+
        -+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 callback.

        -+

        -+mxml_node_t *mxmlSAXLoadFile (
        -+    mxml_node_t *top,
        -+    FILE *fp,
        -+    mxml_load_cb_t cb,
        -+    mxml_sax_cb_t sax_cb,
        -+    void *sax_data
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        fp
        -+
        File to read from
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the file could not be read.

        -+

        Discussion

        -+

        The nodes in the specified file are added to the specified top node. -+If no top node is provided, the XML file MUST be well-formed with a -+single parent node like <?xml> for the entire file. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.
        -+
        -+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 callback.

        -+

        -+mxml_node_t *mxmlSAXLoadString (
        -+    mxml_node_t *top,
        -+    const char *s,
        -+    mxml_load_cb_t cb,
        -+    mxml_sax_cb_t sax_cb,
        -+    void *sax_data
        -+);

        -+

        Parameters

        -+
        -+
        top
        -+
        Top node
        -+
        s
        -+
        String to load
        -+
        cb
        -+
        Callback function or MXML_NO_CALLBACK
        -+
        sax_cb
        -+
        SAX callback or MXML_NO_CALLBACK
        -+
        sax_data
        -+
        SAX user data
        -+
        -+

        Return Value

        -+

        First node or NULL if the string has errors.

        -+

        Discussion

        -+

        The nodes in the specified string are added to the specified top node. -+If no top node is provided, the XML string MUST be well-formed with a -+single parent node like <?xml> for the entire string. The callback -+function returns the value type that should be used for child nodes. -+If MXML_NO_CALLBACK is specified then all child nodes will be either -+MXML_ELEMENT or MXML_TEXT nodes.
        -+
        -+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.
        -+
        -+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. -+ -+

        -+

        mxmlSaveAllocString

        -+

        Save an XML node tree to an allocated string.

        -+

        -+char *mxmlSaveAllocString (
        -+    mxml_node_t *node,
        -+    mxml_save_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        Allocated string or NULL

        -+

        Discussion

        -+

        This function returns a pointer to a string containing the textual -+representation of the XML node tree. The string should be freed -+using the free() function when you are done with it. NULL is returned -+if the node would produce an empty string or if the string cannot be -+allocated.
        -+
        -+The callback argument specifies a function that returns a whitespace -+string or NULL before and after each element. If MXML_NO_CALLBACK -+is specified, whitespace will only be added before MXML_TEXT nodes -+with leading whitespace and before attribute names inside opening -+element tags.

        -+

        mxmlSaveFd

        -+

        Save an XML tree to a file descriptor.

        -+

        -+int mxmlSaveFd (
        -+    mxml_node_t *node,
        -+    int fd,
        -+    mxml_save_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        fd
        -+
        File descriptor to write to
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        0 on success, -1 on error.

        -+

        Discussion

        -+

        The callback argument specifies a function that returns a whitespace -+string or NULL before and after each element. If MXML_NO_CALLBACK -+is specified, whitespace will only be added before MXML_TEXT nodes -+with leading whitespace and before attribute names inside opening -+element tags.

        -+

        mxmlSaveFile

        -+

        Save an XML tree to a file.

        -+

        -+int mxmlSaveFile (
        -+    mxml_node_t *node,
        -+    FILE *fp,
        -+    mxml_save_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        fp
        -+
        File to write to
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        0 on success, -1 on error.

        -+

        Discussion

        -+

        The callback argument specifies a function that returns a whitespace -+string or NULL before and after each element. If MXML_NO_CALLBACK -+is specified, whitespace will only be added before MXML_TEXT nodes -+with leading whitespace and before attribute names inside opening -+element tags.

        -+

        mxmlSaveString

        -+

        Save an XML node tree to a string.

        -+

        -+int mxmlSaveString (
        -+    mxml_node_t *node,
        -+    char *buffer,
        -+    int bufsize,
        -+    mxml_save_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to write
        -+
        buffer
        -+
        String buffer
        -+
        bufsize
        -+
        Size of string buffer
        -+
        cb
        -+
        Whitespace callback or MXML_NO_CALLBACK
        -+
        -+

        Return Value

        -+

        Size of string

        -+

        Discussion

        -+

        This function returns the total number of bytes that would be -+required for the string but only copies (bufsize - 1) characters -+into the specified buffer.
        -+
        -+The callback argument specifies a function that returns a whitespace -+string or NULL before and after each element. If MXML_NO_CALLBACK -+is specified, whitespace will only be added before MXML_TEXT nodes -+with leading whitespace and before attribute names inside opening -+element tags.

        -+

         Mini-XML 2.3 mxmlSetCDATA

        -+

        Set the element name of a CDATA node.

        -+

        -+int mxmlSetCDATA (
        -+    mxml_node_t *node,
        -+    const char *data
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        data
        -+
        New data string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

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

        -+

        -+int mxmlSetCustom (
        -+    mxml_node_t *node,
        -+    void *data,
        -+    mxml_custom_destroy_cb_t destroy
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        data
        -+
        New data pointer
        -+
        destroy
        -+
        New destructor function
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not a custom node. -+ -+

        -+

        mxmlSetCustomHandlers

        -+

        Set the handling functions for custom data.

        -+

        -+void mxmlSetCustomHandlers (
        -+    mxml_custom_load_cb_t load,
        -+    mxml_custom_save_cb_t save
        -+);

        -+

        Parameters

        -+
        -+
        load
        -+
        Load function
        -+
        save
        -+
        Save function
        -+
        -+

        Discussion

        -+

        The load function accepts a node pointer and a data string and must -+return 0 on success and non-zero on error.
        -+
        -+The save function accepts a node pointer and must return a malloc'd -+string on success and NULL on error.

        -+

        mxmlSetElement

        -+

        Set the name of an element node.

        -+

        -+int mxmlSetElement (
        -+    mxml_node_t *node,
        -+    const char *name
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        name
        -+
        New name string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an element node.

        -+

        mxmlSetErrorCallback

        -+

        Set the error message callback.

        -+

        -+void mxmlSetErrorCallback (
        -+    mxml_error_cb_t cb
        -+);

        -+

        Parameters

        -+
        -+
        cb
        -+
        Error callback function
        -+
        -+

        mxmlSetInteger

        -+

        Set the value of an integer node.

        -+

        -+int mxmlSetInteger (
        -+    mxml_node_t *node,
        -+    int integer
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        integer
        -+
        Integer value
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an integer node.

        -+

        mxmlSetOpaque

        -+

        Set the value of an opaque node.

        -+

        -+int mxmlSetOpaque (
        -+    mxml_node_t *node,
        -+    const char *opaque
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        opaque
        -+
        Opaque string
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not an opaque node.

        -+

        mxmlSetReal

        -+

        Set the value of a real number node.

        -+

        -+int mxmlSetReal (
        -+    mxml_node_t *node,
        -+    double real
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        real
        -+
        Real number value
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

        The node is not changed if it is not a real number node.

        -+

        mxmlSetText

        -+

        Set the value of a text node.

        -+

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

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        string
        -+
        String
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

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

        -+

        mxmlSetTextf

        -+

        Set the value of a text node to a formatted string.

        -+

        -+int mxmlSetTextf (
        -+    mxml_node_t *node,
        -+    int whitespace,
        -+    const char *format,
        -+    ...
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Node to set
        -+
        whitespace
        -+
        1 = leading whitespace, 0 = no whitespace
        -+
        format
        -+
        Printf-style format string
        -+
        ...
        -+
        Additional arguments as needed
        -+
        -+

        Return Value

        -+

        0 on success, -1 on failure

        -+

        Discussion

        -+

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

        -+

         Mini-XML 2.3 mxmlSetWrapMargin

        -+

        Set the the wrap margin when saving XML data.

        -+

        -+void mxmlSetWrapMargin (
        -+    int column
        -+);

        -+

        Parameters

        -+
        -+
        column
        -+
        Column for wrapping, 0 to disable wrapping
        -+
        -+

        Discussion

        -+

        Wrapping is disabled when "column" is 0. -+ -+

        -+

        mxmlWalkNext

        -+

        Walk to the next logical node in the tree.

        -+

        -+mxml_node_t *mxmlWalkNext (
        -+    mxml_node_t *node,
        -+    mxml_node_t *top,
        -+    int descend
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Next node or NULL

        -+

        Discussion

        -+

        The descend argument controls whether the first child is considered -+to be the next node. The top node argument constrains the walk to -+the node's children.

        -+

        mxmlWalkPrev

        -+

        Walk to the previous logical node in the tree.

        -+

        -+mxml_node_t *mxmlWalkPrev (
        -+    mxml_node_t *node,
        -+    mxml_node_t *top,
        -+    int descend
        -+);

        -+

        Parameters

        -+
        -+
        node
        -+
        Current node
        -+
        top
        -+
        Top node
        -+
        descend
        -+
        Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST
        -+
        -+

        Return Value

        -+

        Previous node or NULL

        -+

        Discussion

        -+

        The descend argument controls whether the previous node's last child -+is considered to be the previous node. The top node argument constrains -+the walk to the node's children.

        -+

        Data Types

        -+

        mxml_attr_t

        -+

        An XML element attribute value.

        -+

        -+typedef struct mxml_attr_s mxml_attr_t; -+

        -+

        mxml_custom_destroy_cb_t

        -+

        Custom data destructor

        -+

        -+typedef void (*mxml_custom_destroy_cb_t)(void *); -+

        -+

        mxml_custom_load_cb_t

        -+

        Custom data load callback function

        -+

        -+typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *); -+

        -+

        mxml_custom_save_cb_t

        -+

        Custom data save callback function

        -+

        -+typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *); -+

        -+

         Mini-XML 2.1 mxml_custom_t

        -+

        An XML custom value.

        -+

        -+typedef struct mxml_custom_s mxml_custom_t; -+

        -+

        mxml_element_t

        -+

        An XML element value.

        -+

        -+typedef struct mxml_element_s mxml_element_t; -+

        -+

        mxml_entity_cb_t

        -+

        Entity callback function

        -+

        -+typedef int (*mxml_entity_cb_t)(const char *); -+

        -+

        mxml_error_cb_t

        -+

        Error callback function

        -+

        -+typedef void (*mxml_error_cb_t)(const char *); -+

        -+

        mxml_index_t

        -+

        An XML node index.

        -+

        -+typedef struct mxml_index_s mxml_index_t; -+

        -+

        mxml_load_cb_t

        -+

        Load callback function

        -+

        -+typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); -+

        -+

        mxml_node_t

        -+

        An XML node.

        -+

        -+typedef struct mxml_node_s mxml_node_t; -+

        -+

        mxml_save_cb_t

        -+

        Save callback function

        -+

        -+typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); -+

        -+

        mxml_sax_cb_t

        -+

        SAX callback function

        -+

        -+typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); -+

        -+

        mxml_sax_event_t

        -+

        SAX event type.

        -+

        -+typedef enum mxml_sax_event_e mxml_sax_event_t; -+

        -+

        mxml_text_t

        -+

        An XML text value.

        -+

        -+typedef struct mxml_text_s mxml_text_t; -+

        -+

        mxml_type_t

        -+

        The XML node type.

        -+

        -+typedef enum mxml_type_e mxml_type_t; -+

        -+

        mxml_value_t

        -+

        An XML node value.

        -+

        -+typedef union mxml_value_u mxml_value_t; -+

        -+

        Structures

        -+

        mxml_attr_s

        -+

        An XML element attribute value.

        -+

        struct mxml_attr_s {
        -+    char *name;
        -+    char *value;
        -+};

        -+

        Members

        -+
        -+
        name
        -+
        Attribute name
        -+
        value
        -+
        Attribute value
        -+
        -+

         Mini-XML 2.1 mxml_custom_s

        -+

        An XML custom value.

        -+

        struct mxml_custom_s {
        -+    void *data;
        -+    mxml_custom_destroy_cb_t destroy;
        -+};

        -+

        Members

        -+
        -+
        data
        -+
        Pointer to (allocated) custom data
        -+
        destroy
        -+
        Pointer to destructor function
        -+
        -+

        mxml_element_s

        -+

        An XML element value.

        -+

        struct mxml_element_s {
        -+    mxml_attr_t *attrs;
        -+    char *name;
        -+    int num_attrs;
        -+};

        -+

        Members

        -+
        -+
        attrs
        -+
        Attributes
        -+
        name
        -+
        Name of element
        -+
        num_attrs
        -+
        Number of attributes
        -+
        -+

        mxml_index_s

        -+

        An XML node index.

        -+

        struct mxml_index_s {
        -+    int alloc_nodes;
        -+    char *attr;
        -+    int cur_node;
        -+    mxml_node_t **nodes;
        -+    int num_nodes;
        -+};

        -+

        Members

        -+
        -+
        alloc_nodes
        -+
        Allocated nodes in index
        -+
        attr
        -+
        Attribute used for indexing or NULL
        -+
        cur_node
        -+
        Current node
        -+
        nodes
        -+
        Node array
        -+
        num_nodes
        -+
        Number of nodes in index
        -+
        -+

        mxml_node_s

        -+

        An XML node.

        -+

        struct mxml_node_s {
        -+    struct mxml_node_s *child;
        -+    struct mxml_node_s *last_child;
        -+    struct mxml_node_s *next;
        -+    struct mxml_node_s *parent;
        -+    struct mxml_node_s *prev;
        -+    int ref_count;
        -+    mxml_type_t type;
        -+    void *user_data;
        -+    mxml_value_t value;
        -+};

        -+

        Members

        -+
        -+
        child
        -+
        First child node
        -+
        last_child
        -+
        Last child node
        -+
        next
        -+
        Next node under same parent
        -+
        parent
        -+
        Parent node
        -+
        prev
        -+
        Previous node under same parent
        -+
        ref_count
        -+
        Use count
        -+
        type
        -+
        Node type
        -+
        user_data
        -+
        User data
        -+
        value
        -+
        Node value
        -+
        -+

        mxml_text_s

        -+

        An XML text value.

        -+

        struct mxml_text_s {
        -+    char *string;
        -+    int whitespace;
        -+};

        -+

        Members

        -+
        -+
        string
        -+
        Fragment string
        -+
        whitespace
        -+
        Leading whitespace?
        -+
        -+

        Unions

        -+

        mxml_value_u

        -+

        An XML node value.

        -+

        union mxml_value_u {
        -+    mxml_custom_t custom;
        -+    mxml_element_t element;
        -+    int integer;
        -+    char *opaque;
        -+    double real;
        -+    mxml_text_t text;
        -+};

        -+

        Members

        -+
        -+
        custom  Mini-XML 2.1 
        -+
        Custom data
        -+
        element
        -+
        Element
        -+
        integer
        -+
        Integer number
        -+
        opaque
        -+
        Opaque string
        -+
        real
        -+
        Real number
        -+
        text
        -+
        Text fragment
        -+
        -+

        Constants

        -+

        mxml_sax_event_e

        -+

        SAX event type.

        -+

        Constants

        -+
        -+
        MXML_SAX_CDATA
        -+
        CDATA node
        -+
        MXML_SAX_COMMENT
        -+
        Comment node
        -+
        MXML_SAX_DATA
        -+
        Data node
        -+
        MXML_SAX_DIRECTIVE
        -+
        Processing directive node
        -+
        MXML_SAX_ELEMENT_CLOSE
        -+
        Element closed
        -+
        MXML_SAX_ELEMENT_OPEN
        -+
        Element opened
        -+
        -+

        mxml_type_e

        -+

        The XML node type.

        -+

        Constants

        -+
        -+
        MXML_CUSTOM  Mini-XML 2.1 
        -+
        Custom data
        -+
        MXML_ELEMENT
        -+
        XML element with attributes
        -+
        MXML_IGNORE  Mini-XML 2.3 
        -+
        Ignore/throw away node
        -+
        MXML_INTEGER
        -+
        Integer value
        -+
        MXML_OPAQUE
        -+
        Opaque string
        -+
        MXML_REAL
        -+
        Real value
        -+
        MXML_TEXT
        -+
        Text fragment
        -+
        -+
      -+ -+ -diff -Naur mxml-2.6/doc/relnotes.html mxml-2.6-haiku/doc/relnotes.html ---- mxml-2.6/doc/relnotes.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/relnotes.html 2009-05-17 17:31:51.000000000 +0000 -@@ -0,0 +1,518 @@ -+ -+ -+ -+

      BRelease Notes

      -+ -+ -+

      Changes in Mini-XML 2.6

      -+ -+
        -+ -+
      • Documentation fixes (STR #91, STR #92)
      • -+ -+
      • The mxmldoc program did not handle typedef comments properly (STR -+ #72)
      • -+ -+
      • Added support for "long long" printf formats.
      • -+ -+
      • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
      • -+ -+
      • The mxmldoc program now supports generating Xcode documentation -+ sets.
      • -+ -+
      • mxmlSave*() did not output UTF-8 correctly on some platforms.
      • -+ -+
      • mxmlNewXML() now adds encoding="utf-8" in the ?xml -+ directive to avoid problems with non-conformant XML parsers that assume -+ something other than UTF-8 as the default encoding.
      • -+ -+
      • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and -+ "<?xml ... ?>" was always followed by a newline -+ (STR #76)
      • -+ -+
      • The mxml.pc.in file was broken (STR #79)
      • -+ -+
      • The mxmldoc program now handles "typedef enum name {} -+ name" correctly (STR #72)
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.5

      -+ -+
        -+ -+
      • The mxmldoc program now makes greater use of CSS and -+ supports a --css option to embed an alternate stylesheet.
      • -+ -+
      • The mxmldoc program now supports --header and --footer -+ options to insert documentation content before and -+ after the generated content.
      • -+ -+
      • The mxmldoc program now supports a --framed option to -+ generate framed HTML output.
      • -+ -+
      • The mxmldoc program now creates a table of contents -+ including any headings in the --intro file when -+ generating HTML output.
      • -+ -+
      • The man pages and man page output from mxmldoc did -+ not use "\-" for dashes (STR #68)
      • -+ -+
      • The debug version of the Mini-XML DLL could not be -+ built (STR #65)
      • -+ -+
      • Processing instructions and directives did not work -+ when not at the top level of a document (STR #67)
      • -+ -+
      • Spaces around the "=" in attributes were not supported -+ (STR #67)
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.4

      -+ -+
        -+ -+
      • Fixed shared library build problems on HP-UX and Mac OS X.
      • -+ -+
      • The mxmldoc program did not output argument descriptions -+ for functions properly.
      • -+ -+
      • All global settings (custom, error, and entity callbacks -+ and the wrap margin) are now managed separately for each -+ thread.
      • -+ -+
      • Added mxmlElementDeleteAttr() function (STR #59)
      • -+ -+
      • mxmlElementSetAttrf() did not work (STR #57)
      • -+ -+
      • mxmlLoad*() incorrectly treated declarations as parent -+ elements (STR #56)
      • -+ -+
      • mxmlLoad*() incorrectly allowed attributes without -+ values (STR #47)
      • -+ -+
      • Fixed Visual C++ build problems (STR #49)
      • -+ -+
      • mxmlLoad*() did not return NULL when an element -+ contained an error (STR #46)
      • -+ -+
      • Added support for the apos character entity (STR -+ #54)
      • Fixed whitespace detection with Unicode -+ characters (STR #48)
      • -+ -+
      • mxmlWalkNext() and mxmlWalkPrev() did not work correctly -+ when called with a node with no children as the top node -+ (STR #53)
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.3

      -+ -+
        -+ -+
      • Added two exceptions to the LGPL to support static -+ linking of applications against Mini-XML
      • -+ -+
      • The mxmldoc utility can now generate man pages, -+ too.
      • -+ -+
      • Added a mxmlNewXML() function
      • -+ -+
      • Added a mxmlElementSetAttrf() function (STR #43)
      • -+ -+
      • Added a snprintf() emulation function for the test -+ program (STR #32)
      • -+ -+
      • Added the _CRT_SECURE_NO_DEPRECATE definition when -+ building on VC++ 2005 (STR #36)
      • -+ -+
      • mxmlLoad*() did not detect missing > characters in -+ elements (STR #41)
      • -+ -+
      • mxmlLoad*() did not detect missing close tags at the -+ end of an XML document (STR #45)
      • -+ -+
      • Added user_data and ref_count members to mxml_node_t -+ structure
      • -+ -+
      • Added mxmlReleaseNode() and mxmlRetainNode() APIs for -+ reference-counted nodes
      • -+ -+
      • Added mxmlSetWrapMargin() to control the wrapping of -+ XML output
      • -+ -+
      • Added conditional check for EINTR error code for -+ certain Windows compilers that do not define it (STR -+ #33)
      • -+ -+
      • The mxmldoc program now generates correct HTML 4.0 -+ output - previously it generated invalid XHTML
      • -+ -+
      • The mxmldoc program now supports "@deprecated@, -+ "@private@", and "@since version@" comments
      • -+ -+
      • Fixed function and enumeration type bugs in -+ mxmldoc
      • -+ -+
      • Fixed the XML schema for mxmldoc
      • -+ -+
      • The mxmldoc program now supports --intro, --section, -+ and --title options
      • -+ -+
      • The mxmlLoad*() functions could leak a node on an -+ error (STR #27)
      • -+ -+
      • The mxml_vsnprintf() function could get in an -+ infinite loop on a buffer overflow (STR #25)
      • -+ -+
      • Added new mxmlNewCDATA() and mxmlSetCDATA() functions -+ to create and set CDATA nodes, which are really just -+ special element nodes
      • -+ -+
      • Added new MXML_IGNORE type and MXML_IGNORE_CB -+ callback to ignore non-element nodes, e.g. -+ whitespace
      • -+ -+
      • mxmlLoad*() did not treat custom data as opaque, so -+ whitespace characters would be lost
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.2.2

      -+ -+
        -+ -+
      • mxmlLoad*() did not treat custom data as opaque, so -+ whitespace characters would be lost.
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.2.1

      -+ -+
        -+ -+
      • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() -+ now correctly return NULL on error (STR #21)
      • -+ -+
      • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), -+ mxmlNewText(), and mxmlNewTextf() incorrectly required a -+ parent node (STR #22)
      • -+ -+
      • Fixed an XML output bug in mxmldoc.
      • -+ -+
      • The "make install" target now uses the install -+ command to set the proper permissions on -+ UNIX/Linux/OSX.
      • -+ -+
      • Fixed a MingW/Cygwin compilation problem (STR -+ #18)
      • -+ -+
      -+ -+ -+

      Changes in Mini-XML 2.2

      -+ -+
        -+ -+
      • Added shared library support (STR #17)
      • -+ -+
      • mxmlLoad*() now returns an error when an XML stream -+ contains illegal control characters (STR #10)
      • -+ -+
      • mxmlLoad*() now returns an error when an element -+ contains two attributes with the same name in -+ conformance with the XML spec (STR #16)
      • -+ -+
      • Added support for CDATA (STR #14, STR #15)
      • -+ -+
      • Updated comment and processing instruction handling - -+ no entity support per XML specification.
      • -+ -+
      • Added checking for invalid comment termination ("--->" -+ is not allowed)
      • -+ -+
      -+ -+

      Changes in Mini-XML 2.1

      -+ -+
        -+ -+
      • Added support for custom data nodes (STR #6)
      • -+ -+
      • Now treat UTF-8 sequences which are longer than -+ necessary as an error (STR #4)
      • -+ -+
      • Fixed entity number support (STR #8)
      • -+ -+
      • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
      • -+ -+
      • Fixed entity lookup bug (STR #5)
      • -+ -+
      • Added mxmlLoadFd() and mxmlSaveFd() functions.
      • -+ -+
      • Fixed multi-word UTF-16 handling.
      • -+ -+
      -+ -+

      Changes in Mini-XML 2.0

      -+ -+
        -+ -+
      • New programmers manual.
      • -+ -+
      • Added Visual C++ project files for Microsoft Windows -+ users.
      • -+ -+
      • Added optimizations to mxmldoc, mxmlSaveFile(), and -+ mxmlIndexNew() (STR #2)
      • -+ -+
      • mxmlEntityAddCallback() now returns an integer -+ status (STR #2)
      • -+ -+
      • Added UTF-16 support (input only; all output is -+ UTF-8)
      • -+ -+
      • Added index functions to build a searchable index of -+ XML nodes.
      • -+ -+
      • Added character entity callback interface to support -+ additional character entities beyond those defined in -+ the XHTML specification.
      • -+ -+
      • Added support for XHTML character entities.
      • -+ -+
      • The mxmldoc utility now produces XML output which -+ conforms to an updated XML schema, described in the file -+ "doc/mxmldoc.xsd".
      • -+ -+
      • Changed the whitespace callback interface to return -+ strings instead of a single character, allowing for -+ greater control over the formatting of XML files written -+ using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES TO -+ YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -+ -+
      • The mxmldoc utility now produces XML output which -+ conforms to an updated XML schema, described in the file -+ "doc/mxmldoc.xsd".
      • -+ -+
      • Changed the whitespace callback interface to return -+ strings instead of a single character, allowing for -+ greater control over the formatting of XML files written -+ using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES TO -+ YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -+ -+
      • The mxmldoc utility is now capable of documenting C++ -+ classes, functions, and structures, and correctly -+ handles C++ comments.
      • -+ -+
      • Added new modular tests for mxmldoc.
      • -+ -+
      • Updated the mxmldoc output to be more compatible with -+ embedding in manuals produced with HTMLDOC.
      • -+ -+
      • The makefile incorrectly included a "/" separator -+ between the destination path and install path. This -+ caused problems when building and installing with -+ MingW.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.3

      -+ -+
        -+ -+
      • Fixes for mxmldoc.
      • -+ -+
      • Added support for reading standard HTML entity names.
      • -+ -+
      • mxmlLoadString/File() did not decode character -+ entities in element names, attribute names, or -+ attribute values.
      • -+ -+
      • mxmlLoadString/File() would crash when loading non- -+ conformant XML data under an existing parent (top) -+ node.
      • -+ -+
      • Fixed several bugs in the mxmldoc utility.
      • -+ -+
      • Added new error callback function to catch a variety -+ of errors and log them to someplace other than stderr.
      • -+ -+
      • The mxmlElementSetAttr() function now allows for NULL -+ attribute values.
      • -+ -+
      • The load and save functions now properly handle quoted -+ element and attribute name strings properly, e.g. for -+ !DOCTYPE declarations.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.2

      -+ -+
        -+ -+
      • Added new "set" methods to set the value of a node.
      • -+ -+
      • Added new formatted text methods mxmlNewTextf() and -+ mxmlSetTextf() to create/set a text node value using -+ printf-style formats.
      • -+ -+
      • Added new standard callbacks for use with the mxmlLoad -+ functions.
      • -+ -+
      • Updated the HTML documentation to include examples of -+ the walk and load function output.
      • -+ -+
      • Added --with/without-ansi configure option to control -+ the strdup() function check.
      • -+ -+
      • Added --with/without-snprintf configure option to -+ control the snprintf() and vsnprintf() function -+ checks.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.1.2

      -+ -+
        -+ -+
      • The mxml(3) man page wasn't updated for the string -+ functions.
      • -+ -+
      • mxmlSaveString() returned the wrong number of -+ characters.
      • -+ -+
      • mxml_add_char() updated the buffer pointer in the -+ wrong place.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.1.1

      -+ -+
        -+ -+
      • The private mxml_add_ch() function did not update the -+ start-of-buffer pointer which could cause a crash when -+ using mxmlSaveString().
      • -+ -+
      • The private mxml_write_ws() function called putc() -+ instead of using the proper callback which could cause -+ a crash when using mxmlSaveString().
      • -+ -+
      • Added a mxmlSaveAllocString() convenience function for -+ saving an XML node tree to an allocated string.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.1

      -+ -+
        -+ -+
      • The mxmlLoadFile() function now uses dynamically -+ allocated string buffers for element names, attribute -+ names, and attribute values. Previously they were -+ capped at 16383, 255, and 255 bytes, respectively.
      • -+ -+
      • Added a new mxmlLoadString() function for loading an -+ XML node tree from a string.
      • -+ -+
      • Added a new mxmlSaveString() function for saving an -+ XML node tree to a string.
      • -+ -+
      • Add emulation of strdup() if the local platform does -+ not provide the function.
      • -+ -+
      -+ -+

      Changes in Mini-XML 1.0

      -+ -+
        -+ -+
      • The mxmldoc program now handles function arguments, -+ structures, unions, enumerations, classes, and -+ typedefs properly.
      • -+ -+
      • Documentation provided via mxmldoc and more in-line -+ comments in the code.
      • -+ -+
      • Added man pages and packaging files.
      • -+ -+
      -+ -+

      Changes in Mini-XML 0.93

      -+ -+
        -+ -+
      • New mxmldoc example program that is also used to -+ create and update code documentation using XML and -+ produce HTML reference pages.
      • -+ -+
      • Added mxmlAdd() and mxmlRemove() functions to add and -+ remove nodes from a tree. This provides more -+ flexibility over where the nodes are inserted and -+ allows nodes to be moved within the tree as needed.
      • -+ -+
      • mxmlLoadFile() now correctly handles comments.
      • -+ -+
      • mxmlLoadFile() now supports the required "gt", "quot", -+ and "nbsp" character entities.
      • -+ -+
      • mxmlSaveFile() now uses newlines as whitespace -+ when valid to do so.
      • -+ -+
      • mxmlFindElement() now also takes attribute name and -+ attribute value string arguments to limit the search -+ to specific elements with attributes and/or values.
      • -+ NULL pointers can be used as "wildcards". -+ -+
      • Added uninstall target to makefile, and auto-reconfig -+ if Makefile.in or configure.in are changed.
      • -+ -+
      • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() -+ now all provide "descend" arguments to control whether -+ they descend into child nodes in the tree.
      • -+ -+
      • Fixed some whitespace issues in mxmlLoadFile().
      • -+ -+
      • Fixed Unicode output and whitespace issues in -+ mxmlSaveFile().
      • -+ -+
      • mxmlSaveFile() now supports a whitespace callback to -+ provide more human-readable XML output under program -+ control.
      • -+ -+
      -+ -+

      Changes in Mini-XML 0.92

      -+ -+
        -+ -+
      • mxmlSaveFile() didn't return a value on success.
      • -+ -+
      -+ -+

      Changes in Mini-XML 0.91

      -+ -+
        -+ -+
      • mxmlWalkNext() would go into an infinite loop.
      • -+ -+
      -+ -+

      Changes in Mini-XML 0.9

      -+ -+
        -+ -+
      • Initial public release.
      • -+ -+
      -+ -+ -+ -diff -Naur mxml-2.6/doc/schema.html mxml-2.6-haiku/doc/schema.html ---- mxml-2.6/doc/schema.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/schema.html 2007-04-26 22:21:37.000000000 +0000 -@@ -0,0 +1,201 @@ -+ -+ -+ -+

      DXML 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
      -+
      -+ -+

      mxmldoc.xsd

      -+ -+
      
      -+<?xml version="1.0"?>
      -+<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.
      -+    </xsd:documentation>
      -+  </xsd:annotation>
      -+
      -+  <!-- basic element definitions -->
      -+  <xsd:element name="argument" type="argumentType"/>
      -+  <xsd:element name="class" type="classType"/>
      -+  <xsd:element name="constant" type="constantType"/>
      -+  <xsd:element name="description" type="xsd:string"/>
      -+  <xsd:element name="enumeration" type="enumerationType"/>
      -+  <xsd:element name="function" type="functionType"/>
      -+  <xsd:element name="mxmldoc" type="mxmldocType"/>
      -+  <xsd:element name="namespace" type="namespaceType"/>
      -+  <xsd:element name="returnvalue" type="returnvalueType"/>
      -+  <xsd:element name="seealso" type="identifierList"/>
      -+  <xsd:element name="struct" type="structType"/>
      -+  <xsd:element name="typedef" type="typedefType"/>
      -+  <xsd:element name="type" type="xsd:string"/>
      -+  <xsd:element name="union" type="unionType"/>
      -+  <xsd:element name="variable" type="variableType"/>
      -+
      -+  <!-- descriptions of complex elements -->
      -+  <xsd:complexType name="argumentType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="default" type="xsd:string" use="optional"/>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="direction" type="direction" use="optional"
      -+     default="I"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="classType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="class"/>
      -+	<xsd:element ref="enumeration"/>
      -+	<xsd:element ref="function"/>
      -+	<xsd:element ref="struct"/>
      -+	<xsd:element ref="typedef"/>
      -+	<xsd:element ref="union"/>
      -+	<xsd:element ref="variable"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="parent" type="xsd:string" use="optional"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="constantType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="enumerationType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="functionType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
      -+      <xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+    <xsd:attribute name="scope" type="scope" use="optional"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="mxmldocType">
      -+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+      <xsd:element ref="class"/>
      -+      <xsd:element ref="enumeration"/>
      -+      <xsd:element ref="function"/>
      -+      <xsd:element ref="namespace"/>
      -+      <xsd:element ref="struct"/>
      -+      <xsd:element ref="typedef"/>
      -+      <xsd:element ref="union"/>
      -+      <xsd:element ref="variable"/>
      -+    </xsd:choice>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="namespaceType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="class"/>
      -+	<xsd:element ref="enumeration"/>
      -+	<xsd:element ref="function"/>
      -+	<xsd:element ref="struct"/>
      -+	<xsd:element ref="typedef"/>
      -+	<xsd:element ref="union"/>
      -+	<xsd:element ref="variable"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="returnvalueType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="structType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -+	<xsd:element ref="variable"/>
      -+	<xsd:element ref="function"/>
      -+      </xsd:choice>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="typedefType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="unionType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+      <xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <xsd:complexType name="variableType">
      -+    <xsd:sequence>
      -+      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -+      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -+    </xsd:sequence>
      -+    <xsd:attribute name="name" type="identifier" use="required"/>
      -+  </xsd:complexType>
      -+
      -+  <!-- data types -->
      -+  <xsd:simpleType name="direction">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:enumeration value="I"/>
      -+      <xsd:enumeration value="O"/>
      -+      <xsd:enumeration value="IO"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="identifier">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="identifierList">
      -+    <xsd:list itemType="identifier"/>
      -+  </xsd:simpleType>
      -+
      -+  <xsd:simpleType name="scope">
      -+    <xsd:restriction base="xsd:string">
      -+      <xsd:enumeration value=""/>
      -+      <xsd:enumeration value="private"/>
      -+      <xsd:enumeration value="protected"/>
      -+      <xsd:enumeration value="public"/>
      -+    </xsd:restriction>
      -+  </xsd:simpleType>
      -+</xsd:schema>
      -+
      -+ -+ -+ -diff -Naur mxml-2.6/doc/title.html mxml-2.6-haiku/doc/title.html ---- mxml-2.6/doc/title.html 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/doc/title.html 2009-05-17 06:04:58.000000000 +0000 -@@ -0,0 +1,37 @@ -+ -+ -+ -+ Mini-XML Programmers Manual -+ -+ -+ -+ -+ -+ -+ -+
      -+ -+

      Mini-XML Programmers Manual
      -+Version 2.6

      -+ -+

      MICHAEL R. SWEET

      -+ -+
      -+ -+ -+

      Mini-XML Programmers Manual, Version 2.6

      -+ -+

      Copyright © 2003-2009 by Michael R. Sweet

      -+ -+

      Permission is granted to copy, distribute and/or modify -+this document under the terms of the GNU Library General Public -+License, Version 2. A copy of this license is included in Appendix A - Mini-XML License.

      -+ -+

      This book was created solely using free software -+tools.

      -+ -+

      First Printing: April 2007

      -+ -+ -+ -diff -Naur mxml-2.6/install-sh mxml-2.6-haiku/install-sh ---- mxml-2.6/install-sh 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/install-sh 2005-04-24 23:23:59.000000000 +0000 -@@ -0,0 +1,251 @@ -+#!/bin/sh -+# -+# install - install a program, script, or datafile -+# This comes from X11R5 (mit/util/scripts/install.sh). -+# -+# Copyright 1991 by the Massachusetts Institute of Technology -+# -+# Permission to use, copy, modify, distribute, and sell this software and its -+# documentation for any purpose is hereby granted without fee, provided that -+# the above copyright notice appear in all copies and that both that -+# copyright notice and this permission notice appear in supporting -+# documentation, and that the name of M.I.T. not be used in advertising or -+# publicity pertaining to distribution of the software without specific, -+# written prior permission. M.I.T. makes no representations about the -+# suitability of this software for any purpose. It is provided "as is" -+# without express or implied warranty. -+# -+# Calling this script install-sh is preferred over install.sh, to prevent -+# `make' implicit rules from creating a file called install from it -+# when there is no Makefile. -+# -+# This script is compatible with the BSD install script, but was written -+# from scratch. It can only install one file at a time, a restriction -+# shared with many OS's install programs. -+ -+ -+# set DOITPROG to echo to test this script -+ -+# Don't use :- since 4.3BSD and earlier shells don't like it. -+doit="${DOITPROG-}" -+ -+ -+# put in absolute paths if you don't have them in your path; or use env. vars. -+ -+mvprog="${MVPROG-mv}" -+cpprog="${CPPROG-cp}" -+chmodprog="${CHMODPROG-chmod}" -+chownprog="${CHOWNPROG-chown}" -+chgrpprog="${CHGRPPROG-chgrp}" -+stripprog="${STRIPPROG-strip}" -+rmprog="${RMPROG-rm}" -+mkdirprog="${MKDIRPROG-mkdir}" -+ -+transformbasename="" -+transform_arg="" -+instcmd="$mvprog" -+chmodcmd="$chmodprog 0755" -+chowncmd="" -+chgrpcmd="" -+stripcmd="" -+rmcmd="$rmprog -f" -+mvcmd="$mvprog" -+src="" -+dst="" -+dir_arg="" -+ -+while [ x"$1" != x ]; do -+ case $1 in -+ -c) instcmd="$cpprog" -+ shift -+ continue;; -+ -+ -d) dir_arg=true -+ shift -+ continue;; -+ -+ -m) chmodcmd="$chmodprog $2" -+ shift -+ shift -+ continue;; -+ -+ -o) chowncmd="$chownprog $2" -+ shift -+ shift -+ continue;; -+ -+ -g) chgrpcmd="$chgrpprog $2" -+ shift -+ shift -+ continue;; -+ -+ -s) stripcmd="$stripprog" -+ shift -+ continue;; -+ -+ -t=*) transformarg=`echo $1 | sed 's/-t=//'` -+ shift -+ continue;; -+ -+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'` -+ shift -+ continue;; -+ -+ *) if [ x"$src" = x ] -+ then -+ src=$1 -+ else -+ # this colon is to work around a 386BSD /bin/sh bug -+ : -+ dst=$1 -+ fi -+ shift -+ continue;; -+ esac -+done -+ -+if [ x"$src" = x ] -+then -+ echo "install: no input file specified" -+ exit 1 -+else -+ : -+fi -+ -+if [ x"$dir_arg" != x ]; then -+ dst=$src -+ src="" -+ -+ if [ -d $dst ]; then -+ instcmd=: -+ chmodcmd="" -+ else -+ instcmd=$mkdirprog -+ fi -+else -+ -+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -+# might cause directories to be created, which would be especially bad -+# if $src (and thus $dsttmp) contains '*'. -+ -+ if [ -f $src -o -d $src ] -+ then -+ : -+ else -+ echo "install: $src does not exist" -+ exit 1 -+ fi -+ -+ if [ x"$dst" = x ] -+ then -+ echo "install: no destination specified" -+ exit 1 -+ else -+ : -+ fi -+ -+# If destination is a directory, append the input filename; if your system -+# does not like double slashes in filenames, you may need to add some logic -+ -+ if [ -d $dst ] -+ then -+ dst="$dst"/`basename $src` -+ else -+ : -+ fi -+fi -+ -+## this sed command emulates the dirname command -+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` -+ -+# Make sure that the destination directory exists. -+# this part is taken from Noah Friedman's mkinstalldirs script -+ -+# Skip lots of stat calls in the usual case. -+if [ ! -d "$dstdir" ]; then -+defaultIFS=' -+ ' -+IFS="${IFS-${defaultIFS}}" -+ -+oIFS="${IFS}" -+# Some sh's can't handle IFS=/ for some reason. -+IFS='%' -+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -+IFS="${oIFS}" -+ -+pathcomp='' -+ -+while [ $# -ne 0 ] ; do -+ pathcomp="${pathcomp}${1}" -+ shift -+ -+ if [ ! -d "${pathcomp}" ] ; -+ then -+ $mkdirprog "${pathcomp}" -+ else -+ : -+ fi -+ -+ pathcomp="${pathcomp}/" -+done -+fi -+ -+if [ x"$dir_arg" != x ] -+then -+ $doit $instcmd $dst && -+ -+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && -+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && -+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && -+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi -+else -+ -+# If we're going to rename the final executable, determine the name now. -+ -+ if [ x"$transformarg" = x ] -+ then -+ dstfile=`basename $dst` -+ else -+ dstfile=`basename $dst $transformbasename | -+ sed $transformarg`$transformbasename -+ fi -+ -+# don't allow the sed command to completely eliminate the filename -+ -+ if [ x"$dstfile" = x ] -+ then -+ dstfile=`basename $dst` -+ else -+ : -+ fi -+ -+# Make a temp file name in the proper directory. -+ -+ dsttmp=$dstdir/#inst.$$# -+ -+# Move or copy the file name to the temp name -+ -+ $doit $instcmd $src $dsttmp && -+ -+ trap "rm -f ${dsttmp}" 0 && -+ -+# and set any options; do chmod last to preserve setuid bits -+ -+# If any of these fail, we abort the whole thing. If we want to -+# ignore errors from any of these, just make sure not to ignore -+# errors from the above "$doit $instcmd $src $dsttmp" command. -+ -+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && -+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && -+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && -+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && -+ -+# Now rename the file to the real destination. -+ -+ $doit $rmcmd -f $dstdir/$dstfile && -+ $doit $mvcmd $dsttmp $dstdir/$dstfile -+ -+fi && -+ -+ -+exit 0 -diff -Naur mxml-2.6/libmxml.so.2.6 mxml-2.6-haiku/libmxml.so.2.6 ---- mxml-2.6/libmxml.so.2.6 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/libmxml.so.2.6 2009-10-26 02:44:10.000000000 +0000 -@@ -0,0 +1,414 @@ -+ELF4¥4 (DzDzDzDŠDŠ´Ìl†l–l–¸¸ar^]oDY Tig0eZ#jdfA\UR`)c-Imanb',?1/O 8V! 2PqQ6( -+Wp4hSE>M.l &+"%5=9;*:FH<3@KJX$GNB[_7LCk|°k àk -+DŠ \– d– À—øŸ‡G׌c\€d Ï_(UIà)Bðì(‹k§§d°g"Ò§2ßb6»<ý,c]ÎÞ°i HÄaO¤0 CÉhÜj{Àè\$5²¦¡;x)fdC¥h%Ëy $N|ØŽ¿˜i  -+\(_* ÎgÈ#×ü,µJì!Œ·.ú'º" ÔeWkd*3/îLbSÀÈ&<ï°j*°J@;˜*$<^pÌ—µh&`-,fG:€fR`4ƒ8u9ƒ} u -+ë1v‹Gë+‹p‹x …ö~‹E ƒÄøP‹PèÝüÿÿƒÄ…ÀtÚNƒÇ…öâ1Àeè[^_‰ì]ÉöU‰åƒì WVSè[Úu‹}‹E…ÿtEƒ?u@ƒ} t:…ÀtƒÄôPèYüÿÿ‰ÆƒÄë¶1öƒÄüV‹E PW訃Ä…Àt ƒÄôVèœüÿÿeè[^_‰ì]ÉöU‰åƒì WVSè[Ã*u‹}‹U…ÿtcƒ?u^ƒ} tX…ÒtTEƒÄøPRèµH‰ÆƒÄ…öu ‹GƒÄüP‹E PƒÕÿÿPèÙFë%´&ƒÄüV‹E PWèƒÄ…Àt ƒÄôVèüÿÿeè[^_‰ì]ÃU‰åƒì WVSè[Þt‹E‹x‹p …ÿ~A¶‹U ƒÄøR‹PèûÿÿƒÄ…Àu‹F…Àt ƒÄôPè¶ûÿÿ‹E‰F1ÀéOƒÆ…ÿÅ‹U‹B…Àu ƒÄôjè=úÿÿëƒÄøÅP‹U‹B Pèôúÿÿ‰ÆƒÄ…öt3‹U‰r ƒÄô‹BÁàÆ‹E Pèáúÿÿ‰ƒÄ…Àt‹U‹E‰Vÿ@1Àë‹UƒÄü‹BP‹E PƒÕÿÿPèÂE¸ÿÿÿÿeè[^_‰ì]ÃU‰åƒìVSè[çsè?F‰Á‹qƒþc~ƒÄôƒ\ÕÿÿPè~E¸ÿÿÿÿë´&‹EQ‰²ÿA1Àeè[^‰ì]ÃU‰åSè[ÃSs‹EƒÀÞƒø‡±‰Ú+”ƒÜŒÿÿÿâ´&¼'”rŒrŒrŒr°rŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒrŒr¤rŒrœrƒ{Õÿÿët&ƒÕÿÿ냂Õÿÿë -+ƒ…Õÿÿë1À[‰ì]ÃU‰åƒì WVSè[ÃvrèE‰Æ1ÿ;~}‹UƒÄôFR‹¸ÿЃÄ…À} G;~|ä¸ÿÿÿÿeè[^_‰ì]ÉöU‰åƒìWVSè[Ã&rè¾D‰Â1ö‹B‰Á9Î}FB ‰Eôz‰}üB‹};<°u"Aÿ‰B9Æ}%ƒÄü)ðÁàP‹}ôW‹EüPèž÷ÿÿë ƒEôƒEüF9Î|ÆeØ[^_‰ì]ÃU‰åƒìWVSè[îqÇEüÇEøt&‹EüEø‰ÂÁê<ÑÿƒÄøƒ¬‰þÁæ‰Eô‹P‹URè~øÿÿƒÄ…Àt]} ‰}øët&‰}ü‹Eø+Eüƒø²‹uü‹UôÁæƒÄø‹P‹EPèEøÿÿƒÄ…Àt$‹uø‹UôÁæƒÄø‹P‹EPè%øÿÿ…Àt¸ÿÿÿÿë‹Uô‹DeØ[^_‰ì]ÃU‰å1À‹Uƒú tƒú t -+ƒú tƒú -+u¸‰ì]ÃvU‰åì VSè[ìp‹u‹E ‹M‰…ôßÿÿ•ôßÿÿ…àÿÿ‰…øßÿÿ‰…üßÿÿƒÄøjjƒè”ÿÿPQRVèÐ¥Øßÿÿ[^‰ì]ÃU‰åƒìVSè[ÃOp‹u‹M ‹UƒÄøjjƒ@›ÿÿPRQVè‘eè[^‰ì]ÃU‰åƒìSè[Ãp‹M‹UƒÄøjjƒ„³ÿÿPRE PQèV‹]è‰ì]ÃvU‰åì WVSè[ÃÓo‹E Ph µàÿÿV‹EPè{ƒÄ…À~@=þƒÄôVè„öÿÿë0¶ƒÄôxWèõÿÿ‰ÆƒÄ…öt‹E PWV‹EPè8‰ðë1À¥èßÿÿ[^_‰ì]ÃU‰åì WVSè[ÃKo‹u ‹}èÝA‰µôßÿÿµôßÿÿ•àÿÿ‰•øßÿÿ‰­üßÿÿƒÄøPƒ šÿÿPjWV‹EPè;'ƒÄ …À|~ƒÄøVj -+èûƒÄ…À}¸ÿÿÿÿë ƒÄôVè¨ ¥Øßÿÿ[^_‰ì]ÃvU‰åƒì WVSè[ún‹}‹uèLAƒÄøPƒ” ÿÿPjV‹E PWèÈ&ƒÄ …À|7~C‹ƒ€8t‹E ƒÄøPj -+èôÿÿ…À|ë$t&‹E ƒÄøPj -+è^õÿÿ…À}¸ÿÿÿÿë ´&1Àeè[^_‰ì]ÃU‰åƒìWVSè[Ã*n‹uè¿@‹U ‰Uø}øU‰WƒÄøPƒ·ÿÿPjVW‹EPè,&ƒÄ …À} ¸ÿÿÿÿë/‰ö…À~ ƒÄøWj -+èÕ$‹Eø;Gr ‹U‹E ÆDÿëÆ‹Eø+E eØ[^_‰ì]ÃU‰åì WVSè[Ûm‹E ‹}‹M‹U‰…ôßÿÿµôßÿÿ…àÿÿ‰…øßÿÿ‰…üßÿÿƒÄøRQƒè”ÿÿPWV‹EP軥Øßÿÿ[^_‰ì]ÉöU‰åƒì WVSè[Ã6m‹}‹u ‹M‹U‹EƒÄøPRƒ@›ÿÿPQVWèteè[^_‰ì]ÉöU‰åƒìVSè[Ãól‹u‹M‹U‹EƒÄøPRƒ„³ÿÿPQE PVè1eè[^‰ì]ÃU‰åƒì WVSè[òl‹u‹} èD?‰°œ‰¸ [^_‰ì]ÃU‰åƒìVSè[Ãl‹uè?‰0[^‰ì]ÃU‰åƒìVSè[Ã[l‹uèð>‰°˜[^‰ì]ÃU‰åƒì WVSè[Ã2l‹}‹u ‹E‹M‹‰ÐƒÀü9rzúÿ ‹EÒ‰ë ‹M‰‹UƒÄø‹P‹M‹Pèºòÿÿ‰ÂƒÄ…Òu-‹UƒÄô‹Pè#óÿÿ‹MƒÄø‹Pƒ<ÛÿÿPè²=¸ÿÿÿÿ釋M‹‹)Á‰ÈЉ‹E‰ƒÿ‹‰úˆëb´&ÿÿ ‹‰øÁø Àë:ÿÿÿ ‹‰øÁø à닉øÁø ðˆÿ‹‰øÁø $? €ˆÿ‹‰øÁø$? €ˆÿ‹‰ø$? €ˆÿ1Àeè[^_‰ì]ÃvU‰åƒì WVSè[à -+k‹} ‹U‹B9BrƒÄôRèDƒÄ…ÀŒS‹U‹B¶0ÿB‹ƒø„6 …Àt齃ø„Ô鯉ð„À|)ƒþ ƒþ -+„—ƒþ „Žƒþ …éé€þþuF‹U‹B9BrƒÄôR较ąÀŒÍ‹U‹B¶0ÿBþÿ…µÇé8ÿÿÿt&þÿuH‹U‹B9BrƒÄôRèpƒÄ…ÀŒ‹U‹B¶0ÿBþþ…gÇéêþÿÿ¶‰ð%à=Àud‹U‹B9BrƒÄôRèƒÄ…ÀŒ)‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…ƒæÁæƒâ? ÖƒþƒÄøVƒ¼ÛÿÿéÞ‰ð%ð=à…½‹U‹B9BrƒÄôR褃ąÀŒ³‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…‘ƒæÁæƒâ? Ö‹U‹B9BrƒÄôRèXƒÄ…ÀŒg‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…EÁæƒâ? ÖþÿƒÄøVƒ¼Ûÿÿé þÿþ…¦é£ýÿÿ‰ð%ø=ð…‹U‹B9BrƒÄôRèՃąÀŒä‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…ƒæÁæƒâ? Ö‹U‹B9BrƒÄôR艃ąÀŒ˜‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…vÁæƒâ? Ö‹U‹B9BrƒÄôRè@ƒÄ…ÀŒO‹U‹B1ÒŠ‹Eÿ@‰Ð%À=€…-Áæƒâ? Öþÿÿ¥ƒÄøVƒ¼Ûÿÿét&‹U‹B9BrƒÄôRèØƒÄ…ÀŒç‹UÁæ‹B1ÒŠ‹E Öÿ@ƒþƒþ -+tƒþ t ƒþ …ª†(ÿÿ=ÿ‡5‹U‹B9BrƒÄôRè{ƒÄ…ÀŒŠ‹U‹B¶8‹BÿB9Br ƒÄôRèS…À|i‹UÁç‹B1ÒŠ‹Eé·‹U‹B9BrƒÄôRè&ƒÄ…À|9‹U‹B1ÒŠ‹EÁâ Öÿ@ƒþ)ƒþ -+t$ƒþ tƒþ tƒÄøVƒ|ÛÿÿPèŠ8¸ÿÿÿÿ鄆(ÿÿ=ÿwu‹U‹B9BrƒÄôR軃Ä…À|΋U‹B¶8‹BÿB9Br ƒÄôRè—…À|­‹U‹B1ÒŠ‹EÁâ ×ÿ@‡$ÿÿ=þw‹æÿÁæ -+çÿ ÷·‰ðeè[^_‰ì]ÉöU‰åƒìVSè[Ãçe‹u ‹F9FrƒÄôV蜅À}¸ÿÿÿÿë ‹V‹EˆÿF1Àeè[^‰ì]ÃvU‰åƒì WVSè[Úe‹}…ÿu"ëK¶èwìÿÿ8 €t èjìÿÿ8 -+€u+ƒÄüh w V‹PèìÿÿƒÄ…À|Ët‰wD ‰G1Àë¸ÿÿÿÿeè[^_‰ì]ÃU‰åƒì WVSè[Ã"e‹}…ÿu¸ÿÿÿÿëAG ‰Eü‹G;Eüt1‹uü9Æs$t&‹GƒÄü)ðPV‹PèJëÿÿƒÄ…À|ÇÆ;wrà‹Eü‰G1Àeè[^_‰ì]ÉöU‰åƒì WVSè[òd‹} ‹ƒ€8t‹EƒÄôPèyêÿÿë ‹EƒÄôPè{êÿÿƒÄ‰Æƒþÿ„ú‹ƒø„V …Àtéäƒø„÷éÖ‰ð„À|)ƒþǃþ -+„¾ƒþ „µƒþ … é§þþuF‹ƒ€8t‹EƒÄôPèëéÿÿë ‹EƒÄôPèíéÿÿƒÄ‰Æþÿ…ØÇé1ÿÿÿt&þÿuH‹ƒ€8t‹EƒÄôPèéÿÿë ‹EƒÄôPèŸéÿÿƒÄ‰Æþþ…ŠÇéãþÿÿ´&‰ð%à=Àuh‹ƒ€8t‹EƒÄôPèGéÿÿë ‹EƒÄôPèIéÿÿƒÄƒøÿ„9‰ÂâÀú€…%ƒæÁæƒà? ƃþ¢ƒÄøVƒ¼Ûÿÿéü‰ð%ð=à…É‹ƒ€8t‹EƒÄôPèÍèÿÿë ‹EƒÄôPèÏèÿÿƒÄƒøÿ„¿‰ÂâÀú€…«ƒæÁæƒà? Æ‹ƒ€8t‹EƒÄôPè}èÿÿë ‹EƒÄôPèèÿÿƒÄƒøÿ„o‰ÂâÀú€…[Áæƒà? ÆþÿƒÄøVƒ¼Ûÿÿé6t&þÿþ…½é‹ýÿÿ‰ð%ø=ð…‹ƒ€8t‹EƒÄôPèòçÿÿët&‹EƒÄôPèðçÿÿƒÄƒøÿ„à‰ÂâÀú€…̃æÁæƒà? Æ‹ƒ€8t‹EƒÄôPèžçÿÿë ‹EƒÄôPè çÿÿƒÄƒøÿ„‰ÂâÀú€…|Áæƒà? Æ‹ƒ€8t‹EƒÄôPèQçÿÿëv‹EƒÄôPèPçÿÿƒÄƒøÿ„@‰ÂâÀú€…,Áæƒà? Æþÿÿ©ƒÄøVƒ¼Ûÿÿ鋃‰÷Áç€8t‹EƒÄôPèàæÿÿë‰ö‹EƒÄôPèàæÿÿƒÄ‰Æ þƒþƒþ -+tƒþ t ƒþ …­†(ÿÿ=ÿ‡=‹ƒ€8t‹EƒÄôPè‰æÿÿë ‹EƒÄôPè‹æÿÿƒÄ‰ÇÁ狃€8t‹EƒÄôPè\æÿÿë ‹EƒÄôPè^æÿÿ‰Â龋ƒ€8t‹EƒÄôPè0æÿÿë‰ö‹EƒÄôPè0æÿÿƒÄÁà ƃþ)ƒþ -+t$ƒþ tƒþ tƒÄøVƒ|ÛÿÿPè2¸ÿÿÿÿ鉆(ÿÿ=ÿwz‹ƒ€8t‹EƒÄôPèÆåÿÿë ‹EƒÄôPèÈåÿÿƒÄ‰Ç‹ƒ€8t‹EƒÄôPèœåÿÿë ‹EƒÄôPèžåÿÿ‰ÂÁâ ú‚$ÿÿ=þw†æÿÁæ -+âÿ ò²‰ðeè[^_‰ì]ÃvU‰åƒìSè[Ã`_‹M‹ƒ‹U €8tƒÄøRQèÖäÿÿƒøÿtëvƒÄøRQè2æÿÿƒøÿu¸ÿÿÿÿë1À‹]è‰ì]ÃU‰åƒìLWVSè[Ã_}À‰}¼ëCvEÿ9E¼s ‹U¼‰ðˆB‰U¼ë+ƒÄøƒéÛÿÿƒ}t‹U‹BPƒüÛÿÿPè¹0ƒÄë6t&‹EƒÄøP‹U R‹Uÿ҉ƃăþÿtƒþ~‹ƒ„‹öpu“ƒþ#tŽ‹E¼Æƒþ;t%ƒÄüƒéÛÿÿƒ}t‹U‹BPEÀPƒ<Üÿÿé€}À#u.€}ÁxuƒÄüjjEÂPè^äÿÿ‰ÆëIƒÄüj -+jEÁPèJäÿÿ‰Æë5ƒÄôWè‘ëÿÿ‰ÆƒÄ…ö}&ƒÄüƒéÛÿÿƒ}t‹U‹BPWƒ|ÜÿÿPèå/ƒÄƒþ=ƒþ -+t8ƒþ t3ƒþ t.ƒÄüƒéÛÿÿƒ}t‹U‹BPVƒ¼ÜÿÿPè«/¸ÿÿÿÿët&‰ðe¨[^_‰ì]ÃU‰åƒìtƒ}Ð/…òþÿÿ‹Eð9Eü†æþÿÿ‹EüÆ‹Uð‰ÖƒdÞÿÿ‰Ç¹ü¨ó¦…èë EôPEðPEüP‹EÐPèŽìÿÿƒÄ…À…V‹UÔƒÄøR‹M Q‹}ÿ׉EЃÄƒøÿt$ƒø>uÀ‹Eð‹UüƒÀ9Âv³€zý-t­€zþ-u§€zÿ-u¡ƒ}Ð>…ž‹EüÆ‹EðƒÄøP‹EèPè#‰ÆƒÄ…öu*ƒÄøƒéÛÿÿƒ}èt‹Uè‹BPƒœÞÿÿPè5*ƒÄé΃}„‹MƒÄüQjV‹}ÿ׃ÄôVè'%ƒÄ …À…÷1öéê‰ÖƒhÞÿÿ‰Ç¹ ü¨ó¦…ðë EôPEðPEüP‹EÐPèŒëÿÿƒÄ…À…T‹UÔƒÄøR‹M Q‹}ÿ׉EЃÄƒøÿt$ƒø>uÀƒÄüjƒÇÞÿÿP‹EüƒÀþPèQÞÿÿƒÄ…Àu¡ƒ}Ð>…§‹EüÆ‹EðƒÄøP‹EèPè"‰ÆƒÄ…öu%ƒÄøƒéÛÿÿƒ}èt‹Uè‹BPƒüÞÿÿéÂt&ƒ}t!‹MƒÄüQjV‹}ÿ׃ÄôVè.$ƒÄ …Àu1ö…ö„òƒ}ì…è‰uìéàŠuÀ‹Eü;Eðv¸€xÿ?u²ƒ}Ð>…È‹EüÆ‹EðƒÄøP‹EèPè!‰ÆƒÄ…öu!ƒÄøƒéÛÿÿƒ}èt‹Uè‹BPƒ|ßÿÿéÖƒ}„ ‹MƒÄüQjV‹}ÿ׃ÄôVèB#ƒÄ …À…ê1öét&tjƒ}Ð&u$‹MQEøP‹} W‹EèPè×öÿÿ‰EЃÄƒøÿ„oEôPEðPEüP‹UÐRè‡éÿÿƒÄ…À…OƒÄøEøP‹M Q‹}ÿ׉EЃÄƒøÿu•éè‹EüÆ‹EðƒÄøP‹EèPè& ‰ÆƒÄ…öu!ƒÄøƒéÛÿÿƒ}èt‹Uè‹BPƒÜßÿÿéæƒ}t!‹MƒÄüQjV‹}ÿ׃ÄôVèV"ƒÄ …Àu1ö…ö„ƒ}ìu‰uìƒ}è…‰uèƒ}„úé®t&t*ƒ}Ðÿt$t&‹EÔƒÄøP‹U R‹MÿщEЃÄƒø>tƒøÿuà‹uè‹~ ‰}èƒ}t‹EƒÄüPjV‹UÿÒƒÄôVèu!ƒÄ ƒ}„=ƒ}è„3‹MèƒÄôQ‹}ÿ×éäƒÄøR‹EèPèljƃąöu!ƒÄøƒéÛÿÿƒ}èt‹Uè‹BPƒ\àÿÿ釋MЃÄôQè ãÿÿƒÄ…Àt&‹}W‹EÔP‹U RVè‰EЃÄƒøÿ„\ë/vƒ}Ð/u&‹MÔƒÄøQ‹} W‹UÿÒ‰EЃÄƒø>…ûÇEÐ/ƒ}t‹MƒÄüQjV‹}ÿ׃ă}ìu‰uìƒ}Ðÿ„ -+ƒ}Ð/t#‰uèƒ}tK…ötGƒÄôV‹UÿÒ‰EàƒÄë6t&ƒ}t+‹MƒÄüQjV‹}ÿ׃ÄôVè> ƒÄ …Àu 9uìuÇEì‹Eð‰Eüéƒt&ƒ}Ð&u:‹EP‹UØR‹M Q‹}èWèÕóÿÿ‰EЃÄƒøÿ„mEôPEðPEüP‹EÐPë3t&ƒ}àtƒ}àt‹UЃÄôRèÈáÿÿƒÄ…Àu EôPEðPEüP‹MÐQèPæÿÿƒÄ…À…ƒÄø}ø‰}ØW‹E P‹UÿÒ‰EЃÄƒøÿ…aõÿÿ‹EðƒÄôPè¯ÙÿÿƒÄƒ}ètj‹uè‹F ë‰ö‹Mè‹I ‰Mè‹A ;Et…Àuë;uèt6‹V ƒÄüƒ àÿÿ…Òt‹BP‹FPƒÜàÿÿPè$‹}ìƒÄôWèÞé …öt ‰ðé–t&‹Eì鉃ÄôƒqÞÿÿë[ƒÄôƒÊÞÿÿëP‰öƒÄôƒ<ßÿÿëCt&ƒÄôƒ¼ßÿÿë3t&‹EðƒÄüP‹EÐPƒœàÿÿPè‰#ƒÄôVèhƒÄ ëƒÄôƒQÞÿÿPèl#ƒÄ‹UìƒÄôRèE‹EðƒÄôPè­Øÿÿ1Àe¸[^_‰ì]ÃU‰åƒìWVSè[Ã:QƒÄôj@è1×ÿÿ‰EøƒÄ…ÀuƒÄôƒáÿÿPè #逴&ÇEü@ƒÄôj@èûÖÿÿ‰EìƒÄ…Àu%‹EøƒÄôPè5ØÿÿƒÄôƒ\áÿÿPèÊ"é>t&ÇEð@é¬t&ƒÄôVèÇßÿÿƒÄ…À…”ƒþ/tƒþ?u2‹EƒÄøP‹U R‹Uÿ҉ǃăÿ>„ŠW‹U‹BPVƒœáÿÿ鸃þ<„Ÿƒþ>„d‹Eø‰òˆ‹Eø@‰Eôƒþ"t ƒþ'…·‰÷ëMƒþ&u#‹UR‹EP‹U R‹EPèñÿÿ‰ÆƒÄƒþÿ„gEüPEøPEôPVè¸ãÿÿƒÄ…À…J9þ„¨‹UƒÄøR‹E P‹Uÿ҉ƃăþÿu™é‰‰öƒþ&u#‹EP‹UR‹E P‹URè–ðÿÿ‰ÆƒÄƒþÿ„ùEüPEøPEôPVèJãÿÿƒÄ…À…Ü‹EƒÄøP‹U R‹Uÿ҉ƃăþÿt(ƒÄôVèxÞÿÿƒÄ…Àuƒþ=tƒþ/tƒþ>t ƒþ?…yÿÿÿ‹EôÆ‹EøƒÄøP‹EPèÙÿÿƒÄ…À…yë¶‹UƒÄøR‹E P‹Uÿ҉ƃăþÿtƒÄôVè ÞÿÿƒÄ…ÀuÖƒþ=…m‹EƒÄøP‹U R‹Uÿ҉ƃăþÿ„ñƒÄôVèÖÝÿÿƒÄ…ÀuÒƒþÿ„؃þ'tƒþ"u|‹Eì‰÷‰EôëG‰öƒþ&u#‹EP‹UR‹E P‹URèfïÿÿ‰ÆƒÄƒþÿ„ÉEðPEìPEôPVèâÿÿƒÄ…À…¬‹EƒÄøP‹U R‹Uÿ҉ƃăþÿ„›9þu™é’t&‹Eì‰òˆ‹Eì@‰EôëEƒþ&u#‹UR‹EP‹U R‹EPèæîÿÿ‰ÆƒÄƒþÿ„IEðPEìPEôPVèšáÿÿƒÄ…À…,‹UƒÄøR‹E P‹Uÿ҉ƃăþÿtƒÄôVèÈÜÿÿƒÄ…Àuƒþ=t -+ƒþ/tƒþ>u‚‹EôÆ‹EìƒÄüP‹EøP‹EPèÔ×ÿÿƒÄë#v‹UƒÄü‹BP‹EøPƒüáÿÿ鯴&ƒþ/tƒþ?u9‹EƒÄøP‹U R‹Uÿ҉ǃăÿ>tBW‹U‹BPVƒœáÿÿPè¾ÿÿÿÿƒÄë#ƒþ>t‹EƒÄøP‹U R‹Uÿ҉ƃăþÿ…:üÿÿ‹EøƒÄôPè:Ôÿÿ‹EìƒÄôPè.Ôÿÿ‰ðëL‹UƒÄü‹BP‹EøPƒüáÿÿë‹UƒÄø‹BPƒÒáÿÿP袃ċEøƒÄôPèïÓÿÿ‹EìƒÄôPèãÓÿÿ¸ÿÿÿÿeØ[^_‰ì]ÃU‰åƒì WVSè[ÃnL‹}‹¾2‰ñáÿu ‹E ƒ8…:B‰‹E ‹‰Eüƒø„ …Àtét&ƒ}ü„‰é„É|<ƒùGƒù -+„>ƒù „5ƒù „,ƒÄøQƒ|ÛÿÿPèØéÈvùþu€zÿ…³‹E ÇÿéNÿÿÿùÿu€zþ…‘‹E Çÿé,ÿÿÿ‰ð%à=ÀuC¾B%À=€…_‰ñƒáÁáŠB$?¾À ÁƒÂ‰ƒùŽƒÄøQƒ¼Ûÿÿé]ÿÿÿ‰ð%ð=àu}r¾B%À=€… ¾F%À=€…÷‹ƒáÁáŠ$?¾À ÁÁáŠB$?¾À ÁƒÂ‰ùÿƒÄøQƒ¼Ûÿÿéêþÿÿùÿþ„\þÿÿ‰Èé¯t&æøþð…“r¾B%À=€…|¾F%À=€…h¾F%À=€…T‹ƒáÁáŠ$?¾À ÁÁáŠB$?¾À ÁÁáŠB$?¾À ÁƒÂ‰ùÿÿgÿÿÿƒÄøQƒ¼Ûÿÿé6þÿÿt&Áá1ÀŠB ÁƒÂ‰ƒùƒù -+tƒù t ƒù …þÿÿ(ÿÿ=ÿ‡ÿÿÿ‹7€>„Â1ÒŠÁâ1ÀŠF ƒÆ‰7‚$ÿÿ=þ‡žáÿÁá -+âÿ ÊŠéÑþÿÿ1ÀŠBÁà Áu‰ërƒÂ‰ƒùƒù -+tƒù t ƒù …xýÿÿ(ÿÿ=ÿ‡“þÿÿ‹7€~t<1ÒŠVÁâ1ÀŠ ƒÆ‰7‚$ÿÿ=þwáÿÁá -+âÿ ÊŠéOþÿÿ¸ÿÿÿÿeè[^_‰ì]ÃU‰å‹U ‹ -+;Js‹Eˆÿ1À‰ì]ÉöU‰åƒì WVSè[ÃÖH‹uŠ<"t<'…Á‹E ƒÄøP¾P‹Uÿ҃ąÀ|lŠFˆEÿéyƒÄô¾Pè4Õÿÿ‰ÇƒÄ…ÿtS‹U ƒÄøRj&‹Uÿ҃ąÀ|7€?t‹E ƒÄøP¾P‹Uÿ҃ąÀ|G€?uã‹E ƒÄøPj;‹Uÿ҃ąÀ}¸ÿÿÿÿë_‹E ƒÄøP¾PëàvFŠ„Àt :Eÿ…xÿÿÿ‹E ƒÄøP¾EÿP‹UÿÒ…À}(ë„Àt"t&‹E ƒÄøP¾P‹Uÿ҃ąÀ|¢F€>uã1Àeè[^_‰ì]ÃvU‰åìWVSè[÷G‹}ƒ}„°‹U‹ƒø‡†‰Ú+”ƒ|¸ÿÿÿâ¶lGaBÄA”AÑ@@‹EƒÄøPWj‹UR‹E P‹URè ‰Ç‹E ƒÄ ƒÄøPj<‹Uÿ҃ąÀŒ$‹U‹B€8?t;ƒÄüjƒdÞÿÿP‹BPèÛÍÿÿƒÄ…ÀtƒÄüjƒhÞÿÿP‹U‹BPè¼ÍÿÿƒÄ…Àu.‹E‹p€>tE‹U ƒÄøR¾P‹Uÿ҃ąÀŒ¸F€>ußë"‹EƒÄüP‹U R‹U‹BPèÄýÿÿƒÄ…ÀŒŽ‹U‹B‰Â‰Áƒátzƒùt8*t1B8*t,B8*t'B‹ -+„Íu„Ét„ít÷ÁÿtƒÂ÷Áÿu߃êBB)‹E|:‹U‹@‰…üþÿÿ‹R ‰•øþÿÿ…ÀŽ®‹•øþÿÿ‹‰Æ‰Âƒâtzƒút86t1F86t,F86t'F‹„Öu„Òt„öt÷ÂÿtƒÆ÷Âÿu߃îFF)Æ‹…øþÿÿ‹H…ÉtK‰È‰Êƒâtzƒút80t1@80t,@80t'@‹„Öu„Òt„öt÷ÂÿtƒÀ÷Âÿu߃è@@)Èt0‹E‹˜…Ò~$>9Ð~‹U ƒÄøRj -+‹Uÿ҃ąÀŒI1ÿë‹E ƒÄøPj ‹Uÿ҃ąÀŒ,G‹EƒÄüP‹U R‹•øþÿÿ‹Pè=üÿÿƒÄ…ÀŒ‹…øþÿÿƒxtp‹U ƒÄøRj=‹Uÿ҃ąÀŒâ‹E ƒÄøPj"‹Uÿ҃ąÀŒÉ‹EƒÄüP‹U R‹•øþÿÿ‹BPèڃąÀŒ¤‹E ƒÄøPj"‹Uÿ҃ąÀŒ‹÷ÿüþÿÿƒ…øþÿÿƒ½üþÿÿRþÿÿ‹Eƒx„m‹U ƒÄøRj>‹Uÿ҃ąÀŒI‹EGƒÄøPWj‹UR‹E P‹URè‰Ç‹EƒÄ ƒÄøP‹URW‹EP‹U R‹U‹BPèOüÿÿ‰ÇƒÄ …ÿŒû‹U‹BŠ‹Uÿ҃ąÀŒV‹UƒÄø‹B‰Â‰Áƒátzƒùt8*t1B8*t,B8*t'B‹ -+„Íu„Ét„ít÷ÁÿtƒÂ÷Áÿu߃êBB)‹E|:PWj鉋U‹BŠ‹Uÿ҃ąÀŒÌ‹EGëR‹E ƒÄøPj ‹Uÿ҃ąÀŒ¬‹E ƒÄøPj/‹Uÿ҃ąÀŒ“‹E ƒÄøPj>‹Uÿ҃ąÀŒz‹EƒÇƒÄøPWj‹UR‹E P‹URè/‰ÇƒÄ é]‹EƒxtN‹U‹‚˜…À~'9Ç~#‹E ƒÄøPj -+‹Uÿ҃ąÀŒ1ÿë ¶‹E ƒÄøPj ‹Uÿ҃ąÀŒüG‹UƒÄüµÿÿÿ‹BPƒ,âÿÿPVèÉÿÿ‹EƒÄüP‹U RVèøƒÄ …ÀŒÂ‰ð‹•ôþÿÿéÄ‹EƒÄüP‹U R‹U‹BPèɃąÀŒ“‹U‹BéEv‹EƒxtH‹U‹‚˜…À~!9Ç~‹E ƒÄøPj -+‹Uÿ҃ąÀŒR1ÿë‹E ƒÄøPj ‹Uÿ҃ąÀŒ5G‹EƒìµÿÿÿÝ@Ý$ƒ/âÿÿPVèLÈÿÿ‹UƒÄüR‹E PVè/ƒÄ …ÀŒù‰ð‹•ðþÿÿ‹„Öu„Òt„öt÷ÂÿtƒÀ÷Âÿu߃è@@)ðÇéÍ‹EƒxtN…ÿ~J‹U‹‚˜…À~#9Ç~‹E ƒÄøPj -+‹Uÿ҃ąÀŒ‹1ÿë‰ö‹E ƒÄøPj ‹Uÿ҃ąÀŒlG‹EƒÄüP‹U R‹U‹BPèƒÄ…ÀŒI‹U‹B‰Â‰Áƒátzƒùt8*t1B8*t,B8*t'B‹ -+„Íu„Ét„ít÷ÁÿtƒÂ÷Áÿu߃êBB)Â×é‹U‹‚ …À„ä‹UƒÄôRÿЉƃÄ…ö„΋EƒÄüP‹U RVèèƒÄ…ÀŒ²ƒÄøj -+VèîÅÿÿƒÄ…ÀuK‰ð‰òƒâtzƒút80t1@80t,@80t'@‹„Öu„Òt„öt÷ÂÿtƒÀ÷Âÿu߃è@@)ðÇëG‰Ç‰Âƒâtzƒút87t1G87t,G87t'G‹„Öu„Òt„öt÷ÂÿtƒÇ÷Âÿu߃ïGG)ǃÄôVèlÆÿÿƒÄë ¸ÿÿÿÿët&‹E‹@‰E…À…P÷ÿÿ‰ø¥Øþÿÿ[^_‰ì]ÃU‰åƒì WVSè[ÃÖ>‹}€?tvƒÄô¾Pè\Ëÿÿ‰ÆƒÄ…ötC‹E ƒÄøPj&‹Uÿ҃ąÀ|Eët&‹E ƒÄøP¾P‹Uÿ҃ąÀ|(F€>uã‹E ƒÄøPj;ë ‹E ƒÄøP¾P‹Uÿ҃ąÀ}¸ÿÿÿÿëG€?u„1Àeè[^_‰ì]ÃU‰åƒì WVSè[Ã.>‹U‹u…Òte‹EƒÄøP‹EPÿ҉ǃÄ…ÿtO€?tJ‹E ƒÄøP¾P‹Uÿ҃ąÀ}¸ÿÿÿÿë.Š< -+u -+1öë¶< uƒÆ‰ðyF‰ÆƒæøëFG€?u¶‰ðeè[^_‰ì]ÃU‰åƒìVSè[×=‹u…öt0‹…Àt ƒÄôPèÒÄÿÿƒÄƒ~t‹FƒÄôPè½ÄÿÿƒÄƒÄôVè±Äÿÿeè[^‰ì]ÃU‰å‹U…Òt‹J ;J| -+1Àë¶‹B‹ˆÿB ‰ì]ÃvU‰åƒìWVSè[Ã=‹}…ÿ„Fƒ?u -+ƒ}…7ƒ} uƒ}uƒÄôWèÿÿÿé´&‹G…À„ ‹W …Ò…ºÇEüH‰Eøƒø~x‹UüUø‰ÐÁè4‹GÑþ‹°P‹EP‹E PWèåƒÄ…Àu.ëN…öŽ£‹G‹D°üP‹EP‹E PW轃ąÀtÚé…À} ‰uøë -+´&‰uü‹Eø+Eüƒøˆ‹uü;uøj‹G‹°P‹EP‹E PWèuƒÄ…Àt>F;uø~ÞëF¶9Â}<‹G‹P‹EP‹E PWèG…Àu#‹W ‹G‹ÿG ët&F‰G ‹G‹°ë -+‰ö‹G‰G 1ÀeØ[^_‰ì]ÉöU‰åƒì WVSè[â;ƒ}u1ÀéFƒÄøjjèÊÁÿÿ‰ÆƒÄ…öu)ƒÄüƒÄôèfÂÿÿ‹PèÁÿÿPjƒ<âÿÿPèS 1Àéƒ}t‹EƒÄôPè&Âÿÿ‰ƒÄƒ} uOƒ}uI‹}éƒÄüƒÄôèÂÿÿ‹PèÉÀÿÿP‹FƒÀ@ÁàPƒ|âÿÿPèö ƒÄ ƒÄôVèJýÿÿ1ÀéŸvƒÄøjj‹EP‹E P‹EPPëa‹F9F|9…ÀuƒÄôhè½ÀÿÿëƒÄø…P‹FPèwÁÿÿƒÄ…À„pÿÿÿ‰FƒF@‹V‹F‰<ÿFƒÄøjj‹EP‹E P‹EPWèD‰ÇƒÄ …ÿu‘‹Fƒø~ ƒÄüHPjVè -+‰ðeè[^_‰ì]ÉöU‰å‹E…Àt Ç@ ƒxu1Àë‹@‹‰ì]ÃU‰åƒì WVSè[à -+:‹}‹uƒÄø‹FP‹U ‹BPèÁÿÿƒÄ…Àu2‹…Àt*ƒÄøƒÄøPVèÀÃÿÿP‹ƒÄøP‹E Pè°ÃÿÿƒÄPèÏÀÿÿ…Àu1Àeè[^_‰ì]ÃvU‰åƒì WVSè[Ö9‹U ‹}‹u…Òt‹FƒÄøPRèÀÿÿƒÄ…Àu#…ÿt‹EƒÄøƒÄø‹PVèHÃÿÿPWèiÀÿÿ…Àu1Àeè[^_‰ì]ÃU‰åƒì WVSè[Ã29´&‹U‹M ‹u‹B‰Ï‹ˆ‰Eü9ñ}pë¶G;}}!‹EüƒÄüP‹U‹B‹¸PRèÏþÿÿƒÄ…À~ÜëN;u ~‹MüƒÄüQ‹U‹B‹°PRè©þÿÿƒÄ…ÀÜ9÷}‹M‹A‹ ¸‹°‰¸‹U‹B‰ °ë™‹M‹AƒÄü‹°P‹EüPQèmþÿÿƒÄ…À~‹U‹B‹M ‹°‰ˆ‹U‹Mü‹B‰ °Fÿ9E }ƒÄüP‹E P‹URè -+ÿÿÿƒÄF‰u 9uÿÿÿeè[^_‰ì]ÃU‰åƒì WVSè[Ã8‹}‹u…ÿ„Ù…ö„у~ t ƒÄôVèR‰~ ƒ} t ƒ} tZ鮉öƒ}t ‹E;Gt9x t‹G‰F‹G…Àt‰pë‰w‰wëv‹U‰V‹B‰F‹B…Àt‰pë‰w‹E‰pëYƒ}t ‹U;Wt9z t"‰~ ‹G‰F‹G…Àt -+‰pët&‰w‰wë$‹E‹U‰F‹B‰F‹B…Àt‰pë‰w‹E‰peè[^_‰ì]ÉöU‰åƒì WVSè[Ã7‹u…ö„ýƒÄôVè[ë ‹FƒÄôPèÉÿÿÿƒÄƒ~u닃ø‡É‰Ú+”ƒ<Éÿÿÿâ‰ö¬66C66166‹F…Àt ƒÄôPèô½ÿÿƒÄ‹F…À„†1ÿ9Ç}7t&‹F ‹ø…Àt ƒÄôPèɽÿÿƒÄ‹F ‹Dø…Àt ƒÄôPè²½ÿÿƒÄG;~|Í‹F ƒÄôPè½ÿÿë8‹F…Àt4ƒÄôP苽ÿÿë&‹F…Àt"ƒÄôPèy½ÿÿë‹V…Òt‹F…Àt ƒÄôRÿЃÄƒÄôVèW½ÿÿeè[^_‰ì]ÃU‰åƒì WVSè[Ãæ5‹} …ÿu1Àë,ƒÄøj‹EPèB‰ÆƒÄ…ötƒÄøWƒ¼âÿÿPè9 ‰F‰ðeè[^_‰ì]ÉöU‰åƒìSè[Ã5‹EƒÄøjPè÷‰Â…Òt ‹E ‰B‹E‰B‰Ð‹]è‰ì]ÃU‰åƒì WVSè[ÃR5‹} …ÿu1Àë%ƒÄøj‹EP讉ƃąöt ƒÄôWè¼ÿÿ‰F‰ðeè[^_‰ì]ÃU‰åƒìSè[Ã5‹EƒÄøjPèk‰Â…Òt‹E ‰B‰Ð‹]è‰ì]ÉöU‰åƒì WVSè[ÃÊ4‹} …ÿu1Àë)t&ƒÄøj‹EPè"‰ÆƒÄ…öt ƒÄôWè|»ÿÿ‰F‰ðeè[^_‰ì]ÃU‰åƒìSè[Ãx4‹EƒÄøjPèß…ÀtÝE ÝX‹]è‰ì]ÉöU‰åƒì WVSè[ÃB4‹}…ÿu1Àë+ƒÄøj‹EP螉ƃąöt‹E ‰FƒÄôWèòºÿÿ‰F‰ðeè[^_‰ì]ÃvU‰åƒì WVSè[Ãê3‹}…ÿu1Àë3t&ƒÄøj‹EPèB‰ÆƒÄ…öt‹E U‰FƒÄøRWèb‰F‰ðeè[^_‰ì]ÃvU‰åV‹M…ÉtL‹q …ötE‹Q…Òt ‹A‰Bë v‹A‰F‹Q…Òt‹A‰Bë ‹Q ‹A‰BÇA ÇAÇA^‰ì]ÃU‰åìVSè[Ã,3‹E…ÀuƒÉâÿÿPƒÜâÿÿPhµüÿÿVè׸ÿÿƒÄøVjè”ýÿÿ¥èûÿÿ[^‰ì]ÃU‰åƒìSè[ÃÜ2‹U…Òt‹B$Hÿ‰J$‰È…ÀƒÄôRèšûÿÿ1Àë¸ÿÿÿÿ‹]è‰ì]ÉöU‰å‹U…Òu¸ÿÿÿÿë ‹B$H‰J$‰È‰ì]ÃU‰åƒì WVSè[Ãv2‹}ƒÄøj,j訸ÿÿ‰ÆƒÄ…öu1Àë‹E ‰ÇF$…ÿt VjjWèúÿÿ‰ðeè[^_‰ì]ÃU‰åƒì WVSè[Ã2‹u‹}…ö„¢ƒ} „˜ƒ}u…ÿ…Š‹EƒÄüP‹E PV舉ƃÄ…ötpƒ>uYƒ~tSƒ}t‹EƒÄøP‹FPèÆ¸ÿÿƒÄ…Àu6vƒ}t)‹EƒÄøPVè»ÿÿƒÄ…Àt…ÿtƒÄøPW蔸ÿÿƒÄ…Àu‰ðëƒ}uƒÄüjë‚‹vëŒ1Àeè[^_‰ì]ÃvU‰å‹E‹M …ÀtD‹P…Òtƒ}u 9Èt3‹P…Òt‰Ðë*v‹@ …Àt9Ètƒxu‹@ 9Èt …Àt ëí‰ö‹@ë1À‰ì]ÃU‰å‹E‹M …Àt49Èt0‹P…Òt"‹B…Àtƒ}tƒxt‹@ƒxu÷ë ‰Ðë ‹@ 9Èu1À‰ì]ÃU‰åƒìVSè[×0‹u…ötƒ>t¸ÿÿÿÿë"‹V…Òt ‹F…ÀtƒÄôRÿЋE ‰F‹E‰F1Àeè[^‰ì]ÉöU‰åƒì WVSè[ÃB0‹u‹} …öt%ƒ>u …ÿtƒÄüjƒãÿÿP‹FPèÛ¶ÿÿƒÄ…Àt¸ÿÿÿÿë)‹F…Àt ƒÄôPèL·ÿÿƒÄƒÄøWƒ ãÿÿPèm‰F1Àeè[^_‰ì]ÉöU‰åƒì WVSè[ÃÂ/‹u‹} …öt ƒ>u…ÿu¸ÿÿÿÿë!‹F…Àt ƒÄôPèé¶ÿÿƒÄƒÄôWèm¶ÿÿ‰F1Àeè[^_‰ì]ÉöU‰å‹U…Òtƒ:t¸ÿÿÿÿë‹E ‰B1À‰ì]ÉöU‰åƒì WVSè[ÃB/‹u‹} …öt ƒ>u…ÿu¸ÿÿÿÿë!‹F…Àt ƒÄôPèi¶ÿÿƒÄƒÄôWèíµÿÿ‰F1Àeè[^_‰ì]ÉöU‰å‹E…Àtƒ8t¸ÿÿÿÿëÝE ÝX1À‰ì]ÉöU‰åƒì WVSè[ÃÂ.‹u‹}…öt ƒ>u…ÿu¸ÿÿÿÿë'‹F…Àt ƒÄôPèéµÿÿƒÄ‹E ‰FƒÄôWègµÿÿ‰F1Àeè[^_‰ì]ÃU‰åƒì WVSè[Ãb.‹u‹}…öt ƒ>u…ÿu¸ÿÿÿÿë+‹F…Àt ƒÄôP艵ÿÿƒÄ‹E U‰FƒÄøRW觉F1Àeè[^_‰ì]ÃU‰åì WVSè[Ãó-‹u舉DžötCE PVhµüÿÿVèà³ÿÿƒÄƒ?t ƒÄôV‹ÿÐë‰öƒÄüVƒãÿÿP‹ƒ”‹Pè´ÿÿ¥èûÿÿ[^_‰ì]ÉöU‰å¸ÿÿÿÿ‰ì]ÃU‰å¸‰ì]ÃU‰å¸‰ì]ÃU‰å¸‰ì]ÃU‰åƒìVSè[ÃO-ƒÄøƒ,ÓÿÿPƒÐP躳ÿÿ‹ƒÌƒÄôPè˲ÿÿ‰ÆƒÄ …öu;ƒÄøh¤jèS³ÿÿ‰ÆƒÄøV‹ƒÌPèA´ÿÿ‹ƒˆÇF‰Fdž˜H‰ðeè[^‰ì]ÃU‰åƒìSè[ÃÈ,ƒÄøƒ\ÓÿÿPƒÌPèS³ÿÿ‹]è‰ì]ÃU‰åƒìSè[Ø,‹EƒÄôPèݳÿÿ‹]è‰ì]ÃU‰åƒìSè[Ãh,‹UE ƒÄøPRè ‹]è‰ì]ÉöU‰åì WVSè[Ã7,‹E P‹EPhµÿÿÿVè/²ÿÿƒÄ=ÿw ƒÄôVèì²ÿÿë(ƒÄøxWjè<²ÿÿ‰ÆƒÄ…öt‹E P‹EPWVèô±ÿÿ‰ð¥èþÿÿ[^_‰ì]ÃU‰åƒìVSè[÷+³8ÿÿÿƒ»8ÿÿÿÿt ‹ÿЃÆüƒ>ÿuô[^‰ì]ÃvU‰åƒìSè[À+[‰ì]ÃU‰åÿuè1´ÿÿèвÿÿèk´ÿÿ‰ì]Ãinitialize_beforeinitialize_afterterminate_beforeterminate_afterUnable to allocate memory for attribute '%s' in element %s!Unable to add entity callback!ampltgtquotzwnjzwjzetayumlyenyacutexiweierpuumlupsilonupsihumlugraveucircuarruacuteuArrtradetimestildethornthinspthetasymthetathere4tauszligsupesup3sup2sup1supsumsubesubspadessimsigmafsigmashysectsdotscaronsbquorsquorsaquorlmrhorfloorregrealrdquorceilrarrraquorangradicrArrpsipropprodprimepoundplusmnpivpiphiperppermilpartparaoumlotimesotildeoslashordmordforoplusomicronomegaolineograveoeligocircoacutenuntildensubnotinnotninendashnbspnablamuminusmiddotmicromdashmacrlsquolsaquolrmlozlowastlfloorleldquolceillarrlaquolanglambdalArrkappaiumlisiniquestiotaintinfinimageigraveiexclicirciacutehibarhellipheartsharrhArrgegammafraslfrac34frac14frac12forallfnofexisteuroeumlethetaequivepsilonenspemspemptyegraveecirceacutedividediediamsdeltadegdarrdaggerdArrcurrencupcrarrcopycongclubscircchicentcedilccedilcapbullbrvbarbrkbarbetabdquoaumlatildeasymparingaposangandalphaalefsymagraveaeligacuteacircaacuteZetaYumlYacuteXiUumlUpsilonUgraveUcircUacuteThetaTauTHORNSigmaScaronRhoPsiPrimePiPhiOumlOtildeOslashOmicronOmegaOgraveOcircOacuteOEligNuNtildeMuLambdaKappaIumlIotaIgraveIcircIacuteGammaEumlEtaEpsilonEgraveEcircEacuteETHDstrokDeltaDaggerChiCcedilBetaAumlAtildeAringAlphaAgraveAcircAacuteAEligUnable to expand string buffer to %d bytes!Bad control character 0x%02x not allowed by XML standard!Invalid UTF-8 sequence for character 0x%04x!nullEntity name too long under parent <%s>!Character entity "%s" not terminated under parent <%s>!Entity name "%s;" not supported under parent <%s>!Bad control character 0x%02x under parent <%s> not allowed by XML standard!MXML_CUSTOMMXML_TEXTMXML_REALMXML_OPAQUEMXML_INTEGERMXML_ELEMENTUnable to allocate string buffer!Bad custom value '%s' in parent <%s>!integerrealBad %s value '%s' in parent <%s>!Unable to add value node of type %s to parent <%s>!Bare < in element!!--![CDATA[Early EOF in comment node!Unable to add comment node to parent <%s>!]]Early EOF in CDATA node!Unable to add CDATA node to parent <%s>!Early EOF in processing instruction node!Unable to add processing instruction node to parent <%s>!Early EOF in declaration node!Unable to add declaration node to parent <%s>!(null)Mismatched close tag <%s> under parent <%s>!Unable to add element node to parent <%s>!Expected > but got '%c' instead for element <%s/>!Missing close tag under parent <%s>!Unable to allocate memory for name!Unable to allocate memory for value!Expected '>' after '%c' for element %s, but got '%c'!Bare < in element %s!Missing value for attribute '%s' in element %s!%d%fUnable to allocate %d bytes for index - %sUnable to allocate %d bytes for index: %s![CDATA[%s]]1.0?xml version="%s" encoding="utf-8"?![CDATA[![CDATA[%s]]mxml: %s -+| ˆ € “A…B D‡A†Aƒt. <!fA…B D‡A†Aƒ}. `|!nA…B D‡A†Aƒi. „ì!ŒA…B D‡A†Aƒm. ¨x"õA…B D‡A†Aƒi.| ˆ p#WA…B D†Aƒe.<È#×A…B Aƒ X $NA…B D‡A†Aƒg.$|ð$wA…B D‡ -+A† Aƒ P.$¤h%ËA…B D‡ -+A† Aƒ H.| ˆ@&%A…B  0h&`A…B G†‹AƒŒD. TÈ&<A…B D†Aƒf. x'9A…B Dƒf. $˜@'‡A…B G‡†A†‡Aƒˆ`.(ÀÈ'‘A…B G‡ŠA†‹AƒŒH. T.$ì\(A…B D‡A†Aƒj. b.$ì(‹A…B D‡ -+A† Aƒ v. _.$<x)fA…B G‡ŠA†‹AƒŒH. dà)BA…B D‡A†Aƒj. ˆ$*@A…B D†Aƒj. ¬d*3A…B D‡A†AƒÐ˜*$A…B D†Aƒð¼*(A…B D†Aƒ$ä*%A…B D‡A†AƒP. 8 ,"A…B D‡A†Aƒ^. \01IA…B D†Aƒ[.$€|1xA…B D‡A†AƒD.$¨ô1nA…B D‡A†Aƒ@. Ðd2QA…B D‡A†Aƒa.ô¸7WA…B Dƒb.$8|A…B D‡A†AƒI. <Œ9O A…B D‡A†AƒY. `ÜEÌA…B D‡ -+A† Aƒ Q.$„¨J|A…B D‡A†Aƒ’.¬$NA…B  Ä@NA…B D‡A†Aƒk.8è\OäA…B G‡JA†KAƒLf. V.ÿ. {.V. u. $@X¨A…B D‡A†Aƒ^. HèXA…B D‡A†Aƒa.| ˆ €YTA…B D†Aƒ].<ÔY)A…B  TZrA…B D‡ -+A† Aƒ v.4xt[rA…B D‡A†Aƒ`.T.H.M.H.©. ^.°è\$A…B  È ]qA…B D‡A†Aƒ`. ì€]cA…B D‡A†Aƒa.$ä]A…B D‡A†AƒK.| ˆ _A…B D‡A†Aƒl. <`'A…B D‡A†Aƒ[. `0aVA…B D‡A†Aƒ`.„ˆa<A…B DƒU. ¤ÄaOA…B D‡A†Aƒ`.Èb6A…B DƒU. èLbSA…B D‡A†Aƒd.  b2A…B DƒU. ,ÔbUA…B D‡A†Aƒ`. P,c]A…B D‡A†Aƒd.tŒc\A…B A† ècTA…B G†‡Aƒˆm.´rÆ7rÁ1rÂ*rÀ$r‘rÅrÃrÄ r’rÇr§ûq! õq”îqÐêqÐãqÉÝqÊÖqÈÎq•Êq—ÅqË¿q“¸qͲqΫq̦q™¡qÏ›qš”q›‘qœŠqчqqRzqÓtqÔmqÒgq©_qŸXqØQqÕLqÖHq¦Eq ?q3 ;q¨7q¡0q`*q£$qÞ q¤q˜qÚ qÛqÙþp¥ùpÜöpžïpÝêpxåp–ÞpáØpâÒp´ÌpæÅpà½p5!·p±Ÿl&³p'"¯p "ªp'¤påžpH"—pã’päŒp ‡p²€p¦yp¦tp" pp)"ipçcp¸^p¢ZpÇUpÆOpc&JpE"Ep©?pµ!;p*"4p¤/pÓ!(p #p“!p°p´pf&p¨p÷péûoêôoèîo"éo äo ÜoµÖoa"Òo·ÎoðÉoëÄo¬ ¾o"¹o’²o"«o½¤o¼o¾—oD ‘o³Žoe"¦l>‰oÔ!„o”!}oe&vo& po¯ioícoî]o¡VoìPo!Jo"Fo+"Ao¹:o¿5o"0oï*oº%oÐ!o»o)#o«o!o#o ÿnd"øn -+#ñn"ínÊ%én ân9 Ün £l<×n¯Ñn ËnµÄn·¾n"»n¼µn"°n ªn §n`"¤n " n¬šn "•n„"Žnñ‹n½„nó~nôxnSqnòkn> enÉ]n¿Wn•"Tn("OnªJnºCnøl™² -+§mxml-entity.c/boot/home/Desktop/mxml-2.6GNU C 2.95.3-haiku-090629p#3&ΧmxmlEntityAddCallback-§p#Ç#Ucb,ÑPglobal.uQint¾§¾Ä Échar® -+u_mxml_global_s¤ error_cb!‡# num_entity_cbs"§# entity_cbs## wrap$§#˜ custom_load_cb%j#œ custom_save_cb&†# × ‡¾{ ™™c®´§´¾ºjmxml_node_s,‰ typeŠŒ# next‹# prevŒ# parent# childŽ# last_child# value -+# ref_count‘§#$ user_data’r#(Ÿ€€´Épmxml_type_eUMXML_IGNOREÿÿÿÿMXML_ELEMENTMXML_INTEGERMXML_OPAQUEMXML_REALMXML_TEXTMXML_CUSTOMºrmxml_value_u element€tinteger§opaque‚€realƒ¿text„Écustom…¿mxml_element_s l namem€# num_attrsn§# attrso‚#doublemxml_text_ss whitespacet§# stringu€#<mxml_custom_sy datazr# destroy{H# Hr<‚mxml_attr_sf nameg€# valueh€#NÀmxmlEntityGetNameJ¾È#Ÿ$UvalI§‘!mxmlEntityGetValueh§ $î$Unameg¾‘ii§Wchj§PglobalkuVvmxmlEntityRemoveCallback~ð$g%Ucb}Ñ‘i§Vglobal€uR'_mxml_entity_cbœ§h%3&Uname›¾‘diff§Pcurrentž§WfirstŸ§‘|last §‘x¥ name£¾# val¤§#entities¥9З 44 ê 'u_long Llong unsigned intu_intnunsigned intu_shortshort unsigned intu_char±unsigned charulongLushortuintnunchar±blkcnt_tlong long intblksize_t§fsblkcnt_tfsfilcnt_toff_t ino_t!cnt_t"§dev_t#long intpid_t$id_t%uid_t'ngid_t(nmode_t)numode_t*nnlink_t+§daddr_t-§caddr_t.€addr_t0Lkey_t1ptrdiff_tvsize_tªLssize_t¬wchar_tû§wint_tnclock_t time_t suseconds_tuseconds_tLètimespec tv_sec€# tv_nsec#% itimerspec it_interval³# it_value³#÷ tm,! tm_sec"§# tm_min#§# tm_hour$§# tm_mday%§# tm_mon&§# tm_year'§# tm_wday(§# tm_yday)§# tm_isdst*§# tm_gmtoff+§#$ tm_zone,€#(__gnuc_va_listG€va_list¾÷ fpos_t6Mm -+_IO_marker i _next pm -+# _sbuf q© # _pos r§#* -+© _IO_FILE˜ q _flags v§# _IO_read_ptr {€# _IO_read_end |€# _IO_read_base }€# _IO_write_base ~€# _IO_write_ptr €# _IO_write_end €€# _IO_buf_base €# _IO_buf_end ‚€# _IO_save_base „€#$ _IO_backup_base …€#( _IO_save_end †€#, _markers ˆm -+#0 _chain Š© #4 _fileno Œ§#8 _flags2 ާ#< _old_offset M#@ _cur_column “#H _vtable_offset ”¯ #J _shortbuf •¾ #K _lock —Ê #L _offset ™M#P _codecvt œÚ #X _wide_data ð #\ _mode ¢§#` _unused2 ¤ö #ds -+signed char Ê É_IO_codecvtÌ _IO_wide_dataà  É3_IO_lock_t l_IO_FILE ¥s -+FILE -+ s -+R  quot §# rem -+§#div_t , …   quot # rem #ldiv_t _ ¹   quot # rem #lldiv_t “ %__convert_long_double O__convert_long_double_i P%__convert_long_double_d Q1 1nlong double Ïrandom_data  fptr Ï# rptr Ï# state Ï# rand_type §# rand_deg §# rand_sep §# end_ptr Ï#§.drand48_data " x #.# a $.# c %# old_x &.# init '§# :_compare_function ‰SYn§nnt _ISblank_IScntrl_ISpunct_ISalnum_ISupper_ISlower_ISalpha_ISdigit_ISxdigit_ISspace _ISprint@_ISgraph€Ÿmxml_sax_event_eKMXML_SAX_CDATAMXML_SAX_COMMENTMXML_SAX_DATAMXML_SAX_DIRECTIVEMXML_SAX_ELEMENT_CLOSEMXML_SAX_ELEMENT_OPENmxml_sax_event_tR mxml_type_t]Œmxml_custom_destroy_cb_t_ê<mxml_error_cb_tb‡mxml_attr_tiNmxml_element_tptmxml_text_tvÉmxml_custom_t|mxml_value_t† -+mxml_node_t“ºñmxml_index_s– attr—€# num_nodes˜§# alloc_nodes™§# cur_nodeš§# nodes›ñ#´mxml_index_tœmxml_custom_load_cb_tž(Ÿmxml_custom_save_cb_t¡Kpmxml_entity_cb_t¤™mxml_load_cb_t§…•·´mxml_save_cb_tª«±Æ¾´§mxml_sax_cb_t­Ûá ÷´Ÿr_mxml_global_t'×]!mxml-file.c/boot/home/Desktop/mxml-2.6GNU C 2.95.3-haiku-090629@&xYñ‹mxml_isspacep‹@&e&Ucho‹RintBmxml_node_s,‰typeŠB#next‹º#prevŒº#parentº# childŽº#last_childº#valueÀ#ref_count‘‹#$user_data’(#(ºmxml_type_eUMXML_IGNOREÿÿÿÿ MXML_ELEMENT MXML_INTEGER MXML_OPAQUE MXML_REAL MXML_TEXT MXML_CUSTOM -+’ (mxml_value_u  element€ integer‹ opaque‚c realƒq text„{ custom…¶ ‚mxmlLoadFd‚h&È&Utopš‚Vfd›‹Pcbœ˜Qbufžž‘ô¿ -+’˜B‚ -+ˆô_mxml_fdbuf_s XfdY‹#currentZô#end[ô#buffer\ # -+úunsigned charúÿcmxml_element_s lnamemc#num_attrsn‹#attrso4# -+ichardouble¶mxml_text_sswhitespacet‹#stringuc#îmxml_custom_sydataz(#destroy{ú#ú( -+î4mxml_attr_sfnamegc#valuehc# -+„mxmlLoadFileÄ‚È&'UtopÁ‚VfpºQcbØRº_IO_FILE˜q_flagsv‹#_IO_read_ptr{c#_IO_read_end|c#_IO_read_base}c# _IO_write_base~c#_IO_write_ptrc#_IO_write_end€c#_IO_buf_basec#_IO_buf_end‚c# _IO_save_base„c#$_IO_backup_base…c#(_IO_save_end†c#,_markersˆ#0_chainŠ #4_filenoŒ‹#8_flags2Ž‹#<_old_offset#@_cur_column“#H_vtable_offset”.#J_shortbuf•=#K_lock—I#L_offset™#P_codecvtœY#X_wide_datao#\_mode¢‹#`_unused2¤u#d -+„_IO_marker i_nextp#_sbufq #_posr‹# -+À -+„off_tshort unsigned intsigned charIi _IO_codecvt -+K_IO_wide_data -+_i3ÍmxmlLoadStringà‚'='UtopÝ‚QsÞÍ‘ cbߘR -+ÓiLmxmlSaveAllocStringþc@'Ç'Unodeü‚‘cbýa‘ bytesÿ‹Pbufferg‘€@scaÍ‚‹ -+LtiÿòmxmlSaveFd7‹È'Y(Unode4‚‘fd5‹Vcb6aWcol8‹Pbuf9ž‘ô¿global: P _mxml_global_s¤ error_cb!¢ #num_entity_cbs"‹#entity_cbs#¨ #wrap$‹#˜custom_load_cb%ß #œcustom_save_cb&õ #  -+ò¢ Í -+– ´ Ä cÄ ‹Í -+´ ß ‹‚Í -+Ê õ c‚ -+å j -+mxmlSaveFileg‹\(ì(Unoded‚Wfpeº‘ cbfaVcolh‹Pglobali P mxmlSaveString“‹ì(w)Unode‚‘bufferc‘ bufsize‘‹‘cb’aVcol”‹Pptr• ‘xglobal– P c“ mxmlSAXLoadFdÔ‚x)Þ)UtopÏ‚‘fdЋPcbјWsax_cbÒ= Qsax_dataÓ(RbufÕž‘ô¿© ‚© (= mxml_sax_event_eK MXML_SAX_CDATA MXML_SAX_COMMENT MXML_SAX_DATA MXML_SAX_DIRECTIVE MXML_SAX_ELEMENT_CLOSE MXML_SAX_ELEMENT_OPEN -+“ ¸ mxmlSAXLoadFile‚à)"*Utop‚WfpºVcb˜Qsax_cb= Rsax_data(P/ mxmlSAXLoadString+‚$*d*Utop&‚Vs'Í‘ cb(˜Qsax_cb)= Rsax_data*(P‰ mxmlSetCustomHandlersCd*—*UloadAß VsaveBõ WglobalD PÑ mxmlSetErrorCallbackS˜*¼*UcbRÑ VglobalT P -+–  mxmlSetWrapMarginf¼*ä*Ucolumne‹Vglobalg Pmxml_add_charx‹ä* ,Ucht‹WbufptruVbufferv‘bufsizew£‘newbufferycR -+c -+‹Nmxml_fd_getcÆ‹ ,.1UpÄ(‘encodingÅ£WbufÇNchÈ‹VtempÉ‹R1í/=0lchž‹WM­0"1lch΋W -+ž¡mxml_fd_putcõ‹01y1Uchó‹Ppô(‘ buföNVämxml_fd_read‹|1ô1UbufNWbytes‹P6mxml_fd_write>‹ô1b2Ubuf=NWbytes?‹Pptr@ôVÜmxml_file_getcj‹d2µ7Uph(‘encodingi£Wchk‹Vtempl‹Pfpmº¿l6À6lch ‹RÛ/7©7lch(‹Rmxml_file_putcA‹¸78Uch?‹Qp@(R¼mxml_get_entityP‹8Œ9UparentK‚‘pL(‘ encodingM£‘getc_cbNÑ‘chQ‹VentityRב@entptrSc‘¼Ñ‹(£ -+¼ãi?Rmxml_load_data‚Œ9ÛEUtop‰‚‘pŠ(‘ cb‹˜‘getc_cbŒR‘sax_cb= ‘sax_dataŽ(‘ errorþ·Enode‚Vfirst‘‚‘lparent’‚‘hch“‹‘Pwhitespace”‹‘dbuffer•c‘pbufptr–c‘|bufsize—‹‘ttype˜B‘`encoding™‹‘xglobalš ‘\typesœiØŸ -+¼ddÍX_mxml_parse_element‹ÜE¨JUnode ‚‘p (‘ encoding£‘getc_cbR‘ error Jch‹Vquote‹Wnamec‘xvaluec‘lptrc‘tnamesize‹‘|valsize‹‘p÷mxml_string_getc ‹¨J$NUp (Wencoding £‘ ch ‹Qs ÷ÚHMŽMlchà ‹RöÑMNlchó ‹R -+ÍMmxml_string_putc -+‹$N>NUch -+‹Pp -+(‘ pp -+RÁmxml_write_name- -+‹@NYOUs) -+ÍVp* -+(‘ putc_cb+ -+Ö‘quote. -+i‘name/ -+ÍWÖ‹‹( -+Áêmxml_write_nodez -+‹\O@XUnodet -+‚‘pu -+(‘ cbv -+a‘colw -+‹Wputc_cbx -+ê‘globaly -+ ‘i{ -+‹‘ü}width| -+‹Vattr} -+4‘ø}s~ -+ð‘€~º7PcPptr— -+ÍVé1WXdata` cVnewlinea ÍP -+Áüiþamxml_write_string‹ ‹@XèXUsˆ ÍWp‰ (‘ putc_cbŠ ê‘nameŒ ÍVêmxml_write_wsµ ‹èXxYUnode¯ ‚Pp° (‘ cb± aRws² ‹Pcol³ ‹Vputc_cb´ ê‘s¶ ÍW!u_long ølong unsigned int!u_intunsigned int!u_short!u_charú!ulongø!ushort!uint!uncharú!blkcnt_tŒlong long int!blksize_t‹!fsblkcnt_tŒ!fsfilcnt_tŒ!off_t Œ!ino_t!Œ!cnt_t"‹!dev_t#long int!pid_t$!id_t%!uid_t'!gid_t(!mode_t)!umode_t*!nlink_t+‹!daddr_t-‹!caddr_t.c!addr_t0ø!key_t1!ptrdiff_tv!size_tªø!ssize_t¬!wchar_tû‹"wint_t!clock_t !time_t !suseconds_t!useconds_tømtimespectv_sec#tv_nsec#ªitimerspecit_interval8#it_value8#|tm,!tm_sec"‹#tm_min#‹#tm_hour$‹#tm_mday%‹# tm_mon&‹#tm_year'‹#tm_wday(‹#tm_yday)‹#tm_isdst*‹# tm_gmtoff+‹#$tm_zone,c#(!__gnuc_va_listGc!va_list¾|!fpos_t 6Ò#_IO_lock_tl!_IO_FILE¥„!FILE -+ „$_single_threaded i% quot ‹#rem -+‹#!div_t ó%L quot #rem #!ldiv_t &%€ quot Œ#rem Œ#!lldiv_t Z ì__convert_long_double O __convert_long_double_i Pì __convert_long_double_d Qøølong double –random_datafptr£#rptr£#state£#rand_type‹# rand_deg‹#rand_sep‹#end_ptr£#ïdrand48_data"x#ï#a$ï#c%# old_x&ï#init'‹#û!_compare_function‰ -+/‹// -+5&'Ì _ISblank _IScntrl _ISpunct _ISalnum(_ISupper(_ISlower(_ISalpha(_ISdigit(_ISxdigit(_ISspace (_ISprint@(_ISgraph€$__ctype_b,ß -+å!mxml_sax_event_tR© !mxml_type_t]B!mxml_custom_destroy_cb_t_5 -+î!mxml_error_cb_tb¢ !mxml_attr_ti!mxml_element_tp!mxml_text_tv{!mxml_custom_t|¶!mxml_value_t†À!mxml_node_t“’< mxml_index_s–attr—c#num_nodes˜‹#alloc_nodes™‹#cur_nodeš‹# nodes›< # -+‚!mxml_index_tœÊ!mxml_custom_load_cb_tžs -+Ê !mxml_custom_save_cb_t¡– -+å !mxml_entity_cb_t¤Ä !mxml_load_cb_t§Ê -+ˆ!mxml_save_cb_tªæ -+L!mxml_sax_cb_t­! -+“ !_mxml_global_t'ò!_mxml_getc_cb_tTÑ!_mxml_putc_cb_tUÖ!_mxml_fdbuf_t]žQ.mxml-index.c/boot/home/Desktop/mxml-2.6GNU C 2.95.3-haiku-090629€Yô^P(mxmlIndexDelete8€YÔYUind7ÿVÿmxml_index_s–attr—#num_nodes˜#alloc_nodes™#cur_nodeš# nodes›Ê# charintÊmxml_node_s,‰typeŠÖ#next‹N#prevŒN#parentN# childŽN#last_childN#valueT#ref_count‘#$user_data’¼#(ÐNmxml_type_eU MXML_IGNOREÿÿÿÿ -+MXML_ELEMENT -+MXML_INTEGER -+MXML_OPAQUE -+MXML_REAL -+MXML_TEXT -+MXML_CUSTOM ¼mxml_value_u  element€¾ integer opaque‚ realƒ  text„ custom…N  mxml_element_s lnamem#num_attrsn#attrsoÌ#doubleNmxml_text_sswhitespacet#stringu#†mxml_custom_sydataz¼#destroy{’#’¼†Ìmxml_attr_sfnameg#valueh#˜mxmlIndexEnumVÐÔYýYUindUÿR˜mxmlIndexFindvÐZr[UindsÿWelementt˜‘ valueu˜‘diffwPcurrentxVfirsty‘|lastz‘xž +mxmlIndexNew-ÿt[æ\Unode*Бelement+˜‘ attr,˜‘ind.ÿVcurrent/ÐWtemp0ÊPamxmlIndexResetÉÐè\ ]UindÈÿPÆindex_compareî ]}]UindëÿWfirstìБ secondíÐVdiffïP7index_find€]ã]UindÿPelement˜Rvalue˜WnodeÐVdiffPÆindex_sort@ä]ô^Uind=ÿ‘left>‘ right?‘pivotAБ|tempBÐQtemplCWtemprDVu_long Ôlong unsigned intu_intöunsigned intu_shortshort unsigned intu_char9unsigned charulongÔushortuintöunchar9blkcnt_tlong long intblksize_tfsblkcnt_tfsfilcnt_toff_t ino_t!cnt_t"dev_t# long intpid_t$ id_t% uid_t'ögid_t(ömode_t)öumode_t*önlink_t+daddr_t-caddr_t.addr_t0Ôkey_t1 ptrdiff_tv size_tªÔssize_t¬ wchar_tûwint_töclock_t time_t suseconds_t useconds_tÔp timespectv_sec #tv_nsec #­ itimerspecit_interval; #it_value; # -+tm,!tm_sec"#tm_min##tm_hour$#tm_mday%# tm_mon&#tm_year'#tm_wday(#tm_yday)#tm_isdst*# tm_gmtoff+#$tm_zone,#(__gnuc_va_listGva_list¾ -+fpos_t6Õõ -+_IO_marker i_nextpõ -+#_sbufq1 #_posr#² -+1 _IO_FILE˜q_flagsv#_IO_read_ptr{#_IO_read_end|#_IO_read_base}# _IO_write_base~#_IO_write_ptr#_IO_write_end€#_IO_buf_base#_IO_buf_end‚# _IO_save_base„#$_IO_backup_base…#(_IO_save_end†#,_markersˆõ -+#0_chainŠ1 #4_filenoŒ#8_flags2Ž#<_old_offsetÕ#@_cur_column“#H_vtable_offset”7 #J_shortbuf•F #K_lock—R #L_offset™Õ#P_codecvtœb #X_wide_datax #\_mode¢#`_unused2¤~ #dû -+signed charR  _IO_codecvtT _IO_wide_datah Š 3_IO_lock_tl_IO_FILE¥û -+FILE û -+Ú  -+ quot -+ #rem -+ -+#div_t -+ ´   -+quot -+ #rem -+ #ldiv_t -+ç A -+quot -+#rem -+#lldiv_t -+ ­__convert_long_double O __convert_long_double_i P­ __convert_long_double_d Q¹¹ölong double Wrandom_data fptr W#rptr W#state W#rand_type # rand_deg #rand_sep #end_ptr W#¶drand48_data "x #¶#a $¶#c %# old_x &¶#init '#Â_compare_function ‰Ûáöööü !“  -+_ISblank -+_IScntrl -+_ISpunct -+_ISalnum"_ISupper"_ISlower"_ISalpha"_ISdigit"_ISxdigit"_ISspace "_ISprint@"_ISgraph€'mxml_sax_event_eK -+MXML_SAX_CDATA -+MXML_SAX_COMMENT -+MXML_SAX_DATA -+MXML_SAX_DIRECTIVE -+MXML_SAX_ELEMENT_CLOSE -+MXML_SAX_ELEMENT_OPENmxml_sax_event_tR“mxml_type_t]Ömxml_custom_destroy_cb_t_r†mxml_error_cb_tb•¡˜mxml_attr_ti˜mxml_element_tp¾mxml_text_tvmxml_custom_t|Nmxml_value_t†Tmxml_node_t“mxml_index_tœmxml_custom_load_cb_tžJPeИmxml_custom_save_cb_t¡‚ˆ˜Ðmxml_entity_cb_t¤°¶Æ˜mxml_load_cb_t§Üâò?Ðmxml_save_cb_tª#˜Ðmxml_sax_cb_t­8>TÐ'¼ñmxml-node.c/boot/home/Desktop/mxml-2.6GNU C 2.95.3-haiku-090629_ød¯.µmxmlAddD_`Uparent@eWwhereAk‘ childBe‘nodeCeVemxml_node_s,‰typeŠr#next‹ê#prevŒê#parentê# childŽê#last_childê#valueð#ref_count‘k#$user_data’X#(µintêmxml_type_eU MXML_IGNOREÿÿÿÿ -+MXML_ELEMENT -+MXML_INTEGER -+MXML_OPAQUE -+MXML_REAL -+MXML_TEXT -+MXML_CUSTOMµ Xmxml_value_u  element€Z integerk opaque‚¥ realƒ³ text„½ custom…ø ¥mxml_element_s lnamem¥#num_attrsnk#attrsov#«chardoubleømxml_text_sswhitespacetk#stringu¥#0mxml_custom_sydatazX#destroy{<#<X0vmxml_attr_sfnameg¥#valueh¥#B´mxmlDeleteÇ`/aUnodeÆeViÈkW mxmlNewCDATA'e0a†aUparent%ePdata& Wnode(eV«|mxmlNewCustomReˆaÄaUparentOePdataPXPdestroyQ<PnodeSeRÓmxmlNewElementteÄabUparentrePnames WnodeueV-mxmlNewIntegeršebJbUparent˜ePinteger™kPnode›eR…mxmlNewOpaque¹eLbŸbUparent·ePopaque¸ WnodeºeVÙmxmlNewRealße bÒbUparentÝePrealÞ³[nodeàePDmxmlNewTexteÔb)cUparentýePwhitespaceþkPstringÿ WnodeeV¼mxmlNewTextf-e,c‰cUparent)ePwhitespace*kPformat+ Wnode.eVap/¼«ñmxmlRemoveYŒcècUnodeXeQ<mxmlNewXMLžeècµmxml_error) i–iUformat'µVap*Ès+Α€xglobal,yW»À charÀ -+ÛÀ ÿ y_mxml_global_s¤ error_cb!‹# num_entity_cbs"‘# entity_cbs#˜# wrap$‘#˜ custom_load_cb%…#œ custom_save_cb&¡# Û‹µ int -+¤´c´‘µ¤Ï‘ϵՅmxml_node_s,‰ typeЧ# next‹# prevŒ# parent# childŽ# last_child# value%# ref_count‘‘#$ user_data’#(º››ÏÀ‹mxml_type_eUMXML_IGNOREÿÿÿÿMXML_ELEMENTMXML_INTEGERMXML_OPAQUEMXML_REALMXML_TEXTMXML_CUSTOMÕmxml_value_u element€integer‘opaque‚›realƒÚtext„äcustom…Úmxml_element_s l namem›# num_attrsn‘# attrso# doublemxml_text_ss whitespacet‘# stringu›#Wmxml_custom_sy dataz# destroy{c#cWmxml_attr_sf nameg›# valueh›#iÙmxml_ignore_cbR§˜i¤iUnodeQÏ‘mxml_integer_cb_§¤i°iUnode^Ï‘Fmxml_opaque_cbl§°i¼iUnodekÏ‘zmxml_real_cby§¼iÈiUnodexÏ‘¯_mxml_globalyÈiPjUglobal‘yV_mxml_initªPj€jU÷_mxml_destructorµ€j¦jUg´Pu_long  long unsigned intu_int' unsigned intu_shortF short unsigned intu_charj unsigned charulongushortFuint'uncharjblkcnt_tÀ long long intblksize_t‘fsblkcnt_tÀfsfilcnt_tÀoff_t Àino_t!Àcnt_t"‘dev_t#: long intpid_t$:id_t%:uid_t''gid_t('mode_t)'umode_t*'nlink_t+‘daddr_t-‘caddr_t.›addr_t0key_t1:ptrdiff_tv:size_tªssize_t¬:wchar_tû‘wint_t'clock_t :time_t :suseconds_t:useconds_t¡timespec tv_sec9# tv_nsec:#Þitimerspec it_intervall# it_valuel#° tm,! tm_sec"‘# tm_min#‘# tm_hour$‘# tm_mday%‘# tm_mon&‘# tm_year'‘# tm_wday(‘# tm_yday)‘# tm_isdst*‘# tm_gmtoff+‘#$ tm_zone,›#(__gnuc_va_listG›va_list¾° fpos_t6& -+_IO_marker i _next p& -+# _sbuf qb # _pos r‘#ã b _IO_FILE˜ q _flags v‘# _IO_read_ptr {›# _IO_read_end |›# _IO_read_base }›# _IO_write_base ~›# _IO_write_ptr ›# _IO_write_end €›# _IO_buf_base ›# _IO_buf_end ‚›# _IO_save_base „›#$ _IO_backup_base …›#( _IO_save_end †›#, _markers ˆ& -+#0 _chain Šb #4 _fileno Œ‘#8 _flags2 Ž‘#< _old_offset #@ _cur_column “F#H _vtable_offset ”h #J _shortbuf •w #K _lock —ƒ #L _offset ™#P _codecvt œ“ #X _wide_data © #\ _mode ¢‘#` _unused2 ¤¯ #d, -+ signed char -+ƒ À_IO_codecvt… _IO_wide_data™ -+» À3_IO_lock_t l_IO_FILE ¥, -+FILE -+ , -+ stderr<õ Ù !!  quot ‘# rem -+‘#div_t û !T   quot :# rem :#ldiv_t . !ˆ   quot À# rem À#lldiv_t b ô __convert_long_double O__convert_long_double_i Pô __convert_long_double_d Q -+' long double žrandom_data  fptr ž# rptr ž# state ž# rand_type ‘# rand_deg ‘# rand_sep ‘# end_ptr ž#‘ýdrand48_data " x #ý# a $ý# c %F# old_x &ý# init '‘# -+ F_compare_function ‰"(=‘==C"#Ú_ISblank_IScntrl_ISpunct_ISalnum$_ISupper$_ISlower$_ISalpha$_ISdigit$_ISxdigit$_ISspace $_ISprint@$_ISgraph€nmxml_sax_event_eKMXML_SAX_CDATAMXML_SAX_COMMENTMXML_SAX_DATAMXML_SAX_DIRECTIVEMXML_SAX_ELEMENT_CLOSEMXML_SAX_ELEMENT_OPENmxml_sax_event_tRÚmxml_type_t]§mxml_custom_destroy_cb_t_¹Wmxml_error_cb_tb‹mxml_attr_tiimxml_element_tpmxml_text_tvämxml_custom_t|mxml_value_t†%mxml_node_t“ÕÀmxml_index_s– attr—›# num_nodes˜‘# alloc_nodes™‘# cur_nodeš‘# nodes›À#Ïmxml_index_tœNmxml_custom_load_cb_tž÷ºmxml_custom_save_cb_t¡‹mxml_entity_cb_t¤´mxml_load_cb_t§NTd†Ïmxml_save_cb_tªz€•µÏ‘mxml_sax_cb_t­ª°ÆÏn_mxml_global_t'Ûint8_t h uint8_t jint16_t short intuint16_tFint32_t‘uint32_t'int64_tÀuint64_tc long long unsigned intint_least8_tÜuint_least8_têint_least16_tùuint_least16_tint_least32_t%uint_least32_t 4int_least64_t"Duint_least64_t#Sint_fast8_t&%uint_fast8_t'4int_fast16_t)%uint_fast16_t*4int_fast32_t,%uint_fast32_t-4int_fast64_t/Duint_fast64_t0Sintptr_t3%uintptr_t44intmax_t7Àuintmax_t8cu_int8_t™êu_int16_tšu_int32_t›4u_int64_tœS_pthread_threadpthread_tqN_pthread_attrpthread_attr_tw_pthread_mutex flags4# count %# sem!%# owner"%# owner_count#%#pthread_mutex_t£_pthread_mutexattrpthread_mutexattr_tV&Ð_pthread_cond flags'4# sem(%# mutex)Ð# waiter_count*%# event_counter+%#pthread_cond_t\_pthread_condattrpthread_condattr_tìpthread_key_t‘\_pthread_once state/%#pthread_once_t5³_pthread_rwlock  flags34# owner4%#%³#&×@shared8×local?î!î8 sem7%#!_? lock_sem:%# lock_count;%# reader_count<%# writer_count=%# waiters>_# -+kpthread_rwlock_tr_pthread_rwlockattrpthread_rwlockattr_tµƒ;pthread_mutex_typeCPTHREAD_MUTEX_DEFAULTPTHREAD_MUTEX_NORMALPTHREAD_MUTEX_ERRORCHECKPTHREAD_MUTEX_RECURSIVEŽpthread_process_sharedJPTHREAD_PROCESS_PRIVATEPTHREAD_PROCESS_SHAREDê__pthread_cleanup_handler m previousnê# functiono¹# argumentp#Ž_mxml_keyƒ ðŸ_mxml_key_once„\ôŸ J mxml-string.c/boot/home/Desktop/mxml-2.6GNU C 2.95.3-haiku-090629°jWk~B©_mxml_strdupfW©°jÚjUformatU·RapXÂsY©P¯char½ ¯¯ -+B_mxml_vstrdupf¦©ÜjWkU format¤·‘ ap¥Â‘ bytes§BP buffer¨©V temp©I‘€~int U¯ÿu_long clong unsigned intu_int…unsigned intu_short¤short unsigned intu_charÈunsigned charulongcushort¤uint…uncharÈblkcnt_tlong long intblksize_tBfsblkcnt_tfsfilcnt_toff_t ino_t!cnt_t"Bdev_t#˜long intpid_t$˜id_t%˜uid_t'…gid_t(…mode_t)…umode_t*…nlink_t+Bdaddr_t-Bcaddr_t.©addr_t0ckey_t1˜ptrdiff_tv˜size_tªcssize_t¬˜wchar_tûBwint_t…clock_t ˜time_t ˜suseconds_t˜useconds_tcÿtimespectv_sec—#tv_nsec˜#<itimerspecit_intervalÊ#it_valueÊ#tm,!tm_sec"B#tm_min#B#tm_hour$B#tm_mday%B# tm_mon&B#tm_year'B#tm_wday(B#tm_yday)B#tm_isdst*B# tm_gmtoff+B#$tm_zone,©#(__gnuc_va_listG©va_list¾fpos_t6d„_IO_marker i_nextp„#_sbufqÀ#_posrB#AÀ_IO_FILE˜q_flagsvB#_IO_read_ptr{©#_IO_read_end|©#_IO_read_base}©# _IO_write_base~©#_IO_write_ptr©#_IO_write_end€©#_IO_buf_base©#_IO_buf_end‚©# _IO_save_base„©#$_IO_backup_base…©#(_IO_save_end†©#,_markersˆ„#0_chainŠÀ#4_filenoŒB#8_flags2ŽB#<_old_offsetd#@_cur_column“¤#H_vtable_offset”Æ#J_shortbuf•Õ#K_lock—á#L_offset™d#P_codecvtœñ#X_wide_data#\_mode¢B#`_unused2¤ #dŠsigned char á¯_IO_codecvtã_IO_wide_data÷ ¯3_IO_lock_tl_IO_FILE¥ŠFILE Ši quot B#rem -+B#div_t Cœ quot ˜#rem ˜#ldiv_t vÐ quot #rem #lldiv_t ª< __convert_long_double -+O__convert_long_double_i -+P< __convert_long_double_d -+QH H …long double æ random_data fptr æ #rptr æ #state æ #rand_type B# rand_deg B#rand_sep B#end_ptr æ #BE -+drand48_data "x #E -+#a $E -+#c %¤# old_x &E -+#init 'B# Q -+¤_compare_function ‰j -+p -+… -+B… -+… -+‹ -+"  _ISblank_IScntrl_ISpunct_ISalnum_ISupper_ISlower_ISalpha_ISdigit_ISxdigit_ISspace _ISprint@_ISgraph€% .? : ; ' @ -+: ; I -+4: ; I -+ : ;  : ; I8 -+ I&I $ > -+ : ; ( (  : ;  : ; I ' I.? : ; ' I@ -+4: ; I.: ;' I@ -+: ;I -+4: ;I -+: ; I: ;II!/ < : ;  : ; ' I &! : ; "(% .? : ; ' I@ -+: ; I -+4: ; I -+$ > ' II I &I -+ : ; : ; I8 -+ ' I!/  : ;  : ; ((  : ;  : ; I .? : ; ' @ -+ : ; !/: ; I: ;I< : ; & : ; (% .: ; ' I@ -+: ; I -+$ >  : ;  : ; I8 -+ : ; ( ( -+ I  : ; : ; I  .? : ; ' I@ -+4: ; I -+' II : ; I!/' !/ < &I4: ;I -+4: ;I.? : ;' I@ -+: ;I -+.? : ;' @ -+.: ;' I@ -+  -+: ;!: ; I": ;I#: ; $4: ; I? < % : ; &&' : ; ((% .? : ; ' @ -+: ; I -+ : ;  : ; I8 -+ I$ >  : ; ( -+(  : ; : ; I  ' I.? : ; ' I@ -+4: ; I -+&I.? : ;' I@ -+: ;I -+4: ;I -+.: ;' I@ -+.: ;' @ -+: ; I: ;II!/ < : ;  : ; ' I &! : ; "(% .? : ; ' @ -+: ; I -+ : ;  : ; I8 -+ I$ >  : ; ( -+(  : ; : ; I  ' I4: ; I -+.? : ;' I@ -+: ;I -+4: ;I -+&I4: ;I.? : ;' @ -+I!/.: ;' I@ -+: ; I: ;I!/ < : ;  : ; !' I"&# : ; $(%  : ;  : ; I8 -+ : ; ((  I : ; : ; I -+$ >  .? : ; ' I@ -+ : ; I -+4: ; I -+&I' I: ; I: ;II!/ < : ;  : ; ' I& : ; (% .? : ; ' I@ -+: ; I -+$ >  : ;  : ; I8 -+ I ' -+I  : ; ( (  : ;  : ; I&I.? : ;' I@ -+: ;I -+4: ;I: ; I: ;II!/ < : ;  : ; ' I& : ; (% .? : ; ' @ -+: ; I -+4: ; I4: ; I -+ I&I $ > -+I !/  : ; : ; I8 -+' I!/ ' I : ;  : ; ((  : ;  : ; I .? : ; ' I@ -+.: ; ' @ -+.: ; ' @ -+: ; I: ;I< : ; 4: ; I? < ! : ; "&# : ; $(% I8 -+& : ; % .? : ; ' I@ -+: ; I -+4: ; I4: ; I -+ I$ > &I -+.? : ;' I@ -+ : ;I -+ 4: ;I -+ I!/ : ; I: ;I : ;  : ; I8 -+ < : ;  : ;  : ;  : ; I' II& : ; ( (­öõ -+mxml-attr.cmxml.h/boot/develop/headers/posix/sys/types.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stddef.h/boot/develop/headers/posix/time.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stdarg.h/boot/develop/headers/posix/stdio.h/boot/develop/headers/posix/libio.h/boot/develop/headers/posix/stdio_pre.h/boot/develop/headers/posix/div_t.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/float.h/boot/develop/headers/posix/stdlib.h/boot/develop/headers/posix/ctype.h€ U© ¯ ³ É Ô à á è ù ÿ !l! !,!!,!";!@!'E!sK!P!f!j!n!,z!|!$—!!¦!ª!À!Â!×!à!ì!'"#"")"0"P"e"n"x"(–" "¶"½"Æ"Ì"Ó"t×"Û"(å"ñ" ####"#4#7#:#=#@#D# ^#m#m#û “öõ -+mxml-entity.cmxml-private.hmxml.h/boot/develop/headers/posix/sys/types.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stddef.h/boot/develop/headers/posix/time.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stdarg.h/boot/develop/headers/posix/stdio.h/boot/develop/headers/posix/libio.h/boot/develop/headers/posix/stdio_pre.h/boot/develop/headers/posix/div_t.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/float.h/boot/develop/headers/posix/stdlib.h/boot/develop/headers/posix/ctype.hp#A‹#“#¢#°# ¹#¼#Ç#È# t$€$ˆ$$˜$ $%¼$Ã$Ù$ß$î$ð$  %#%.%4%8%N%P%s]%#h%œ„%% %Å%Ç%Ð%Ó%Þ%þ%&"&o"&#3&3&û >½öõ -+mxml-file.cmxml.h/boot/develop/headers/posix/libio.hmxml-private.h/boot/develop/headers/posix/sys/types.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stddef.h/boot/develop/headers/posix/time.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stdarg.h/boot/develop/headers/posix/stdio.h/boot/develop/headers/posix/stdio_pre.h/boot/develop/headers/posix/stdio_post.h/boot/develop/headers/posix/div_t.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/float.h/boot/develop/headers/posix/stdlib.h/boot/develop/headers/posix/ctype.h@&„E&H&h&@ˆ&Ž& &¦&È&È&*å&'+'@'7q'x'''¥'´'¸' Ç'È'%æ'ë'ñ'( (((*(<(C(Y(\(%w(|(›((Ò(à(ì(ì(*) )))7)@)D)O)W)d)g)w)x)3œ)¢)´)º)Þ)à)4*$*5D*d*'*„*Š*—*˜*¯*´*¼*¼*!Ó*Ø*ä*ä* ÿ*++#+.+K+Y+n+x+‡+Œ+‘+—+ +¨+±+³+»+Ä+Æ+Ó+â+ñ+ý+ , ,$,$,/,C,O,s,y,,¢,ª,µ,É,Õ,á,ç,ð,ø,--#-/-5-@-N-Y-m-}--š-£-­-²-Ä-Ï-ã-ó-.../.?.Q.Y.a.k.p.|..“.ž.².Â.Ô.ß.ê.þ./ /(/3/G/W/i/q/}/‡// ›/¯/²/µ/¿/Á/Ä/Ü/í/í/ø/ 0000 0-00030=0=0B0M0]0j0o0r0†0–0 0­0­0¸0È0Ñ0Ô0×0Ü0é0ö0û0þ0 1"1"1.101G1O1\1c1n1y1|1”1˜1 1Õ1×1Ú1á1å1tå1ô1ô1 222%2%202I2P2V2b2d2|2|2¦2¯2Ó2Ù2ý23 -+343@3F3P3X3‚3Ž3”3 3®3ó3þ3444(4m4x4½4Å4Í4×4à4ì4ñ45L5W5œ5¤5ì5ô56 -+66 C6[6l6À6À6Å6ô677"7/7…7’7©7©7µ7¸7Î7Ô7×78(+80888E8g8l8Š8 ¢8¢8¨8­8Í8Ò8Ø8Þ8ò8999>9R9u9€9Œ9Œ9.©9%½9Ì9Ñ9Ñ9Ô9×9Þ9á9è9ï9ö9:::":_:b:”:³:µ:Å:Ç:ë:ó: ;;;.;E;k;t;v;y;€;‚;Š;º;À;Ã;Æ;É;í;÷;<#<)<8<H<J<T<W<`<y<€<–<¯<¸<Ç<×<Ù<ã<æ<í<÷<ý<= ==6=V=X=x=Ò=ð=l>>)">?>A>a>|> > >ª>#°>É>ë>ó>ý> ? ?"?'?A?C?c?~?¢?¢?¬?#²?Ë?ç?ð?ö?@@@)@,@1@;@@@`@{@Ž@Ž@˜@"ž@·@Ó@Ø@â@ñ@AA$AAA$AHAhAƒAˆA"ŽA§AÃAÈAÎAÝAíAïA÷AýAB -+B BB B(BHBhBpB€B B£B©B¯B¾BÇBÊBÞBêBðBC"C'C:C[C`CfC…CŒC’C¤CªC­C·C½CÀCÊCÙCàCæCõC -+DDD D&DJDZD`DDŸDÁDÍDÖDÙDàDõDúDE*E0E4E@EHEö|QESEL\E`ELiEpE^yE€E—E E¥E¥}´E·E¾ÃEÏEÛEÜE/FF F'F;FGFVF`FgFpF„FŽF F¬F»FÀFÉFÒFÙFàFîFðFòF÷FG7G?GYG^G`GeGˆG¥G¿GuçGçG íGHH:HCHqHzH„H‡H‰HŒHH•H¸HÕHóH -+÷H÷H IIIII8IUIoI -+ŽIŽI”I¨I°IÄIÐIÚIìIôI JJJJJ6JBJNJRJfJhJµ~JJÇJ™J¨J¨JÀJÀJÛJàJKK8KHKPKXKbKkKmKrKzK„KKK”K¢K¶KÈKÍKÖKàKåKóKLN@N XNfN}NƒNˆNN²N·NÎNÏNÔNéNðNOOO%Oi%O%O%O)'O0OGOHOMOYO\O"wOO¸OÕOñO7P7PBP]PcPeP‡PÔP×PÛPðPøPGQTQŸQ³QÌQÎQÐQéQêQRR3RLRqRŠRŒR[™R¦R=³RÌRÌRÏRÐRêRS2SOSkS„S¦S¿SÂSÅSTTTT T0TITITLTMTPTiT‚T›T›TžT¡T»T¾TÃTÌTÝTöTøTUUU7USU[U`U‚UˆUU™UªUÃUÅUÇUàUáUVVNVSV`VqVŠVŒVV©VªVÌVW W1W1WGWcWuWÀWXXXX X)X1X@X@X XX`XuXŠXX§X¨X­X¶X¸XÏXÖX×XÜXèXèX"YY"Y9Y@YFYPYTYWYcYeYfYgYlYxYxYû >€öõ -+mxml-index.cmxml.h/boot/develop/headers/posix/sys/types.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stddef.h/boot/develop/headers/posix/time.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stdarg.h/boot/develop/headers/posix/stdio.h/boot/develop/headers/posix/libio.h/boot/develop/headers/posix/stdio_pre.h/boot/develop/headers/posix/div_t.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/float.h/boot/develop/headers/posix/stdlib.h/boot/develop/headers/posix/ctype.h€YK—Y›Y¡Y­Y³YÂYËYÔYÚYÞYæYðYZ'Z$/Z#;ZPZ[Z"fZmZqZvZ„Z‡Z‰Z¢Z¤Z¥ZÊZ!ÐZÔZàZãZîZöZ[[. [=[P[dV[`[5f[r[t[4[–[«[Í[Ô[Ú[ë[÷[\'*\6\@\jT\V\^\b\q\ˆ\\"“\—\£\¾\Å\9Í\Ú\9æ\è\!î\ò\ù\ÿ\] ]"']A]G]q]}]€] ž]¢]¶]º]×]ã]ä],^^ ^ ^^^^ ^!^D^F^G^j^n^w^}^†^fˆ^7¦^µ^Á^É^Ý^ô^ô^û _öõ -+mxml-node.cmxml.h/boot/develop/headers/posix/sys/types.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stddef.h/boot/develop/headers/posix/time.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/stdarg.h/boot/develop/headers/posix/stdio.h/boot/develop/headers/posix/libio.h/boot/develop/headers/posix/stdio_pre.h/boot/develop/headers/posix/div_t.h/boot/develop/tools/gnupro/lib/gcc-lib/i586-pc-haiku/2.95.3-haiku-090629/include/float.h/boot/develop/headers/posix/stdlib.h/boot/develop/headers/posix/ctype.h_W_+_&1_:_=_P_c_i_p_u_x_{_€_†_Œ_“_˜_›_¡_£_¶_¹_¿_Æ_Ð_Ó_Ö_Ø_Û_Þ_á_ç_î_ó_ö_ü_#`  ` (`1`3`H`x``‹`–` `ª`¶`Á`Í`Ó`ß`á`è`ñ`ó`ú`aaaa%a0a%Ha!LaPagaza†aˆa'ža!¯aµa»aÄaÄa"Üa!àaäaûabbb"*b ;bAbJbLb#db!hbpb‡b“bŸb b"¶b ÅbËbÒbÔb%ìb!ðbôb ccc)c,c&Dc"HcPcgcjcmcpc}c‰cŒc “cžc(¥c°c¶c½cÅcÎcÕcÜcãc"èc"d%dœœðI MO°k°kUàkàkd ]DŠDz g\–\†nd–d†ul–l†¸~$—$‡œƒÀ—À‡8‰øŸøŽø€—x‘ ¦˜’¶§—S¸ÂúO»Ðµ^‰E>¤ÜT©p _ ĵ ”è |Œ|œ°k àk -+DŠ \– d– l–$—À—øŸñÿLÀ—Pd– ^Ä—j€DŠ “øžøŸ¨´L¿È—Í\– Û`kñ`– ´˜k¿øŸþh– X– ñÿdñÿtñÿ€x"õŽDŠ žñÿ¬ЗŽ ‹ ¸ñÿÄ@&%Ñ ,"ÞŒ9O íd2Qü¨J| 01I\Oä*ô1n8¸7WG$NXä*%f|1xs8|ƒØŸŒÜEÌŸ@N¯èX½@X¨ŽÔ‹ ÏñÿÜ€]cçä]ò ]qŽ< ñÿ  dXŽp‘ ñÿŽ|“ #ñÿŽä“ .ñÿ=ðŸGôŸVPj0a€j&Ž• rñÿŽ– €l–ñÿ‰$—ñÿŸG°Œc\»€d Æ_ÎUÜà)Bìì(‹ûk§°g"'/28b6G<U,c]bl°i {ÄaOŠ0 C–h›Üj{ªè\$¹²À¡Êx)fØdCåh%Ëõ $N|Ž˜i $\(1*9Î@È#×R,YJ_ì!Œs.{ˆº" ÔeW­d*3ÃÖLbSäÈ&<ñ°j*ÿJ; ˜*$!^)Ì—@h&`K,fGX€fRf`møŸñÿE ñÿJ€YTZ|!nm´hdz¨C†ð$wŸÈ'‘ª“"ÀÈ—Û0aVècüÙ/home/michaelvoliveira/develop/haiku/trunk/src/system/glue/arch/x86/crti.Sp.3__DTOR_LIST__completed.4__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.11frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__/home/michaelvoliveira/develop/haiku/trunk/src/system/glue/arch/x86/crtn.Sinit_term_dyn.cmxml-attr.cmxml_set_attr__FRAME_BEGIN__mxml-entity.centities.15mxml-file.cmxml_isspacemxml_fd_getcmxml_load_datamxml_file_getcmxml_string_getcmxml_fd_putcmxml_write_nodemxml_fd_writemxml_file_putcmxml_string_putcmxml_add_charmxml_fd_readmxml_get_entitytypes.69mxml_parse_elementmxml_write_namemxml_write_wsmxml_write_stringmxml-index.cindex_findindex_sortindex_comparemxml-node.cmxml_newmxml-search.cmxml-set.cmxml-private.c_mxml_key_mxml_key_once_mxml_init_mxml_destructormxml-string.c_DYNAMIC_GLOBAL_OFFSET_TABLE_get_image_symbolmxmlRemovemxmlRetainmxmlAddputc_unlockedmxmlSAXLoadFilemxmlSaveStringpthread_getspecificstrerrormxmlSetIntegermemmovesnprintfmxmlNewIntegergetc_unlockedmxmlNewTextf__ctype_bmxml_opaque_cbmxmlNewElement_term_aftergetc_mxml_vstrdupfmxmlIndexResetmallocvsnprintfmxmlSAXLoadFd_init_before_mxml_entity_cbmxmlEntityGetValue_initstrtolmxml_ignore_cbmxmlSaveFilestrrchrcallocmxmlEntityGetNamestrtodwritemxmlElementSetAttrffprintfpthread_once__deregister_frame_infomxmlWalkNextmxmlSetCustomHandlerspthread_key_createmxmlNewOpaquemxmlLoadFile_mxml_strdupfreadstrncmpmxmlSetErrorCallbackrealloc_gSharedObjectHaikuABImxmlLoadFdmxmlWalkPrevmxmlSetCustomstrdupmxmlReleasemxmlDeletemxmlElementDeleteAttr__bss_startmxmlEntityAddCallback_mxml_globalmxmlSetCDATAmxmlSetOpaquemxml_real_cb_term_beforemxmlElementGetAttrmxmlNewRealmxmlFindElement_errnopmxmlSetElementmxmlNewCustomputcmxmlSaveAllocStringmxmlSAXLoadStringstrcmpmxml_errormxmlLoadString_finimxmlSetRealmxmlIndexEnumsprintfmxmlSetWrapMarginmxmlIndexNew_single_threadedstderrmxmlSetTextmxmlIndexFindmxmlNewXMLmxml_integer_cbmxmlNewText_edata_endmxmlIndexDeletemxmlElementSetAttrmxmlSetTextf_init_aftermxmlEntityRemoveCallbackmxmlSaveFd__register_frame_info_gSharedObjectHaikuVersionmxmlNewCDATApthread_setspecificfree -\ No newline at end of file -diff -Naur mxml-2.6/mxml-attr.c mxml-2.6-haiku/mxml-attr.c ---- mxml-2.6/mxml-attr.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-attr.c 2007-09-15 20:04:56.000000000 +0000 -@@ -0,0 +1,321 @@ -+/* -+ * "$Id: mxml-attr.c 308 2007-09-15 20:04:56Z mike $" -+ * -+ * Attribute support code for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlElementDeleteAttr() - Delete an attribute. -+ * mxmlElementGetAttr() - Get an attribute. -+ * mxmlElementSetAttr() - Set an attribute. -+ * mxmlElementSetAttrf() - Set an attribute with a formatted value. -+ * mxml_set_attr() - Set or add an attribute name/value pair. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * Local functions... -+ */ -+ -+static int mxml_set_attr(mxml_node_t *node, const char *name, -+ char *value); -+ -+ -+/* -+ * 'mxmlElementDeleteAttr()' - Delete an attribute. -+ * -+ * @since Mini-XML 2.4@ -+ */ -+ -+void -+mxmlElementDeleteAttr(mxml_node_t *node,/* I - Element */ -+ const char *name)/* I - Attribute name */ -+{ -+ int i; /* Looping var */ -+ mxml_attr_t *attr; /* Cirrent attribute */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlElementDeleteAttr(node=%p, name=\"%s\")\n", -+ node, name ? name : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !name) -+ return; -+ -+ /* -+ * Look for the attribute... -+ */ -+ -+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs; -+ i > 0; -+ i --, attr ++) -+ { -+#ifdef DEBUG -+ printf(" %s=\"%s\"\n", attr->name, attr->value); -+#endif /* DEBUG */ -+ -+ if (!strcmp(attr->name, name)) -+ { -+ /* -+ * Delete this attribute... -+ */ -+ -+ free(attr->name); -+ free(attr->value); -+ -+ i --; -+ if (i > 0) -+ memmove(attr, attr + 1, i * sizeof(mxml_attr_t)); -+ -+ node->value.element.num_attrs --; -+ return; -+ } -+ } -+} -+ -+ -+/* -+ * 'mxmlElementGetAttr()' - Get an attribute. -+ * -+ * This function returns NULL if the node is not an element or the -+ * named attribute does not exist. -+ */ -+ -+const char * /* O - Attribute value or NULL */ -+mxmlElementGetAttr(mxml_node_t *node, /* I - Element node */ -+ const char *name) /* I - Name of attribute */ -+{ -+ int i; /* Looping var */ -+ mxml_attr_t *attr; /* Cirrent attribute */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n", -+ node, name ? name : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !name) -+ return (NULL); -+ -+ /* -+ * Look for the attribute... -+ */ -+ -+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs; -+ i > 0; -+ i --, attr ++) -+ { -+#ifdef DEBUG -+ printf(" %s=\"%s\"\n", attr->name, attr->value); -+#endif /* DEBUG */ -+ -+ if (!strcmp(attr->name, name)) -+ { -+#ifdef DEBUG -+ printf(" Returning \"%s\"!\n", attr->value); -+#endif /* DEBUG */ -+ return (attr->value); -+ } -+ } -+ -+ /* -+ * Didn't find attribute, so return NULL... -+ */ -+ -+#ifdef DEBUG -+ puts(" Returning NULL!\n"); -+#endif /* DEBUG */ -+ -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxmlElementSetAttr()' - Set an attribute. -+ * -+ * If the named attribute already exists, the value of the attribute -+ * is replaced by the new string value. The string value is copied -+ * into the element node. This function does nothing if the node is -+ * not an element. -+ */ -+ -+void -+mxmlElementSetAttr(mxml_node_t *node, /* I - Element node */ -+ const char *name, /* I - Name of attribute */ -+ const char *value) /* I - Attribute value */ -+{ -+ char *valuec; /* Copy of value */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n", -+ node, name ? name : "(null)", value ? value : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !name) -+ return; -+ -+ if (value) -+ valuec = strdup(value); -+ else -+ valuec = NULL; -+ -+ if (mxml_set_attr(node, name, valuec)) -+ free(valuec); -+} -+ -+ -+/* -+ * 'mxmlElementSetAttrf()' - Set an attribute with a formatted value. -+ * -+ * If the named attribute already exists, the value of the attribute -+ * is replaced by the new formatted string. The formatted string value is -+ * copied into the element node. This function does nothing if the node -+ * is not an element. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+void -+mxmlElementSetAttrf(mxml_node_t *node, /* I - Element node */ -+ const char *name, /* I - Name of attribute */ -+ const char *format,/* I - Printf-style attribute value */ -+ ...) /* I - Additional arguments as needed */ -+{ -+ va_list ap; /* Argument pointer */ -+ char *value; /* Value */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, -+ "mxmlElementSetAttrf(node=%p, name=\"%s\", format=\"%s\", ...)\n", -+ node, name ? name : "(null)", format ? format : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !name || !format) -+ return; -+ -+ /* -+ * Format the value... -+ */ -+ -+ va_start(ap, format); -+ value = _mxml_vstrdupf(format, ap); -+ va_end(ap); -+ -+ if (!value) -+ mxml_error("Unable to allocate memory for attribute '%s' in element %s!", -+ name, node->value.element.name); -+ else if (mxml_set_attr(node, name, value)) -+ free(value); -+} -+ -+ -+/* -+ * 'mxml_set_attr()' - Set or add an attribute name/value pair. -+ */ -+ -+static int /* O - 0 on success, -1 on failure */ -+mxml_set_attr(mxml_node_t *node, /* I - Element node */ -+ const char *name, /* I - Attribute name */ -+ char *value) /* I - Attribute value */ -+{ -+ int i; /* Looping var */ -+ mxml_attr_t *attr; /* New attribute */ -+ -+ -+ /* -+ * Look for the attribute... -+ */ -+ -+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs; -+ i > 0; -+ i --, attr ++) -+ if (!strcmp(attr->name, name)) -+ { -+ /* -+ * Free the old value as needed... -+ */ -+ -+ if (attr->value) -+ free(attr->value); -+ -+ attr->value = value; -+ -+ return (0); -+ } -+ -+ /* -+ * Add a new attribute... -+ */ -+ -+ if (node->value.element.num_attrs == 0) -+ attr = malloc(sizeof(mxml_attr_t)); -+ else -+ attr = realloc(node->value.element.attrs, -+ (node->value.element.num_attrs + 1) * sizeof(mxml_attr_t)); -+ -+ if (!attr) -+ { -+ mxml_error("Unable to allocate memory for attribute '%s' in element %s!", -+ name, node->value.element.name); -+ return (-1); -+ } -+ -+ node->value.element.attrs = attr; -+ attr += node->value.element.num_attrs; -+ -+ if ((attr->name = strdup(name)) == NULL) -+ { -+ mxml_error("Unable to allocate memory for attribute '%s' in element %s!", -+ name, node->value.element.name); -+ return (-1); -+ } -+ -+ attr->value = value; -+ -+ node->value.element.num_attrs ++; -+ -+ return (0); -+} -+ -+ -+/* -+ * End of "$Id: mxml-attr.c 308 2007-09-15 20:04:56Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-entity.c mxml-2.6-haiku/mxml-entity.c ---- mxml-2.6/mxml-entity.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-entity.c 2009-03-19 05:38:52.000000000 +0000 -@@ -0,0 +1,462 @@ -+/* -+ * "$Id: mxml-entity.c 385 2009-03-19 05:38:52Z mike $" -+ * -+ * Character entity support code for Mini-XML, a small XML-like -+ * file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlEntityAddCallback() - Add a callback to convert entities to -+ * Unicode. -+ * mxmlEntityGetName() - Get the name that corresponds to the -+ * character value. -+ * mxmlEntityGetValue() - Get the character corresponding to a named -+ * entity. -+ * mxmlEntityRemoveCallback() - Remove a callback. -+ * _mxml_entity_cb() - Lookup standard (X)HTML entities. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "mxml-private.h" -+ -+ -+/* -+ * 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlEntityAddCallback( -+ mxml_entity_cb_t cb) /* I - Callback function to add */ -+{ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ if (global->num_entity_cbs < (int)(sizeof(global->entity_cbs) / sizeof(global->entity_cbs[0]))) -+ { -+ global->entity_cbs[global->num_entity_cbs] = cb; -+ global->num_entity_cbs ++; -+ -+ return (0); -+ } -+ else -+ { -+ mxml_error("Unable to add entity callback!"); -+ -+ return (-1); -+ } -+} -+ -+ -+/* -+ * 'mxmlEntityGetName()' - Get the name that corresponds to the character value. -+ * -+ * If val does not need to be represented by a named entity, NULL is returned. -+ */ -+ -+const char * /* O - Entity name or NULL */ -+mxmlEntityGetName(int val) /* I - Character value */ -+{ -+ switch (val) -+ { -+ case '&' : -+ return ("amp"); -+ -+ case '<' : -+ return ("lt"); -+ -+ case '>' : -+ return ("gt"); -+ -+ case '\"' : -+ return ("quot"); -+ -+ default : -+ return (NULL); -+ } -+} -+ -+ -+/* -+ * 'mxmlEntityGetValue()' - Get the character corresponding to a named entity. -+ * -+ * The entity name can also be a numeric constant. -1 is returned if the -+ * name is not known. -+ */ -+ -+int /* O - Character value or -1 on error */ -+mxmlEntityGetValue(const char *name) /* I - Entity name */ -+{ -+ int i; /* Looping var */ -+ int ch; /* Character value */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ for (i = 0; i < global->num_entity_cbs; i ++) -+ if ((ch = (global->entity_cbs[i])(name)) >= 0) -+ return (ch); -+ -+ return (-1); -+} -+ -+ -+/* -+ * 'mxmlEntityRemoveCallback()' - Remove a callback. -+ */ -+ -+void -+mxmlEntityRemoveCallback( -+ mxml_entity_cb_t cb) /* I - Callback function to remove */ -+{ -+ int i; /* Looping var */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ for (i = 0; i < global->num_entity_cbs; i ++) -+ if (cb == global->entity_cbs[i]) -+ { -+ /* -+ * Remove the callback... -+ */ -+ -+ global->num_entity_cbs --; -+ -+ if (i < global->num_entity_cbs) -+ memmove(global->entity_cbs + i, global->entity_cbs + i + 1, -+ (global->num_entity_cbs - i) * sizeof(global->entity_cbs[0])); -+ -+ return; -+ } -+} -+ -+ -+/* -+ * '_mxml_entity_cb()' - Lookup standard (X)HTML entities. -+ */ -+ -+int /* O - Unicode value or -1 */ -+_mxml_entity_cb(const char *name) /* I - Entity name */ -+{ -+ int diff, /* Difference between names */ -+ current, /* Current entity in search */ -+ first, /* First entity in search */ -+ last; /* Last entity in search */ -+ static const struct -+ { -+ const char *name; /* Entity name */ -+ int val; /* Character value */ -+ } entities[] = -+ { -+ { "AElig", 198 }, -+ { "Aacute", 193 }, -+ { "Acirc", 194 }, -+ { "Agrave", 192 }, -+ { "Alpha", 913 }, -+ { "Aring", 197 }, -+ { "Atilde", 195 }, -+ { "Auml", 196 }, -+ { "Beta", 914 }, -+ { "Ccedil", 199 }, -+ { "Chi", 935 }, -+ { "Dagger", 8225 }, -+ { "Delta", 916 }, -+ { "Dstrok", 208 }, -+ { "ETH", 208 }, -+ { "Eacute", 201 }, -+ { "Ecirc", 202 }, -+ { "Egrave", 200 }, -+ { "Epsilon", 917 }, -+ { "Eta", 919 }, -+ { "Euml", 203 }, -+ { "Gamma", 915 }, -+ { "Iacute", 205 }, -+ { "Icirc", 206 }, -+ { "Igrave", 204 }, -+ { "Iota", 921 }, -+ { "Iuml", 207 }, -+ { "Kappa", 922 }, -+ { "Lambda", 923 }, -+ { "Mu", 924 }, -+ { "Ntilde", 209 }, -+ { "Nu", 925 }, -+ { "OElig", 338 }, -+ { "Oacute", 211 }, -+ { "Ocirc", 212 }, -+ { "Ograve", 210 }, -+ { "Omega", 937 }, -+ { "Omicron", 927 }, -+ { "Oslash", 216 }, -+ { "Otilde", 213 }, -+ { "Ouml", 214 }, -+ { "Phi", 934 }, -+ { "Pi", 928 }, -+ { "Prime", 8243 }, -+ { "Psi", 936 }, -+ { "Rho", 929 }, -+ { "Scaron", 352 }, -+ { "Sigma", 931 }, -+ { "THORN", 222 }, -+ { "Tau", 932 }, -+ { "Theta", 920 }, -+ { "Uacute", 218 }, -+ { "Ucirc", 219 }, -+ { "Ugrave", 217 }, -+ { "Upsilon", 933 }, -+ { "Uuml", 220 }, -+ { "Xi", 926 }, -+ { "Yacute", 221 }, -+ { "Yuml", 376 }, -+ { "Zeta", 918 }, -+ { "aacute", 225 }, -+ { "acirc", 226 }, -+ { "acute", 180 }, -+ { "aelig", 230 }, -+ { "agrave", 224 }, -+ { "alefsym", 8501 }, -+ { "alpha", 945 }, -+ { "amp", '&' }, -+ { "and", 8743 }, -+ { "ang", 8736 }, -+ { "apos", '\'' }, -+ { "aring", 229 }, -+ { "asymp", 8776 }, -+ { "atilde", 227 }, -+ { "auml", 228 }, -+ { "bdquo", 8222 }, -+ { "beta", 946 }, -+ { "brkbar", 166 }, -+ { "brvbar", 166 }, -+ { "bull", 8226 }, -+ { "cap", 8745 }, -+ { "ccedil", 231 }, -+ { "cedil", 184 }, -+ { "cent", 162 }, -+ { "chi", 967 }, -+ { "circ", 710 }, -+ { "clubs", 9827 }, -+ { "cong", 8773 }, -+ { "copy", 169 }, -+ { "crarr", 8629 }, -+ { "cup", 8746 }, -+ { "curren", 164 }, -+ { "dArr", 8659 }, -+ { "dagger", 8224 }, -+ { "darr", 8595 }, -+ { "deg", 176 }, -+ { "delta", 948 }, -+ { "diams", 9830 }, -+ { "die", 168 }, -+ { "divide", 247 }, -+ { "eacute", 233 }, -+ { "ecirc", 234 }, -+ { "egrave", 232 }, -+ { "empty", 8709 }, -+ { "emsp", 8195 }, -+ { "ensp", 8194 }, -+ { "epsilon", 949 }, -+ { "equiv", 8801 }, -+ { "eta", 951 }, -+ { "eth", 240 }, -+ { "euml", 235 }, -+ { "euro", 8364 }, -+ { "exist", 8707 }, -+ { "fnof", 402 }, -+ { "forall", 8704 }, -+ { "frac12", 189 }, -+ { "frac14", 188 }, -+ { "frac34", 190 }, -+ { "frasl", 8260 }, -+ { "gamma", 947 }, -+ { "ge", 8805 }, -+ { "gt", '>' }, -+ { "hArr", 8660 }, -+ { "harr", 8596 }, -+ { "hearts", 9829 }, -+ { "hellip", 8230 }, -+ { "hibar", 175 }, -+ { "iacute", 237 }, -+ { "icirc", 238 }, -+ { "iexcl", 161 }, -+ { "igrave", 236 }, -+ { "image", 8465 }, -+ { "infin", 8734 }, -+ { "int", 8747 }, -+ { "iota", 953 }, -+ { "iquest", 191 }, -+ { "isin", 8712 }, -+ { "iuml", 239 }, -+ { "kappa", 954 }, -+ { "lArr", 8656 }, -+ { "lambda", 955 }, -+ { "lang", 9001 }, -+ { "laquo", 171 }, -+ { "larr", 8592 }, -+ { "lceil", 8968 }, -+ { "ldquo", 8220 }, -+ { "le", 8804 }, -+ { "lfloor", 8970 }, -+ { "lowast", 8727 }, -+ { "loz", 9674 }, -+ { "lrm", 8206 }, -+ { "lsaquo", 8249 }, -+ { "lsquo", 8216 }, -+ { "lt", '<' }, -+ { "macr", 175 }, -+ { "mdash", 8212 }, -+ { "micro", 181 }, -+ { "middot", 183 }, -+ { "minus", 8722 }, -+ { "mu", 956 }, -+ { "nabla", 8711 }, -+ { "nbsp", 160 }, -+ { "ndash", 8211 }, -+ { "ne", 8800 }, -+ { "ni", 8715 }, -+ { "not", 172 }, -+ { "notin", 8713 }, -+ { "nsub", 8836 }, -+ { "ntilde", 241 }, -+ { "nu", 957 }, -+ { "oacute", 243 }, -+ { "ocirc", 244 }, -+ { "oelig", 339 }, -+ { "ograve", 242 }, -+ { "oline", 8254 }, -+ { "omega", 969 }, -+ { "omicron", 959 }, -+ { "oplus", 8853 }, -+ { "or", 8744 }, -+ { "ordf", 170 }, -+ { "ordm", 186 }, -+ { "oslash", 248 }, -+ { "otilde", 245 }, -+ { "otimes", 8855 }, -+ { "ouml", 246 }, -+ { "para", 182 }, -+ { "part", 8706 }, -+ { "permil", 8240 }, -+ { "perp", 8869 }, -+ { "phi", 966 }, -+ { "pi", 960 }, -+ { "piv", 982 }, -+ { "plusmn", 177 }, -+ { "pound", 163 }, -+ { "prime", 8242 }, -+ { "prod", 8719 }, -+ { "prop", 8733 }, -+ { "psi", 968 }, -+ { "quot", '\"' }, -+ { "rArr", 8658 }, -+ { "radic", 8730 }, -+ { "rang", 9002 }, -+ { "raquo", 187 }, -+ { "rarr", 8594 }, -+ { "rceil", 8969 }, -+ { "rdquo", 8221 }, -+ { "real", 8476 }, -+ { "reg", 174 }, -+ { "rfloor", 8971 }, -+ { "rho", 961 }, -+ { "rlm", 8207 }, -+ { "rsaquo", 8250 }, -+ { "rsquo", 8217 }, -+ { "sbquo", 8218 }, -+ { "scaron", 353 }, -+ { "sdot", 8901 }, -+ { "sect", 167 }, -+ { "shy", 173 }, -+ { "sigma", 963 }, -+ { "sigmaf", 962 }, -+ { "sim", 8764 }, -+ { "spades", 9824 }, -+ { "sub", 8834 }, -+ { "sube", 8838 }, -+ { "sum", 8721 }, -+ { "sup", 8835 }, -+ { "sup1", 185 }, -+ { "sup2", 178 }, -+ { "sup3", 179 }, -+ { "supe", 8839 }, -+ { "szlig", 223 }, -+ { "tau", 964 }, -+ { "there4", 8756 }, -+ { "theta", 952 }, -+ { "thetasym", 977 }, -+ { "thinsp", 8201 }, -+ { "thorn", 254 }, -+ { "tilde", 732 }, -+ { "times", 215 }, -+ { "trade", 8482 }, -+ { "uArr", 8657 }, -+ { "uacute", 250 }, -+ { "uarr", 8593 }, -+ { "ucirc", 251 }, -+ { "ugrave", 249 }, -+ { "uml", 168 }, -+ { "upsih", 978 }, -+ { "upsilon", 965 }, -+ { "uuml", 252 }, -+ { "weierp", 8472 }, -+ { "xi", 958 }, -+ { "yacute", 253 }, -+ { "yen", 165 }, -+ { "yuml", 255 }, -+ { "zeta", 950 }, -+ { "zwj", 8205 }, -+ { "zwnj", 8204 } -+ }; -+ -+ -+ /* -+ * Do a binary search for the named entity... -+ */ -+ -+ first = 0; -+ last = (int)(sizeof(entities) / sizeof(entities[0]) - 1); -+ -+ while ((last - first) > 1) -+ { -+ current = (first + last) / 2; -+ -+ if ((diff = strcmp(name, entities[current].name)) == 0) -+ return (entities[current].val); -+ else if (diff < 0) -+ last = current; -+ else -+ first = current; -+ } -+ -+ /* -+ * If we get here, there is a small chance that there is still -+ * a match; check first and last... -+ */ -+ -+ if (!strcmp(name, entities[first].name)) -+ return (entities[first].val); -+ else if (!strcmp(name, entities[last].name)) -+ return (entities[last].val); -+ else -+ return (-1); -+} -+ -+ -+/* -+ * End of "$Id: mxml-entity.c 385 2009-03-19 05:38:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-file.c mxml-2.6-haiku/mxml-file.c ---- mxml-2.6/mxml-file.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-file.c 2009-05-17 05:20:52.000000000 +0000 -@@ -0,0 +1,3027 @@ -+/* -+ * "$Id: mxml-file.c 391 2009-05-17 05:20:52Z mike $" -+ * -+ * File loading code for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlLoadFd() - Load a file descriptor into an XML node tree. -+ * mxmlLoadFile() - Load a file into an XML node tree. -+ * mxmlLoadString() - Load a string into an XML node tree. -+ * mxmlSaveAllocString() - Save an XML node tree to an allocated string. -+ * mxmlSaveFd() - Save an XML tree to a file descriptor. -+ * mxmlSaveFile() - Save an XML tree to a file. -+ * mxmlSaveString() - Save an XML node tree to a string. -+ * mxmlSAXLoadFd() - Load a file descriptor into an XML node tree -+ * using a SAX callback. -+ * mxmlSAXLoadFile() - Load a file into an XML node tree -+ * using a SAX callback. -+ * mxmlSAXLoadString() - Load a string into an XML node tree -+ * using a SAX callback. -+ * mxmlSetCustomHandlers() - Set the handling functions for custom data. -+ * mxmlSetErrorCallback() - Set the error message callback. -+ * mxmlSetWrapMargin() - Set the the wrap margin when saving XML data. -+ * mxml_add_char() - Add a character to a buffer, expanding as needed. -+ * mxml_fd_getc() - Read a character from a file descriptor. -+ * mxml_fd_putc() - Write a character to a file descriptor. -+ * mxml_fd_read() - Read a buffer of data from a file descriptor. -+ * mxml_fd_write() - Write a buffer of data to a file descriptor. -+ * mxml_file_getc() - Get a character from a file. -+ * mxml_file_putc() - Write a character to a file. -+ * mxml_get_entity() - Get the character corresponding to an entity... -+ * mxml_load_data() - Load data into an XML node tree. -+ * mxml_parse_element() - Parse an element for any attributes... -+ * mxml_string_getc() - Get a character from a string. -+ * mxml_string_putc() - Write a character to a string. -+ * mxml_write_name() - Write a name string. -+ * mxml_write_node() - Save an XML node to a file. -+ * mxml_write_string() - Write a string, escaping & and < as needed. -+ * mxml_write_ws() - Do whitespace callback... -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#ifndef WIN32 -+# include -+#endif /* !WIN32 */ -+#include "mxml-private.h" -+ -+ -+/* -+ * Character encoding... -+ */ -+ -+#define ENCODE_UTF8 0 /* UTF-8 */ -+#define ENCODE_UTF16BE 1 /* UTF-16 Big-Endian */ -+#define ENCODE_UTF16LE 2 /* UTF-16 Little-Endian */ -+ -+ -+/* -+ * Macro to test for a bad XML character... -+ */ -+ -+#define mxml_bad_char(ch) ((ch) < ' ' && (ch) != '\n' && (ch) != '\r' && (ch) != '\t') -+ -+ -+/* -+ * Types and structures... -+ */ -+ -+typedef int (*_mxml_getc_cb_t)(void *, int *); -+typedef int (*_mxml_putc_cb_t)(int, void *); -+ -+typedef struct _mxml_fdbuf_s /**** File descriptor buffer ****/ -+{ -+ int fd; /* File descriptor */ -+ unsigned char *current, /* Current position in buffer */ -+ *end, /* End of buffer */ -+ buffer[8192]; /* Character buffer */ -+} _mxml_fdbuf_t; -+ -+ -+/* -+ * Local functions... -+ */ -+ -+static int mxml_add_char(int ch, char **ptr, char **buffer, -+ int *bufsize); -+static int mxml_fd_getc(void *p, int *encoding); -+static int mxml_fd_putc(int ch, void *p); -+static int mxml_fd_read(_mxml_fdbuf_t *buf); -+static int mxml_fd_write(_mxml_fdbuf_t *buf); -+static int mxml_file_getc(void *p, int *encoding); -+static int mxml_file_putc(int ch, void *p); -+static int mxml_get_entity(mxml_node_t *parent, void *p, -+ int *encoding, -+ _mxml_getc_cb_t getc_cb); -+static inline int mxml_isspace(int ch) -+ { -+ return (ch == ' ' || ch == '\t' || ch == '\r' || -+ ch == '\n'); -+ } -+static mxml_node_t *mxml_load_data(mxml_node_t *top, void *p, -+ mxml_load_cb_t cb, -+ _mxml_getc_cb_t getc_cb, -+ mxml_sax_cb_t sax_cb, void *sax_data); -+static int mxml_parse_element(mxml_node_t *node, void *p, -+ int *encoding, -+ _mxml_getc_cb_t getc_cb); -+static int mxml_string_getc(void *p, int *encoding); -+static int mxml_string_putc(int ch, void *p); -+static int mxml_write_name(const char *s, void *p, -+ _mxml_putc_cb_t putc_cb); -+static int mxml_write_node(mxml_node_t *node, void *p, -+ mxml_save_cb_t cb, int col, -+ _mxml_putc_cb_t putc_cb, -+ _mxml_global_t *global); -+static int mxml_write_string(const char *s, void *p, -+ _mxml_putc_cb_t putc_cb); -+static int mxml_write_ws(mxml_node_t *node, void *p, -+ mxml_save_cb_t cb, int ws, -+ int col, _mxml_putc_cb_t putc_cb); -+ -+ -+/* -+ * 'mxmlLoadFd()' - Load a file descriptor into an XML node tree. -+ * -+ * The nodes in the specified file are added to the specified top node. -+ * If no top node is provided, the XML file MUST be well-formed with a -+ * single parent node like for the entire file. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the file could not be read. */ -+mxmlLoadFd(mxml_node_t *top, /* I - Top node */ -+ int fd, /* I - File descriptor to read from */ -+ mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ -+{ -+ _mxml_fdbuf_t buf; /* File descriptor buffer */ -+ -+ -+ /* -+ * Initialize the file descriptor buffer... -+ */ -+ -+ buf.fd = fd; -+ buf.current = buf.buffer; -+ buf.end = buf.buffer; -+ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, &buf, cb, mxml_fd_getc, MXML_NO_CALLBACK, NULL)); -+} -+ -+ -+/* -+ * 'mxmlLoadFile()' - Load a file into an XML node tree. -+ * -+ * The nodes in the specified file are added to the specified top node. -+ * If no top node is provided, the XML file MUST be well-formed with a -+ * single parent node like for the entire file. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the file could not be read. */ -+mxmlLoadFile(mxml_node_t *top, /* I - Top node */ -+ FILE *fp, /* I - File to read from */ -+ mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ -+{ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, fp, cb, mxml_file_getc, MXML_NO_CALLBACK, NULL)); -+} -+ -+ -+/* -+ * 'mxmlLoadString()' - Load a string into an XML node tree. -+ * -+ * The nodes in the specified string are added to the specified top node. -+ * If no top node is provided, the XML string MUST be well-formed with a -+ * single parent node like for the entire string. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the string has errors. */ -+mxmlLoadString(mxml_node_t *top, /* I - Top node */ -+ const char *s, /* I - String to load */ -+ mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ -+{ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, (void *)&s, cb, mxml_string_getc, MXML_NO_CALLBACK, -+ NULL)); -+} -+ -+ -+/* -+ * 'mxmlSaveAllocString()' - Save an XML node tree to an allocated string. -+ * -+ * This function returns a pointer to a string containing the textual -+ * representation of the XML node tree. The string should be freed -+ * using the free() function when you are done with it. NULL is returned -+ * if the node would produce an empty string or if the string cannot be -+ * allocated. -+ * -+ * The callback argument specifies a function that returns a whitespace -+ * string or NULL before and after each element. If MXML_NO_CALLBACK -+ * is specified, whitespace will only be added before MXML_TEXT nodes -+ * with leading whitespace and before attribute names inside opening -+ * element tags. -+ */ -+ -+char * /* O - Allocated string or NULL */ -+mxmlSaveAllocString( -+ mxml_node_t *node, /* I - Node to write */ -+ mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ -+{ -+ int bytes; /* Required bytes */ -+ char buffer[8192]; /* Temporary buffer */ -+ char *s; /* Allocated string */ -+ -+ -+ /* -+ * Write the node to the temporary buffer... -+ */ -+ -+ bytes = mxmlSaveString(node, buffer, sizeof(buffer), cb); -+ -+ if (bytes <= 0) -+ return (NULL); -+ -+ if (bytes < (int)(sizeof(buffer) - 1)) -+ { -+ /* -+ * Node fit inside the buffer, so just duplicate that string and -+ * return... -+ */ -+ -+ return (strdup(buffer)); -+ } -+ -+ /* -+ * Allocate a buffer of the required size and save the node to the -+ * new buffer... -+ */ -+ -+ if ((s = malloc(bytes + 1)) == NULL) -+ return (NULL); -+ -+ mxmlSaveString(node, s, bytes + 1, cb); -+ -+ /* -+ * Return the allocated string... -+ */ -+ -+ return (s); -+} -+ -+ -+/* -+ * 'mxmlSaveFd()' - Save an XML tree to a file descriptor. -+ * -+ * The callback argument specifies a function that returns a whitespace -+ * string or NULL before and after each element. If MXML_NO_CALLBACK -+ * is specified, whitespace will only be added before MXML_TEXT nodes -+ * with leading whitespace and before attribute names inside opening -+ * element tags. -+ */ -+ -+int /* O - 0 on success, -1 on error. */ -+mxmlSaveFd(mxml_node_t *node, /* I - Node to write */ -+ int fd, /* I - File descriptor to write to */ -+ mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ -+{ -+ int col; /* Final column */ -+ _mxml_fdbuf_t buf; /* File descriptor buffer */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ /* -+ * Initialize the file descriptor buffer... -+ */ -+ -+ buf.fd = fd; -+ buf.current = buf.buffer; -+ buf.end = buf.buffer + sizeof(buf.buffer); -+ -+ /* -+ * Write the node... -+ */ -+ -+ if ((col = mxml_write_node(node, &buf, cb, 0, mxml_fd_putc, global)) < 0) -+ return (-1); -+ -+ if (col > 0) -+ if (mxml_fd_putc('\n', &buf) < 0) -+ return (-1); -+ -+ /* -+ * Flush and return... -+ */ -+ -+ return (mxml_fd_write(&buf)); -+} -+ -+ -+/* -+ * 'mxmlSaveFile()' - Save an XML tree to a file. -+ * -+ * The callback argument specifies a function that returns a whitespace -+ * string or NULL before and after each element. If MXML_NO_CALLBACK -+ * is specified, whitespace will only be added before MXML_TEXT nodes -+ * with leading whitespace and before attribute names inside opening -+ * element tags. -+ */ -+ -+int /* O - 0 on success, -1 on error. */ -+mxmlSaveFile(mxml_node_t *node, /* I - Node to write */ -+ FILE *fp, /* I - File to write to */ -+ mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ -+{ -+ int col; /* Final column */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ /* -+ * Write the node... -+ */ -+ -+ if ((col = mxml_write_node(node, fp, cb, 0, mxml_file_putc, global)) < 0) -+ return (-1); -+ -+ if (col > 0) -+ if (putc('\n', fp) < 0) -+ return (-1); -+ -+ /* -+ * Return 0 (success)... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSaveString()' - Save an XML node tree to a string. -+ * -+ * This function returns the total number of bytes that would be -+ * required for the string but only copies (bufsize - 1) characters -+ * into the specified buffer. -+ * -+ * The callback argument specifies a function that returns a whitespace -+ * string or NULL before and after each element. If MXML_NO_CALLBACK -+ * is specified, whitespace will only be added before MXML_TEXT nodes -+ * with leading whitespace and before attribute names inside opening -+ * element tags. -+ */ -+ -+int /* O - Size of string */ -+mxmlSaveString(mxml_node_t *node, /* I - Node to write */ -+ char *buffer, /* I - String buffer */ -+ int bufsize, /* I - Size of string buffer */ -+ mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ -+{ -+ int col; /* Final column */ -+ char *ptr[2]; /* Pointers for putc_cb */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ /* -+ * Write the node... -+ */ -+ -+ ptr[0] = buffer; -+ ptr[1] = buffer + bufsize; -+ -+ if ((col = mxml_write_node(node, ptr, cb, 0, mxml_string_putc, global)) < 0) -+ return (-1); -+ -+ if (col > 0) -+ mxml_string_putc('\n', ptr); -+ -+ /* -+ * Nul-terminate the buffer... -+ */ -+ -+ if (ptr[0] >= ptr[1]) -+ buffer[bufsize - 1] = '\0'; -+ else -+ ptr[0][0] = '\0'; -+ -+ /* -+ * Return the number of characters... -+ */ -+ -+ return (ptr[0] - buffer); -+} -+ -+ -+/* -+ * 'mxmlSAXLoadFd()' - Load a file descriptor into an XML node tree -+ * using a SAX callback. -+ * -+ * The nodes in the specified file are added to the specified top node. -+ * If no top node is provided, the XML file MUST be well-formed with a -+ * single parent node like for the entire file. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ * -+ * 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. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the file could not be read. */ -+mxmlSAXLoadFd(mxml_node_t *top, /* I - Top node */ -+ int fd, /* I - File descriptor to read from */ -+ mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ -+ mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ -+ void *sax_data) /* I - SAX user data */ -+{ -+ _mxml_fdbuf_t buf; /* File descriptor buffer */ -+ -+ -+ /* -+ * Initialize the file descriptor buffer... -+ */ -+ -+ buf.fd = fd; -+ buf.current = buf.buffer; -+ buf.end = buf.buffer; -+ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, &buf, cb, mxml_fd_getc, sax_cb, sax_data)); -+} -+ -+ -+/* -+ * 'mxmlSAXLoadFile()' - Load a file into an XML node tree -+ * using a SAX callback. -+ * -+ * The nodes in the specified file are added to the specified top node. -+ * If no top node is provided, the XML file MUST be well-formed with a -+ * single parent node like for the entire file. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ * -+ * 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. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the file could not be read. */ -+mxmlSAXLoadFile( -+ mxml_node_t *top, /* I - Top node */ -+ FILE *fp, /* I - File to read from */ -+ mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ -+ mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ -+ void *sax_data) /* I - SAX user data */ -+{ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, fp, cb, mxml_file_getc, sax_cb, sax_data)); -+} -+ -+ -+/* -+ * 'mxmlSAXLoadString()' - Load a string into an XML node tree -+ * using a SAX callback. -+ * -+ * The nodes in the specified string are added to the specified top node. -+ * If no top node is provided, the XML string MUST be well-formed with a -+ * single parent node like for the entire string. The callback -+ * function returns the value type that should be used for child nodes. -+ * If MXML_NO_CALLBACK is specified then all child nodes will be either -+ * MXML_ELEMENT or MXML_TEXT nodes. -+ * -+ * 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. -+ * -+ * 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. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+mxml_node_t * /* O - First node or NULL if the string has errors. */ -+mxmlSAXLoadString( -+ mxml_node_t *top, /* I - Top node */ -+ const char *s, /* I - String to load */ -+ mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ -+ mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ -+ void *sax_data) /* I - SAX user data */ -+{ -+ /* -+ * Read the XML data... -+ */ -+ -+ return (mxml_load_data(top, (void *)&s, cb, mxml_string_getc, sax_cb, sax_data)); -+} -+ -+ -+/* -+ * 'mxmlSetCustomHandlers()' - Set the handling functions for custom data. -+ * -+ * The load function accepts a node pointer and a data string and must -+ * return 0 on success and non-zero on error. -+ * -+ * The save function accepts a node pointer and must return a malloc'd -+ * string on success and NULL on error. -+ * -+ */ -+ -+void -+mxmlSetCustomHandlers( -+ mxml_custom_load_cb_t load, /* I - Load function */ -+ mxml_custom_save_cb_t save) /* I - Save function */ -+{ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ global->custom_load_cb = load; -+ global->custom_save_cb = save; -+} -+ -+ -+/* -+ * 'mxmlSetErrorCallback()' - Set the error message callback. -+ */ -+ -+void -+mxmlSetErrorCallback(mxml_error_cb_t cb)/* I - Error callback function */ -+{ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ global->error_cb = cb; -+} -+ -+ -+/* -+ * 'mxmlSetWrapMargin()' - Set the the wrap margin when saving XML data. -+ * -+ * Wrapping is disabled when "column" is 0. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+void -+mxmlSetWrapMargin(int column) /* I - Column for wrapping, 0 to disable wrapping */ -+{ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ global->wrap = column; -+} -+ -+ -+/* -+ * 'mxml_add_char()' - Add a character to a buffer, expanding as needed. -+ */ -+ -+static int /* O - 0 on success, -1 on error */ -+mxml_add_char(int ch, /* I - Character to add */ -+ char **bufptr, /* IO - Current position in buffer */ -+ char **buffer, /* IO - Current buffer */ -+ int *bufsize) /* IO - Current buffer size */ -+{ -+ char *newbuffer; /* New buffer value */ -+ -+ -+ if (*bufptr >= (*buffer + *bufsize - 4)) -+ { -+ /* -+ * Increase the size of the buffer... -+ */ -+ -+ if (*bufsize < 1024) -+ (*bufsize) *= 2; -+ else -+ (*bufsize) += 1024; -+ -+ if ((newbuffer = realloc(*buffer, *bufsize)) == NULL) -+ { -+ free(*buffer); -+ -+ mxml_error("Unable to expand string buffer to %d bytes!", *bufsize); -+ -+ return (-1); -+ } -+ -+ *bufptr = newbuffer + (*bufptr - *buffer); -+ *buffer = newbuffer; -+ } -+ -+ if (ch < 0x80) -+ { -+ /* -+ * Single byte ASCII... -+ */ -+ -+ *(*bufptr)++ = ch; -+ } -+ else if (ch < 0x800) -+ { -+ /* -+ * Two-byte UTF-8... -+ */ -+ -+ *(*bufptr)++ = 0xc0 | (ch >> 6); -+ *(*bufptr)++ = 0x80 | (ch & 0x3f); -+ } -+ else if (ch < 0x10000) -+ { -+ /* -+ * Three-byte UTF-8... -+ */ -+ -+ *(*bufptr)++ = 0xe0 | (ch >> 12); -+ *(*bufptr)++ = 0x80 | ((ch >> 6) & 0x3f); -+ *(*bufptr)++ = 0x80 | (ch & 0x3f); -+ } -+ else -+ { -+ /* -+ * Four-byte UTF-8... -+ */ -+ -+ *(*bufptr)++ = 0xf0 | (ch >> 18); -+ *(*bufptr)++ = 0x80 | ((ch >> 12) & 0x3f); -+ *(*bufptr)++ = 0x80 | ((ch >> 6) & 0x3f); -+ *(*bufptr)++ = 0x80 | (ch & 0x3f); -+ } -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_fd_getc()' - Read a character from a file descriptor. -+ */ -+ -+static int /* O - Character or EOF */ -+mxml_fd_getc(void *p, /* I - File descriptor buffer */ -+ int *encoding) /* IO - Encoding */ -+{ -+ _mxml_fdbuf_t *buf; /* File descriptor buffer */ -+ int ch, /* Current character */ -+ temp; /* Temporary character */ -+ -+ -+ /* -+ * Grab the next character in the buffer... -+ */ -+ -+ buf = (_mxml_fdbuf_t *)p; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ ch = *(buf->current)++; -+ -+ switch (*encoding) -+ { -+ case ENCODE_UTF8 : -+ /* -+ * Got a UTF-8 character; convert UTF-8 to Unicode and return... -+ */ -+ -+ if (!(ch & 0x80)) -+ { -+#if DEBUG > 1 -+ printf("mxml_fd_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ -+ return (ch); -+ } -+ else if (ch == 0xfe) -+ { -+ /* -+ * UTF-16 big-endian BOM? -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ ch = *(buf->current)++; -+ -+ if (ch != 0xff) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16BE; -+ -+ return (mxml_fd_getc(p, encoding)); -+ } -+ else if (ch == 0xff) -+ { -+ /* -+ * UTF-16 little-endian BOM? -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ ch = *(buf->current)++; -+ -+ if (ch != 0xfe) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16LE; -+ -+ return (mxml_fd_getc(p, encoding)); -+ } -+ else if ((ch & 0xe0) == 0xc0) -+ { -+ /* -+ * Two-byte value... -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x1f) << 6) | (temp & 0x3f); -+ -+ if (ch < 0x80) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ } -+ else if ((ch & 0xf0) == 0xe0) -+ { -+ /* -+ * Three-byte value... -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x0f) << 6) | (temp & 0x3f); -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if (ch < 0x800) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ -+ /* -+ * Ignore (strip) Byte Order Mark (BOM)... -+ */ -+ -+ if (ch == 0xfeff) -+ return (mxml_fd_getc(p, encoding)); -+ } -+ else if ((ch & 0xf8) == 0xf0) -+ { -+ /* -+ * Four-byte value... -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x07) << 6) | (temp & 0x3f); -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ if ((temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if (ch < 0x10000) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ } -+ else -+ return (EOF); -+ break; -+ -+ case ENCODE_UTF16BE : -+ /* -+ * Read UTF-16 big-endian char... -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ ch = (ch << 8) | temp; -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ lch = *(buf->current)++; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ lch = (lch << 8) | temp; -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ break; -+ -+ case ENCODE_UTF16LE : -+ /* -+ * Read UTF-16 little-endian char... -+ */ -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ ch |= (temp << 8); -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ lch = *(buf->current)++; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_read(buf) < 0) -+ return (EOF); -+ -+ temp = *(buf->current)++; -+ -+ lch |= (temp << 8); -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ break; -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_fd_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+} -+ -+ -+/* -+ * 'mxml_fd_putc()' - Write a character to a file descriptor. -+ */ -+ -+static int /* O - 0 on success, -1 on error */ -+mxml_fd_putc(int ch, /* I - Character */ -+ void *p) /* I - File descriptor buffer */ -+{ -+ _mxml_fdbuf_t *buf; /* File descriptor buffer */ -+ -+ -+ /* -+ * Flush the write buffer as needed... -+ */ -+ -+ buf = (_mxml_fdbuf_t *)p; -+ -+ if (buf->current >= buf->end) -+ if (mxml_fd_write(buf) < 0) -+ return (-1); -+ -+ *(buf->current)++ = ch; -+ -+ /* -+ * Return successfully... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_fd_read()' - Read a buffer of data from a file descriptor. -+ */ -+ -+static int /* O - 0 on success, -1 on error */ -+mxml_fd_read(_mxml_fdbuf_t *buf) /* I - File descriptor buffer */ -+{ -+ int bytes; /* Bytes read... */ -+ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!buf) -+ return (-1); -+ -+ /* -+ * Read from the file descriptor... -+ */ -+ -+ while ((bytes = read(buf->fd, buf->buffer, sizeof(buf->buffer))) < 0) -+#ifdef EINTR -+ if (errno != EAGAIN && errno != EINTR) -+#else -+ if (errno != EAGAIN) -+#endif /* EINTR */ -+ return (-1); -+ -+ if (bytes == 0) -+ return (-1); -+ -+ /* -+ * Update the pointers and return success... -+ */ -+ -+ buf->current = buf->buffer; -+ buf->end = buf->buffer + bytes; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_fd_write()' - Write a buffer of data to a file descriptor. -+ */ -+ -+static int /* O - 0 on success, -1 on error */ -+mxml_fd_write(_mxml_fdbuf_t *buf) /* I - File descriptor buffer */ -+{ -+ int bytes; /* Bytes written */ -+ unsigned char *ptr; /* Pointer into buffer */ -+ -+ -+ /* -+ * Range check... -+ */ -+ -+ if (!buf) -+ return (-1); -+ -+ /* -+ * Return 0 if there is nothing to write... -+ */ -+ -+ if (buf->current == buf->buffer) -+ return (0); -+ -+ /* -+ * Loop until we have written everything... -+ */ -+ -+ for (ptr = buf->buffer; ptr < buf->current; ptr += bytes) -+ if ((bytes = write(buf->fd, ptr, buf->current - ptr)) < 0) -+ return (-1); -+ -+ /* -+ * All done, reset pointers and return success... -+ */ -+ -+ buf->current = buf->buffer; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_file_getc()' - Get a character from a file. -+ */ -+ -+static int /* O - Character or EOF */ -+mxml_file_getc(void *p, /* I - Pointer to file */ -+ int *encoding) /* IO - Encoding */ -+{ -+ int ch, /* Character from file */ -+ temp; /* Temporary character */ -+ FILE *fp; /* Pointer to file */ -+ -+ -+ /* -+ * Read a character from the file and see if it is EOF or ASCII... -+ */ -+ -+ fp = (FILE *)p; -+ ch = getc(fp); -+ -+ if (ch == EOF) -+ return (EOF); -+ -+ switch (*encoding) -+ { -+ case ENCODE_UTF8 : -+ /* -+ * Got a UTF-8 character; convert UTF-8 to Unicode and return... -+ */ -+ -+ if (!(ch & 0x80)) -+ { -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_file_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ } -+ else if (ch == 0xfe) -+ { -+ /* -+ * UTF-16 big-endian BOM? -+ */ -+ -+ ch = getc(fp); -+ if (ch != 0xff) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16BE; -+ -+ return (mxml_file_getc(p, encoding)); -+ } -+ else if (ch == 0xff) -+ { -+ /* -+ * UTF-16 little-endian BOM? -+ */ -+ -+ ch = getc(fp); -+ if (ch != 0xfe) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16LE; -+ -+ return (mxml_file_getc(p, encoding)); -+ } -+ else if ((ch & 0xe0) == 0xc0) -+ { -+ /* -+ * Two-byte value... -+ */ -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x1f) << 6) | (temp & 0x3f); -+ -+ if (ch < 0x80) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ } -+ else if ((ch & 0xf0) == 0xe0) -+ { -+ /* -+ * Three-byte value... -+ */ -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x0f) << 6) | (temp & 0x3f); -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if (ch < 0x800) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ -+ /* -+ * Ignore (strip) Byte Order Mark (BOM)... -+ */ -+ -+ if (ch == 0xfeff) -+ return (mxml_file_getc(p, encoding)); -+ } -+ else if ((ch & 0xf8) == 0xf0) -+ { -+ /* -+ * Four-byte value... -+ */ -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x07) << 6) | (temp & 0x3f); -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = (ch << 6) | (temp & 0x3f); -+ -+ if (ch < 0x10000) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ } -+ else -+ return (EOF); -+ break; -+ -+ case ENCODE_UTF16BE : -+ /* -+ * Read UTF-16 big-endian char... -+ */ -+ -+ ch = (ch << 8) | getc(fp); -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch = (getc(fp) << 8) | getc(fp); -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ break; -+ -+ case ENCODE_UTF16LE : -+ /* -+ * Read UTF-16 little-endian char... -+ */ -+ -+ ch |= (getc(fp) << 8); -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch = getc(fp) | (getc(fp) << 8); -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ break; -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_file_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+} -+ -+ -+/* -+ * 'mxml_file_putc()' - Write a character to a file. -+ */ -+ -+static int /* O - 0 on success, -1 on failure */ -+mxml_file_putc(int ch, /* I - Character to write */ -+ void *p) /* I - Pointer to file */ -+{ -+ return (putc(ch, (FILE *)p) == EOF ? -1 : 0); -+} -+ -+ -+/* -+ * 'mxml_get_entity()' - Get the character corresponding to an entity... -+ */ -+ -+static int /* O - Character value or EOF on error */ -+mxml_get_entity(mxml_node_t *parent, /* I - Parent node */ -+ void *p, /* I - Pointer to source */ -+ int *encoding, /* IO - Character encoding */ -+ int (*getc_cb)(void *, int *)) -+ /* I - Get character function */ -+{ -+ int ch; /* Current character */ -+ char entity[64], /* Entity string */ -+ *entptr; /* Pointer into entity */ -+ -+ -+ entptr = entity; -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ if (ch > 126 || (!isalnum(ch) && ch != '#')) -+ break; -+ else if (entptr < (entity + sizeof(entity) - 1)) -+ *entptr++ = ch; -+ else -+ { -+ mxml_error("Entity name too long under parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ break; -+ } -+ -+ *entptr = '\0'; -+ -+ if (ch != ';') -+ { -+ mxml_error("Character entity \"%s\" not terminated under parent <%s>!", -+ entity, parent ? parent->value.element.name : "null"); -+ return (EOF); -+ } -+ -+ if (entity[0] == '#') -+ { -+ if (entity[1] == 'x') -+ ch = strtol(entity + 2, NULL, 16); -+ else -+ ch = strtol(entity + 1, NULL, 10); -+ } -+ else if ((ch = mxmlEntityGetValue(entity)) < 0) -+ mxml_error("Entity name \"%s;\" not supported under parent <%s>!", -+ entity, parent ? parent->value.element.name : "null"); -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x under parent <%s> not allowed by XML standard!", -+ ch, parent ? parent->value.element.name : "null"); -+ return (EOF); -+ } -+ -+ return (ch); -+} -+ -+ -+/* -+ * 'mxml_load_data()' - Load data into an XML node tree. -+ */ -+ -+static mxml_node_t * /* O - First node or NULL if the file could not be read. */ -+mxml_load_data( -+ mxml_node_t *top, /* I - Top node */ -+ void *p, /* I - Pointer to data */ -+ mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ -+ _mxml_getc_cb_t getc_cb, /* I - Read function */ -+ mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ -+ void *sax_data) /* I - SAX user data */ -+{ -+ mxml_node_t *node, /* Current node */ -+ *first, /* First node added */ -+ *parent; /* Current parent node */ -+ int ch, /* Character from file */ -+ whitespace; /* Non-zero if whitespace seen */ -+ char *buffer, /* String buffer */ -+ *bufptr; /* Pointer into buffer */ -+ int bufsize; /* Size of buffer */ -+ mxml_type_t type; /* Current node type */ -+ int encoding; /* Character encoding */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ static const char * const types[] = /* Type strings... */ -+ { -+ "MXML_ELEMENT", /* XML element with attributes */ -+ "MXML_INTEGER", /* Integer value */ -+ "MXML_OPAQUE", /* Opaque string */ -+ "MXML_REAL", /* Real value */ -+ "MXML_TEXT", /* Text fragment */ -+ "MXML_CUSTOM" /* Custom data */ -+ }; -+ -+ -+ /* -+ * Read elements and other nodes from the file... -+ */ -+ -+ if ((buffer = malloc(64)) == NULL) -+ { -+ mxml_error("Unable to allocate string buffer!"); -+ return (NULL); -+ } -+ -+ bufsize = 64; -+ bufptr = buffer; -+ parent = top; -+ first = NULL; -+ whitespace = 0; -+ encoding = ENCODE_UTF8; -+ -+ if (cb && parent) -+ type = (*cb)(parent); -+ else -+ type = MXML_TEXT; -+ -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF) -+ { -+ if ((ch == '<' || -+ (mxml_isspace(ch) && type != MXML_OPAQUE && type != MXML_CUSTOM)) && -+ bufptr > buffer) -+ { -+ /* -+ * Add a new value node... -+ */ -+ -+ *bufptr = '\0'; -+ -+ switch (type) -+ { -+ case MXML_INTEGER : -+ node = mxmlNewInteger(parent, strtol(buffer, &bufptr, 0)); -+ break; -+ -+ case MXML_OPAQUE : -+ node = mxmlNewOpaque(parent, buffer); -+ break; -+ -+ case MXML_REAL : -+ node = mxmlNewReal(parent, strtod(buffer, &bufptr)); -+ break; -+ -+ case MXML_TEXT : -+ node = mxmlNewText(parent, whitespace, buffer); -+ break; -+ -+ case MXML_CUSTOM : -+ if (global->custom_load_cb) -+ { -+ /* -+ * Use the callback to fill in the custom data... -+ */ -+ -+ node = mxmlNewCustom(parent, NULL, NULL); -+ -+ if ((*global->custom_load_cb)(node, buffer)) -+ { -+ mxml_error("Bad custom value '%s' in parent <%s>!", -+ buffer, parent ? parent->value.element.name : "null"); -+ mxmlDelete(node); -+ node = NULL; -+ } -+ break; -+ } -+ -+ default : /* Ignore... */ -+ node = NULL; -+ break; -+ } -+ -+ if (*bufptr) -+ { -+ /* -+ * Bad integer/real number value... -+ */ -+ -+ mxml_error("Bad %s value '%s' in parent <%s>!", -+ type == MXML_INTEGER ? "integer" : "real", buffer, -+ parent ? parent->value.element.name : "null"); -+ break; -+ } -+ -+ bufptr = buffer; -+ whitespace = mxml_isspace(ch) && type == MXML_TEXT; -+ -+ if (!node && type != MXML_IGNORE) -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Unable to add value node of type %s to parent <%s>!", -+ types[type], parent ? parent->value.element.name : "null"); -+ goto error; -+ } -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_DATA, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (!first && node) -+ first = node; -+ } -+ else if (mxml_isspace(ch) && type == MXML_TEXT) -+ whitespace = 1; -+ -+ /* -+ * Add lone whitespace node if we have an element and existing -+ * whitespace... -+ */ -+ -+ if (ch == '<' && whitespace && type == MXML_TEXT) -+ { -+ node = mxmlNewText(parent, whitespace, ""); -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_DATA, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (!first && node) -+ first = node; -+ -+ whitespace = 0; -+ } -+ -+ if (ch == '<') -+ { -+ /* -+ * Start of open/close tag... -+ */ -+ -+ bufptr = buffer; -+ -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF) -+ if (mxml_isspace(ch) || ch == '>' || (ch == '/' && bufptr > buffer)) -+ break; -+ else if (ch == '<') -+ { -+ mxml_error("Bare < in element!"); -+ goto error; -+ } -+ else if (ch == '&') -+ { -+ if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ else if (((bufptr - buffer) == 1 && buffer[0] == '?') || -+ ((bufptr - buffer) == 3 && !strncmp(buffer, "!--", 3)) || -+ ((bufptr - buffer) == 8 && !strncmp(buffer, "![CDATA[", 8))) -+ break; -+ -+ *bufptr = '\0'; -+ -+ if (!strcmp(buffer, "!--")) -+ { -+ /* -+ * Gather rest of comment... -+ */ -+ -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF) -+ { -+ if (ch == '>' && bufptr > (buffer + 4) && -+ bufptr[-3] != '-' && bufptr[-2] == '-' && bufptr[-1] == '-') -+ break; -+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ -+ /* -+ * Error out if we didn't get the whole comment... -+ */ -+ -+ if (ch != '>') -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Early EOF in comment node!"); -+ goto error; -+ } -+ -+ -+ /* -+ * Otherwise add this as an element under the current parent... -+ */ -+ -+ *bufptr = '\0'; -+ -+ if ((node = mxmlNewElement(parent, buffer)) == NULL) -+ { -+ /* -+ * Just print error for now... -+ */ -+ -+ mxml_error("Unable to add comment node to parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ break; -+ } -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_COMMENT, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (node && !first) -+ first = node; -+ } -+ else if (!strcmp(buffer, "![CDATA[")) -+ { -+ /* -+ * Gather CDATA section... -+ */ -+ -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF) -+ { -+ if (ch == '>' && !strncmp(bufptr - 2, "]]", 2)) -+ break; -+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ -+ /* -+ * Error out if we didn't get the whole comment... -+ */ -+ -+ if (ch != '>') -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Early EOF in CDATA node!"); -+ goto error; -+ } -+ -+ -+ /* -+ * Otherwise add this as an element under the current parent... -+ */ -+ -+ *bufptr = '\0'; -+ -+ if ((node = mxmlNewElement(parent, buffer)) == NULL) -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Unable to add CDATA node to parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ goto error; -+ } -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_CDATA, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (node && !first) -+ first = node; -+ } -+ else if (buffer[0] == '?') -+ { -+ /* -+ * Gather rest of processing instruction... -+ */ -+ -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF) -+ { -+ if (ch == '>' && bufptr > buffer && bufptr[-1] == '?') -+ break; -+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ -+ /* -+ * Error out if we didn't get the whole processing instruction... -+ */ -+ -+ if (ch != '>') -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Early EOF in processing instruction node!"); -+ goto error; -+ } -+ -+ /* -+ * Otherwise add this as an element under the current parent... -+ */ -+ -+ *bufptr = '\0'; -+ -+ if ((node = mxmlNewElement(parent, buffer)) == NULL) -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Unable to add processing instruction node to parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ goto error; -+ } -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_DIRECTIVE, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (node) -+ { -+ if (!first) -+ first = node; -+ -+ if (!parent) -+ { -+ parent = node; -+ -+ if (cb) -+ type = (*cb)(parent); -+ } -+ } -+ } -+ else if (buffer[0] == '!') -+ { -+ /* -+ * Gather rest of declaration... -+ */ -+ -+ do -+ { -+ if (ch == '>') -+ break; -+ else -+ { -+ if (ch == '&') -+ if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ } -+ while ((ch = (*getc_cb)(p, &encoding)) != EOF); -+ -+ /* -+ * Error out if we didn't get the whole declaration... -+ */ -+ -+ if (ch != '>') -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Early EOF in declaration node!"); -+ goto error; -+ } -+ -+ /* -+ * Otherwise add this as an element under the current parent... -+ */ -+ -+ *bufptr = '\0'; -+ -+ if ((node = mxmlNewElement(parent, buffer)) == NULL) -+ { -+ /* -+ * Print error and return... -+ */ -+ -+ mxml_error("Unable to add declaration node to parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ goto error; -+ } -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_DIRECTIVE, sax_data); -+ -+ if (!mxmlRelease(node)) -+ node = NULL; -+ } -+ -+ if (node) -+ { -+ if (!first) -+ first = node; -+ -+ if (!parent) -+ { -+ parent = node; -+ -+ if (cb) -+ type = (*cb)(parent); -+ } -+ } -+ } -+ else if (buffer[0] == '/') -+ { -+ /* -+ * Handle close tag... -+ */ -+ -+ if (!parent || strcmp(buffer + 1, parent->value.element.name)) -+ { -+ /* -+ * Close tag doesn't match tree; print an error for now... -+ */ -+ -+ mxml_error("Mismatched close tag <%s> under parent <%s>!", -+ buffer, parent ? parent->value.element.name : "(null)"); -+ goto error; -+ } -+ -+ /* -+ * Keep reading until we see >... -+ */ -+ -+ while (ch != '>' && ch != EOF) -+ ch = (*getc_cb)(p, &encoding); -+ -+ node = parent; -+ parent = parent->parent; -+ -+ if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_ELEMENT_CLOSE, sax_data); -+ -+ mxmlRelease(node); -+ } -+ -+ /* -+ * Ascend into the parent and set the value type as needed... -+ */ -+ -+ if (cb && parent) -+ type = (*cb)(parent); -+ } -+ else -+ { -+ /* -+ * Handle open tag... -+ */ -+ -+ if ((node = mxmlNewElement(parent, buffer)) == NULL) -+ { -+ /* -+ * Just print error for now... -+ */ -+ -+ mxml_error("Unable to add element node to parent <%s>!", -+ parent ? parent->value.element.name : "null"); -+ goto error; -+ } -+ -+ if (mxml_isspace(ch)) -+ { -+ if ((ch = mxml_parse_element(node, p, &encoding, getc_cb)) == EOF) -+ goto error; -+ } -+ else if (ch == '/') -+ { -+ if ((ch = (*getc_cb)(p, &encoding)) != '>') -+ { -+ mxml_error("Expected > but got '%c' instead for element <%s/>!", -+ ch, buffer); -+ mxmlDelete(node); -+ goto error; -+ } -+ -+ ch = '/'; -+ } -+ -+ if (sax_cb) -+ (*sax_cb)(node, MXML_SAX_ELEMENT_OPEN, sax_data); -+ -+ if (!first) -+ first = node; -+ -+ if (ch == EOF) -+ break; -+ -+ if (ch != '/') -+ { -+ /* -+ * Descend into this node, setting the value type as needed... -+ */ -+ -+ parent = node; -+ -+ if (cb && parent) -+ type = (*cb)(parent); -+ } -+ else if (sax_cb) -+ { -+ (*sax_cb)(node, MXML_SAX_ELEMENT_CLOSE, sax_data); -+ -+ if (!mxmlRelease(node) && first == node) -+ first = NULL; -+ } -+ } -+ -+ bufptr = buffer; -+ } -+ else if (ch == '&') -+ { -+ /* -+ * Add character entity to current buffer... -+ */ -+ -+ if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ else if (type == MXML_OPAQUE || type == MXML_CUSTOM || !mxml_isspace(ch)) -+ { -+ /* -+ * Add character to current buffer... -+ */ -+ -+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) -+ goto error; -+ } -+ } -+ -+ /* -+ * Free the string buffer - we don't need it anymore... -+ */ -+ -+ free(buffer); -+ -+ /* -+ * Find the top element and return it... -+ */ -+ -+ if (parent) -+ { -+ node = parent; -+ -+ while (parent->parent != top && parent->parent) -+ parent = parent->parent; -+ -+ if (node != parent) -+ { -+ mxml_error("Missing close tag under parent <%s>!", -+ node->value.element.name, -+ node->parent ? node->parent->value.element.name : "(null)"); -+ -+ mxmlDelete(first); -+ -+ return (NULL); -+ } -+ } -+ -+ if (parent) -+ return (parent); -+ else -+ return (first); -+ -+ /* -+ * Common error return... -+ */ -+ -+error: -+ -+ mxmlDelete(first); -+ -+ free(buffer); -+ -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxml_parse_element()' - Parse an element for any attributes... -+ */ -+ -+static int /* O - Terminating character */ -+mxml_parse_element( -+ mxml_node_t *node, /* I - Element node */ -+ void *p, /* I - Data to read from */ -+ int *encoding, /* IO - Encoding */ -+ _mxml_getc_cb_t getc_cb) /* I - Data callback */ -+{ -+ int ch, /* Current character in file */ -+ quote; /* Quoting character */ -+ char *name, /* Attribute name */ -+ *value, /* Attribute value */ -+ *ptr; /* Pointer into name/value */ -+ int namesize, /* Size of name string */ -+ valsize; /* Size of value string */ -+ -+ -+ /* -+ * Initialize the name and value buffers... -+ */ -+ -+ if ((name = malloc(64)) == NULL) -+ { -+ mxml_error("Unable to allocate memory for name!"); -+ return (EOF); -+ } -+ -+ namesize = 64; -+ -+ if ((value = malloc(64)) == NULL) -+ { -+ free(name); -+ mxml_error("Unable to allocate memory for value!"); -+ return (EOF); -+ } -+ -+ valsize = 64; -+ -+ /* -+ * Loop until we hit a >, /, ?, or EOF... -+ */ -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ { -+#if DEBUG > 1 -+ fprintf(stderr, "parse_element: ch='%c'\n", ch); -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Skip leading whitespace... -+ */ -+ -+ if (mxml_isspace(ch)) -+ continue; -+ -+ /* -+ * Stop at /, ?, or >... -+ */ -+ -+ if (ch == '/' || ch == '?') -+ { -+ /* -+ * Grab the > character and print an error if it isn't there... -+ */ -+ -+ quote = (*getc_cb)(p, encoding); -+ -+ if (quote != '>') -+ { -+ mxml_error("Expected '>' after '%c' for element %s, but got '%c'!", -+ ch, node->value.element.name, quote); -+ goto error; -+ } -+ -+ break; -+ } -+ else if (ch == '<') -+ { -+ mxml_error("Bare < in element %s!", node->value.element.name); -+ goto error; -+ } -+ else if (ch == '>') -+ break; -+ -+ /* -+ * Read the attribute name... -+ */ -+ -+ name[0] = ch; -+ ptr = name + 1; -+ -+ if (ch == '\"' || ch == '\'') -+ { -+ /* -+ * Name is in quotes, so get a quoted string... -+ */ -+ -+ quote = ch; -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ { -+ if (ch == '&') -+ if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &ptr, &name, &namesize)) -+ goto error; -+ -+ if (ch == quote) -+ break; -+ } -+ } -+ else -+ { -+ /* -+ * Grab an normal, non-quoted name... -+ */ -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ if (mxml_isspace(ch) || ch == '=' || ch == '/' || ch == '>' || -+ ch == '?') -+ break; -+ else -+ { -+ if (ch == '&') -+ if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &ptr, &name, &namesize)) -+ goto error; -+ } -+ } -+ -+ *ptr = '\0'; -+ -+ if (mxmlElementGetAttr(node, name)) -+ goto error; -+ -+ while (ch != EOF && mxml_isspace(ch)) -+ ch = (*getc_cb)(p, encoding); -+ -+ if (ch == '=') -+ { -+ /* -+ * Read the attribute value... -+ */ -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF && mxml_isspace(ch)); -+ -+ if (ch == EOF) -+ { -+ mxml_error("Missing value for attribute '%s' in element %s!", -+ name, node->value.element.name); -+ goto error; -+ } -+ -+ if (ch == '\'' || ch == '\"') -+ { -+ /* -+ * Read quoted value... -+ */ -+ -+ quote = ch; -+ ptr = value; -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ if (ch == quote) -+ break; -+ else -+ { -+ if (ch == '&') -+ if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &ptr, &value, &valsize)) -+ goto error; -+ } -+ -+ *ptr = '\0'; -+ } -+ else -+ { -+ /* -+ * Read unquoted value... -+ */ -+ -+ value[0] = ch; -+ ptr = value + 1; -+ -+ while ((ch = (*getc_cb)(p, encoding)) != EOF) -+ if (mxml_isspace(ch) || ch == '=' || ch == '/' || ch == '>') -+ break; -+ else -+ { -+ if (ch == '&') -+ if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) -+ goto error; -+ -+ if (mxml_add_char(ch, &ptr, &value, &valsize)) -+ goto error; -+ } -+ -+ *ptr = '\0'; -+ } -+ -+ /* -+ * Set the attribute with the given string value... -+ */ -+ -+ mxmlElementSetAttr(node, name, value); -+ } -+ else -+ { -+ mxml_error("Missing value for attribute '%s' in element %s!", -+ name, node->value.element.name); -+ goto error; -+ } -+ -+ /* -+ * Check the end character... -+ */ -+ -+ if (ch == '/' || ch == '?') -+ { -+ /* -+ * Grab the > character and print an error if it isn't there... -+ */ -+ -+ quote = (*getc_cb)(p, encoding); -+ -+ if (quote != '>') -+ { -+ mxml_error("Expected '>' after '%c' for element %s, but got '%c'!", -+ ch, node->value.element.name, quote); -+ ch = EOF; -+ } -+ -+ break; -+ } -+ else if (ch == '>') -+ break; -+ } -+ -+ /* -+ * Free the name and value buffers and return... -+ */ -+ -+ free(name); -+ free(value); -+ -+ return (ch); -+ -+ /* -+ * Common error return point... -+ */ -+ -+error: -+ -+ free(name); -+ free(value); -+ -+ return (EOF); -+} -+ -+ -+/* -+ * 'mxml_string_getc()' - Get a character from a string. -+ */ -+ -+static int /* O - Character or EOF */ -+mxml_string_getc(void *p, /* I - Pointer to file */ -+ int *encoding) /* IO - Encoding */ -+{ -+ int ch; /* Character */ -+ const char **s; /* Pointer to string pointer */ -+ -+ -+ s = (const char **)p; -+ -+ if ((ch = (*s)[0] & 255) != 0 || *encoding == ENCODE_UTF16LE) -+ { -+ /* -+ * Got character; convert UTF-8 to integer and return... -+ */ -+ -+ (*s)++; -+ -+ switch (*encoding) -+ { -+ case ENCODE_UTF8 : -+ if (!(ch & 0x80)) -+ { -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ -+ return (ch); -+ } -+ else if (ch == 0xfe) -+ { -+ /* -+ * UTF-16 big-endian BOM? -+ */ -+ -+ if (((*s)[0] & 255) != 0xff) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16BE; -+ (*s)++; -+ -+ return (mxml_string_getc(p, encoding)); -+ } -+ else if (ch == 0xff) -+ { -+ /* -+ * UTF-16 little-endian BOM? -+ */ -+ -+ if (((*s)[0] & 255) != 0xfe) -+ return (EOF); -+ -+ *encoding = ENCODE_UTF16LE; -+ (*s)++; -+ -+ return (mxml_string_getc(p, encoding)); -+ } -+ else if ((ch & 0xe0) == 0xc0) -+ { -+ /* -+ * Two-byte value... -+ */ -+ -+ if (((*s)[0] & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((ch & 0x1f) << 6) | ((*s)[0] & 0x3f); -+ -+ (*s)++; -+ -+ if (ch < 0x80) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ } -+ else if ((ch & 0xf0) == 0xe0) -+ { -+ /* -+ * Three-byte value... -+ */ -+ -+ if (((*s)[0] & 0xc0) != 0x80 || -+ ((*s)[1] & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((((ch & 0x0f) << 6) | ((*s)[0] & 0x3f)) << 6) | ((*s)[1] & 0x3f); -+ -+ (*s) += 2; -+ -+ if (ch < 0x800) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ -+ /* -+ * Ignore (strip) Byte Order Mark (BOM)... -+ */ -+ -+ if (ch == 0xfeff) -+ return (mxml_string_getc(p, encoding)); -+ -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ } -+ else if ((ch & 0xf8) == 0xf0) -+ { -+ /* -+ * Four-byte value... -+ */ -+ -+ if (((*s)[0] & 0xc0) != 0x80 || -+ ((*s)[1] & 0xc0) != 0x80 || -+ ((*s)[2] & 0xc0) != 0x80) -+ return (EOF); -+ -+ ch = ((((((ch & 0x07) << 6) | ((*s)[0] & 0x3f)) << 6) | -+ ((*s)[1] & 0x3f)) << 6) | ((*s)[2] & 0x3f); -+ -+ (*s) += 3; -+ -+ if (ch < 0x10000) -+ { -+ mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); -+ return (EOF); -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ } -+ else -+ return (EOF); -+ -+ case ENCODE_UTF16BE : -+ /* -+ * Read UTF-16 big-endian char... -+ */ -+ -+ ch = (ch << 8) | ((*s)[0] & 255); -+ (*s) ++; -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch; /* Lower word */ -+ -+ -+ if (!(*s)[0]) -+ return (EOF); -+ -+ lch = (((*s)[0] & 255) << 8) | ((*s)[1] & 255); -+ (*s) += 2; -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ -+ case ENCODE_UTF16LE : -+ /* -+ * Read UTF-16 little-endian char... -+ */ -+ -+ ch = ch | (((*s)[0] & 255) << 8); -+ -+ if (!ch) -+ { -+ (*s) --; -+ return (EOF); -+ } -+ -+ (*s) ++; -+ -+ if (mxml_bad_char(ch)) -+ { -+ mxml_error("Bad control character 0x%02x not allowed by XML standard!", -+ ch); -+ return (EOF); -+ } -+ else if (ch >= 0xd800 && ch <= 0xdbff) -+ { -+ /* -+ * Multi-word UTF-16 char... -+ */ -+ -+ int lch; /* Lower word */ -+ -+ -+ if (!(*s)[1]) -+ return (EOF); -+ -+ lch = (((*s)[1] & 255) << 8) | ((*s)[0] & 255); -+ (*s) += 2; -+ -+ if (lch < 0xdc00 || lch >= 0xdfff) -+ return (EOF); -+ -+ ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; -+ } -+ -+#if DEBUG > 1 -+ printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); -+#endif /* DEBUG > 1 */ -+ -+ return (ch); -+ } -+ } -+ -+ return (EOF); -+} -+ -+ -+/* -+ * 'mxml_string_putc()' - Write a character to a string. -+ */ -+ -+static int /* O - 0 on success, -1 on failure */ -+mxml_string_putc(int ch, /* I - Character to write */ -+ void *p) /* I - Pointer to string pointers */ -+{ -+ char **pp; /* Pointer to string pointers */ -+ -+ -+ pp = (char **)p; -+ -+ if (pp[0] < pp[1]) -+ pp[0][0] = ch; -+ -+ pp[0] ++; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_write_name()' - Write a name string. -+ */ -+ -+static int /* O - 0 on success, -1 on failure */ -+mxml_write_name(const char *s, /* I - Name to write */ -+ void *p, /* I - Write pointer */ -+ int (*putc_cb)(int, void *)) -+ /* I - Write callback */ -+{ -+ char quote; /* Quote character */ -+ const char *name; /* Entity name */ -+ -+ -+ if (*s == '\"' || *s == '\'') -+ { -+ /* -+ * Write a quoted name string... -+ */ -+ -+ if ((*putc_cb)(*s, p) < 0) -+ return (-1); -+ -+ quote = *s++; -+ -+ while (*s && *s != quote) -+ { -+ if ((name = mxmlEntityGetName(*s)) != NULL) -+ { -+ if ((*putc_cb)('&', p) < 0) -+ return (-1); -+ -+ while (*name) -+ { -+ if ((*putc_cb)(*name, p) < 0) -+ return (-1); -+ -+ name ++; -+ } -+ -+ if ((*putc_cb)(';', p) < 0) -+ return (-1); -+ } -+ else if ((*putc_cb)(*s, p) < 0) -+ return (-1); -+ -+ s ++; -+ } -+ -+ /* -+ * Write the end quote... -+ */ -+ -+ if ((*putc_cb)(quote, p) < 0) -+ return (-1); -+ } -+ else -+ { -+ /* -+ * Write a non-quoted name string... -+ */ -+ -+ while (*s) -+ { -+ if ((*putc_cb)(*s, p) < 0) -+ return (-1); -+ -+ s ++; -+ } -+ } -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_write_node()' - Save an XML node to a file. -+ */ -+ -+static int /* O - Column or -1 on error */ -+mxml_write_node(mxml_node_t *node, /* I - Node to write */ -+ void *p, /* I - File to write to */ -+ mxml_save_cb_t cb, /* I - Whitespace callback */ -+ int col, /* I - Current column */ -+ _mxml_putc_cb_t putc_cb,/* I - Output callback */ -+ _mxml_global_t *global)/* I - Global data */ -+{ -+ int i, /* Looping var */ -+ width; /* Width of attr + value */ -+ mxml_attr_t *attr; /* Current attribute */ -+ char s[255]; /* Temporary string */ -+ -+ -+ while (node != NULL) -+ { -+ /* -+ * Print the node value... -+ */ -+ -+ switch (node->type) -+ { -+ case MXML_ELEMENT : -+ col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_OPEN, col, putc_cb); -+ -+ if ((*putc_cb)('<', p) < 0) -+ return (-1); -+ if (node->value.element.name[0] == '?' || -+ !strncmp(node->value.element.name, "!--", 3) || -+ !strncmp(node->value.element.name, "![CDATA[", 8)) -+ { -+ /* -+ * Comments, CDATA, and processing instructions do not -+ * use character entities. -+ */ -+ -+ const char *ptr; /* Pointer into name */ -+ -+ -+ for (ptr = node->value.element.name; *ptr; ptr ++) -+ if ((*putc_cb)(*ptr, p) < 0) -+ return (-1); -+ } -+ else if (mxml_write_name(node->value.element.name, p, putc_cb) < 0) -+ return (-1); -+ -+ col += strlen(node->value.element.name) + 1; -+ -+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs; -+ i > 0; -+ i --, attr ++) -+ { -+ width = strlen(attr->name); -+ -+ if (attr->value) -+ width += strlen(attr->value) + 3; -+ -+ if (global->wrap > 0 && (col + width) > global->wrap) -+ { -+ if ((*putc_cb)('\n', p) < 0) -+ return (-1); -+ -+ col = 0; -+ } -+ else -+ { -+ if ((*putc_cb)(' ', p) < 0) -+ return (-1); -+ -+ col ++; -+ } -+ -+ if (mxml_write_name(attr->name, p, putc_cb) < 0) -+ return (-1); -+ -+ if (attr->value) -+ { -+ if ((*putc_cb)('=', p) < 0) -+ return (-1); -+ if ((*putc_cb)('\"', p) < 0) -+ return (-1); -+ if (mxml_write_string(attr->value, p, putc_cb) < 0) -+ return (-1); -+ if ((*putc_cb)('\"', p) < 0) -+ return (-1); -+ } -+ -+ col += width; -+ } -+ -+ if (node->child) -+ { -+ /* -+ * Write children... -+ */ -+ -+ if ((*putc_cb)('>', p) < 0) -+ return (-1); -+ else -+ col ++; -+ -+ col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); -+ -+ if ((col = mxml_write_node(node->child, p, cb, col, putc_cb, -+ global)) < 0) -+ return (-1); -+ -+ /* -+ * The ? and ! elements are special-cases and have no end tags... -+ */ -+ -+ if (node->value.element.name[0] != '!' && -+ node->value.element.name[0] != '?') -+ { -+ col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb); -+ -+ if ((*putc_cb)('<', p) < 0) -+ return (-1); -+ if ((*putc_cb)('/', p) < 0) -+ return (-1); -+ if (mxml_write_string(node->value.element.name, p, putc_cb) < 0) -+ return (-1); -+ if ((*putc_cb)('>', p) < 0) -+ return (-1); -+ -+ col += strlen(node->value.element.name) + 3; -+ -+ col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb); -+ } -+ } -+ else if (node->value.element.name[0] == '!' || -+ node->value.element.name[0] == '?') -+ { -+ /* -+ * The ? and ! elements are special-cases... -+ */ -+ -+ if ((*putc_cb)('>', p) < 0) -+ return (-1); -+ else -+ col ++; -+ -+ col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); -+ } -+ else -+ { -+ if ((*putc_cb)(' ', p) < 0) -+ return (-1); -+ if ((*putc_cb)('/', p) < 0) -+ return (-1); -+ if ((*putc_cb)('>', p) < 0) -+ return (-1); -+ -+ col += 3; -+ -+ col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); -+ } -+ break; -+ -+ case MXML_INTEGER : -+ if (node->prev) -+ { -+ if (global->wrap > 0 && col > global->wrap) -+ { -+ if ((*putc_cb)('\n', p) < 0) -+ return (-1); -+ -+ col = 0; -+ } -+ else if ((*putc_cb)(' ', p) < 0) -+ return (-1); -+ else -+ col ++; -+ } -+ -+ sprintf(s, "%d", node->value.integer); -+ if (mxml_write_string(s, p, putc_cb) < 0) -+ return (-1); -+ -+ col += strlen(s); -+ break; -+ -+ case MXML_OPAQUE : -+ if (mxml_write_string(node->value.opaque, p, putc_cb) < 0) -+ return (-1); -+ -+ col += strlen(node->value.opaque); -+ break; -+ -+ case MXML_REAL : -+ if (node->prev) -+ { -+ if (global->wrap > 0 && col > global->wrap) -+ { -+ if ((*putc_cb)('\n', p) < 0) -+ return (-1); -+ -+ col = 0; -+ } -+ else if ((*putc_cb)(' ', p) < 0) -+ return (-1); -+ else -+ col ++; -+ } -+ -+ sprintf(s, "%f", node->value.real); -+ if (mxml_write_string(s, p, putc_cb) < 0) -+ return (-1); -+ -+ col += strlen(s); -+ break; -+ -+ case MXML_TEXT : -+ if (node->value.text.whitespace && col > 0) -+ { -+ if (global->wrap > 0 && col > global->wrap) -+ { -+ if ((*putc_cb)('\n', p) < 0) -+ return (-1); -+ -+ col = 0; -+ } -+ else if ((*putc_cb)(' ', p) < 0) -+ return (-1); -+ else -+ col ++; -+ } -+ -+ if (mxml_write_string(node->value.text.string, p, putc_cb) < 0) -+ return (-1); -+ -+ col += strlen(node->value.text.string); -+ break; -+ -+ case MXML_CUSTOM : -+ if (global->custom_save_cb) -+ { -+ char *data; /* Custom data string */ -+ const char *newline; /* Last newline in string */ -+ -+ -+ if ((data = (*global->custom_save_cb)(node)) == NULL) -+ return (-1); -+ -+ if (mxml_write_string(data, p, putc_cb) < 0) -+ return (-1); -+ -+ if ((newline = strrchr(data, '\n')) == NULL) -+ col += strlen(data); -+ else -+ col = strlen(newline); -+ -+ free(data); -+ break; -+ } -+ -+ default : /* Should never happen */ -+ return (-1); -+ } -+ -+ /* -+ * Next node... -+ */ -+ -+ node = node->next; -+ } -+ -+ return (col); -+} -+ -+ -+/* -+ * 'mxml_write_string()' - Write a string, escaping & and < as needed. -+ */ -+ -+static int /* O - 0 on success, -1 on failure */ -+mxml_write_string( -+ const char *s, /* I - String to write */ -+ void *p, /* I - Write pointer */ -+ _mxml_putc_cb_t putc_cb) /* I - Write callback */ -+{ -+ const char *name; /* Entity name, if any */ -+ -+ -+ while (*s) -+ { -+ if ((name = mxmlEntityGetName(*s)) != NULL) -+ { -+ if ((*putc_cb)('&', p) < 0) -+ return (-1); -+ -+ while (*name) -+ { -+ if ((*putc_cb)(*name, p) < 0) -+ return (-1); -+ name ++; -+ } -+ -+ if ((*putc_cb)(';', p) < 0) -+ return (-1); -+ } -+ else if ((*putc_cb)(*s, p) < 0) -+ return (-1); -+ -+ s ++; -+ } -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxml_write_ws()' - Do whitespace callback... -+ */ -+ -+static int /* O - New column */ -+mxml_write_ws(mxml_node_t *node, /* I - Current node */ -+ void *p, /* I - Write pointer */ -+ mxml_save_cb_t cb, /* I - Callback function */ -+ int ws, /* I - Where value */ -+ int col, /* I - Current column */ -+ _mxml_putc_cb_t putc_cb) /* I - Write callback */ -+{ -+ const char *s; /* Whitespace string */ -+ -+ -+ if (cb && (s = (*cb)(node, ws)) != NULL) -+ { -+ while (*s) -+ { -+ if ((*putc_cb)(*s, p) < 0) -+ return (-1); -+ else if (*s == '\n') -+ col = 0; -+ else if (*s == '\t') -+ { -+ col += MXML_TAB; -+ col = col - (col % MXML_TAB); -+ } -+ else -+ col ++; -+ -+ s ++; -+ } -+ } -+ -+ return (col); -+} -+ -+ -+/* -+ * End of "$Id: mxml-file.c 391 2009-05-17 05:20:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-index.c mxml-2.6-haiku/mxml-index.c ---- mxml-2.6/mxml-index.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-index.c 2005-01-29 07:21:44.000000000 +0000 -@@ -0,0 +1,649 @@ -+/* -+ * "$Id: mxml-index.c 184 2005-01-29 07:21:44Z mike $" -+ * -+ * Index support code for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2005 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlIndexDelete() - Delete an index. -+ * mxmlIndexEnum() - Return the next node in the index. -+ * mxmlIndexFind() - Find the next matching node. -+ * mxmlIndexNew() - Create a new index. -+ * mxmlIndexReset() - Reset the enumeration/find pointer in the index and -+ * return the first node in the index. -+ * index_compare() - Compare two nodes. -+ * index_find() - Compare a node with index values. -+ * index_sort() - Sort the nodes in the index... -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * Sort functions... -+ */ -+ -+static int index_compare(mxml_index_t *ind, mxml_node_t *first, -+ mxml_node_t *second); -+static int index_find(mxml_index_t *ind, const char *element, -+ const char *value, mxml_node_t *node); -+static void index_sort(mxml_index_t *ind, int left, int right); -+ -+ -+/* -+ * 'mxmlIndexDelete()' - Delete an index. -+ */ -+ -+void -+mxmlIndexDelete(mxml_index_t *ind) /* I - Index to delete */ -+{ -+ /* -+ * Range check input.. -+ */ -+ -+ if (!ind) -+ return; -+ -+ /* -+ * Free memory... -+ */ -+ -+ if (ind->attr) -+ free(ind->attr); -+ -+ if (ind->alloc_nodes) -+ free(ind->nodes); -+ -+ free(ind); -+} -+ -+ -+/* -+ * 'mxmlIndexEnum()' - Return the next node in the index. -+ * -+ * Nodes are returned in the sorted order of the index. -+ */ -+ -+mxml_node_t * /* O - Next node or NULL if there is none */ -+mxmlIndexEnum(mxml_index_t *ind) /* I - Index to enumerate */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!ind) -+ return (NULL); -+ -+ /* -+ * Return the next node... -+ */ -+ -+ if (ind->cur_node < ind->num_nodes) -+ return (ind->nodes[ind->cur_node ++]); -+ else -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxmlIndexFind()' - Find the next matching node. -+ * -+ * You should call mxmlIndexReset() prior to using 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(). -+ */ -+ -+mxml_node_t * /* O - Node or NULL if none found */ -+mxmlIndexFind(mxml_index_t *ind, /* I - Index to search */ -+ const char *element, /* I - Element name to find, if any */ -+ const char *value) /* I - Attribute value, if any */ -+{ -+ int diff, /* Difference between names */ -+ current, /* Current entity in search */ -+ first, /* First entity in search */ -+ last; /* Last entity in search */ -+ -+ -+#ifdef DEBUG -+ printf("mxmlIndexFind(ind=%p, element=\"%s\", value=\"%s\")\n", -+ ind, element ? element : "(null)", value ? value : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!ind || (!ind->attr && value)) -+ { -+#ifdef DEBUG -+ puts(" returning NULL..."); -+ printf(" ind->attr=\"%s\"\n", ind->attr ? ind->attr : "(null)"); -+#endif /* DEBUG */ -+ -+ return (NULL); -+ } -+ -+ /* -+ * If both element and value are NULL, just enumerate the nodes in the -+ * index... -+ */ -+ -+ if (!element && !value) -+ return (mxmlIndexEnum(ind)); -+ -+ /* -+ * If there are no nodes in the index, return NULL... -+ */ -+ -+ if (!ind->num_nodes) -+ { -+#ifdef DEBUG -+ puts(" returning NULL..."); -+ puts(" no nodes!"); -+#endif /* DEBUG */ -+ -+ return (NULL); -+ } -+ -+ /* -+ * If cur_node == 0, then find the first matching node... -+ */ -+ -+ if (ind->cur_node == 0) -+ { -+ /* -+ * Find the first node using a modified binary search algorithm... -+ */ -+ -+ first = 0; -+ last = ind->num_nodes - 1; -+ -+#ifdef DEBUG -+ printf(" find first time, num_nodes=%d...\n", ind->num_nodes); -+#endif /* DEBUG */ -+ -+ while ((last - first) > 1) -+ { -+ current = (first + last) / 2; -+ -+#ifdef DEBUG -+ printf(" first=%d, last=%d, current=%d\n", first, last, current); -+#endif /* DEBUG */ -+ -+ if ((diff = index_find(ind, element, value, ind->nodes[current])) == 0) -+ { -+ /* -+ * Found a match, move back to find the first... -+ */ -+ -+#ifdef DEBUG -+ puts(" match!"); -+#endif /* DEBUG */ -+ -+ while (current > 0 && -+ !index_find(ind, element, value, ind->nodes[current - 1])) -+ current --; -+ -+#ifdef DEBUG -+ printf(" returning first match=%d\n", current); -+#endif /* DEBUG */ -+ -+ /* -+ * Return the first match and save the index to the next... -+ */ -+ -+ ind->cur_node = current + 1; -+ -+ return (ind->nodes[current]); -+ } -+ else if (diff < 0) -+ last = current; -+ else -+ first = current; -+ -+#ifdef DEBUG -+ printf(" diff=%d\n", diff); -+#endif /* DEBUG */ -+ } -+ -+ /* -+ * If we get this far, then we found exactly 0 or 1 matches... -+ */ -+ -+ for (current = first; current <= last; current ++) -+ if (!index_find(ind, element, value, ind->nodes[current])) -+ { -+ /* -+ * Found exactly one (or possibly two) match... -+ */ -+ -+#ifdef DEBUG -+ printf(" returning only match %d...\n", current); -+#endif /* DEBUG */ -+ -+ ind->cur_node = current + 1; -+ -+ return (ind->nodes[current]); -+ } -+ -+ /* -+ * No matches... -+ */ -+ -+ ind->cur_node = ind->num_nodes; -+ -+#ifdef DEBUG -+ puts(" returning NULL..."); -+#endif /* DEBUG */ -+ -+ return (NULL); -+ } -+ else if (ind->cur_node < ind->num_nodes && -+ !index_find(ind, element, value, ind->nodes[ind->cur_node])) -+ { -+ /* -+ * Return the next matching node... -+ */ -+ -+#ifdef DEBUG -+ printf(" returning next match %d...\n", ind->cur_node); -+#endif /* DEBUG */ -+ -+ return (ind->nodes[ind->cur_node ++]); -+ } -+ -+ /* -+ * If we get this far, then we have no matches... -+ */ -+ -+ ind->cur_node = ind->num_nodes; -+ -+#ifdef DEBUG -+ puts(" returning NULL..."); -+#endif /* DEBUG */ -+ -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxmlIndexNew()' - Create a new index. -+ * -+ * The index will contain all nodes that contain the named element and/or -+ * attribute. If both "element" and "attr" are NULL, then the index will -+ * contain a sorted list of the elements in the node tree. Nodes are -+ * sorted by element name and optionally by attribute value if the "attr" -+ * argument is not NULL. -+ */ -+ -+mxml_index_t * /* O - New index */ -+mxmlIndexNew(mxml_node_t *node, /* I - XML node tree */ -+ const char *element, /* I - Element to index or NULL for all */ -+ const char *attr) /* I - Attribute to index or NULL for none */ -+{ -+ mxml_index_t *ind; /* New index */ -+ mxml_node_t *current, /* Current node in index */ -+ **temp; /* Temporary node pointer array */ -+ -+ -+ /* -+ * Range check input... -+ */ -+ -+#ifdef DEBUG -+ printf("mxmlIndexNew(node=%p, element=\"%s\", attr=\"%s\")\n", -+ node, element ? element : "(null)", attr ? attr : "(null)"); -+#endif /* DEBUG */ -+ -+ if (!node) -+ return (NULL); -+ -+ /* -+ * Create a new index... -+ */ -+ -+ if ((ind = calloc(1, sizeof(mxml_index_t))) == NULL) -+ { -+ mxml_error("Unable to allocate %d bytes for index - %s", -+ sizeof(mxml_index_t), strerror(errno)); -+ return (NULL); -+ } -+ -+ if (attr) -+ ind->attr = strdup(attr); -+ -+ if (!element && !attr) -+ current = node; -+ else -+ current = mxmlFindElement(node, node, element, attr, NULL, MXML_DESCEND); -+ -+ while (current) -+ { -+ if (ind->num_nodes >= ind->alloc_nodes) -+ { -+ if (!ind->alloc_nodes) -+ temp = malloc(64 * sizeof(mxml_node_t *)); -+ else -+ temp = realloc(ind->nodes, (ind->alloc_nodes + 64) * sizeof(mxml_node_t *)); -+ -+ if (!temp) -+ { -+ /* -+ * Unable to allocate memory for the index, so abort... -+ */ -+ -+ mxml_error("Unable to allocate %d bytes for index: %s", -+ (ind->alloc_nodes + 64) * sizeof(mxml_node_t *), -+ strerror(errno)); -+ -+ mxmlIndexDelete(ind); -+ return (NULL); -+ } -+ -+ ind->nodes = temp; -+ ind->alloc_nodes += 64; -+ } -+ -+ ind->nodes[ind->num_nodes ++] = current; -+ -+ current = mxmlFindElement(current, node, element, attr, NULL, MXML_DESCEND); -+ } -+ -+ /* -+ * Sort nodes based upon the search criteria... -+ */ -+ -+#ifdef DEBUG -+ { -+ int i; /* Looping var */ -+ -+ -+ printf("%d node(s) in index.\n\n", ind->num_nodes); -+ -+ if (attr) -+ { -+ printf("Node Address Element %s\n", attr); -+ puts("-------- -------- -------------- ------------------------------"); -+ -+ for (i = 0; i < ind->num_nodes; i ++) -+ printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i], -+ ind->nodes[i]->value.element.name, -+ mxmlElementGetAttr(ind->nodes[i], attr)); -+ } -+ else -+ { -+ puts("Node Address Element"); -+ puts("-------- -------- --------------"); -+ -+ for (i = 0; i < ind->num_nodes; i ++) -+ printf("%8d %-8p %s\n", i, ind->nodes[i], -+ ind->nodes[i]->value.element.name); -+ } -+ -+ putchar('\n'); -+ } -+#endif /* DEBUG */ -+ -+ if (ind->num_nodes > 1) -+ index_sort(ind, 0, ind->num_nodes - 1); -+ -+#ifdef DEBUG -+ { -+ int i; /* Looping var */ -+ -+ -+ puts("After sorting:\n"); -+ -+ if (attr) -+ { -+ printf("Node Address Element %s\n", attr); -+ puts("-------- -------- -------------- ------------------------------"); -+ -+ for (i = 0; i < ind->num_nodes; i ++) -+ printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i], -+ ind->nodes[i]->value.element.name, -+ mxmlElementGetAttr(ind->nodes[i], attr)); -+ } -+ else -+ { -+ puts("Node Address Element"); -+ puts("-------- -------- --------------"); -+ -+ for (i = 0; i < ind->num_nodes; i ++) -+ printf("%8d %-8p %s\n", i, ind->nodes[i], -+ ind->nodes[i]->value.element.name); -+ } -+ -+ putchar('\n'); -+ } -+#endif /* DEBUG */ -+ -+ /* -+ * Return the new index... -+ */ -+ -+ return (ind); -+} -+ -+ -+/* -+ * 'mxmlIndexReset()' - Reset the enumeration/find pointer in the index and -+ * return the first node in the index. -+ * -+ * This function should be called prior to using mxmlIndexEnum() or -+ * mxmlIndexFind() for the first time. -+ */ -+ -+mxml_node_t * /* O - First node or NULL if there is none */ -+mxmlIndexReset(mxml_index_t *ind) /* I - Index to reset */ -+{ -+#ifdef DEBUG -+ printf("mxmlIndexReset(ind=%p)\n", ind); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!ind) -+ return (NULL); -+ -+ /* -+ * Set the index to the first element... -+ */ -+ -+ ind->cur_node = 0; -+ -+ /* -+ * Return the first node... -+ */ -+ -+ if (ind->num_nodes) -+ return (ind->nodes[0]); -+ else -+ return (NULL); -+} -+ -+ -+/* -+ * 'index_compare()' - Compare two nodes. -+ */ -+ -+static int /* O - Result of comparison */ -+index_compare(mxml_index_t *ind, /* I - Index */ -+ mxml_node_t *first, /* I - First node */ -+ mxml_node_t *second) /* I - Second node */ -+{ -+ int diff; /* Difference */ -+ -+ -+ /* -+ * Check the element name... -+ */ -+ -+ if ((diff = strcmp(first->value.element.name, -+ second->value.element.name)) != 0) -+ return (diff); -+ -+ /* -+ * Check the attribute value... -+ */ -+ -+ if (ind->attr) -+ { -+ if ((diff = strcmp(mxmlElementGetAttr(first, ind->attr), -+ mxmlElementGetAttr(second, ind->attr))) != 0) -+ return (diff); -+ } -+ -+ /* -+ * No difference, return 0... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'index_find()' - Compare a node with index values. -+ */ -+ -+static int /* O - Result of comparison */ -+index_find(mxml_index_t *ind, /* I - Index */ -+ const char *element, /* I - Element name or NULL */ -+ const char *value, /* I - Attribute value or NULL */ -+ mxml_node_t *node) /* I - Node */ -+{ -+ int diff; /* Difference */ -+ -+ -+ /* -+ * Check the element name... -+ */ -+ -+ if (element) -+ { -+ if ((diff = strcmp(element, node->value.element.name)) != 0) -+ return (diff); -+ } -+ -+ /* -+ * Check the attribute value... -+ */ -+ -+ if (value) -+ { -+ if ((diff = strcmp(value, mxmlElementGetAttr(node, ind->attr))) != 0) -+ return (diff); -+ } -+ -+ /* -+ * No difference, return 0... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'index_sort()' - Sort the nodes in the index... -+ * -+ * This function implements the classic quicksort algorithm... -+ */ -+ -+static void -+index_sort(mxml_index_t *ind, /* I - Index to sort */ -+ int left, /* I - Left node in partition */ -+ int right) /* I - Right node in partition */ -+{ -+ mxml_node_t *pivot, /* Pivot node */ -+ *temp; /* Swap node */ -+ int templ, /* Temporary left node */ -+ tempr; /* Temporary right node */ -+ -+ -+ /* -+ * Loop until we have sorted all the way to the right... -+ */ -+ -+ do -+ { -+ /* -+ * Sort the pivot in the current partition... -+ */ -+ -+ pivot = ind->nodes[left]; -+ -+ for (templ = left, tempr = right; templ < tempr;) -+ { -+ /* -+ * Move left while left node <= pivot node... -+ */ -+ -+ while ((templ < right) && -+ index_compare(ind, ind->nodes[templ], pivot) <= 0) -+ templ ++; -+ -+ /* -+ * Move right while right node > pivot node... -+ */ -+ -+ while ((tempr > left) && -+ index_compare(ind, ind->nodes[tempr], pivot) > 0) -+ tempr --; -+ -+ /* -+ * Swap nodes if needed... -+ */ -+ -+ if (templ < tempr) -+ { -+ temp = ind->nodes[templ]; -+ ind->nodes[templ] = ind->nodes[tempr]; -+ ind->nodes[tempr] = temp; -+ } -+ } -+ -+ /* -+ * When we get here, the right (tempr) node is the new position for the -+ * pivot node... -+ */ -+ -+ if (index_compare(ind, pivot, ind->nodes[tempr]) > 0) -+ { -+ ind->nodes[left] = ind->nodes[tempr]; -+ ind->nodes[tempr] = pivot; -+ } -+ -+ /* -+ * Recursively sort the left partition as needed... -+ */ -+ -+ if (left < (tempr - 1)) -+ index_sort(ind, left, tempr - 1); -+ } -+ while (right > (left = tempr + 1)); -+} -+ -+ -+/* -+ * End of "$Id: mxml-index.c 184 2005-01-29 07:21:44Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-node.c mxml-2.6-haiku/mxml-node.c ---- mxml-2.6/mxml-node.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-node.c 2008-10-26 18:28:05.000000000 +0000 -@@ -0,0 +1,780 @@ -+/* -+ * "$Id: mxml-node.c 363 2008-10-26 18:28:05Z mike $" -+ * -+ * Node support code for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * 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. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * Local functions... -+ */ -+ -+static mxml_node_t *mxml_new(mxml_node_t *parent, mxml_type_t type); -+ -+ -+/* -+ * 'mxmlAdd()' - Add a node to a tree. -+ * -+ * Adds the specified node to the parent. If the child argument is not -+ * NULL, puts the new node before or after the specified child depending -+ * on the value of the where argument. If the child argument is NULL, -+ * puts the new node at the beginning of the child list (MXML_ADD_BEFORE) -+ * or at the end of the child list (MXML_ADD_AFTER). The constant -+ * MXML_ADD_TO_PARENT can be used to specify a NULL child pointer. -+ */ -+ -+void -+mxmlAdd(mxml_node_t *parent, /* I - Parent node */ -+ int where, /* I - Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER */ -+ mxml_node_t *child, /* I - Child node for where or MXML_ADD_TO_PARENT */ -+ mxml_node_t *node) /* I - Node to add */ -+{ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlAdd(parent=%p, where=%d, child=%p, node=%p)\n", parent, -+ where, child, node); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!parent || !node) -+ return; -+ -+#if DEBUG > 1 -+ fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent); -+ if (parent) -+ { -+ fprintf(stderr, " BEFORE: parent->child=%p\n", parent->child); -+ fprintf(stderr, " BEFORE: parent->last_child=%p\n", parent->last_child); -+ fprintf(stderr, " BEFORE: parent->prev=%p\n", parent->prev); -+ fprintf(stderr, " BEFORE: parent->next=%p\n", parent->next); -+ } -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Remove the node from any existing parent... -+ */ -+ -+ if (node->parent) -+ mxmlRemove(node); -+ -+ /* -+ * Reset pointers... -+ */ -+ -+ node->parent = parent; -+ -+ switch (where) -+ { -+ case MXML_ADD_BEFORE : -+ if (!child || child == parent->child || child->parent != parent) -+ { -+ /* -+ * Insert as first node under parent... -+ */ -+ -+ node->next = parent->child; -+ -+ if (parent->child) -+ parent->child->prev = node; -+ else -+ parent->last_child = node; -+ -+ parent->child = node; -+ } -+ else -+ { -+ /* -+ * Insert node before this child... -+ */ -+ -+ node->next = child; -+ node->prev = child->prev; -+ -+ if (child->prev) -+ child->prev->next = node; -+ else -+ parent->child = node; -+ -+ child->prev = node; -+ } -+ break; -+ -+ case MXML_ADD_AFTER : -+ if (!child || child == parent->last_child || child->parent != parent) -+ { -+ /* -+ * Insert as last node under parent... -+ */ -+ -+ node->parent = parent; -+ node->prev = parent->last_child; -+ -+ if (parent->last_child) -+ parent->last_child->next = node; -+ else -+ parent->child = node; -+ -+ parent->last_child = node; -+ } -+ else -+ { -+ /* -+ * Insert node after this child... -+ */ -+ -+ node->prev = child; -+ node->next = child->next; -+ -+ if (child->next) -+ child->next->prev = node; -+ else -+ parent->last_child = node; -+ -+ child->next = node; -+ } -+ break; -+ } -+ -+#if DEBUG > 1 -+ fprintf(stderr, " AFTER: node->parent=%p\n", node->parent); -+ if (parent) -+ { -+ fprintf(stderr, " AFTER: parent->child=%p\n", parent->child); -+ fprintf(stderr, " AFTER: parent->last_child=%p\n", parent->last_child); -+ fprintf(stderr, " AFTER: parent->prev=%p\n", parent->prev); -+ fprintf(stderr, " AFTER: parent->next=%p\n", parent->next); -+ } -+#endif /* DEBUG > 1 */ -+} -+ -+ -+/* -+ * 'mxmlDelete()' - Delete a node and all of its children. -+ * -+ * If the specified node has a parent, this function first removes the -+ * node from its parent using the mxmlRemove() function. -+ */ -+ -+void -+mxmlDelete(mxml_node_t *node) /* I - Node to delete */ -+{ -+ int i; /* Looping var */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlDelete(node=%p)\n", node); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node) -+ return; -+ -+ /* -+ * Remove the node from its parent, if any... -+ */ -+ -+ mxmlRemove(node); -+ -+ /* -+ * Delete children... -+ */ -+ -+ while (node->child) -+ mxmlDelete(node->child); -+ -+ /* -+ * Now delete any node data... -+ */ -+ -+ switch (node->type) -+ { -+ case MXML_ELEMENT : -+ if (node->value.element.name) -+ free(node->value.element.name); -+ -+ if (node->value.element.num_attrs) -+ { -+ for (i = 0; i < node->value.element.num_attrs; i ++) -+ { -+ if (node->value.element.attrs[i].name) -+ free(node->value.element.attrs[i].name); -+ if (node->value.element.attrs[i].value) -+ free(node->value.element.attrs[i].value); -+ } -+ -+ free(node->value.element.attrs); -+ } -+ break; -+ case MXML_INTEGER : -+ /* Nothing to do */ -+ break; -+ case MXML_OPAQUE : -+ if (node->value.opaque) -+ free(node->value.opaque); -+ break; -+ case MXML_REAL : -+ /* Nothing to do */ -+ break; -+ case MXML_TEXT : -+ if (node->value.text.string) -+ free(node->value.text.string); -+ break; -+ case MXML_CUSTOM : -+ if (node->value.custom.data && -+ node->value.custom.destroy) -+ (*(node->value.custom.destroy))(node->value.custom.data); -+ break; -+ default : -+ break; -+ } -+ -+ /* -+ * Free this node... -+ */ -+ -+ free(node); -+} -+ -+ -+/* -+ * 'mxmlNewCDATA()' - Create a new CDATA node. -+ * -+ * The new CDATA node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * 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. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewCDATA(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ const char *data) /* I - Data string */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewCDATA(parent=%p, data=\"%s\")\n", -+ parent, data ? data : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!data) -+ return (NULL); -+ -+ /* -+ * Create the node and set the name value... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL) -+ node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data); -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewCustom()' - Create a new custom data node. -+ * -+ * The new custom node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * element node has no parent. NULL can be passed when the data in the -+ * node is not dynamically allocated or is separately managed. -+ * -+ * @since Mini-XML 2.1@ -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewCustom( -+ mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ void *data, /* I - Pointer to data */ -+ mxml_custom_destroy_cb_t destroy) /* I - Function to destroy data */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewCustom(parent=%p, data=%p, destroy=%p)\n", parent, -+ data, destroy); -+#endif /* DEBUG */ -+ -+ /* -+ * Create the node and set the value... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_CUSTOM)) != NULL) -+ { -+ node->value.custom.data = data; -+ node->value.custom.destroy = destroy; -+ } -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewElement()' - Create a new element node. -+ * -+ * The new element node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * element node has no parent. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewElement(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ const char *name) /* I - Name of element */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewElement(parent=%p, name=\"%s\")\n", parent, -+ name ? name : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!name) -+ return (NULL); -+ -+ /* -+ * Create the node and set the element name... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL) -+ node->value.element.name = strdup(name); -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewInteger()' - Create a new integer node. -+ * -+ * The new integer node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * integer node has no parent. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewInteger(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ int integer) /* I - Integer value */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewInteger(parent=%p, integer=%d)\n", parent, integer); -+#endif /* DEBUG */ -+ -+ /* -+ * Create the node and set the element name... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_INTEGER)) != NULL) -+ node->value.integer = integer; -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewOpaque()' - Create a new opaque string. -+ * -+ * The new opaque node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * opaque node has no parent. The opaque string must be nul-terminated and -+ * is copied into the new node. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewOpaque(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ const char *opaque) /* I - Opaque string */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewOpaque(parent=%p, opaque=\"%s\")\n", parent, -+ opaque ? opaque : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!opaque) -+ return (NULL); -+ -+ /* -+ * Create the node and set the element name... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_OPAQUE)) != NULL) -+ node->value.opaque = strdup(opaque); -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewReal()' - Create a new real number node. -+ * -+ * The new real number node is added to the end of the specified parent's -+ * child list. The constant MXML_NO_PARENT can be used to specify that -+ * the new real number node has no parent. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewReal(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ double real) /* I - Real number value */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewReal(parent=%p, real=%g)\n", parent, real); -+#endif /* DEBUG */ -+ -+ /* -+ * Create the node and set the element name... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_REAL)) != NULL) -+ node->value.real = real; -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewText()' - Create a new text fragment node. -+ * -+ * The new text node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * text node has no parent. The whitespace parameter is used to specify -+ * whether leading whitespace is present before the node. The text -+ * string must be nul-terminated and is copied into the new node. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewText(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ -+ const char *string) /* I - String */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewText(parent=%p, whitespace=%d, string=\"%s\")\n", -+ parent, whitespace, string ? string : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!string) -+ return (NULL); -+ -+ /* -+ * Create the node and set the text value... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_TEXT)) != NULL) -+ { -+ node->value.text.whitespace = whitespace; -+ node->value.text.string = strdup(string); -+ } -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlNewTextf()' - Create a new formatted text fragment node. -+ * -+ * The new text node is added to the end of the specified parent's child -+ * list. The constant MXML_NO_PARENT can be used to specify that the new -+ * text node has no parent. The whitespace 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. -+ */ -+ -+mxml_node_t * /* O - New node */ -+mxmlNewTextf(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ -+ int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ -+ const char *format, /* I - Printf-style frmat string */ -+ ...) /* I - Additional args as needed */ -+{ -+ mxml_node_t *node; /* New node */ -+ va_list ap; /* Pointer to arguments */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlNewTextf(parent=%p, whitespace=%d, format=\"%s\", ...)\n", -+ parent, whitespace, format ? format : "(null)"); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!format) -+ return (NULL); -+ -+ /* -+ * Create the node and set the text value... -+ */ -+ -+ if ((node = mxml_new(parent, MXML_TEXT)) != NULL) -+ { -+ va_start(ap, format); -+ -+ node->value.text.whitespace = whitespace; -+ node->value.text.string = _mxml_vstrdupf(format, ap); -+ -+ va_end(ap); -+ } -+ -+ return (node); -+} -+ -+ -+/* -+ * 'mxmlRemove()' - Remove a node from its parent. -+ * -+ * Does not free memory used by the node - use mxmlDelete() for that. -+ * This function does nothing if the node has no parent. -+ */ -+ -+void -+mxmlRemove(mxml_node_t *node) /* I - Node to remove */ -+{ -+#ifdef DEBUG -+ fprintf(stderr, "mxmlRemove(node=%p)\n", node); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || !node->parent) -+ return; -+ -+ /* -+ * Remove from parent... -+ */ -+ -+#if DEBUG > 1 -+ fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent); -+ if (node->parent) -+ { -+ fprintf(stderr, " BEFORE: node->parent->child=%p\n", node->parent->child); -+ fprintf(stderr, " BEFORE: node->parent->last_child=%p\n", node->parent->last_child); -+ } -+ fprintf(stderr, " BEFORE: node->child=%p\n", node->child); -+ fprintf(stderr, " BEFORE: node->last_child=%p\n", node->last_child); -+ fprintf(stderr, " BEFORE: node->prev=%p\n", node->prev); -+ fprintf(stderr, " BEFORE: node->next=%p\n", node->next); -+#endif /* DEBUG > 1 */ -+ -+ if (node->prev) -+ node->prev->next = node->next; -+ else -+ node->parent->child = node->next; -+ -+ if (node->next) -+ node->next->prev = node->prev; -+ else -+ node->parent->last_child = node->prev; -+ -+ node->parent = NULL; -+ node->prev = NULL; -+ node->next = NULL; -+ -+#if DEBUG > 1 -+ fprintf(stderr, " AFTER: node->parent=%p\n", node->parent); -+ if (node->parent) -+ { -+ fprintf(stderr, " AFTER: node->parent->child=%p\n", node->parent->child); -+ fprintf(stderr, " AFTER: node->parent->last_child=%p\n", node->parent->last_child); -+ } -+ fprintf(stderr, " AFTER: node->child=%p\n", node->child); -+ fprintf(stderr, " AFTER: node->last_child=%p\n", node->last_child); -+ fprintf(stderr, " AFTER: node->prev=%p\n", node->prev); -+ fprintf(stderr, " AFTER: node->next=%p\n", node->next); -+#endif /* DEBUG > 1 */ -+} -+ -+ -+/* -+ * 'mxmlNewXML()' - Create a new XML document tree. -+ * -+ * The "version" argument specifies the version number to put in the -+ * ?xml element node. If NULL, version 1.0 is assumed. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+mxml_node_t * /* O - New ?xml node */ -+mxmlNewXML(const char *version) /* I - Version number to use */ -+{ -+ char element[1024]; /* Element text */ -+ -+ -+ snprintf(element, sizeof(element), "?xml version=\"%s\" encoding=\"utf-8\"?", -+ version ? version : "1.0"); -+ -+ return (mxmlNewElement(NULL, element)); -+} -+ -+ -+/* -+ * 'mxmlRelease()' - Release a node. -+ * -+ * When the reference count reaches zero, the node (and any children) -+ * is deleted via mxmlDelete(). -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+int /* O - New reference count */ -+mxmlRelease(mxml_node_t *node) /* I - Node */ -+{ -+ if (node) -+ { -+ if ((-- node->ref_count) <= 0) -+ { -+ mxmlDelete(node); -+ return (0); -+ } -+ else -+ return (node->ref_count); -+ } -+ else -+ return (-1); -+} -+ -+ -+/* -+ * 'mxmlRetain()' - Retain a node. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+int /* O - New reference count */ -+mxmlRetain(mxml_node_t *node) /* I - Node */ -+{ -+ if (node) -+ return (++ node->ref_count); -+ else -+ return (-1); -+} -+ -+ -+/* -+ * 'mxml_new()' - Create a new node. -+ */ -+ -+static mxml_node_t * /* O - New node */ -+mxml_new(mxml_node_t *parent, /* I - Parent node */ -+ mxml_type_t type) /* I - Node type */ -+{ -+ mxml_node_t *node; /* New node */ -+ -+ -+#if DEBUG > 1 -+ fprintf(stderr, "mxml_new(parent=%p, type=%d)\n", parent, type); -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Allocate memory for the node... -+ */ -+ -+ if ((node = calloc(1, sizeof(mxml_node_t))) == NULL) -+ { -+#if DEBUG > 1 -+ fputs(" returning NULL\n", stderr); -+#endif /* DEBUG > 1 */ -+ -+ return (NULL); -+ } -+ -+#if DEBUG > 1 -+ fprintf(stderr, " returning %p\n", node); -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Set the node type... -+ */ -+ -+ node->type = type; -+ node->ref_count = 1; -+ -+ /* -+ * Add to the parent if present... -+ */ -+ -+ if (parent) -+ mxmlAdd(parent, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, node); -+ -+ /* -+ * Return the new node... -+ */ -+ -+ return (node); -+} -+ -+ -+/* -+ * End of "$Id: mxml-node.c 363 2008-10-26 18:28:05Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-private.c mxml-2.6-haiku/mxml-private.c ---- mxml-2.6/mxml-private.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-private.c 2007-11-22 18:01:52.000000000 +0000 -@@ -0,0 +1,285 @@ -+/* -+ * "$Id: mxml-private.c 315 2007-11-22 18:01:52Z mike $" -+ * -+ * Private functions for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxml_error() - Display an error message. -+ * mxml_integer_cb() - Default callback for integer values. -+ * mxml_opaque_cb() - Default callback for opaque values. -+ * mxml_real_cb() - Default callback for real number values. -+ * _mxml_global() - Get global data. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "mxml-private.h" -+ -+ -+/* -+ * 'mxml_error()' - Display an error message. -+ */ -+ -+void -+mxml_error(const char *format, /* I - Printf-style format string */ -+ ...) /* I - Additional arguments as needed */ -+{ -+ va_list ap; /* Pointer to arguments */ -+ char s[1024]; /* Message string */ -+ _mxml_global_t *global = _mxml_global(); -+ /* Global data */ -+ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!format) -+ return; -+ -+ /* -+ * Format the error message string... -+ */ -+ -+ va_start(ap, format); -+ -+ vsnprintf(s, sizeof(s), format, ap); -+ -+ va_end(ap); -+ -+ /* -+ * And then display the error message... -+ */ -+ -+ if (global->error_cb) -+ (*global->error_cb)(s); -+ else -+ fprintf(stderr, "mxml: %s\n", s); -+} -+ -+ -+/* -+ * 'mxml_ignore_cb()' - Default callback for ignored values. -+ */ -+ -+mxml_type_t /* O - Node type */ -+mxml_ignore_cb(mxml_node_t *node) /* I - Current node */ -+{ -+ (void)node; -+ -+ return (MXML_IGNORE); -+} -+ -+ -+/* -+ * 'mxml_integer_cb()' - Default callback for integer values. -+ */ -+ -+mxml_type_t /* O - Node type */ -+mxml_integer_cb(mxml_node_t *node) /* I - Current node */ -+{ -+ (void)node; -+ -+ return (MXML_INTEGER); -+} -+ -+ -+/* -+ * 'mxml_opaque_cb()' - Default callback for opaque values. -+ */ -+ -+mxml_type_t /* O - Node type */ -+mxml_opaque_cb(mxml_node_t *node) /* I - Current node */ -+{ -+ (void)node; -+ -+ return (MXML_OPAQUE); -+} -+ -+ -+/* -+ * 'mxml_real_cb()' - Default callback for real number values. -+ */ -+ -+mxml_type_t /* O - Node type */ -+mxml_real_cb(mxml_node_t *node) /* I - Current node */ -+{ -+ (void)node; -+ -+ return (MXML_REAL); -+} -+ -+ -+#ifdef HAVE_PTHREAD_H /**** POSIX threading ****/ -+# include -+ -+static pthread_key_t _mxml_key = -1; /* Thread local storage key */ -+static pthread_once_t _mxml_key_once = PTHREAD_ONCE_INIT; -+ /* One-time initialization object */ -+static void _mxml_init(void); -+static void _mxml_destructor(void *g); -+ -+ -+/* -+ * '_mxml_global()' - Get global data. -+ */ -+ -+_mxml_global_t * /* O - Global data */ -+_mxml_global(void) -+{ -+ _mxml_global_t *global; /* Global data */ -+ -+ -+ pthread_once(&_mxml_key_once, _mxml_init); -+ -+ if ((global = (_mxml_global_t *)pthread_getspecific(_mxml_key)) == NULL) -+ { -+ global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t)); -+ pthread_setspecific(_mxml_key, global); -+ -+ global->num_entity_cbs = 1; -+ global->entity_cbs[0] = _mxml_entity_cb; -+ global->wrap = 72; -+ } -+ -+ return (global); -+} -+ -+ -+/* -+ * '_mxml_init()' - Initialize global data... -+ */ -+ -+static void -+_mxml_init(void) -+{ -+ pthread_key_create(&_mxml_key, _mxml_destructor); -+} -+ -+ -+/* -+ * '_mxml_destructor()' - Free memory used for globals... -+ */ -+ -+static void -+_mxml_destructor(void *g) /* I - Global data */ -+{ -+ free(g); -+} -+ -+ -+#elif defined(WIN32) /**** WIN32 threading ****/ -+# include -+ -+static DWORD _mxml_tls_index; /* Index for global storage */ -+ -+ -+/* -+ * 'DllMain()' - Main entry for library. -+ */ -+ -+BOOL WINAPI /* O - Success/failure */ -+DllMain(HINSTANCE hinst, /* I - DLL module handle */ -+ DWORD reason, /* I - Reason */ -+ LPVOID reserved) /* I - Unused */ -+{ -+ _mxml_global_t *global; /* Global data */ -+ -+ -+ (void)hinst; -+ (void)reserved; -+ -+ switch (reason) -+ { -+ case DLL_PROCESS_ATTACH : /* Called on library initialization */ -+ if ((_mxml_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) -+ return (FALSE); -+ break; -+ -+ case DLL_THREAD_DETACH : /* Called when a thread terminates */ -+ if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL) -+ free(global); -+ break; -+ -+ case DLL_PROCESS_DETACH : /* Called when library is unloaded */ -+ if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL) -+ free(global); -+ -+ TlsFree(_mxml_tls_index); -+ break; -+ -+ default: -+ break; -+ } -+ -+ return (TRUE); -+} -+ -+ -+/* -+ * '_mxml_global()' - Get global data. -+ */ -+ -+_mxml_global_t * /* O - Global data */ -+_mxml_global(void) -+{ -+ _mxml_global_t *global; /* Global data */ -+ -+ -+ if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) == NULL) -+ { -+ global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t)); -+ -+ global->num_entity_cbs = 1; -+ global->entity_cbs[0] = _mxml_entity_cb; -+ global->wrap = 72; -+ -+ TlsSetValue(_mxml_tls_index, (LPVOID)global); -+ } -+ -+ return (global); -+} -+ -+ -+#else /**** No threading ****/ -+/* -+ * '_mxml_global()' - Get global data. -+ */ -+ -+_mxml_global_t * /* O - Global data */ -+_mxml_global(void) -+{ -+ static _mxml_global_t global = /* Global data */ -+ { -+ NULL, /* error_cb */ -+ 1, /* num_entity_cbs */ -+ { _mxml_entity_cb }, /* entity_cbs */ -+ 72, /* wrap */ -+ NULL, /* custom_load_cb */ -+ NULL /* custom_save_cb */ -+ }; -+ -+ -+ return (&global); -+} -+#endif /* HAVE_PTHREAD_H */ -+ -+ -+/* -+ * End of "$Id: mxml-private.c 315 2007-11-22 18:01:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-private.h mxml-2.6-haiku/mxml-private.h ---- mxml-2.6/mxml-private.h 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-private.h 2007-09-21 04:46:02.000000000 +0000 -@@ -0,0 +1,52 @@ -+/* -+ * "$Id: mxml-private.h 309 2007-09-21 04:46:02Z mike $" -+ * -+ * Private definitions for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * Global, per-thread data... -+ */ -+ -+typedef struct _mxml_global_s -+{ -+ void (*error_cb)(const char *); -+ int num_entity_cbs; -+ int (*entity_cbs[100])(const char *name); -+ int wrap; -+ mxml_custom_load_cb_t custom_load_cb; -+ mxml_custom_save_cb_t custom_save_cb; -+} _mxml_global_t; -+ -+ -+/* -+ * Functions... -+ */ -+ -+extern _mxml_global_t *_mxml_global(void); -+extern int _mxml_entity_cb(const char *name); -+ -+ -+/* -+ * End of "$Id: mxml-private.h 309 2007-09-21 04:46:02Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-search.c mxml-2.6-haiku/mxml-search.c ---- mxml-2.6/mxml-search.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-search.c 2007-09-09 07:16:52.000000000 +0000 -@@ -0,0 +1,201 @@ -+/* -+ * "$Id: mxml-search.c 297 2007-09-09 07:16:52Z mike $" -+ * -+ * Search/navigation functions for Mini-XML, a small XML-like file -+ * parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlFindElement() - Find the named element. -+ * mxmlWalkNext() - Walk to the next logical node in the tree. -+ * mxmlWalkPrev() - Walk to the previous logical node in the tree. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * 'mxmlFindElement()' - Find the named element. -+ * -+ * The search is constrained by the name, attribute name, and value; any -+ * NULL names or values are treated as wildcards, so different kinds of -+ * searches can be implemented by looking for all elements of a given name -+ * or all elements with a specific attribute. The descend argument determines -+ * 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. -+ */ -+ -+mxml_node_t * /* O - Element node or NULL */ -+mxmlFindElement(mxml_node_t *node, /* I - Current node */ -+ mxml_node_t *top, /* I - Top node */ -+ const char *name, /* I - Element name or NULL for any */ -+ const char *attr, /* I - Attribute name, or NULL for none */ -+ const char *value, /* I - Attribute value, or NULL for any */ -+ int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ -+{ -+ const char *temp; /* Current attribute value */ -+ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || !top || (!attr && value)) -+ return (NULL); -+ -+ /* -+ * Start with the next node... -+ */ -+ -+ node = mxmlWalkNext(node, top, descend); -+ -+ /* -+ * Loop until we find a matching element... -+ */ -+ -+ while (node != NULL) -+ { -+ /* -+ * See if this node matches... -+ */ -+ -+ if (node->type == MXML_ELEMENT && -+ node->value.element.name && -+ (!name || !strcmp(node->value.element.name, name))) -+ { -+ /* -+ * See if we need to check for an attribute... -+ */ -+ -+ if (!attr) -+ return (node); /* No attribute search, return it... */ -+ -+ /* -+ * Check for the attribute... -+ */ -+ -+ if ((temp = mxmlElementGetAttr(node, attr)) != NULL) -+ { -+ /* -+ * OK, we have the attribute, does it match? -+ */ -+ -+ if (!value || !strcmp(value, temp)) -+ return (node); /* Yes, return it... */ -+ } -+ } -+ -+ /* -+ * No match, move on to the next node... -+ */ -+ -+ if (descend == MXML_DESCEND) -+ node = mxmlWalkNext(node, top, MXML_DESCEND); -+ else -+ node = node->next; -+ } -+ -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxmlWalkNext()' - Walk to the next logical node in the tree. -+ * -+ * The descend argument controls whether the first child is considered -+ * to be the next node. The top node argument constrains the walk to -+ * the node's children. -+ */ -+ -+mxml_node_t * /* O - Next node or NULL */ -+mxmlWalkNext(mxml_node_t *node, /* I - Current node */ -+ mxml_node_t *top, /* I - Top node */ -+ int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ -+{ -+ if (!node) -+ return (NULL); -+ else if (node->child && descend) -+ return (node->child); -+ else if (node == top) -+ return (NULL); -+ else if (node->next) -+ return (node->next); -+ else if (node->parent && node->parent != top) -+ { -+ node = node->parent; -+ -+ while (!node->next) -+ if (node->parent == top || !node->parent) -+ return (NULL); -+ else -+ node = node->parent; -+ -+ return (node->next); -+ } -+ else -+ return (NULL); -+} -+ -+ -+/* -+ * 'mxmlWalkPrev()' - Walk to the previous logical node in the tree. -+ * -+ * The descend argument controls whether the previous node's last child -+ * is considered to be the previous node. The top node argument constrains -+ * the walk to the node's children. -+ */ -+ -+mxml_node_t * /* O - Previous node or NULL */ -+mxmlWalkPrev(mxml_node_t *node, /* I - Current node */ -+ mxml_node_t *top, /* I - Top node */ -+ int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ -+{ -+ if (!node || node == top) -+ return (NULL); -+ else if (node->prev) -+ { -+ if (node->prev->last_child && descend) -+ { -+ /* -+ * Find the last child under the previous node... -+ */ -+ -+ node = node->prev->last_child; -+ -+ while (node->last_child) -+ node = node->last_child; -+ -+ return (node); -+ } -+ else -+ return (node->prev); -+ } -+ else if (node->parent != top) -+ return (node->parent); -+ else -+ return (NULL); -+} -+ -+ -+/* -+ * End of "$Id: mxml-search.c 297 2007-09-09 07:16:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-set.c mxml-2.6-haiku/mxml-set.c ---- mxml-2.6/mxml-set.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-set.c 2007-04-23 21:48:03.000000000 +0000 -@@ -0,0 +1,294 @@ -+/* -+ * "$Id: mxml-set.c 270 2007-04-23 21:48:03Z mike $" -+ * -+ * Node set functions for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * mxmlSetCustom() - Set the data and destructor of a custom data node. -+ * mxmlSetCDATA() - Set the element name of a CDATA node. -+ * mxmlSetElement() - Set the name of an element node. -+ * mxmlSetInteger() - Set the value of an integer node. -+ * mxmlSetOpaque() - Set the value of an opaque node. -+ * mxmlSetReal() - Set the value of a real number node. -+ * mxmlSetText() - Set the value of a text node. -+ * mxmlSetTextf() - Set the value of a text node to a formatted string. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+ -+ -+/* -+ * 'mxmlSetCustom()' - Set the data and destructor of a custom data node. -+ * -+ * The node is not changed if it is not a custom node. -+ * -+ * @since Mini-XML 2.1@ -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetCustom( -+ mxml_node_t *node, /* I - Node to set */ -+ void *data, /* I - New data pointer */ -+ mxml_custom_destroy_cb_t destroy) /* I - New destructor function */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_CUSTOM) -+ return (-1); -+ -+ /* -+ * Free any old element value and set the new value... -+ */ -+ -+ if (node->value.custom.data && node->value.custom.destroy) -+ (*(node->value.custom.destroy))(node->value.custom.data); -+ -+ node->value.custom.data = data; -+ node->value.custom.destroy = destroy; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetCDATA()' - Set the element name of a CDATA node. -+ * -+ * The node is not changed if it is not a CDATA element node. -+ * -+ * @since Mini-XML 2.3@ -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetCDATA(mxml_node_t *node, /* I - Node to set */ -+ const char *data) /* I - New data string */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !data || -+ strncmp(node->value.element.name, "![CDATA[", 8)) -+ return (-1); -+ -+ /* -+ * Free any old element value and set the new value... -+ */ -+ -+ if (node->value.element.name) -+ free(node->value.element.name); -+ -+ node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data); -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetElement()' - Set the name of an element node. -+ * -+ * The node is not changed if it is not an element node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetElement(mxml_node_t *node, /* I - Node to set */ -+ const char *name) /* I - New name string */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_ELEMENT || !name) -+ return (-1); -+ -+ /* -+ * Free any old element value and set the new value... -+ */ -+ -+ if (node->value.element.name) -+ free(node->value.element.name); -+ -+ node->value.element.name = strdup(name); -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetInteger()' - Set the value of an integer node. -+ * -+ * The node is not changed if it is not an integer node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetInteger(mxml_node_t *node, /* I - Node to set */ -+ int integer) /* I - Integer value */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_INTEGER) -+ return (-1); -+ -+ /* -+ * Set the new value and return... -+ */ -+ -+ node->value.integer = integer; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetOpaque()' - Set the value of an opaque node. -+ * -+ * The node is not changed if it is not an opaque node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetOpaque(mxml_node_t *node, /* I - Node to set */ -+ const char *opaque) /* I - Opaque string */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_OPAQUE || !opaque) -+ return (-1); -+ -+ /* -+ * Free any old opaque value and set the new value... -+ */ -+ -+ if (node->value.opaque) -+ free(node->value.opaque); -+ -+ node->value.opaque = strdup(opaque); -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetReal()' - Set the value of a real number node. -+ * -+ * The node is not changed if it is not a real number node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetReal(mxml_node_t *node, /* I - Node to set */ -+ double real) /* I - Real number value */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_REAL) -+ return (-1); -+ -+ /* -+ * Set the new value and return... -+ */ -+ -+ node->value.real = real; -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetText()' - Set the value of a text node. -+ * -+ * The node is not changed if it is not a text node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetText(mxml_node_t *node, /* I - Node to set */ -+ int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ -+ const char *string) /* I - String */ -+{ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_TEXT || !string) -+ return (-1); -+ -+ /* -+ * Free any old string value and set the new value... -+ */ -+ -+ if (node->value.text.string) -+ free(node->value.text.string); -+ -+ node->value.text.whitespace = whitespace; -+ node->value.text.string = strdup(string); -+ -+ return (0); -+} -+ -+ -+/* -+ * 'mxmlSetTextf()' - Set the value of a text node to a formatted string. -+ * -+ * The node is not changed if it is not a text node. -+ */ -+ -+int /* O - 0 on success, -1 on failure */ -+mxmlSetTextf(mxml_node_t *node, /* I - Node to set */ -+ int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ -+ const char *format, /* I - Printf-style format string */ -+ ...) /* I - Additional arguments as needed */ -+{ -+ va_list ap; /* Pointer to arguments */ -+ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!node || node->type != MXML_TEXT || !format) -+ return (-1); -+ -+ /* -+ * Free any old string value and set the new value... -+ */ -+ -+ if (node->value.text.string) -+ free(node->value.text.string); -+ -+ va_start(ap, format); -+ -+ node->value.text.whitespace = whitespace; -+ node->value.text.string = _mxml_strdupf(format, ap); -+ -+ va_end(ap); -+ -+ return (0); -+} -+ -+ -+/* -+ * End of "$Id: mxml-set.c 270 2007-04-23 21:48:03Z mike $". -+ */ -diff -Naur mxml-2.6/mxml-string.c mxml-2.6-haiku/mxml-string.c ---- mxml-2.6/mxml-string.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml-string.c 2009-04-18 17:05:52.000000000 +0000 -@@ -0,0 +1,462 @@ -+/* -+ * "$Id: mxml-string.c 387 2009-04-18 17:05:52Z mike $" -+ * -+ * String functions for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * _mxml_snprintf() - Format a string. -+ * _mxml_strdup() - Duplicate a string. -+ * _mxml_strdupf() - Format and duplicate a string. -+ * _mxml_vsnprintf() - Format a string into a fixed size buffer. -+ * _mxml_vstrdupf() - Format and duplicate a string. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+ -+ -+#ifndef HAVE_SNPRINTF -+/* -+ * '_mxml_snprintf()' - Format a string. -+ */ -+ -+int /* O - Number of bytes formatted */ -+_mxml_snprintf(char *buffer, /* I - Output buffer */ -+ size_t bufsize, /* I - Size of output buffer */ -+ const char *format, /* I - Printf-style format string */ -+ ...) /* I - Additional arguments as needed */ -+{ -+ va_list ap; /* Argument list */ -+ int bytes; /* Number of bytes formatted */ -+ -+ -+ va_start(ap, format); -+ bytes = vsnprintf(buffer, bufsize, format, ap); -+ va_end(ap); -+ -+ return (bytes); -+} -+#endif /* !HAVE_SNPRINTF */ -+ -+ -+/* -+ * '_mxml_strdup()' - Duplicate a string. -+ */ -+ -+#ifndef HAVE_STRDUP -+char * /* O - New string pointer */ -+_mxml_strdup(const char *s) /* I - String to duplicate */ -+{ -+ char *t; /* New string pointer */ -+ -+ -+ if (s == NULL) -+ return (NULL); -+ -+ if ((t = malloc(strlen(s) + 1)) == NULL) -+ return (NULL); -+ -+ return (strcpy(t, s)); -+} -+#endif /* !HAVE_STRDUP */ -+ -+ -+/* -+ * '_mxml_strdupf()' - Format and duplicate a string. -+ */ -+ -+char * /* O - New string pointer */ -+_mxml_strdupf(const char *format, /* I - Printf-style format string */ -+ ...) /* I - Additional arguments as needed */ -+{ -+ va_list ap; /* Pointer to additional arguments */ -+ char *s; /* Pointer to formatted string */ -+ -+ -+ /* -+ * Get a pointer to the additional arguments, format the string, -+ * and return it... -+ */ -+ -+ va_start(ap, format); -+ s = _mxml_vstrdupf(format, ap); -+ va_end(ap); -+ -+ return (s); -+} -+ -+ -+#ifndef HAVE_VSNPRINTF -+/* -+ * '_mxml_vsnprintf()' - Format a string into a fixed size buffer. -+ */ -+ -+int /* O - Number of bytes formatted */ -+_mxml_vsnprintf(char *buffer, /* O - Output buffer */ -+ size_t bufsize, /* O - Size of output buffer */ -+ const char *format, /* I - Printf-style format string */ -+ va_list ap) /* I - Pointer to additional arguments */ -+{ -+ char *bufptr, /* Pointer to position in buffer */ -+ *bufend, /* Pointer to end of buffer */ -+ sign, /* Sign of format width */ -+ size, /* Size character (h, l, L) */ -+ type; /* Format type character */ -+ int width, /* Width of field */ -+ prec; /* Number of characters of precision */ -+ char tformat[100], /* Temporary format string for sprintf() */ -+ *tptr, /* Pointer into temporary format */ -+ temp[1024]; /* Buffer for formatted numbers */ -+ char *s; /* Pointer to string */ -+ int slen; /* Length of string */ -+ int bytes; /* Total number of bytes needed */ -+ -+ -+ /* -+ * Loop through the format string, formatting as needed... -+ */ -+ -+ bufptr = buffer; -+ bufend = buffer + bufsize - 1; -+ bytes = 0; -+ -+ while (*format) -+ { -+ if (*format == '%') -+ { -+ tptr = tformat; -+ *tptr++ = *format++; -+ -+ if (*format == '%') -+ { -+ if (bufptr && bufptr < bufend) *bufptr++ = *format; -+ bytes ++; -+ format ++; -+ continue; -+ } -+ else if (strchr(" -+#\'", *format)) -+ { -+ *tptr++ = *format; -+ sign = *format++; -+ } -+ else -+ sign = 0; -+ -+ if (*format == '*') -+ { -+ /* -+ * Get width from argument... -+ */ -+ -+ format ++; -+ width = va_arg(ap, int); -+ -+ snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); -+ tptr += strlen(tptr); -+ } -+ else -+ { -+ width = 0; -+ -+ while (isdigit(*format & 255)) -+ { -+ if (tptr < (tformat + sizeof(tformat) - 1)) -+ *tptr++ = *format; -+ -+ width = width * 10 + *format++ - '0'; -+ } -+ } -+ -+ if (*format == '.') -+ { -+ if (tptr < (tformat + sizeof(tformat) - 1)) -+ *tptr++ = *format; -+ -+ format ++; -+ -+ if (*format == '*') -+ { -+ /* -+ * Get precision from argument... -+ */ -+ -+ format ++; -+ prec = va_arg(ap, int); -+ -+ snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); -+ tptr += strlen(tptr); -+ } -+ else -+ { -+ prec = 0; -+ -+ while (isdigit(*format & 255)) -+ { -+ if (tptr < (tformat + sizeof(tformat) - 1)) -+ *tptr++ = *format; -+ -+ prec = prec * 10 + *format++ - '0'; -+ } -+ } -+ } -+ else -+ prec = -1; -+ -+ if (*format == 'l' && format[1] == 'l') -+ { -+ size = 'L'; -+ -+ if (tptr < (tformat + sizeof(tformat) - 2)) -+ { -+ *tptr++ = 'l'; -+ *tptr++ = 'l'; -+ } -+ -+ format += 2; -+ } -+ else if (*format == 'h' || *format == 'l' || *format == 'L') -+ { -+ if (tptr < (tformat + sizeof(tformat) - 1)) -+ *tptr++ = *format; -+ -+ size = *format++; -+ } -+ -+ if (!*format) -+ break; -+ -+ if (tptr < (tformat + sizeof(tformat) - 1)) -+ *tptr++ = *format; -+ -+ type = *format++; -+ *tptr = '\0'; -+ -+ switch (type) -+ { -+ case 'E' : /* Floating point formats */ -+ case 'G' : -+ case 'e' : -+ case 'f' : -+ case 'g' : -+ if ((width + 2) > sizeof(temp)) -+ break; -+ -+ sprintf(temp, tformat, va_arg(ap, double)); -+ -+ bytes += strlen(temp); -+ -+ if (bufptr) -+ { -+ if ((bufptr + strlen(temp)) > bufend) -+ { -+ strncpy(bufptr, temp, (size_t)(bufend - bufptr)); -+ bufptr = bufend; -+ } -+ else -+ { -+ strcpy(bufptr, temp); -+ bufptr += strlen(temp); -+ } -+ } -+ break; -+ -+ case 'B' : /* Integer formats */ -+ case 'X' : -+ case 'b' : -+ case 'd' : -+ case 'i' : -+ case 'o' : -+ case 'u' : -+ case 'x' : -+ if ((width + 2) > sizeof(temp)) -+ break; -+ -+#ifdef HAVE_LONG_LONG -+ if (size == 'L') -+ sprintf(temp, tformat, va_arg(ap, long long)); -+ else -+#endif /* HAVE_LONG_LONG */ -+ sprintf(temp, tformat, va_arg(ap, int)); -+ -+ bytes += strlen(temp); -+ -+ if (bufptr) -+ { -+ if ((bufptr + strlen(temp)) > bufend) -+ { -+ strncpy(bufptr, temp, (size_t)(bufend - bufptr)); -+ bufptr = bufend; -+ } -+ else -+ { -+ strcpy(bufptr, temp); -+ bufptr += strlen(temp); -+ } -+ } -+ break; -+ -+ case 'p' : /* Pointer value */ -+ if ((width + 2) > sizeof(temp)) -+ break; -+ -+ sprintf(temp, tformat, va_arg(ap, void *)); -+ -+ bytes += strlen(temp); -+ -+ if (bufptr) -+ { -+ if ((bufptr + strlen(temp)) > bufend) -+ { -+ strncpy(bufptr, temp, (size_t)(bufend - bufptr)); -+ bufptr = bufend; -+ } -+ else -+ { -+ strcpy(bufptr, temp); -+ bufptr += strlen(temp); -+ } -+ } -+ break; -+ -+ case 'c' : /* Character or character array */ -+ bytes += width; -+ -+ if (bufptr) -+ { -+ if (width <= 1) -+ *bufptr++ = va_arg(ap, int); -+ else -+ { -+ if ((bufptr + width) > bufend) -+ width = bufend - bufptr; -+ -+ memcpy(bufptr, va_arg(ap, char *), (size_t)width); -+ bufptr += width; -+ } -+ } -+ break; -+ -+ case 's' : /* String */ -+ if ((s = va_arg(ap, char *)) == NULL) -+ s = "(null)"; -+ -+ slen = strlen(s); -+ if (slen > width && prec != width) -+ width = slen; -+ -+ bytes += width; -+ -+ if (bufptr) -+ { -+ if ((bufptr + width) > bufend) -+ width = bufend - bufptr; -+ -+ if (slen > width) -+ slen = width; -+ -+ if (sign == '-') -+ { -+ strncpy(bufptr, s, (size_t)slen); -+ memset(bufptr + slen, ' ', (size_t)(width - slen)); -+ } -+ else -+ { -+ memset(bufptr, ' ', (size_t)(width - slen)); -+ strncpy(bufptr + width - slen, s, (size_t)slen); -+ } -+ -+ bufptr += width; -+ } -+ break; -+ -+ case 'n' : /* Output number of chars so far */ -+ *(va_arg(ap, int *)) = bytes; -+ break; -+ } -+ } -+ else -+ { -+ bytes ++; -+ -+ if (bufptr && bufptr < bufend) -+ *bufptr++ = *format; -+ -+ format ++; -+ } -+ } -+ -+ /* -+ * Nul-terminate the string and return the number of characters needed. -+ */ -+ -+ *bufptr = '\0'; -+ -+ return (bytes); -+} -+#endif /* !HAVE_VSNPRINTF */ -+ -+ -+/* -+ * '_mxml_vstrdupf()' - Format and duplicate a string. -+ */ -+ -+char * /* O - New string pointer */ -+_mxml_vstrdupf(const char *format, /* I - Printf-style format string */ -+ va_list ap) /* I - Pointer to additional arguments */ -+{ -+ int bytes; /* Number of bytes required */ -+ char *buffer, /* String buffer */ -+ temp[256]; /* Small buffer for first vsnprintf */ -+ -+ -+ /* -+ * First format with a tiny buffer; this will tell us how many bytes are -+ * needed... -+ */ -+ -+ bytes = vsnprintf(temp, sizeof(temp), format, ap); -+ -+ if (bytes < sizeof(temp)) -+ { -+ /* -+ * Hey, the formatted string fits in the tiny buffer, so just dup that... -+ */ -+ -+ return (strdup(temp)); -+ } -+ -+ /* -+ * Allocate memory for the whole thing and reformat to the new, larger -+ * buffer... -+ */ -+ -+ if ((buffer = calloc(1, bytes + 1)) != NULL) -+ vsnprintf(buffer, bytes + 1, format, ap); -+ -+ /* -+ * Return the new string... -+ */ -+ -+ return (buffer); -+} -+ -+ -+/* -+ * End of "$Id: mxml-string.c 387 2009-04-18 17:05:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml.h mxml-2.6-haiku/mxml.h ---- mxml-2.6/mxml.h 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml.h 2009-03-19 05:38:52.000000000 +0000 -@@ -0,0 +1,308 @@ -+/* -+ * "$Id: mxml.h 385 2009-03-19 05:38:52Z mike $" -+ * -+ * Header file for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ */ -+ -+/* -+ * Prevent multiple inclusion... -+ */ -+ -+#ifndef _mxml_h_ -+# define _mxml_h_ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+# include -+# include -+# include -+# include -+# include -+ -+ -+/* -+ * Constants... -+ */ -+ -+# define MXML_TAB 8 /* Tabs every N columns */ -+ -+# define MXML_NO_CALLBACK 0 /* Don't use a type callback */ -+# define MXML_INTEGER_CALLBACK mxml_integer_cb -+ /* Treat all data as integers */ -+# define MXML_OPAQUE_CALLBACK mxml_opaque_cb -+ /* Treat all data as opaque */ -+# define MXML_REAL_CALLBACK mxml_real_cb -+ /* Treat all data as real numbers */ -+# define MXML_TEXT_CALLBACK 0 /* Treat all data as text */ -+# define MXML_IGNORE_CALLBACK mxml_ignore_cb -+ /* Ignore all non-element content */ -+ -+# define MXML_NO_PARENT 0 /* No parent for the node */ -+ -+# define MXML_DESCEND 1 /* Descend when finding/walking */ -+# define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */ -+# define MXML_DESCEND_FIRST -1 /* Descend for first find */ -+ -+# define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */ -+# define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */ -+# define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */ -+# define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */ -+ -+# define MXML_ADD_BEFORE 0 /* Add node before specified node */ -+# define MXML_ADD_AFTER 1 /* Add node after specified node */ -+# define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */ -+ -+ -+/* -+ * Data types... -+ */ -+ -+typedef enum mxml_sax_event_e /**** SAX event type. ****/ -+{ -+ MXML_SAX_CDATA, /* CDATA node */ -+ MXML_SAX_COMMENT, /* Comment node */ -+ MXML_SAX_DATA, /* Data node */ -+ MXML_SAX_DIRECTIVE, /* Processing directive node */ -+ MXML_SAX_ELEMENT_CLOSE, /* Element closed */ -+ MXML_SAX_ELEMENT_OPEN /* Element opened */ -+} mxml_sax_event_t; -+ -+typedef enum mxml_type_e /**** The XML node type. ****/ -+{ -+ MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */ -+ MXML_ELEMENT, /* XML element with attributes */ -+ MXML_INTEGER, /* Integer value */ -+ MXML_OPAQUE, /* Opaque string */ -+ MXML_REAL, /* Real value */ -+ MXML_TEXT, /* Text fragment */ -+ MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */ -+} mxml_type_t; -+ -+typedef void (*mxml_custom_destroy_cb_t)(void *); -+ /**** Custom data destructor ****/ -+ -+typedef void (*mxml_error_cb_t)(const char *); -+ /**** Error callback function ****/ -+ -+typedef struct mxml_attr_s /**** An XML element attribute value. ****/ -+{ -+ char *name; /* Attribute name */ -+ char *value; /* Attribute value */ -+} mxml_attr_t; -+ -+typedef struct mxml_element_s /**** An XML element value. ****/ -+{ -+ char *name; /* Name of element */ -+ int num_attrs; /* Number of attributes */ -+ mxml_attr_t *attrs; /* Attributes */ -+} mxml_element_t; -+ -+typedef struct mxml_text_s /**** An XML text value. ****/ -+{ -+ int whitespace; /* Leading whitespace? */ -+ char *string; /* Fragment string */ -+} mxml_text_t; -+ -+typedef struct mxml_custom_s /**** An XML custom value. @since Mini-XML 2.1@ ****/ -+{ -+ void *data; /* Pointer to (allocated) custom data */ -+ mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */ -+} mxml_custom_t; -+ -+typedef union mxml_value_u /**** An XML node value. ****/ -+{ -+ mxml_element_t element; /* Element */ -+ int integer; /* Integer number */ -+ char *opaque; /* Opaque string */ -+ double real; /* Real number */ -+ mxml_text_t text; /* Text fragment */ -+ mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */ -+} mxml_value_t; -+ -+typedef struct mxml_node_s /**** An XML node. ****/ -+{ -+ mxml_type_t type; /* Node type */ -+ struct mxml_node_s *next; /* Next node under same parent */ -+ struct mxml_node_s *prev; /* Previous node under same parent */ -+ struct mxml_node_s *parent; /* Parent node */ -+ struct mxml_node_s *child; /* First child node */ -+ struct mxml_node_s *last_child; /* Last child node */ -+ mxml_value_t value; /* Node value */ -+ int ref_count; /* Use count */ -+ void *user_data; /* User data */ -+} mxml_node_t; -+ -+typedef struct mxml_index_s /**** An XML node index. ****/ -+{ -+ char *attr; /* Attribute used for indexing or NULL */ -+ int num_nodes; /* Number of nodes in index */ -+ int alloc_nodes; /* Allocated nodes in index */ -+ int cur_node; /* Current node */ -+ mxml_node_t **nodes; /* Node array */ -+} mxml_index_t; -+ -+typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *); -+ /**** Custom data load callback function ****/ -+ -+typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *); -+ /**** Custom data save callback function ****/ -+ -+typedef int (*mxml_entity_cb_t)(const char *); -+ /**** Entity callback function */ -+ -+typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); -+ /**** Load callback function ****/ -+ -+typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); -+ /**** Save callback function ****/ -+ -+typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); -+ /**** SAX callback function ****/ -+ -+ -+/* -+ * C++ support... -+ */ -+ -+# ifdef __cplusplus -+extern "C" { -+# endif /* __cplusplus */ -+ -+/* -+ * Prototypes... -+ */ -+ -+extern void mxmlAdd(mxml_node_t *parent, int where, -+ mxml_node_t *child, mxml_node_t *node); -+extern void mxmlDelete(mxml_node_t *node); -+extern void mxmlElementDeleteAttr(mxml_node_t *node, -+ const char *name); -+extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name); -+extern void mxmlElementSetAttr(mxml_node_t *node, const char *name, -+ const char *value); -+extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name, -+ const char *format, ...) -+# ifdef __GNUC__ -+__attribute__ ((__format__ (__printf__, 3, 4))) -+# endif /* __GNUC__ */ -+; -+extern int mxmlEntityAddCallback(mxml_entity_cb_t cb); -+extern const char *mxmlEntityGetName(int val); -+extern int mxmlEntityGetValue(const char *name); -+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 void mxmlIndexDelete(mxml_index_t *ind); -+extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind); -+extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind, -+ const char *element, -+ const char *value); -+extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element, -+ const char *attr); -+extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind); -+extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd, -+ mxml_type_t (*cb)(mxml_node_t *)); -+extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp, -+ mxml_type_t (*cb)(mxml_node_t *)); -+extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s, -+ mxml_type_t (*cb)(mxml_node_t *)); -+extern mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string); -+extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data, -+ mxml_custom_destroy_cb_t destroy); -+extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name); -+extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer); -+extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque); -+extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real); -+extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace, -+ const char *string); -+extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace, -+ const char *format, ...) -+# ifdef __GNUC__ -+__attribute__ ((__format__ (__printf__, 3, 4))) -+# endif /* __GNUC__ */ -+; -+extern mxml_node_t *mxmlNewXML(const char *version); -+extern int mxmlRelease(mxml_node_t *node); -+extern void mxmlRemove(mxml_node_t *node); -+extern int mxmlRetain(mxml_node_t *node); -+extern char *mxmlSaveAllocString(mxml_node_t *node, -+ mxml_save_cb_t cb); -+extern int mxmlSaveFd(mxml_node_t *node, int fd, -+ mxml_save_cb_t cb); -+extern int mxmlSaveFile(mxml_node_t *node, FILE *fp, -+ mxml_save_cb_t cb); -+extern int mxmlSaveString(mxml_node_t *node, char *buffer, -+ int bufsize, mxml_save_cb_t cb); -+extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd, -+ mxml_type_t (*cb)(mxml_node_t *), -+ mxml_sax_cb_t sax, void *sax_data); -+extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp, -+ mxml_type_t (*cb)(mxml_node_t *), -+ mxml_sax_cb_t sax, void *sax_data); -+extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s, -+ mxml_type_t (*cb)(mxml_node_t *), -+ mxml_sax_cb_t sax, void *sax_data); -+extern int mxmlSetCDATA(mxml_node_t *node, const char *data); -+extern int mxmlSetCustom(mxml_node_t *node, void *data, -+ mxml_custom_destroy_cb_t destroy); -+extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load, -+ mxml_custom_save_cb_t save); -+extern int mxmlSetElement(mxml_node_t *node, const char *name); -+extern void mxmlSetErrorCallback(mxml_error_cb_t cb); -+extern int mxmlSetInteger(mxml_node_t *node, int integer); -+extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque); -+extern int mxmlSetReal(mxml_node_t *node, double real); -+extern int mxmlSetText(mxml_node_t *node, int whitespace, -+ const char *string); -+extern int mxmlSetTextf(mxml_node_t *node, int whitespace, -+ const char *format, ...) -+# ifdef __GNUC__ -+__attribute__ ((__format__ (__printf__, 3, 4))) -+# endif /* __GNUC__ */ -+; -+extern void mxmlSetWrapMargin(int column); -+extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top, -+ int descend); -+extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top, -+ int descend); -+ -+ -+/* -+ * Semi-private functions... -+ */ -+ -+extern void mxml_error(const char *format, ...); -+extern mxml_type_t mxml_ignore_cb(mxml_node_t *node); -+extern mxml_type_t mxml_integer_cb(mxml_node_t *node); -+extern mxml_type_t mxml_opaque_cb(mxml_node_t *node); -+extern mxml_type_t mxml_real_cb(mxml_node_t *node); -+ -+ -+/* -+ * C++ support... -+ */ -+ -+# ifdef __cplusplus -+} -+# endif /* __cplusplus */ -+#endif /* !_mxml_h_ */ -+ -+ -+/* -+ * End of "$Id: mxml.h 385 2009-03-19 05:38:52Z mike $". -+ */ -diff -Naur mxml-2.6/mxml.list mxml-2.6-haiku/mxml.list ---- mxml-2.6/mxml.list 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxml.list 2009-10-26 02:28:22.000000000 +0000 -@@ -0,0 +1,107 @@ -+# -+# "$Id: mxml.list.in 399 2009-05-17 17:20:51Z mike $" -+# -+# EPM software list file for Mini-XML, a small XML library. -+# -+# Copyright 2003-2009 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 -+# License as published by the Free Software Foundation; either -+# version 2, or (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+ -+# Directories... -+$prefix=/boot/common -+$exec_prefix=/boot/common -+$bindir=${exec_prefix}/bin -+$datarootdir=${prefix}/share -+$docdir=${datarootdir}/doc/mxml -+$includedir=${prefix}/include -+$libdir=${exec_prefix}/lib -+$mandir=${datarootdir}/man -+$srcdir=. -+ -+$PICFLAG=0 -+ -+# Product information -+%product mxml -+%copyright 2003-2009 by Michael Sweet -+%vendor Michael Sweet -+%license ${srcdir}/COPYING -+%readme ${srcdir}/README -+%version 2.6 -+ -+%description < -+Vendor: Michael Sweet -+ -+# Use buildroot so as not to disturb the version already installed -+BuildRoot: /var/tmp/%{name}-root -+ -+%description -+Mini-XML is a small XML parsing library that you can use to read -+XML and XML-like data files 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. -+ - Data is stored in a linked-list tree structure, preserving -+ the XML data hierarchy. -+ - 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 "leaf" nodes. -+ - Functions for creating and managing trees of data. -+ - "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, nor does it support character entities other than -+those required by the XML specification. -+ -+%prep -+%setup -+ -+%build -+CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" ./configure --enable-shared --prefix=/usr -+ -+# If we got this far, all prerequisite libraries must be here. -+make -+ -+%install -+# Make sure the RPM_BUILD_ROOT directory exists. -+rm -rf $RPM_BUILD_ROOT -+ -+make BUILDROOT=$RPM_BUILD_ROOT install -+ -+%clean -+rm -rf $RPM_BUILD_ROOT -+ -+%files -+%defattr(-,root,root) -+ -+%dir /usr/bin -+/usr/bin/* -+%dir /usr/include -+/usr/include/mxml.h -+%dir /usr/lib -+/usr/lib/* -+%dir /usr/lib/pkgconfig -+/usr/lib/pkgconfig/mxml.pc -+%dir /usr/share/doc/mxml -+/usr/share/doc/mxml/* -+%dir /usr/share/man/man1 -+/usr/share/man/man1/* -+%dir /usr/share/man/man3 -+/usr/share/man/man3/* -+ -+# -+# End of "$Id: mxml.spec 399 2009-05-17 17:20:51Z mike $". -+# -diff -Naur mxml-2.6/mxmldoc.c mxml-2.6-haiku/mxmldoc.c ---- mxml-2.6/mxmldoc.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/mxmldoc.c 2009-05-05 13:38:00.000000000 +0000 -@@ -0,0 +1,5772 @@ -+/*#define DEBUG 1*/ -+/* -+ * "$Id: mxmldoc.c 390 2009-05-05 13:38:00Z mike $" -+ * -+ * Documentation generator using Mini-XML, a small XML-like file parsing -+ * library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * main() - Main entry for test program. -+ * add_variable() - Add a variable or argument. -+ * find_public() - Find a public function, type, etc. -+ * get_comment_info() - Get info from comment. -+ * get_text() - Get the text for a node. -+ * load_cb() - Set the type of child nodes. -+ * new_documentation() - Create a new documentation tree. -+ * remove_directory() - Remove a directory. -+ * safe_strcpy() - Copy a string allowing for overlapping strings. -+ * scan_file() - Scan a source file. -+ * sort_node() - Insert a node sorted into a tree. -+ * update_comment() - Update a comment node. -+ * usage() - Show program usage... -+ * write_description() - Write the description text. -+ * write_element() - Write an element's text nodes. -+ * write_file() - Copy a file to the output. -+ * write_function() - Write documentation for a function. -+ * write_html() - Write HTML documentation. -+ * write_html_head() - Write the standard HTML header. -+ * write_man() - Write manpage documentation. -+ * write_scu() - Write a structure, class, or union. -+ * write_string() - Write a string, quoting HTML special chars as needed. -+ * write_toc() - Write a table-of-contents. -+ * write_tokens() - Write nodes for all APIs. -+ * ws_cb() - Whitespace callback for saving. -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+#include -+#include -+#ifndef WIN32 -+# include -+# include -+# include -+# include -+extern char **environ; -+#endif /* !WIN32 */ -+ -+ -+/* -+ * This program scans source and header files and produces public API -+ * documentation for code that conforms to the CUPS Configuration -+ * Management Plan (CMP) coding standards. Please see the following web -+ * page for details: -+ * -+ * http://www.cups.org/cmp.html -+ * -+ * Using Mini-XML, this program creates and maintains an XML representation -+ * of the public API code documentation which can then be converted to HTML -+ * as desired. The following is a poor-man's schema: -+ * -+ * -+ * -+ * -+ * [optional...] -+ * -+ * descriptive text -+ * -+ * -+ * -+ * descriptive text -+ * ... -+ * -+ * -+ * -+ * descriptive text -+ * type string -+ * -+ * -+ * -+ * descriptive text -+ * -+ * descriptive text -+ * type string -+ * -+ * -+ * descriptive text -+ * type string -+ * -+ * function names separated by spaces -+ * -+ * -+ * -+ * descriptive text -+ * type string -+ * -+ * -+ * -+ * descriptive text -+ * ... -+ * ... -+ * -+ * -+ * -+ * descriptive text -+ * ... -+ * -+ * -+ * -+ * descriptive text -+ * ... -+ * ... -+ * ... -+ * ... -+ * ... -+ * -+ * -+ * -+ */ -+ -+ -+/* -+ * Basic states for file parser... -+ */ -+ -+#define STATE_NONE 0 /* No state - whitespace, etc. */ -+#define STATE_PREPROCESSOR 1 /* Preprocessor directive */ -+#define STATE_C_COMMENT 2 /* Inside a C comment */ -+#define STATE_CXX_COMMENT 3 /* Inside a C++ comment */ -+#define STATE_STRING 4 /* Inside a string constant */ -+#define STATE_CHARACTER 5 /* Inside a character constant */ -+#define STATE_IDENTIFIER 6 /* Inside a keyword/identifier */ -+ -+ -+/* -+ * Output modes... -+ */ -+ -+#define OUTPUT_NONE 0 /* No output */ -+#define OUTPUT_HTML 1 /* Output HTML */ -+#define OUTPUT_XML 2 /* Output XML */ -+#define OUTPUT_MAN 3 /* Output nroff/man */ -+#define OUTPUT_TOKENS 4 /* Output docset Tokens.xml file */ -+ -+ -+/* -+ * Local functions... -+ */ -+ -+static mxml_node_t *add_variable(mxml_node_t *parent, const char *name, -+ mxml_node_t *type); -+static mxml_node_t *find_public(mxml_node_t *node, mxml_node_t *top, -+ const char *name); -+static char *get_comment_info(mxml_node_t *description); -+static char *get_text(mxml_node_t *node, char *buffer, int buflen); -+static mxml_type_t load_cb(mxml_node_t *node); -+static mxml_node_t *new_documentation(mxml_node_t **mxmldoc); -+static int remove_directory(const char *path); -+static void safe_strcpy(char *dst, const char *src); -+static int scan_file(const char *filename, FILE *fp, -+ mxml_node_t *doc); -+static void sort_node(mxml_node_t *tree, mxml_node_t *func); -+static void update_comment(mxml_node_t *parent, -+ mxml_node_t *comment); -+static void usage(const char *option); -+static void write_description(FILE *out, mxml_node_t *description, -+ const char *element, int summary); -+static void write_element(FILE *out, mxml_node_t *doc, -+ mxml_node_t *element, int mode); -+static void write_file(FILE *out, const char *file); -+static void write_function(FILE *out, mxml_node_t *doc, -+ mxml_node_t *function, int level); -+static void write_html(const char *section, const char *title, -+ const char *footerfile, -+ const char *headerfile, -+ const char *introfile, const char *cssfile, -+ const char *framefile, -+ const char *docset, const char *docversion, -+ const char *feedname, const char *feedurl, -+ mxml_node_t *doc); -+static void write_html_head(FILE *out, const char *section, -+ const char *title, const char *cssfile); -+static void write_man(const char *man_name, const char *section, -+ const char *title, const char *headerfile, -+ const char *footerfile, const char *introfile, -+ mxml_node_t *doc); -+static void write_scu(FILE *out, mxml_node_t *doc, -+ mxml_node_t *scut); -+static void write_string(FILE *out, const char *s, int mode); -+static void write_toc(FILE *out, mxml_node_t *doc, -+ const char *introfile, const char *target, -+ int xml); -+static void write_tokens(FILE *out, mxml_node_t *doc, -+ const char *path); -+static const char *ws_cb(mxml_node_t *node, int where); -+ -+ -+/* -+ * 'main()' - Main entry for test program. -+ */ -+ -+int /* O - Exit status */ -+main(int argc, /* I - Number of command-line args */ -+ char *argv[]) /* I - Command-line args */ -+{ -+ int i; /* Looping var */ -+ int len; /* Length of argument */ -+ FILE *fp; /* File to read */ -+ mxml_node_t *doc; /* XML documentation tree */ -+ mxml_node_t *mxmldoc; /* mxmldoc node */ -+ const char *cssfile, /* CSS stylesheet file */ -+ *docset, /* Documentation set directory */ -+ *docversion, /* Documentation set version */ -+ *feedname, /* Feed name for documentation set */ -+ *feedurl, /* Feed URL for documentation set */ -+ *footerfile, /* Footer file */ -+ *framefile, /* Framed HTML basename */ -+ *headerfile, /* Header file */ -+ *introfile, /* Introduction file */ -+ *name, /* Name of manpage */ -+ *path, /* Path to help file for tokens */ -+ *section, /* Section/keywords of documentation */ -+ *title, /* Title of documentation */ -+ *xmlfile; /* XML file */ -+ int mode, /* Output mode */ -+ update; /* Updated XML file */ -+ -+ -+ /* -+ * Check arguments... -+ */ -+ -+ cssfile = NULL; -+ doc = NULL; -+ docset = NULL; -+ docversion = NULL; -+ feedname = NULL; -+ feedurl = NULL; -+ footerfile = NULL; -+ framefile = NULL; -+ headerfile = NULL; -+ introfile = NULL; -+ mode = OUTPUT_HTML; -+ mxmldoc = NULL; -+ name = NULL; -+ path = NULL; -+ section = NULL; -+ title = NULL; -+ update = 0; -+ xmlfile = NULL; -+ -+ for (i = 1; i < argc; i ++) -+ if (!strcmp(argv[i], "--help")) -+ { -+ /* -+ * Show help... -+ */ -+ -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--css") && !cssfile) -+ { -+ /* -+ * Set CSS stylesheet file... -+ */ -+ -+ i ++; -+ if (i < argc) -+ cssfile = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--docset") && !docset) -+ { -+ /* -+ * Set documentation set directory... -+ */ -+ -+ i ++; -+ if (i < argc) -+ docset = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--docversion") && !docversion) -+ { -+ /* -+ * Set documentation set directory... -+ */ -+ -+ i ++; -+ if (i < argc) -+ docversion = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--footer") && !footerfile) -+ { -+ /* -+ * Set footer file... -+ */ -+ -+ i ++; -+ if (i < argc) -+ footerfile = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--feedname") && !feedname) -+ { -+ /* -+ * Set documentation set feed name... -+ */ -+ -+ i ++; -+ if (i < argc) -+ feedname = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--feedurl") && !feedurl) -+ { -+ /* -+ * Set documentation set feed name... -+ */ -+ -+ i ++; -+ if (i < argc) -+ feedurl = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--framed") && !framefile) -+ { -+ /* -+ * Set base filename for framed HTML output... -+ */ -+ -+ i ++; -+ if (i < argc) -+ framefile = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--header") && !headerfile) -+ { -+ /* -+ * Set header file... -+ */ -+ -+ i ++; -+ if (i < argc) -+ headerfile = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--intro") && !introfile) -+ { -+ /* -+ * Set intro file... -+ */ -+ -+ i ++; -+ if (i < argc) -+ introfile = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--man") && !name) -+ { -+ /* -+ * Output manpage... -+ */ -+ -+ i ++; -+ if (i < argc) -+ { -+ mode = OUTPUT_MAN; -+ name = argv[i]; -+ } -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--no-output")) -+ mode = OUTPUT_NONE; -+ else if (!strcmp(argv[i], "--section") && !section) -+ { -+ /* -+ * Set section/keywords... -+ */ -+ -+ i ++; -+ if (i < argc) -+ section = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--title") && !title) -+ { -+ /* -+ * Set title... -+ */ -+ -+ i ++; -+ if (i < argc) -+ title = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (!strcmp(argv[i], "--tokens")) -+ { -+ /* -+ * Output Tokens.xml file... -+ */ -+ -+ mode = OUTPUT_TOKENS; -+ -+ i ++; -+ if (i < argc) -+ path = argv[i]; -+ else -+ usage(NULL); -+ } -+ else if (argv[i][0] == '-') -+ { -+ /* -+ * Unknown/bad option... -+ */ -+ -+ usage(argv[i]); -+ } -+ else -+ { -+ /* -+ * Process XML or source file... -+ */ -+ -+ len = (int)strlen(argv[i]); -+ if (len > 4 && !strcmp(argv[i] + len - 4, ".xml")) -+ { -+ /* -+ * Set XML file... -+ */ -+ -+ if (xmlfile) -+ usage(NULL); -+ -+ xmlfile = argv[i]; -+ -+ if (!doc) -+ { -+ if ((fp = fopen(argv[i], "r")) != NULL) -+ { -+ /* -+ * Read the existing XML file... -+ */ -+ -+ doc = mxmlLoadFile(NULL, fp, load_cb); -+ -+ fclose(fp); -+ -+ if (!doc) -+ { -+ mxmldoc = NULL; -+ -+ fprintf(stderr, -+ "mxmldoc: Unable to read the XML documentation file " -+ "\"%s\"!\n", argv[i]); -+ } -+ else if ((mxmldoc = mxmlFindElement(doc, doc, "mxmldoc", NULL, -+ NULL, MXML_DESCEND)) == NULL) -+ { -+ fprintf(stderr, -+ "mxmldoc: XML documentation file \"%s\" is missing " -+ " node!!\n", argv[i]); -+ -+ mxmlDelete(doc); -+ doc = NULL; -+ } -+ } -+ else -+ { -+ doc = NULL; -+ mxmldoc = NULL; -+ } -+ -+ if (!doc) -+ doc = new_documentation(&mxmldoc); -+ } -+ } -+ else -+ { -+ /* -+ * Load source file... -+ */ -+ -+ update = 1; -+ -+ if (!doc) -+ doc = new_documentation(&mxmldoc); -+ -+ if ((fp = fopen(argv[i], "r")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to open source file \"%s\": %s\n", -+ argv[i], strerror(errno)); -+ mxmlDelete(doc); -+ return (1); -+ } -+ else if (scan_file(argv[i], fp, mxmldoc)) -+ { -+ fclose(fp); -+ mxmlDelete(doc); -+ return (1); -+ } -+ else -+ fclose(fp); -+ } -+ } -+ -+ if (update && xmlfile) -+ { -+ /* -+ * Save the updated XML documentation file... -+ */ -+ -+ if ((fp = fopen(xmlfile, "w")) != NULL) -+ { -+ /* -+ * Write over the existing XML file... -+ */ -+ -+ mxmlSetWrapMargin(0); -+ -+ if (mxmlSaveFile(doc, fp, ws_cb)) -+ { -+ fprintf(stderr, -+ "mxmldoc: Unable to write the XML documentation file \"%s\": " -+ "%s!\n", xmlfile, strerror(errno)); -+ fclose(fp); -+ mxmlDelete(doc); -+ return (1); -+ } -+ -+ fclose(fp); -+ } -+ else -+ { -+ fprintf(stderr, -+ "mxmldoc: Unable to create the XML documentation file \"%s\": " -+ "%s!\n", xmlfile, strerror(errno)); -+ mxmlDelete(doc); -+ return (1); -+ } -+ } -+ -+ switch (mode) -+ { -+ case OUTPUT_HTML : -+ /* -+ * Write HTML documentation... -+ */ -+ -+ write_html(section, title ? title : "Documentation", footerfile, -+ headerfile, introfile, cssfile, framefile, docset, -+ docversion, feedname, feedurl, mxmldoc); -+ break; -+ -+ case OUTPUT_MAN : -+ /* -+ * Write manpage documentation... -+ */ -+ -+ write_man(name, section, title, footerfile, headerfile, introfile, -+ mxmldoc); -+ break; -+ -+ case OUTPUT_TOKENS : -+ fputs("\n" -+ "\n", stdout); -+ -+ write_tokens(stdout, mxmldoc, path); -+ -+ fputs("\n", stdout); -+ break; -+ } -+ -+ /* -+ * Delete the tree and return... -+ */ -+ -+ mxmlDelete(doc); -+ -+ return (0); -+} -+ -+ -+/* -+ * 'add_variable()' - Add a variable or argument. -+ */ -+ -+static mxml_node_t * /* O - New variable/argument */ -+add_variable(mxml_node_t *parent, /* I - Parent node */ -+ const char *name, /* I - "argument" or "variable" */ -+ mxml_node_t *type) /* I - Type nodes */ -+{ -+ mxml_node_t *variable, /* New variable */ -+ *node, /* Current node */ -+ *next; /* Next node */ -+ char buffer[16384], /* String buffer */ -+ *bufptr; /* Pointer into buffer */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "add_variable(parent=%p, name=\"%s\", type=%p)\n", -+ parent, name, type); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!type || !type->child) -+ return (NULL); -+ -+ /* -+ * Create the variable/argument node... -+ */ -+ -+ variable = mxmlNewElement(parent, name); -+ -+ /* -+ * Check for a default value... -+ */ -+ -+ for (node = type->child; node; node = node->next) -+ if (!strcmp(node->value.text.string, "=")) -+ break; -+ -+ if (node) -+ { -+ /* -+ * Default value found, copy it and add as a "default" attribute... -+ */ -+ -+ for (bufptr = buffer; node; bufptr += strlen(bufptr)) -+ { -+ if (node->value.text.whitespace && bufptr > buffer) -+ *bufptr++ = ' '; -+ -+ strcpy(bufptr, node->value.text.string); -+ -+ next = node->next; -+ mxmlDelete(node); -+ node = next; -+ } -+ -+ mxmlElementSetAttr(variable, "default", buffer); -+ } -+ -+ /* -+ * Extract the argument/variable name... -+ */ -+ -+ if (type->last_child->value.text.string[0] == ')') -+ { -+ /* -+ * Handle "type (*name)(args)"... -+ */ -+ -+ for (node = type->child; node; node = node->next) -+ if (node->value.text.string[0] == '(') -+ break; -+ -+ for (bufptr = buffer; node; bufptr += strlen(bufptr)) -+ { -+ if (node->value.text.whitespace && bufptr > buffer) -+ *bufptr++ = ' '; -+ -+ strcpy(bufptr, node->value.text.string); -+ -+ next = node->next; -+ mxmlDelete(node); -+ node = next; -+ } -+ } -+ else -+ { -+ /* -+ * Handle "type name"... -+ */ -+ -+ strcpy(buffer, type->last_child->value.text.string); -+ mxmlDelete(type->last_child); -+ } -+ -+ /* -+ * Set the name... -+ */ -+ -+ mxmlElementSetAttr(variable, "name", buffer); -+ -+ /* -+ * Add the remaining type information to the variable node... -+ */ -+ -+ mxmlAdd(variable, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, type); -+ -+ /* -+ * Add new new variable node... -+ */ -+ -+ return (variable); -+} -+ -+ -+/* -+ * 'find_public()' - Find a public function, type, etc. -+ */ -+ -+static mxml_node_t * /* I - Found node or NULL */ -+find_public(mxml_node_t *node, /* I - Current node */ -+ mxml_node_t *top, /* I - Top node */ -+ const char *name) /* I - Name of element */ -+{ -+ mxml_node_t *description, /* Description node */ -+ *comment; /* Comment node */ -+ -+ -+ for (node = mxmlFindElement(node, top, name, NULL, NULL, -+ node == top ? MXML_DESCEND_FIRST : -+ MXML_NO_DESCEND); -+ node; -+ node = mxmlFindElement(node, top, name, NULL, NULL, MXML_NO_DESCEND)) -+ { -+ /* -+ * Get the description for this node... -+ */ -+ -+ description = mxmlFindElement(node, node, "description", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ /* -+ * A missing or empty description signals a private node... -+ */ -+ -+ if (!description) -+ continue; -+ -+ /* -+ * Look for @private@ in the comment text... -+ */ -+ -+ for (comment = description->child; comment; comment = comment->next) -+ if ((comment->type == MXML_TEXT && -+ strstr(comment->value.text.string, "@private@")) || -+ (comment->type == MXML_OPAQUE && -+ strstr(comment->value.opaque, "@private@"))) -+ break; -+ -+ if (!comment) -+ { -+ /* -+ * No @private@, so return this node... -+ */ -+ -+ return (node); -+ } -+ } -+ -+ /* -+ * If we get here, there are no (more) public nodes... -+ */ -+ -+ return (NULL); -+} -+ -+ -+/* -+ * 'get_comment_info()' - Get info from comment. -+ */ -+ -+static char * /* O - Info from comment */ -+get_comment_info( -+ mxml_node_t *description) /* I - Description node */ -+{ -+ char text[10240], /* Description text */ -+ since[255], /* @since value */ -+ *ptr; /* Pointer into text */ -+ static char info[1024]; /* Info string */ -+ -+ -+ if (!description) -+ return (""); -+ -+ get_text(description, text, sizeof(text)); -+ -+ for (ptr = strchr(text, '@'); ptr; ptr = strchr(ptr + 1, '@')) -+ { -+ if (!strncmp(ptr, "@deprecated@", 12)) -+ return (" DEPRECATED "); -+ else if (!strncmp(ptr, "@since ", 7)) -+ { -+ strncpy(since, ptr + 7, sizeof(since) - 1); -+ since[sizeof(since) - 1] = '\0'; -+ -+ if ((ptr = strchr(since, '@')) != NULL) -+ *ptr = '\0'; -+ -+ snprintf(info, sizeof(info), " %s ", since); -+ return (info); -+ } -+ } -+ -+ return (""); -+} -+ -+ -+/* -+ * 'get_text()' - Get the text for a node. -+ */ -+ -+static char * /* O - Text in node */ -+get_text(mxml_node_t *node, /* I - Node to get */ -+ char *buffer, /* I - Buffer */ -+ int buflen) /* I - Size of buffer */ -+{ -+ char *ptr, /* Pointer into buffer */ -+ *end; /* End of buffer */ -+ int len; /* Length of node */ -+ mxml_node_t *current; /* Current node */ -+ -+ -+ ptr = buffer; -+ end = buffer + buflen - 1; -+ -+ for (current = node->child; current && ptr < end; current = current->next) -+ { -+ if (current->type == MXML_TEXT) -+ { -+ if (current->value.text.whitespace) -+ *ptr++ = ' '; -+ -+ len = (int)strlen(current->value.text.string); -+ if (len > (int)(end - ptr)) -+ len = (int)(end - ptr); -+ -+ memcpy(ptr, current->value.text.string, len); -+ ptr += len; -+ } -+ else if (current->type == MXML_OPAQUE) -+ { -+ len = (int)strlen(current->value.opaque); -+ if (len > (int)(end - ptr)) -+ len = (int)(end - ptr); -+ -+ memcpy(ptr, current->value.opaque, len); -+ ptr += len; -+ } -+ } -+ -+ *ptr = '\0'; -+ -+ return (buffer); -+} -+ -+ -+/* -+ * 'load_cb()' - Set the type of child nodes. -+ */ -+ -+static mxml_type_t /* O - Node type */ -+load_cb(mxml_node_t *node) /* I - Node */ -+{ -+ if (!strcmp(node->value.element.name, "description")) -+ return (MXML_OPAQUE); -+ else -+ return (MXML_TEXT); -+} -+ -+ -+/* -+ * 'new_documentation()' - Create a new documentation tree. -+ */ -+ -+static mxml_node_t * /* O - New documentation */ -+new_documentation(mxml_node_t **mxmldoc)/* O - mxmldoc node */ -+{ -+ mxml_node_t *doc; /* New documentation */ -+ -+ -+ /* -+ * Create an empty XML documentation file... -+ */ -+ -+ doc = mxmlNewXML(NULL); -+ -+ *mxmldoc = mxmlNewElement(doc, "mxmldoc"); -+ -+ mxmlElementSetAttr(*mxmldoc, "xmlns", "http://www.easysw.com"); -+ mxmlElementSetAttr(*mxmldoc, "xmlns:xsi", -+ "http://www.w3.org/2001/XMLSchema-instance"); -+ mxmlElementSetAttr(*mxmldoc, "xsi:schemaLocation", -+ "http://www.minixml.org/mxmldoc.xsd"); -+ -+ return (doc); -+} -+ -+ -+/* -+ * 'remove_directory()' - Remove a directory. -+ */ -+ -+static int /* O - 1 on success, 0 on failure */ -+remove_directory(const char *path) /* I - Directory to remove */ -+{ -+#ifdef WIN32 -+ /* TODO: Add Windows directory removal code */ -+ -+#else -+ DIR *dir; /* Directory */ -+ struct dirent *dent; /* Current directory entry */ -+ char filename[1024]; /* Current filename */ -+ struct stat fileinfo; /* File information */ -+ -+ -+ if ((dir = opendir(path)) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to open directory \"%s\": %s\n", path, -+ strerror(errno)); -+ return (0); -+ } -+ -+ while ((dent = readdir(dir)) != NULL) -+ { -+ /* -+ * Skip "." and ".."... -+ */ -+ -+ if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) -+ continue; -+ -+ /* -+ * See if we have a file or directory... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s/%s", path, dent->d_name); -+ -+ if (stat(filename, &fileinfo)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to stat \"%s\": %s\n", filename, -+ strerror(errno)); -+ closedir(dir); -+ return (0); -+ } -+ -+ if (S_ISDIR(fileinfo.st_mode)) -+ { -+ if (!remove_directory(filename)) -+ { -+ closedir(dir); -+ return (0); -+ } -+ } -+ else if (unlink(filename)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to remove \"%s\": %s\n", filename, -+ strerror(errno)); -+ closedir(dir); -+ return (0); -+ } -+ } -+ -+ closedir(dir); -+ -+ if (rmdir(path)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to remove directory \"%s\": %s\n", path, -+ strerror(errno)); -+ return (0); -+ } -+#endif /* WIN32 */ -+ -+ return (1); -+} -+ -+ -+/* -+ * 'safe_strcpy()' - Copy a string allowing for overlapping strings. -+ */ -+ -+static void -+safe_strcpy(char *dst, /* I - Destination string */ -+ const char *src) /* I - Source string */ -+{ -+ while (*src) -+ *dst++ = *src++; -+ -+ *dst = '\0'; -+} -+ -+ -+/* -+ * 'scan_file()' - Scan a source file. -+ */ -+ -+static int /* O - 0 on success, -1 on error */ -+scan_file(const char *filename, /* I - Filename */ -+ FILE *fp, /* I - File to scan */ -+ mxml_node_t *tree) /* I - Function tree */ -+{ -+ int state, /* Current parser state */ -+ braces, /* Number of braces active */ -+ parens; /* Number of active parenthesis */ -+ int ch; /* Current character */ -+ char buffer[65536], /* String buffer */ -+ *bufptr; /* Pointer into buffer */ -+ const char *scope; /* Current variable/function scope */ -+ mxml_node_t *comment, /* node */ -+ *constant, /* node */ -+ *enumeration, /* node */ -+ *function, /* node */ -+ *fstructclass, /* function struct/class node */ -+ *structclass, /* or node */ -+ *typedefnode, /* node */ -+ *variable, /* or node */ -+ *returnvalue, /* node */ -+ *type, /* node */ -+ *description, /* node */ -+ *node, /* Current node */ -+ *next; /* Next node */ -+#if DEBUG > 1 -+ mxml_node_t *temp; /* Temporary node */ -+ int oldstate, /* Previous state */ -+ oldch; /* Old character */ -+ static const char *states[] = /* State strings */ -+ { -+ "STATE_NONE", -+ "STATE_PREPROCESSOR", -+ "STATE_C_COMMENT", -+ "STATE_CXX_COMMENT", -+ "STATE_STRING", -+ "STATE_CHARACTER", -+ "STATE_IDENTIFIER" -+ }; -+#endif /* DEBUG > 1 */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "scan_file(filename=\"%s\", fp=%p, tree=%p)\n", filename, -+ fp, tree); -+#endif /* DEBUG */ -+ -+ /* -+ * Initialize the finite state machine... -+ */ -+ -+ state = STATE_NONE; -+ braces = 0; -+ parens = 0; -+ bufptr = buffer; -+ -+ comment = mxmlNewElement(MXML_NO_PARENT, "temp"); -+ constant = NULL; -+ enumeration = NULL; -+ function = NULL; -+ variable = NULL; -+ returnvalue = NULL; -+ type = NULL; -+ description = NULL; -+ typedefnode = NULL; -+ structclass = NULL; -+ fstructclass = NULL; -+ -+ if (!strcmp(tree->value.element.name, "class")) -+ scope = "private"; -+ else -+ scope = NULL; -+ -+ /* -+ * Read until end-of-file... -+ */ -+ -+ while ((ch = getc(fp)) != EOF) -+ { -+#if DEBUG > 1 -+ oldstate = state; -+ oldch = ch; -+#endif /* DEBUG > 1 */ -+ -+ switch (state) -+ { -+ case STATE_NONE : /* No state - whitespace, etc. */ -+ switch (ch) -+ { -+ case '/' : /* Possible C/C++ comment */ -+ ch = getc(fp); -+ bufptr = buffer; -+ -+ if (ch == '*') -+ state = STATE_C_COMMENT; -+ else if (ch == '/') -+ state = STATE_CXX_COMMENT; -+ else -+ { -+ ungetc(ch, fp); -+ -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< / >>>\n", stderr); -+#endif /* DEBUG */ -+ ch = type->last_child->value.text.string[0]; -+ mxmlNewText(type, isalnum(ch) || ch == '_', "/"); -+ } -+ } -+ break; -+ -+ case '#' : /* Preprocessor */ -+#ifdef DEBUG -+ fputs(" #preprocessor...\n", stderr); -+#endif /* DEBUG */ -+ state = STATE_PREPROCESSOR; -+ break; -+ -+ case '\'' : /* Character constant */ -+ state = STATE_CHARACTER; -+ bufptr = buffer; -+ *bufptr++ = ch; -+ break; -+ -+ case '\"' : /* String constant */ -+ state = STATE_STRING; -+ bufptr = buffer; -+ *bufptr++ = ch; -+ break; -+ -+ case '{' : -+#ifdef DEBUG -+ fprintf(stderr, " open brace, function=%p, type=%p...\n", -+ function, type); -+ if (type) -+ fprintf(stderr, " type->child=\"%s\"...\n", -+ type->child->value.text.string); -+#endif /* DEBUG */ -+ -+ if (function) -+ { -+ if (fstructclass) -+ { -+ sort_node(fstructclass, function); -+ fstructclass = NULL; -+ } -+ else -+ sort_node(tree, function); -+ -+ function = NULL; -+ } -+ else if (type && type->child && -+ ((!strcmp(type->child->value.text.string, "typedef") && -+ type->child->next && -+ (!strcmp(type->child->next->value.text.string, "struct") || -+ !strcmp(type->child->next->value.text.string, "union") || -+ !strcmp(type->child->next->value.text.string, "class"))) || -+ !strcmp(type->child->value.text.string, "union") || -+ !strcmp(type->child->value.text.string, "struct") || -+ !strcmp(type->child->value.text.string, "class"))) -+ { -+ /* -+ * Start of a class or structure... -+ */ -+ -+ if (!strcmp(type->child->value.text.string, "typedef")) -+ { -+#ifdef DEBUG -+ fputs(" starting typedef...\n", stderr); -+#endif /* DEBUG */ -+ -+ typedefnode = mxmlNewElement(MXML_NO_PARENT, "typedef"); -+ mxmlDelete(type->child); -+ } -+ else -+ typedefnode = NULL; -+ -+ structclass = mxmlNewElement(MXML_NO_PARENT, -+ type->child->value.text.string); -+ -+#ifdef DEBUG -+ fprintf(stderr, "%c%s: <<<< %s >>>\n", -+ toupper(type->child->value.text.string[0]), -+ type->child->value.text.string + 1, -+ type->child->next ? -+ type->child->next->value.text.string : "(noname)"); -+ -+ fputs(" type =", stderr); -+ for (node = type->child; node; node = node->next) -+ fprintf(stderr, " \"%s\"", node->value.text.string); -+ putc('\n', stderr); -+ -+ fprintf(stderr, " scope = %s\n", scope ? scope : "(null)"); -+#endif /* DEBUG */ -+ -+ if (type->child->next) -+ { -+ mxmlElementSetAttr(structclass, "name", -+ type->child->next->value.text.string); -+ sort_node(tree, structclass); -+ } -+ -+ if (typedefnode && type->child) -+ type->child->value.text.whitespace = 0; -+ else if (structclass && type->child && -+ type->child->next && type->child->next->next) -+ { -+ for (bufptr = buffer, node = type->child->next->next; -+ node; -+ bufptr += strlen(bufptr)) -+ { -+ if (node->value.text.whitespace && bufptr > buffer) -+ *bufptr++ = ' '; -+ -+ strcpy(bufptr, node->value.text.string); -+ -+ next = node->next; -+ mxmlDelete(node); -+ node = next; -+ } -+ -+ mxmlElementSetAttr(structclass, "parent", buffer); -+ -+ mxmlDelete(type); -+ type = NULL; -+ } -+ else -+ { -+ mxmlDelete(type); -+ type = NULL; -+ } -+ -+ if (typedefnode && comment->last_child) -+ { -+ /* -+ * Copy comment for typedef as well as class/struct/union... -+ */ -+ -+ mxmlNewText(comment, 0, -+ comment->last_child->value.text.string); -+ description = mxmlNewElement(typedefnode, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " duplicating comment %p/%p for typedef...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ update_comment(typedefnode, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ } -+ -+ description = mxmlNewElement(structclass, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to %s...\n", -+ comment->last_child, comment->child, -+ structclass->value.element.name); -+#endif /* DEBUG */ -+ update_comment(structclass, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ -+ if (scan_file(filename, fp, structclass)) -+ { -+ mxmlDelete(comment); -+ return (-1); -+ } -+ -+#ifdef DEBUG -+ fputs(" ended typedef...\n", stderr); -+#endif /* DEBUG */ -+ structclass = NULL; -+ break; -+ } -+ else if (type && type->child && type->child->next && -+ (!strcmp(type->child->value.text.string, "enum") || -+ (!strcmp(type->child->value.text.string, "typedef") && -+ !strcmp(type->child->next->value.text.string, "enum")))) -+ { -+ /* -+ * Enumeration type... -+ */ -+ -+ if (!strcmp(type->child->value.text.string, "typedef")) -+ { -+#ifdef DEBUG -+ fputs(" starting typedef...\n", stderr); -+#endif /* DEBUG */ -+ -+ typedefnode = mxmlNewElement(MXML_NO_PARENT, "typedef"); -+ mxmlDelete(type->child); -+ } -+ else -+ typedefnode = NULL; -+ -+ enumeration = mxmlNewElement(MXML_NO_PARENT, "enumeration"); -+ -+#ifdef DEBUG -+ fprintf(stderr, "Enumeration: <<<< %s >>>\n", -+ type->child->next ? -+ type->child->next->value.text.string : "(noname)"); -+#endif /* DEBUG */ -+ -+ if (type->child->next) -+ { -+ mxmlElementSetAttr(enumeration, "name", -+ type->child->next->value.text.string); -+ sort_node(tree, enumeration); -+ } -+ -+ if (typedefnode && type->child) -+ type->child->value.text.whitespace = 0; -+ else -+ { -+ mxmlDelete(type); -+ type = NULL; -+ } -+ -+ if (typedefnode && comment->last_child) -+ { -+ /* -+ * Copy comment for typedef as well as class/struct/union... -+ */ -+ -+ mxmlNewText(comment, 0, -+ comment->last_child->value.text.string); -+ description = mxmlNewElement(typedefnode, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " duplicating comment %p/%p for typedef...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ update_comment(typedefnode, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ } -+ -+ description = mxmlNewElement(enumeration, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to enumeration...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ update_comment(enumeration, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ } -+ else if (type && type->child && -+ !strcmp(type->child->value.text.string, "extern")) -+ { -+ if (scan_file(filename, fp, tree)) -+ { -+ mxmlDelete(comment); -+ return (-1); -+ } -+ } -+ else if (type) -+ { -+ mxmlDelete(type); -+ type = NULL; -+ } -+ -+ braces ++; -+ function = NULL; -+ variable = NULL; -+ break; -+ -+ case '}' : -+#ifdef DEBUG -+ fputs(" close brace...\n", stderr); -+#endif /* DEBUG */ -+ -+ if (structclass) -+ scope = NULL; -+ -+ if (!typedefnode) -+ enumeration = NULL; -+ -+ constant = NULL; -+ structclass = NULL; -+ -+ if (braces > 0) -+ braces --; -+ else -+ { -+ mxmlDelete(comment); -+ return (0); -+ } -+ break; -+ -+ case '(' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< ( >>>\n", stderr); -+#endif /* DEBUG */ -+ mxmlNewText(type, 0, "("); -+ } -+ -+ parens ++; -+ break; -+ -+ case ')' : -+ if (type && parens) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< ) >>>\n", stderr); -+#endif /* DEBUG */ -+ mxmlNewText(type, 0, ")"); -+ } -+ -+ if (function && type && !parens) -+ { -+ /* -+ * Check for "void" argument... -+ */ -+ -+ if (type->child && type->child->next) -+ variable = add_variable(function, "argument", type); -+ else -+ mxmlDelete(type); -+ -+ type = NULL; -+ } -+ -+ if (parens > 0) -+ parens --; -+ break; -+ -+ case ';' : -+#ifdef DEBUG -+ fputs("Identifier: <<<< ; >>>\n", stderr); -+ fprintf(stderr, " enumeration=%p, function=%p, type=%p, type->child=%p, typedefnode=%p\n", -+ enumeration, function, type, type ? type->child : NULL, typedefnode); -+#endif /* DEBUG */ -+ -+ if (function) -+ { -+ if (!strcmp(tree->value.element.name, "class")) -+ { -+#ifdef DEBUG -+ fputs(" ADDING FUNCTION TO CLASS\n", stderr); -+#endif /* DEBUG */ -+ sort_node(tree, function); -+ } -+ else -+ mxmlDelete(function); -+ -+ function = NULL; -+ variable = NULL; -+ } -+ -+ if (type) -+ { -+ /* -+ * See if we have a typedef... -+ */ -+ -+ if (type->child && -+ !strcmp(type->child->value.text.string, "typedef")) -+ { -+ /* -+ * Yes, add it! -+ */ -+ -+ typedefnode = mxmlNewElement(MXML_NO_PARENT, "typedef"); -+ -+ for (node = type->child->next; node; node = node->next) -+ if (!strcmp(node->value.text.string, "(")) -+ break; -+ -+ if (node) -+ { -+ for (node = node->next; node; node = node->next) -+ if (strcmp(node->value.text.string, "*")) -+ break; -+ } -+ -+ if (!node) -+ node = type->last_child; -+ -+#ifdef DEBUG -+ fprintf(stderr, " ADDING TYPEDEF FOR %p(%s)...\n", -+ node, node->value.text.string); -+#endif /* DEBUG */ -+ -+ mxmlElementSetAttr(typedefnode, "name", -+ node->value.text.string); -+ sort_node(tree, typedefnode); -+ -+ if (type->child != node) -+ mxmlDelete(type->child); -+ -+ mxmlDelete(node); -+ -+ if (type->child) -+ type->child->value.text.whitespace = 0; -+ -+ mxmlAdd(typedefnode, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ type); -+ type = NULL; -+ break; -+ } -+ else if (typedefnode && enumeration) -+ { -+ /* -+ * Add enum typedef... -+ */ -+ -+ node = type->child; -+ -+#ifdef DEBUG -+ fprintf(stderr, " ADDING TYPEDEF FOR %p(%s)...\n", -+ node, node->value.text.string); -+#endif /* DEBUG */ -+ -+ mxmlElementSetAttr(typedefnode, "name", -+ node->value.text.string); -+ sort_node(tree, typedefnode); -+ mxmlDelete(type); -+ -+ type = mxmlNewElement(typedefnode, "type"); -+ mxmlNewText(type, 0, "enum"); -+ mxmlNewText(type, 1, -+ mxmlElementGetAttr(enumeration, "name")); -+ enumeration = NULL; -+ type = NULL; -+ break; -+ } -+ -+ mxmlDelete(type); -+ type = NULL; -+ } -+ break; -+ -+ case ':' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< : >>>\n", stderr); -+#endif /* DEBUG */ -+ mxmlNewText(type, 1, ":"); -+ } -+ break; -+ -+ case '*' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< * >>>\n", stderr); -+#endif /* DEBUG */ -+ ch = type->last_child->value.text.string[0]; -+ mxmlNewText(type, isalnum(ch) || ch == '_', "*"); -+ } -+ break; -+ -+ case ',' : -+ if (type && !enumeration) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< , >>>\n", stderr); -+#endif /* DEBUG */ -+ mxmlNewText(type, 0, ","); -+ } -+ break; -+ -+ case '&' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< & >>>\n", stderr); -+#endif /* DEBUG */ -+ mxmlNewText(type, 1, "&"); -+ } -+ break; -+ -+ case '+' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< + >>>\n", stderr); -+#endif /* DEBUG */ -+ ch = type->last_child->value.text.string[0]; -+ mxmlNewText(type, isalnum(ch) || ch == '_', "+"); -+ } -+ break; -+ -+ case '-' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< - >>>\n", stderr); -+#endif /* DEBUG */ -+ ch = type->last_child->value.text.string[0]; -+ mxmlNewText(type, isalnum(ch) || ch == '_', "-"); -+ } -+ break; -+ -+ case '=' : -+ if (type) -+ { -+#ifdef DEBUG -+ fputs("Identifier: <<<< = >>>\n", stderr); -+#endif /* DEBUG */ -+ ch = type->last_child->value.text.string[0]; -+ mxmlNewText(type, isalnum(ch) || ch == '_', "="); -+ } -+ break; -+ -+ default : /* Other */ -+ if (isalnum(ch) || ch == '_' || ch == '.' || ch == ':' || ch == '~') -+ { -+ state = STATE_IDENTIFIER; -+ bufptr = buffer; -+ *bufptr++ = ch; -+ } -+ break; -+ } -+ break; -+ -+ case STATE_PREPROCESSOR : /* Preprocessor directive */ -+ if (ch == '\n') -+ state = STATE_NONE; -+ else if (ch == '\\') -+ getc(fp); -+ break; -+ -+ case STATE_C_COMMENT : /* Inside a C comment */ -+ switch (ch) -+ { -+ case '\n' : -+ while ((ch = getc(fp)) != EOF) -+ if (ch == '*') -+ { -+ ch = getc(fp); -+ -+ if (ch == '/') -+ { -+ *bufptr = '\0'; -+ -+ if (comment->child != comment->last_child) -+ { -+#ifdef DEBUG -+ fprintf(stderr, " removing comment %p(%20.20s), last comment %p(%20.20s)...\n", -+ comment->child, -+ comment->child ? comment->child->value.text.string : "", -+ comment->last_child, -+ comment->last_child ? comment->last_child->value.text.string : ""); -+#endif /* DEBUG */ -+ mxmlDelete(comment->child); -+#ifdef DEBUG -+ fprintf(stderr, " new comment %p, last comment %p...\n", -+ comment->child, comment->last_child); -+#endif /* DEBUG */ -+ } -+ -+#ifdef DEBUG -+ fprintf(stderr, -+ " processing comment, variable=%p, " -+ "constant=%p, typedefnode=%p, tree=\"%s\"\n", -+ variable, constant, typedefnode, -+ tree->value.element.name); -+#endif /* DEBUG */ -+ -+ if (variable) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private variables... -+ */ -+ -+ mxmlDelete(variable); -+ } -+ else -+ { -+ description = mxmlNewElement(variable, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " adding comment %p/%p to variable...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(variable, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ variable = NULL; -+ } -+ else if (constant) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private constants... -+ */ -+ -+ mxmlDelete(constant); -+ } -+ else -+ { -+ description = mxmlNewElement(constant, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " adding comment %p/%p to constant...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(constant, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ constant = NULL; -+ } -+ else if (typedefnode) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private typedefs... -+ */ -+ -+ mxmlDelete(typedefnode); -+ -+ if (structclass) -+ { -+ mxmlDelete(structclass); -+ structclass = NULL; -+ } -+ -+ if (enumeration) -+ { -+ mxmlDelete(enumeration); -+ enumeration = NULL; -+ } -+ } -+ else -+ { -+ description = mxmlNewElement(typedefnode, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " adding comment %p/%p to typedef %s...\n", -+ comment->last_child, comment->child, -+ mxmlElementGetAttr(typedefnode, "name")); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(typedefnode, -+ mxmlNewText(description, 0, buffer)); -+ -+ if (structclass) -+ { -+ description = mxmlNewElement(structclass, "description"); -+ update_comment(structclass, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else if (enumeration) -+ { -+ description = mxmlNewElement(enumeration, "description"); -+ update_comment(enumeration, -+ mxmlNewText(description, 0, buffer)); -+ } -+ } -+ -+ typedefnode = NULL; -+ } -+ else if (strcmp(tree->value.element.name, "mxmldoc") && -+ !mxmlFindElement(tree, tree, "description", -+ NULL, NULL, MXML_DESCEND_FIRST)) -+ { -+ description = mxmlNewElement(tree, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to parent...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(tree, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else -+ { -+#ifdef DEBUG -+ fprintf(stderr, " before adding comment, child=%p, last_child=%p\n", -+ comment->child, comment->last_child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+#ifdef DEBUG -+ fprintf(stderr, " after adding comment, child=%p, last_child=%p\n", -+ comment->child, comment->last_child); -+#endif /* DEBUG */ -+ } -+#ifdef DEBUG -+ fprintf(stderr, "C comment: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ -+ state = STATE_NONE; -+ break; -+ } -+ else -+ ungetc(ch, fp); -+ } -+ else if (ch == '\n' && bufptr > buffer && -+ bufptr < (buffer + sizeof(buffer) - 1)) -+ *bufptr++ = ch; -+ else if (!isspace(ch)) -+ break; -+ -+ if (ch != EOF) -+ ungetc(ch, fp); -+ -+ if (bufptr > buffer && bufptr < (buffer + sizeof(buffer) - 1)) -+ *bufptr++ = '\n'; -+ break; -+ -+ case '/' : -+ if (ch == '/' && bufptr > buffer && bufptr[-1] == '*') -+ { -+ while (bufptr > buffer && -+ (bufptr[-1] == '*' || isspace(bufptr[-1] & 255))) -+ bufptr --; -+ *bufptr = '\0'; -+ -+ if (comment->child != comment->last_child) -+ { -+#ifdef DEBUG -+ fprintf(stderr, " removing comment %p(%20.20s), last comment %p(%20.20s)...\n", -+ comment->child, -+ comment->child ? comment->child->value.text.string : "", -+ comment->last_child, -+ comment->last_child ? comment->last_child->value.text.string : ""); -+#endif /* DEBUG */ -+ mxmlDelete(comment->child); -+#ifdef DEBUG -+ fprintf(stderr, " new comment %p, last comment %p...\n", -+ comment->child, comment->last_child); -+#endif /* DEBUG */ -+ } -+ -+#ifdef DEBUG -+ fprintf(stderr, -+ " processing comment, variable=%p, " -+ "constant=%p, typedefnode=%p, tree=\"%s\"\n", -+ variable, constant, typedefnode, -+ tree->value.element.name); -+#endif /* DEBUG */ -+ -+ if (variable) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private variables... -+ */ -+ -+ mxmlDelete(variable); -+ } -+ else -+ { -+ description = mxmlNewElement(variable, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to variable...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(variable, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ variable = NULL; -+ } -+ else if (constant) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private constants... -+ */ -+ -+ mxmlDelete(constant); -+ } -+ else -+ { -+ description = mxmlNewElement(constant, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to constant...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(constant, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ constant = NULL; -+ } -+ else if (typedefnode) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private typedefs... -+ */ -+ -+ mxmlDelete(typedefnode); -+ -+ if (structclass) -+ { -+ mxmlDelete(structclass); -+ structclass = NULL; -+ } -+ -+ if (enumeration) -+ { -+ mxmlDelete(enumeration); -+ enumeration = NULL; -+ } -+ } -+ else -+ { -+ description = mxmlNewElement(typedefnode, "description"); -+#ifdef DEBUG -+ fprintf(stderr, -+ " adding comment %p/%p to typedef %s...\n", -+ comment->last_child, comment->child, -+ mxmlElementGetAttr(typedefnode, "name")); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(typedefnode, -+ mxmlNewText(description, 0, buffer)); -+ -+ if (structclass) -+ { -+ description = mxmlNewElement(structclass, "description"); -+ update_comment(structclass, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else if (enumeration) -+ { -+ description = mxmlNewElement(enumeration, "description"); -+ update_comment(enumeration, -+ mxmlNewText(description, 0, buffer)); -+ } -+ } -+ -+ typedefnode = NULL; -+ } -+ else if (strcmp(tree->value.element.name, "mxmldoc") && -+ !mxmlFindElement(tree, tree, "description", -+ NULL, NULL, MXML_DESCEND_FIRST)) -+ { -+ description = mxmlNewElement(tree, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to parent...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(tree, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else -+ mxmlNewText(comment, 0, buffer); -+ -+#ifdef DEBUG -+ fprintf(stderr, "C comment: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ -+ state = STATE_NONE; -+ break; -+ } -+ -+ default : -+ if (ch == ' ' && bufptr == buffer) -+ break; -+ -+ if (bufptr < (buffer + sizeof(buffer) - 1)) -+ *bufptr++ = ch; -+ break; -+ } -+ break; -+ -+ case STATE_CXX_COMMENT : /* Inside a C++ comment */ -+ if (ch == '\n') -+ { -+ state = STATE_NONE; -+ *bufptr = '\0'; -+ -+ if (comment->child != comment->last_child) -+ { -+#ifdef DEBUG -+ fprintf(stderr, " removing comment %p(%20.20s), last comment %p(%20.20s)...\n", -+ comment->child, -+ comment->child ? comment->child->value.text.string : "", -+ comment->last_child, -+ comment->last_child ? comment->last_child->value.text.string : ""); -+#endif /* DEBUG */ -+ mxmlDelete(comment->child); -+#ifdef DEBUG -+ fprintf(stderr, " new comment %p, last comment %p...\n", -+ comment->child, comment->last_child); -+#endif /* DEBUG */ -+ } -+ -+ if (variable) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private variables... -+ */ -+ -+ mxmlDelete(variable); -+ } -+ else -+ { -+ description = mxmlNewElement(variable, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to variable...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(variable, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ variable = NULL; -+ } -+ else if (constant) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private constants... -+ */ -+ -+ mxmlDelete(constant); -+ } -+ else -+ { -+ description = mxmlNewElement(constant, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to constant...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(constant, -+ mxmlNewText(description, 0, buffer)); -+ } -+ -+ constant = NULL; -+ } -+ else if (typedefnode) -+ { -+ if (strstr(buffer, "@private@")) -+ { -+ /* -+ * Delete private typedefs... -+ */ -+ -+ mxmlDelete(typedefnode); -+ typedefnode = NULL; -+ -+ if (structclass) -+ { -+ mxmlDelete(structclass); -+ structclass = NULL; -+ } -+ -+ if (enumeration) -+ { -+ mxmlDelete(enumeration); -+ enumeration = NULL; -+ } -+ } -+ else -+ { -+ description = mxmlNewElement(typedefnode, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to typedef %s...\n", -+ comment->last_child, comment->child, -+ mxmlElementGetAttr(typedefnode, "name")); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(typedefnode, -+ mxmlNewText(description, 0, buffer)); -+ -+ if (structclass) -+ { -+ description = mxmlNewElement(structclass, "description"); -+ update_comment(structclass, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else if (enumeration) -+ { -+ description = mxmlNewElement(enumeration, "description"); -+ update_comment(enumeration, -+ mxmlNewText(description, 0, buffer)); -+ } -+ } -+ } -+ else if (strcmp(tree->value.element.name, "mxmldoc") && -+ !mxmlFindElement(tree, tree, "description", -+ NULL, NULL, MXML_DESCEND_FIRST)) -+ { -+ description = mxmlNewElement(tree, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to parent...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ mxmlNewText(comment, 0, buffer); -+ update_comment(tree, -+ mxmlNewText(description, 0, buffer)); -+ } -+ else -+ mxmlNewText(comment, 0, buffer); -+ -+#ifdef DEBUG -+ fprintf(stderr, "C++ comment: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ } -+ else if (ch == ' ' && bufptr == buffer) -+ break; -+ else if (bufptr < (buffer + sizeof(buffer) - 1)) -+ *bufptr++ = ch; -+ break; -+ -+ case STATE_STRING : /* Inside a string constant */ -+ *bufptr++ = ch; -+ -+ if (ch == '\\') -+ *bufptr++ = getc(fp); -+ else if (ch == '\"') -+ { -+ *bufptr = '\0'; -+ -+ if (type) -+ mxmlNewText(type, type->child != NULL, buffer); -+ -+ state = STATE_NONE; -+ } -+ break; -+ -+ case STATE_CHARACTER : /* Inside a character constant */ -+ *bufptr++ = ch; -+ -+ if (ch == '\\') -+ *bufptr++ = getc(fp); -+ else if (ch == '\'') -+ { -+ *bufptr = '\0'; -+ -+ if (type) -+ mxmlNewText(type, type->child != NULL, buffer); -+ -+ state = STATE_NONE; -+ } -+ break; -+ -+ case STATE_IDENTIFIER : /* Inside a keyword or identifier */ -+ if (isalnum(ch) || ch == '_' || ch == '[' || ch == ']' || -+ (ch == ',' && (parens > 1 || (type && !enumeration && !function))) || -+ ch == ':' || ch == '.' || ch == '~') -+ { -+ if (bufptr < (buffer + sizeof(buffer) - 1)) -+ *bufptr++ = ch; -+ } -+ else -+ { -+ ungetc(ch, fp); -+ *bufptr = '\0'; -+ state = STATE_NONE; -+ -+#ifdef DEBUG -+ fprintf(stderr, " braces=%d, type=%p, type->child=%p, buffer=\"%s\"\n", -+ braces, type, type ? type->child : NULL, buffer); -+#endif /* DEBUG */ -+ -+ if (!braces) -+ { -+ if (!type || !type->child) -+ { -+ if (!strcmp(tree->value.element.name, "class")) -+ { -+ if (!strcmp(buffer, "public") || -+ !strcmp(buffer, "public:")) -+ { -+ scope = "public"; -+#ifdef DEBUG -+ fputs(" scope = public\n", stderr); -+#endif /* DEBUG */ -+ break; -+ } -+ else if (!strcmp(buffer, "private") || -+ !strcmp(buffer, "private:")) -+ { -+ scope = "private"; -+#ifdef DEBUG -+ fputs(" scope = private\n", stderr); -+#endif /* DEBUG */ -+ break; -+ } -+ else if (!strcmp(buffer, "protected") || -+ !strcmp(buffer, "protected:")) -+ { -+ scope = "protected"; -+#ifdef DEBUG -+ fputs(" scope = protected\n", stderr); -+#endif /* DEBUG */ -+ break; -+ } -+ } -+ } -+ -+ if (!type) -+ type = mxmlNewElement(MXML_NO_PARENT, "type"); -+ -+#ifdef DEBUG -+ fprintf(stderr, " function=%p (%s), type->child=%p, ch='%c', parens=%d\n", -+ function, -+ function ? mxmlElementGetAttr(function, "name") : "null", -+ type->child, ch, parens); -+#endif /* DEBUG */ -+ -+ if (!function && ch == '(') -+ { -+ if (type->child && -+ !strcmp(type->child->value.text.string, "extern")) -+ { -+ /* -+ * Remove external declarations... -+ */ -+ -+ mxmlDelete(type); -+ type = NULL; -+ break; -+ } -+ -+ if (type->child && -+ !strcmp(type->child->value.text.string, "static") && -+ !strcmp(tree->value.element.name, "mxmldoc")) -+ { -+ /* -+ * Remove static functions... -+ */ -+ -+ mxmlDelete(type); -+ type = NULL; -+ break; -+ } -+ -+ function = mxmlNewElement(MXML_NO_PARENT, "function"); -+ if ((bufptr = strchr(buffer, ':')) != NULL && bufptr[1] == ':') -+ { -+ *bufptr = '\0'; -+ bufptr += 2; -+ -+ if ((fstructclass = -+ mxmlFindElement(tree, tree, "class", "name", buffer, -+ MXML_DESCEND_FIRST)) == NULL) -+ fstructclass = -+ mxmlFindElement(tree, tree, "struct", "name", buffer, -+ MXML_DESCEND_FIRST); -+ } -+ else -+ bufptr = buffer; -+ -+ mxmlElementSetAttr(function, "name", bufptr); -+ -+ if (scope) -+ mxmlElementSetAttr(function, "scope", scope); -+ -+#ifdef DEBUG -+ fprintf(stderr, "function: %s\n", buffer); -+ fprintf(stderr, " scope = %s\n", scope ? scope : "(null)"); -+ fprintf(stderr, " comment = %p\n", comment); -+ fprintf(stderr, " child = (%p) %s\n", -+ comment->child, -+ comment->child ? -+ comment->child->value.text.string : "(null)"); -+ fprintf(stderr, " last_child = (%p) %s\n", -+ comment->last_child, -+ comment->last_child ? -+ comment->last_child->value.text.string : "(null)"); -+#endif /* DEBUG */ -+ -+ if (type->last_child && -+ strcmp(type->last_child->value.text.string, "void")) -+ { -+ returnvalue = mxmlNewElement(function, "returnvalue"); -+ -+ mxmlAdd(returnvalue, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, type); -+ -+ description = mxmlNewElement(returnvalue, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to returnvalue...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ update_comment(returnvalue, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ } -+ else -+ mxmlDelete(type); -+ -+ description = mxmlNewElement(function, "description"); -+#ifdef DEBUG -+ fprintf(stderr, " adding comment %p/%p to function...\n", -+ comment->last_child, comment->child); -+#endif /* DEBUG */ -+ update_comment(function, comment->last_child); -+ mxmlAdd(description, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, -+ comment->last_child); -+ -+ type = NULL; -+ } -+ else if (function && ((ch == ')' && parens == 1) || ch == ',')) -+ { -+ /* -+ * Argument definition... -+ */ -+ -+ if (strcmp(buffer, "void")) -+ { -+ mxmlNewText(type, type->child != NULL && -+ type->last_child->value.text.string[0] != '(' && -+ type->last_child->value.text.string[0] != '*', -+ buffer); -+ -+#ifdef DEBUG -+ fprintf(stderr, "Argument: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ -+ variable = add_variable(function, "argument", type); -+ } -+ else -+ mxmlDelete(type); -+ -+ type = NULL; -+ } -+ else if (type->child && !function && (ch == ';' || ch == ',')) -+ { -+#ifdef DEBUG -+ fprintf(stderr, " got semicolon, typedefnode=%p, structclass=%p\n", -+ typedefnode, structclass); -+#endif /* DEBUG */ -+ -+ if (typedefnode || structclass) -+ { -+#ifdef DEBUG -+ fprintf(stderr, "Typedef/struct/class: <<<< %s >>>>\n", buffer); -+#endif /* DEBUG */ -+ -+ if (typedefnode) -+ { -+ mxmlElementSetAttr(typedefnode, "name", buffer); -+ -+ sort_node(tree, typedefnode); -+ } -+ -+ if (structclass && !mxmlElementGetAttr(structclass, "name")) -+ { -+#ifdef DEBUG -+ fprintf(stderr, "setting struct/class name to %s!\n", -+ type->last_child->value.text.string); -+#endif /* DEBUG */ -+ mxmlElementSetAttr(structclass, "name", buffer); -+ -+ sort_node(tree, structclass); -+ structclass = NULL; -+ } -+ -+ if (typedefnode) -+ mxmlAdd(typedefnode, MXML_ADD_BEFORE, MXML_ADD_TO_PARENT, -+ type); -+ else -+ mxmlDelete(type); -+ -+ type = NULL; -+ typedefnode = NULL; -+ } -+ else if (type->child && -+ !strcmp(type->child->value.text.string, "typedef")) -+ { -+ /* -+ * Simple typedef... -+ */ -+ -+#ifdef DEBUG -+ fprintf(stderr, "Typedef: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ -+ typedefnode = mxmlNewElement(MXML_NO_PARENT, "typedef"); -+ mxmlElementSetAttr(typedefnode, "name", buffer); -+ mxmlDelete(type->child); -+ -+ sort_node(tree, typedefnode); -+ -+ if (type->child) -+ type->child->value.text.whitespace = 0; -+ -+ mxmlAdd(typedefnode, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, type); -+ type = NULL; -+ } -+ else if (!parens) -+ { -+ /* -+ * Variable definition... -+ */ -+ -+ if (type->child && -+ !strcmp(type->child->value.text.string, "static") && -+ !strcmp(tree->value.element.name, "mxmldoc")) -+ { -+ /* -+ * Remove static functions... -+ */ -+ -+ mxmlDelete(type); -+ type = NULL; -+ break; -+ } -+ -+ mxmlNewText(type, type->child != NULL && -+ type->last_child->value.text.string[0] != '(' && -+ type->last_child->value.text.string[0] != '*', -+ buffer); -+ -+#ifdef DEBUG -+ fprintf(stderr, "Variable: <<<< %s >>>>\n", buffer); -+ fprintf(stderr, " scope = %s\n", scope ? scope : "(null)"); -+#endif /* DEBUG */ -+ -+ variable = add_variable(MXML_NO_PARENT, "variable", type); -+ type = NULL; -+ -+ sort_node(tree, variable); -+ -+ if (scope) -+ mxmlElementSetAttr(variable, "scope", scope); -+ } -+ } -+ else -+ { -+#ifdef DEBUG -+ fprintf(stderr, "Identifier: <<<< %s >>>>\n", buffer); -+#endif /* DEBUG */ -+ -+ mxmlNewText(type, type->child != NULL && -+ type->last_child->value.text.string[0] != '(' && -+ type->last_child->value.text.string[0] != '*', -+ buffer); -+ } -+ } -+ else if (enumeration && !isdigit(buffer[0] & 255)) -+ { -+#ifdef DEBUG -+ fprintf(stderr, "Constant: <<<< %s >>>\n", buffer); -+#endif /* DEBUG */ -+ -+ constant = mxmlNewElement(MXML_NO_PARENT, "constant"); -+ mxmlElementSetAttr(constant, "name", buffer); -+ sort_node(enumeration, constant); -+ } -+ else if (type) -+ { -+ mxmlDelete(type); -+ type = NULL; -+ } -+ } -+ break; -+ } -+ -+#if DEBUG > 1 -+ if (state != oldstate) -+ { -+ fprintf(stderr, " changed states from %s to %s on receipt of character '%c'...\n", -+ states[oldstate], states[state], oldch); -+ fprintf(stderr, " variable = %p\n", variable); -+ if (type) -+ { -+ fputs(" type =", stderr); -+ for (temp = type->child; temp; temp = temp->next) -+ fprintf(stderr, " \"%s\"", temp->value.text.string); -+ fputs("\n", stderr); -+ } -+ } -+#endif /* DEBUG > 1 */ -+ } -+ -+ mxmlDelete(comment); -+ -+ /* -+ * All done, return with no errors... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'sort_node()' - Insert a node sorted into a tree. -+ */ -+ -+static void -+sort_node(mxml_node_t *tree, /* I - Tree to sort into */ -+ mxml_node_t *node) /* I - Node to add */ -+{ -+ mxml_node_t *temp; /* Current node */ -+ const char *tempname, /* Name of current node */ -+ *nodename, /* Name of node */ -+ *scope; /* Scope */ -+ -+ -+#if DEBUG > 1 -+ fprintf(stderr, " sort_node(tree=%p, node=%p)\n", tree, node); -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!tree || !node || node->parent == tree) -+ return; -+ -+ /* -+ * Get the node name... -+ */ -+ -+ if ((nodename = mxmlElementGetAttr(node, "name")) == NULL) -+ return; -+ -+ if (nodename[0] == '_') -+ return; /* Hide private names */ -+ -+#if DEBUG > 1 -+ fprintf(stderr, " nodename=%p (\"%s\")\n", nodename, nodename); -+#endif /* DEBUG > 1 */ -+ -+ /* -+ * Delete any existing definition at this level, if one exists... -+ */ -+ -+ if ((temp = mxmlFindElement(tree, tree, node->value.element.name, -+ "name", nodename, MXML_DESCEND_FIRST)) != NULL) -+ { -+ /* -+ * Copy the scope if needed... -+ */ -+ -+ if ((scope = mxmlElementGetAttr(temp, "scope")) != NULL && -+ mxmlElementGetAttr(node, "scope") == NULL) -+ { -+#ifdef DEBUG -+ fprintf(stderr, " copying scope %s for %s\n", scope, nodename); -+#endif /* DEBUG */ -+ -+ mxmlElementSetAttr(node, "scope", scope); -+ } -+ -+ mxmlDelete(temp); -+ } -+ -+ /* -+ * Add the node into the tree at the proper place... -+ */ -+ -+ for (temp = tree->child; temp; temp = temp->next) -+ { -+#if DEBUG > 1 -+ fprintf(stderr, " temp=%p\n", temp); -+#endif /* DEBUG > 1 */ -+ -+ if ((tempname = mxmlElementGetAttr(temp, "name")) == NULL) -+ continue; -+ -+#if DEBUG > 1 -+ fprintf(stderr, " tempname=%p (\"%s\")\n", tempname, tempname); -+#endif /* DEBUG > 1 */ -+ -+ if (strcmp(nodename, tempname) < 0) -+ break; -+ } -+ -+ if (temp) -+ mxmlAdd(tree, MXML_ADD_BEFORE, temp, node); -+ else -+ mxmlAdd(tree, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, node); -+} -+ -+ -+/* -+ * 'update_comment()' - Update a comment node. -+ */ -+ -+static void -+update_comment(mxml_node_t *parent, /* I - Parent node */ -+ mxml_node_t *comment) /* I - Comment node */ -+{ -+ char *ptr; /* Pointer into comment */ -+ -+ -+#ifdef DEBUG -+ fprintf(stderr, "update_comment(parent=%p, comment=%p)\n", -+ parent, comment); -+#endif /* DEBUG */ -+ -+ /* -+ * Range check the input... -+ */ -+ -+ if (!parent || !comment) -+ return; -+ -+ /* -+ * Update the comment... -+ */ -+ -+ ptr = comment->value.text.string; -+ -+ if (*ptr == '\'') -+ { -+ /* -+ * Convert "'name()' - description" to "description". -+ */ -+ -+ for (ptr ++; *ptr && *ptr != '\''; ptr ++); -+ -+ if (*ptr == '\'') -+ { -+ ptr ++; -+ while (isspace(*ptr & 255)) -+ ptr ++; -+ -+ if (*ptr == '-') -+ ptr ++; -+ -+ while (isspace(*ptr & 255)) -+ ptr ++; -+ -+ safe_strcpy(comment->value.text.string, ptr); -+ } -+ } -+ else if (!strncmp(ptr, "I ", 2) || !strncmp(ptr, "O ", 2) || -+ !strncmp(ptr, "IO ", 3)) -+ { -+ /* -+ * 'Convert "I - description", "IO - description", or "O - description" -+ * to description + directory attribute. -+ */ -+ -+ ptr = strchr(ptr, ' '); -+ *ptr++ = '\0'; -+ -+ if (!strcmp(parent->value.element.name, "argument")) -+ mxmlElementSetAttr(parent, "direction", comment->value.text.string); -+ -+ while (isspace(*ptr & 255)) -+ ptr ++; -+ -+ if (*ptr == '-') -+ ptr ++; -+ -+ while (isspace(*ptr & 255)) -+ ptr ++; -+ -+ safe_strcpy(comment->value.text.string, ptr); -+ } -+ -+ /* -+ * Eliminate leading and trailing *'s... -+ */ -+ -+ for (ptr = comment->value.text.string; *ptr == '*'; ptr ++); -+ for (; isspace(*ptr & 255); ptr ++); -+ if (ptr > comment->value.text.string) -+ safe_strcpy(comment->value.text.string, ptr); -+ -+ for (ptr = comment->value.text.string + strlen(comment->value.text.string) - 1; -+ ptr > comment->value.text.string && *ptr == '*'; -+ ptr --) -+ *ptr = '\0'; -+ for (; ptr > comment->value.text.string && isspace(*ptr & 255); ptr --) -+ *ptr = '\0'; -+ -+#ifdef DEBUG -+ fprintf(stderr, " updated comment = %s\n", comment->value.text.string); -+#endif /* DEBUG */ -+} -+ -+ -+/* -+ * 'usage()' - Show program usage... -+ */ -+ -+static void -+usage(const char *option) /* I - Unknown option */ -+{ -+ if (option) -+ printf("mxmldoc: Bad option \"%s\"!\n\n", option); -+ -+ puts("Usage: mxmldoc [options] [filename.xml] [source files] >filename.html"); -+ puts("Options:"); -+ puts(" --css filename.css Set CSS stylesheet file"); -+ puts(" --docset bundleid.docset Generate documentation set"); -+ puts(" --docversion version Set documentation version"); -+ puts(" --feedname name Set documentation set feed name"); -+ puts(" --feedurl url Set documentation set feed URL"); -+ puts(" --footer footerfile Set footer file"); -+ puts(" --framed basename Generate framed HTML to basename*.html"); -+ puts(" --header headerfile Set header file"); -+ puts(" --intro introfile Set introduction file"); -+ puts(" --man name Generate man page"); -+ puts(" --no-output Do no generate documentation file"); -+ puts(" --section section Set section name"); -+ puts(" --title title Set documentation title"); -+ puts(" --tokens path Generate Xcode docset Tokens.xml file"); -+ -+ exit(1); -+} -+ -+ -+/* -+ * 'write_description()' - Write the description text. -+ */ -+ -+static void -+write_description( -+ FILE *out, /* I - Output file */ -+ mxml_node_t *description, /* I - Description node */ -+ const char *element, /* I - HTML element, if any */ -+ int summary) /* I - Show summary */ -+{ -+ char text[10240], /* Text for description */ -+ *start, /* Start of code/link */ -+ *ptr; /* Pointer into text */ -+ int col; /* Current column */ -+ -+ -+ if (!description) -+ return; -+ -+ get_text(description, text, sizeof(text)); -+ -+ ptr = strstr(text, "\n\n"); -+ -+ if (summary) -+ { -+ if (ptr) -+ *ptr = '\0'; -+ -+ ptr = text; -+ } -+ else if (!ptr || !ptr[2]) -+ return; -+ else -+ ptr += 2; -+ -+ if (element && *element) -+ fprintf(out, "<%s class=\"%s\">", element, -+ summary ? "description" : "discussion"); -+ else if (!summary) -+ fputs(".PP\n", out); -+ -+ for (col = 0; *ptr; ptr ++) -+ { -+ if (*ptr == '@' && -+ (!strncmp(ptr + 1, "deprecated@", 11) || -+ !strncmp(ptr + 1, "since ", 6))) -+ { -+ ptr ++; -+ while (*ptr && *ptr != '@') -+ ptr ++; -+ -+ if (!*ptr) -+ return; -+ } -+ else if (!strncmp(ptr, "@code ", 6)) -+ { -+ for (ptr += 6; isspace(*ptr & 255); ptr ++); -+ -+ for (start = ptr, ptr ++; *ptr && *ptr != '@'; ptr ++); -+ -+ if (*ptr) -+ *ptr = '\0'; -+ else -+ ptr --; -+ -+ if (element && *element) -+ fprintf(out, "%s", start); -+ else if (element) -+ fputs(start, out); -+ else -+ fprintf(out, "\\fB%s\\fR", start); -+ } -+ else if (!strncmp(ptr, "@link ", 6)) -+ { -+ for (ptr += 6; isspace(*ptr & 255); ptr ++); -+ -+ for (start = ptr, ptr ++; *ptr && *ptr != '@'; ptr ++); -+ -+ if (*ptr) -+ *ptr = '\0'; -+ else -+ ptr --; -+ -+ if (element && *element) -+ fprintf(out, "%s", start, start); -+ else if (element) -+ fputs(start, out); -+ else -+ fprintf(out, "\\fI%s\\fR", start); -+ } -+ else if (element) -+ { -+ if (*ptr == '&') -+ fputs("&", out); -+ else if (*ptr == '<') -+ fputs("<", out); -+ else if (*ptr == '>') -+ fputs(">", out); -+ else if (*ptr == '\"') -+ fputs(""", out); -+ else if (*ptr & 128) -+ { -+ /* -+ * Convert UTF-8 to Unicode constant... -+ */ -+ -+ int ch; /* Unicode character */ -+ -+ -+ ch = *ptr & 255; -+ -+ if ((ch & 0xe0) == 0xc0) -+ { -+ ch = ((ch & 0x1f) << 6) | (ptr[1] & 0x3f); -+ ptr ++; -+ } -+ else if ((ch & 0xf0) == 0xe0) -+ { -+ ch = ((((ch * 0x0f) << 6) | (ptr[1] & 0x3f)) << 6) | (ptr[2] & 0x3f); -+ ptr += 2; -+ } -+ -+ if (ch == 0xa0) -+ { -+ /* -+ * Handle non-breaking space as-is... -+ */ -+ -+ fputs(" ", out); -+ } -+ else -+ fprintf(out, "&#x%x;", ch); -+ } -+ else if (*ptr == '\n' && ptr[1] == '\n' && ptr[2] && ptr[2] != '@') -+ { -+ fputs("
      \n
      \n", out); -+ ptr ++; -+ } -+ else -+ putc(*ptr, out); -+ } -+ else if (*ptr == '\n' && ptr[1] == '\n' && ptr[2] && ptr[2] != '@') -+ { -+ fputs("\n.PP\n", out); -+ ptr ++; -+ } -+ else -+ { -+ if (*ptr == '\\' || (*ptr == '.' && col == 0)) -+ putc('\\', out); -+ -+ putc(*ptr, out); -+ -+ if (*ptr == '\n') -+ col = 0; -+ else -+ col ++; -+ } -+ } -+ -+ if (element && *element) -+ fprintf(out, "\n", element); -+ else if (!element) -+ putc('\n', out); -+} -+ -+ -+/* -+ * 'write_element()' - Write an element's text nodes. -+ */ -+ -+static void -+write_element(FILE *out, /* I - Output file */ -+ mxml_node_t *doc, /* I - Document tree */ -+ mxml_node_t *element, /* I - Element to write */ -+ int mode) /* I - Output mode */ -+{ -+ mxml_node_t *node; /* Current node */ -+ -+ -+ if (!element) -+ return; -+ -+ for (node = element->child; -+ node; -+ node = mxmlWalkNext(node, element, MXML_NO_DESCEND)) -+ if (node->type == MXML_TEXT) -+ { -+ if (node->value.text.whitespace) -+ putc(' ', out); -+ -+ if (mode == OUTPUT_HTML && -+ (mxmlFindElement(doc, doc, "class", "name", node->value.text.string, -+ MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "enumeration", "name", -+ node->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "struct", "name", node->value.text.string, -+ MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "typedef", "name", node->value.text.string, -+ MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "union", "name", node->value.text.string, -+ MXML_DESCEND))) -+ { -+ fputs("value.text.string, mode); -+ fputs("\">", out); -+ write_string(out, node->value.text.string, mode); -+ fputs("", out); -+ } -+ else -+ write_string(out, node->value.text.string, mode); -+ } -+ -+ if (!strcmp(element->value.element.name, "type") && -+ element->last_child->value.text.string[0] != '*') -+ putc(' ', out); -+} -+ -+ -+/* -+ * 'write_file()' - Copy a file to the output. -+ */ -+ -+static void -+write_file(FILE *out, /* I - Output file */ -+ const char *file) /* I - File to copy */ -+{ -+ FILE *fp; /* Copy file */ -+ char line[8192]; /* Line from file */ -+ -+ -+ if ((fp = fopen(file, "r")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to open \"%s\": %s\n", file, -+ strerror(errno)); -+ return; -+ } -+ -+ while (fgets(line, sizeof(line), fp)) -+ fputs(line, out); -+ -+ fclose(fp); -+} -+ -+ -+/* -+ * 'write_function()' - Write documentation for a function. -+ */ -+ -+static void -+write_function(FILE *out, /* I - Output file */ -+ mxml_node_t *doc, /* I - Document */ -+ mxml_node_t *function, /* I - Function */ -+ int level) /* I - Base heading level */ -+{ -+ mxml_node_t *arg, /* Current argument */ -+ *adesc, /* Description of argument */ -+ *description, /* Description of function */ -+ *type, /* Type for argument */ -+ *node; /* Node in description */ -+ const char *name, /* Name of function/type */ -+ *defval; /* Default value */ -+ char prefix; /* Prefix character */ -+ char *sep; /* Newline separator */ -+ -+ -+ name = mxmlElementGetAttr(function, "name"); -+ description = mxmlFindElement(function, function, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "%s%s\n", -+ level, level == 3 ? "function" : "method", -+ get_comment_info(description), name, name, level); -+ -+ if (description) -+ write_description(out, description, "p", 1); -+ -+ fputs("

      \n", out); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_HTML); -+ else -+ fputs("void ", out); -+ -+ fprintf(out, "%s ", name); -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ fprintf(out, "%c
      \n    ", prefix); -+ if (type->child) -+ write_element(out, doc, type, OUTPUT_HTML); -+ -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ fprintf(out, " %s", defval); -+ } -+ -+ if (prefix == '(') -+ fputs("(void);

      \n", out); -+ else -+ { -+ fprintf(out, -+ "
      \n);

      \n" -+ "Parameters\n" -+ "
      \n", level + 1, level + 1); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ fprintf(out, "
      %s
      \n", mxmlElementGetAttr(arg, "name")); -+ -+ adesc = mxmlFindElement(arg, arg, "description", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ write_description(out, adesc, "dd", 1); -+ write_description(out, adesc, "dd", 0); -+ } -+ -+ fputs("
      \n", out); -+ } -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ { -+ fprintf(out, "Return Value\n", level + 1, -+ level + 1); -+ -+ adesc = mxmlFindElement(arg, arg, "description", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ write_description(out, adesc, "p", 1); -+ write_description(out, adesc, "p", 0); -+ } -+ -+ if (description) -+ { -+ for (node = description->child; node; node = node->next) -+ if (node->value.text.string && -+ (sep = strstr(node->value.text.string, "\n\n")) != NULL) -+ { -+ sep += 2; -+ if (*sep && strncmp(sep, "@since ", 7) && -+ strncmp(sep, "@deprecated@", 12)) -+ break; -+ } -+ -+ if (node) -+ { -+ fprintf(out, "Discussion\n", level + 1, -+ level + 1); -+ write_description(out, description, "p", 0); -+ } -+ } -+} -+ -+ -+/* -+ * 'write_html()' - Write HTML documentation. -+ */ -+ -+static void -+write_html(const char *section, /* I - Section */ -+ const char *title, /* I - Title */ -+ const char *footerfile, /* I - Footer file */ -+ const char *headerfile, /* I - Header file */ -+ const char *introfile, /* I - Intro file */ -+ const char *cssfile, /* I - Stylesheet file */ -+ const char *framefile, /* I - Framed HTML basename */ -+ const char *docset, /* I - Documentation set directory */ -+ const char *docversion, /* I - Documentation set version */ -+ const char *feedname, /* I - Feed name for doc set */ -+ const char *feedurl, /* I - Feed URL for doc set */ -+ mxml_node_t *doc) /* I - XML documentation */ -+{ -+ FILE *out; /* Output file */ -+ mxml_node_t *function, /* Current function */ -+ *scut, /* Struct/class/union/typedef */ -+ *arg, /* Current argument */ -+ *description, /* Description of function/var */ -+ *type; /* Type for argument */ -+ const char *name, /* Name of function/type */ -+ *defval, /* Default value */ -+ *basename; /* Base filename for framed output */ -+ char filename[1024]; /* Current output filename */ -+ -+ -+ if (framefile) -+ { -+ /* -+ * Get the basename of the frame file... -+ */ -+ -+ if ((basename = strrchr(framefile, '/')) != NULL) -+ basename ++; -+ else -+ basename = framefile; -+ -+ if (strstr(basename, ".html")) -+ fputs("mxmldoc: Frame base name should not contain .html extension!\n", -+ stderr); -+ -+ /* -+ * Create the container HTML file for the frames... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s.html", framefile); -+ -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ fputs("\n" -+ "\n" -+ "\n" -+ "", out); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("\n", out); -+ -+ if (section) -+ fprintf(out, "\n", section); -+ -+ fputs("\n" -+ "\n", out); -+ fprintf(out, "\n", basename); -+ fprintf(out, "\n", basename); -+ fputs("\n" -+ "\n" -+ "<h1>", out); -+ write_string(out, title, OUTPUT_HTML); -+ fprintf(out, -+ "</h1>\n" -+ "<ul>\n" -+ "\t<li><a href=\"%s-toc.html\">Table of Contents</a></li>\n" -+ "\t<li><a href=\"%s-body.html\">Body</a></li>\n" -+ "</ul>\n", basename, basename); -+ fputs("\n" -+ "\n", out); -+ fclose(out); -+ -+ /* -+ * Write the table-of-contents file... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s-toc.html", framefile); -+ -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ write_html_head(out, section, title, cssfile); -+ -+ snprintf(filename, sizeof(filename), "%s-body.html", basename); -+ -+ fputs("
      \n", out); -+ fprintf(out, "

      ", -+ filename); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("

      \n", out); -+ -+ write_toc(out, doc, introfile, filename, 0); -+ -+ fputs("
      \n" -+ "\n" -+ "\n", out); -+ fclose(out); -+ -+ /* -+ * Finally, open the body file... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s-body.html", framefile); -+ -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ } -+ else if (docset) -+ { -+ /* -+ * Create an Xcode documentation set - start by removing any existing -+ * output directory... -+ */ -+ -+#ifdef __APPLE__ -+ const char *id; /* Identifier */ -+ -+ -+ if (!access(docset, 0) && !remove_directory(docset)) -+ return; -+ -+ /* -+ * Then make the Apple standard bundle directory structure... -+ */ -+ -+ if (mkdir(docset, 0755)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", docset, -+ strerror(errno)); -+ return; -+ } -+ -+ snprintf(filename, sizeof(filename), "%s/Contents", docset); -+ if (mkdir(filename, 0755)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources", docset); -+ if (mkdir(filename, 0755)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources/Documentation", -+ docset); -+ if (mkdir(filename, 0755)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ /* -+ * The Info.plist file, which describes the documentation set... -+ */ -+ -+ if ((id = strrchr(docset, '/')) != NULL) -+ id ++; -+ else -+ id = docset; -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Info.plist", docset); -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ fputs("\n" -+ "\n" -+ "\n" -+ "\n" -+ "\tCFBundleIdentifier\n" -+ "\t", out); -+ write_string(out, id, OUTPUT_HTML); -+ fputs("\n" -+ "\tCFBundleName\n" -+ "\t", out); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("\n" -+ "\tCFBundleVersion\n" -+ "\t", out); -+ write_string(out, docversion ? docversion : "0.0", OUTPUT_HTML); -+ fputs("\n", out); -+ -+ if (feedname) -+ { -+ fputs("\tDocSetFeedName\n" -+ "\t", out); -+ write_string(out, feedname ? feedname : title, OUTPUT_HTML); -+ fputs("\n", out); -+ } -+ -+ if (feedurl) -+ { -+ fputs("\tDocSetFeedURL\n" -+ "\t", out); -+ write_string(out, feedurl, OUTPUT_HTML); -+ fputs("\n", out); -+ } -+ -+ fputs("\n" -+ "\n", out); -+ -+ fclose(out); -+ -+ /* -+ * Next the Nodes.xml file... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources/Nodes.xml", -+ docset); -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ fputs("\n" -+ "\n" -+ "\n" -+ "\n" -+ "", out); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("\n" -+ "Documentation/index.html\n" -+ "\n", out); -+ -+ write_toc(out, doc, introfile, NULL, 1); -+ -+ fputs("\n" -+ "\n" -+ "\n" -+ "\n", out); -+ -+ fclose(out); -+ -+ /* -+ * Then the Tokens.xml file... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources/Tokens.xml", -+ docset); -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+ fputs("\n" -+ "\n", out); -+ -+ write_tokens(out, doc, "index.html"); -+ -+ fputs("\n", out); -+ -+ fclose(out); -+ -+ /* -+ * Finally the HTML file... -+ */ -+ -+ snprintf(filename, sizeof(filename), -+ "%s/Contents/Resources/Documentation/index.html", -+ docset); -+ if ((out = fopen(filename, "w")) == NULL) -+ { -+ fprintf(stderr, "mxmldoc: Unable to create \"%s\": %s\n", filename, -+ strerror(errno)); -+ return; -+ } -+ -+#else -+ fputs("mxmldoc: Xcode documentation sets can only be created on " -+ "Mac OS X.\n", stderr); -+ return; -+#endif /* __APPLE__ */ -+ } -+ else -+ out = stdout; -+ -+ /* -+ * Standard header... -+ */ -+ -+ write_html_head(out, section, title, cssfile); -+ -+ fputs("
      \n", out); -+ -+ /* -+ * Header... -+ */ -+ -+ if (headerfile) -+ { -+ /* -+ * Use custom header... -+ */ -+ -+ write_file(out, headerfile); -+ } -+ else -+ { -+ /* -+ * Use standard header... -+ */ -+ -+ fputs("

      ", out); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("

      \n", out); -+ } -+ -+ /* -+ * Table of contents... -+ */ -+ -+ if (!framefile) -+ write_toc(out, doc, introfile, NULL, 0); -+ -+ /* -+ * Intro... -+ */ -+ -+ if (introfile) -+ write_file(out, introfile); -+ -+ /* -+ * List of classes... -+ */ -+ -+ if ((scut = find_public(doc, doc, "class")) != NULL) -+ { -+ fputs("

      Classes

      \n", out); -+ -+ while (scut) -+ { -+ write_scu(out, doc, scut); -+ -+ scut = find_public(scut, doc, "class"); -+ } -+ } -+ -+ /* -+ * List of functions... -+ */ -+ -+ if ((function = find_public(doc, doc, "function")) != NULL) -+ { -+ fputs("

      Functions

      \n", out); -+ -+ while (function) -+ { -+ write_function(out, doc, function, 3); -+ -+ function = find_public(function, doc, "function"); -+ } -+ } -+ -+ /* -+ * List of types... -+ */ -+ -+ if ((scut = find_public(doc, doc, "typedef")) != NULL) -+ { -+ fputs("

      Data Types

      \n", out); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ fprintf(out, "

      %s%s

      \n", -+ get_comment_info(description), name, name); -+ -+ if (description) -+ write_description(out, description, "p", 1); -+ -+ fputs("

      \n" -+ "typedef ", out); -+ -+ type = mxmlFindElement(scut, scut, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ for (type = type->child; type; type = type->next) -+ if (!strcmp(type->value.text.string, "(")) -+ break; -+ else -+ { -+ if (type->value.text.whitespace) -+ putc(' ', out); -+ -+ if (mxmlFindElement(doc, doc, "class", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "enumeration", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "struct", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "typedef", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "union", "name", -+ type->value.text.string, MXML_DESCEND)) -+ { -+ fputs("value.text.string, OUTPUT_HTML); -+ fputs("\">", out); -+ write_string(out, type->value.text.string, OUTPUT_HTML); -+ fputs("", out); -+ } -+ else -+ write_string(out, type->value.text.string, OUTPUT_HTML); -+ } -+ -+ if (type) -+ { -+ /* -+ * Output function type... -+ */ -+ -+ if (type->prev && type->prev->value.text.string[0] != '*') -+ putc(' ', out); -+ -+ fprintf(out, "(*%s", name); -+ -+ for (type = type->next->next; type; type = type->next) -+ { -+ if (type->value.text.whitespace) -+ putc(' ', out); -+ -+ if (mxmlFindElement(doc, doc, "class", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "enumeration", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "struct", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "typedef", "name", -+ type->value.text.string, MXML_DESCEND) || -+ mxmlFindElement(doc, doc, "union", "name", -+ type->value.text.string, MXML_DESCEND)) -+ { -+ fputs("value.text.string, OUTPUT_HTML); -+ fputs("\">", out); -+ write_string(out, type->value.text.string, OUTPUT_HTML); -+ fputs("", out); -+ } -+ else -+ write_string(out, type->value.text.string, OUTPUT_HTML); -+ } -+ -+ fputs(";\n", out); -+ } -+ else -+ { -+ type = mxmlFindElement(scut, scut, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ if (type->last_child->value.text.string[0] != '*') -+ putc(' ', out); -+ -+ fprintf(out, "%s;\n", name); -+ } -+ -+ fputs("

      \n", out); -+ -+ scut = find_public(scut, doc, "typedef"); -+ } -+ } -+ -+ /* -+ * List of structures... -+ */ -+ -+ if ((scut = find_public(doc, doc, "struct")) != NULL) -+ { -+ fputs("

      Structures

      \n", -+ out); -+ -+ while (scut) -+ { -+ write_scu(out, doc, scut); -+ -+ scut = find_public(scut, doc, "struct"); -+ } -+ } -+ -+ /* -+ * List of unions... -+ */ -+ -+ if ((scut = find_public(doc, doc, "union")) != NULL) -+ { -+ fputs("

      Unions

      \n", out); -+ -+ while (scut) -+ { -+ write_scu(out, doc, scut); -+ -+ scut = find_public(scut, doc, "union"); -+ } -+ } -+ -+ /* -+ * Variables... -+ */ -+ -+ if ((arg = find_public(doc, doc, "variable")) != NULL) -+ { -+ fputs("

      Variables

      \n", -+ out); -+ -+ while (arg) -+ { -+ name = mxmlElementGetAttr(arg, "name"); -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ fprintf(out, "

      %s%s

      \n", -+ get_comment_info(description), name, name); -+ -+ if (description) -+ write_description(out, description, "p", 1); -+ -+ fputs("

      ", out); -+ -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_HTML); -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ fprintf(out, " %s", defval); -+ fputs(";

      \n", out); -+ -+ arg = find_public(arg, doc, "variable"); -+ } -+ } -+ -+ /* -+ * List of enumerations... -+ */ -+ -+ if ((scut = find_public(doc, doc, "enumeration")) != NULL) -+ { -+ fputs("

      Constants

      \n", -+ out); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ fprintf(out, "

      %s%s

      \n", -+ get_comment_info(description), name, name); -+ -+ if (description) -+ write_description(out, description, "p", 1); -+ -+ fputs("

      Constants

      \n" -+ "
      \n", out); -+ -+ for (arg = mxmlFindElement(scut, scut, "constant", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "constant", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ fprintf(out, "
      %s %s
      \n", -+ mxmlElementGetAttr(arg, "name"), get_comment_info(description)); -+ -+ write_description(out, description, "dd", 1); -+ write_description(out, description, "dd", 0); -+ } -+ -+ fputs("
      \n", out); -+ -+ scut = find_public(scut, doc, "enumeration"); -+ } -+ } -+ -+ /* -+ * Footer... -+ */ -+ -+ if (footerfile) -+ { -+ /* -+ * Use custom footer... -+ */ -+ -+ write_file(out, footerfile); -+ } -+ -+ fputs("
      \n" -+ "\n" -+ "\n", out); -+ -+ /* -+ * Close output file as needed... -+ */ -+ -+ if (out != stdout) -+ fclose(out); -+ -+#ifdef __APPLE__ -+ /* -+ * When generating document sets, run the docsetutil program to index it... -+ */ -+ -+ if (docset) -+ { -+ const char *args[4]; /* Argument array */ -+ pid_t pid; /* Process ID */ -+ int status; /* Exit status */ -+ -+ -+ args[0] = "/Developer/usr/bin/docsetutil"; -+ args[1] = "index"; -+ args[2] = docset; -+ args[3] = NULL; -+ -+ if (posix_spawn(&pid, args[0], NULL, NULL, (char **)args, environ)) -+ { -+ fprintf(stderr, "mxmldoc: Unable to index documentation set \"%s\": %s\n", -+ docset, strerror(errno)); -+ } -+ else -+ { -+ while (wait(&status) != pid); -+ -+ if (status) -+ { -+ if (WIFEXITED(status)) -+ fprintf(stderr, "mxmldoc: docsetutil exited with status %d\n", -+ WEXITSTATUS(status)); -+ else -+ fprintf(stderr, "mxmldoc: docsetutil crashed with signal %d\n", -+ WTERMSIG(status)); -+ } -+ else -+ { -+ /* -+ * Remove unneeded temporary XML files... -+ */ -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources/Nodes.xml", -+ docset); -+ unlink(filename); -+ -+ snprintf(filename, sizeof(filename), "%s/Contents/Resources/Tokens.xml", -+ docset); -+ unlink(filename); -+ } -+ } -+ } -+#endif /* __APPLE__ */ -+} -+ -+ -+/* -+ * 'write_html_head()' - Write the standard HTML header. -+ */ -+ -+static void -+write_html_head(FILE *out, /* I - Output file */ -+ const char *section, /* I - Section */ -+ const char *title, /* I - Title */ -+ const char *cssfile) /* I - Stylesheet */ -+{ -+ fputs("\n" -+ "\n", out); -+ -+ if (section) -+ fprintf(out, "\n", section); -+ -+ fputs("\n" -+ "", out); -+ write_string(out, title, OUTPUT_HTML); -+ fputs("\n", out); -+ -+ if (section) -+ fprintf(out, "\n", section); -+ -+ fputs("\n" -+ "\n" -+ "\n" -+ "\n", out); -+} -+ -+ -+/* -+ * 'write_man()' - Write manpage documentation. -+ */ -+ -+static void -+write_man(const char *man_name, /* I - Name of manpage */ -+ const char *section, /* I - Section */ -+ const char *title, /* I - Title */ -+ const char *footerfile, /* I - Footer file */ -+ const char *headerfile, /* I - Header file */ -+ const char *introfile, /* I - Intro file */ -+ mxml_node_t *doc) /* I - XML documentation */ -+{ -+ int i; /* Looping var */ -+ mxml_node_t *function, /* Current function */ -+ *scut, /* Struct/class/union/typedef */ -+ *arg, /* Current argument */ -+ *description, /* Description of function/var */ -+ *type; /* Type for argument */ -+ const char *name, /* Name of function/type */ -+ *cname, /* Class name */ -+ *defval, /* Default value */ -+ *parent; /* Parent class */ -+ int inscope; /* Variable/method scope */ -+ char prefix; /* Prefix character */ -+ time_t curtime; /* Current time */ -+ struct tm *curdate; /* Current date */ -+ char buffer[1024]; /* String buffer */ -+ static const char * const scopes[] = /* Scope strings */ -+ { -+ "private", -+ "protected", -+ "public" -+ }; -+ -+ -+ /* -+ * Standard man page... -+ */ -+ -+ curtime = time(NULL); -+ curdate = localtime(&curtime); -+ strftime(buffer, sizeof(buffer), "%x", curdate); -+ -+ printf(".TH %s %s \"%s\" \"%s\" \"%s\"\n", man_name, section ? section : "3", -+ title ? title : "", buffer, title ? title : ""); -+ -+ /* -+ * Header... -+ */ -+ -+ if (headerfile) -+ { -+ /* -+ * Use custom header... -+ */ -+ -+ write_file(stdout, headerfile); -+ } -+ else -+ { -+ /* -+ * Use standard header... -+ */ -+ -+ puts(".SH NAME"); -+ printf("%s \\- %s\n", man_name, title ? title : man_name); -+ } -+ -+ /* -+ * Intro... -+ */ -+ -+ if (introfile) -+ write_file(stdout, introfile); -+ -+ /* -+ * List of classes... -+ */ -+ -+ if (find_public(doc, doc, "class")) -+ { -+ puts(".SH CLASSES"); -+ -+ for (scut = find_public(doc, doc, "class"); -+ scut; -+ scut = find_public(scut, doc, "class")) -+ { -+ cname = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", cname); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ printf(".PP\n" -+ ".nf\n" -+ "class %s", cname); -+ if ((parent = mxmlElementGetAttr(scut, "parent")) != NULL) -+ printf(" %s", parent); -+ puts("\n{"); -+ -+ for (i = 0; i < 3; i ++) -+ { -+ inscope = 0; -+ -+ for (arg = mxmlFindElement(scut, scut, "variable", "scope", scopes[i], -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "variable", "scope", scopes[i], -+ MXML_NO_DESCEND)) -+ { -+ if (!inscope) -+ { -+ inscope = 1; -+ printf(" %s:\n", scopes[i]); -+ } -+ -+ printf(" "); -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ printf("%s;\n", mxmlElementGetAttr(arg, "name")); -+ } -+ -+ for (function = mxmlFindElement(scut, scut, "function", "scope", -+ scopes[i], MXML_DESCEND_FIRST); -+ function; -+ function = mxmlFindElement(function, scut, "function", "scope", -+ scopes[i], MXML_NO_DESCEND)) -+ { -+ if (!inscope) -+ { -+ inscope = 1; -+ printf(" %s:\n", scopes[i]); -+ } -+ -+ name = mxmlElementGetAttr(function, "name"); -+ -+ printf(" "); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ else if (strcmp(cname, name) && strcmp(cname, name + 1)) -+ fputs("void ", stdout); -+ -+ printf("%s", name); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putchar(prefix); -+ if (prefix == ',') -+ putchar(' '); -+ -+ if (type->child) -+ write_element(stdout, doc, type, OUTPUT_MAN); -+ fputs(mxmlElementGetAttr(arg, "name"), stdout); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ printf(" %s", defval); -+ } -+ -+ if (prefix == '(') -+ puts("(void);"); -+ else -+ puts(");"); -+ } -+ } -+ -+ puts("};\n" -+ ".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ /* -+ * List of enumerations... -+ */ -+ -+ if (find_public(doc, doc, "enumeration")) -+ { -+ puts(".SH ENUMERATIONS"); -+ -+ for (scut = find_public(doc, doc, "enumeration"); -+ scut; -+ scut = find_public(scut, doc, "enumeration")) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", name); -+ -+ write_description(stdout, description, NULL, 1); -+ write_description(stdout, description, NULL, 0); -+ -+ for (arg = mxmlFindElement(scut, scut, "constant", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "constant", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".TP 5\n%s\n.br\n", mxmlElementGetAttr(arg, "name")); -+ write_description(stdout, description, NULL, 1); -+ } -+ } -+ } -+ -+ /* -+ * List of functions... -+ */ -+ -+ if (find_public(doc, doc, "function")) -+ { -+ puts(".SH FUNCTIONS"); -+ -+ for (function = find_public(doc, doc, "function"); -+ function; -+ function = find_public(function, doc, "function")) -+ { -+ name = mxmlElementGetAttr(function, "name"); -+ description = mxmlFindElement(function, function, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", name); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ puts(".PP\n" -+ ".nf"); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ else -+ fputs("void", stdout); -+ -+ printf(" %s ", name); -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ printf("%c\n ", prefix); -+ if (type->child) -+ write_element(stdout, doc, type, OUTPUT_MAN); -+ fputs(mxmlElementGetAttr(arg, "name"), stdout); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ printf(" %s", defval); -+ } -+ -+ if (prefix == '(') -+ puts("(void);"); -+ else -+ puts("\n);"); -+ -+ puts(".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ /* -+ * List of structures... -+ */ -+ -+ if (find_public(doc, doc, "struct")) -+ { -+ puts(".SH STRUCTURES"); -+ -+ for (scut = find_public(doc, doc, "struct"); -+ scut; -+ scut = find_public(scut, doc, "struct")) -+ { -+ cname = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", cname); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ printf(".PP\n" -+ ".nf\n" -+ "struct %s\n{\n", cname); -+ for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ printf(" "); -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ printf("%s;\n", mxmlElementGetAttr(arg, "name")); -+ } -+ -+ for (function = mxmlFindElement(scut, scut, "function", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ function; -+ function = mxmlFindElement(function, scut, "function", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ name = mxmlElementGetAttr(function, "name"); -+ -+ printf(" "); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ else if (strcmp(cname, name) && strcmp(cname, name + 1)) -+ fputs("void ", stdout); -+ -+ fputs(name, stdout); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putchar(prefix); -+ if (prefix == ',') -+ putchar(' '); -+ -+ if (type->child) -+ write_element(stdout, doc, type, OUTPUT_MAN); -+ fputs(mxmlElementGetAttr(arg, "name"), stdout); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ printf(" %s", defval); -+ } -+ -+ if (prefix == '(') -+ puts("(void);"); -+ else -+ puts(");"); -+ } -+ -+ puts("};\n" -+ ".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ /* -+ * List of types... -+ */ -+ -+ if (find_public(doc, doc, "typedef")) -+ { -+ puts(".SH TYPES"); -+ -+ for (scut = find_public(doc, doc, "typedef"); -+ scut; -+ scut = find_public(scut, doc, "typedef")) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", name); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ fputs(".PP\n" -+ ".nf\n" -+ "typedef ", stdout); -+ -+ type = mxmlFindElement(scut, scut, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ for (type = type->child; type; type = type->next) -+ if (!strcmp(type->value.text.string, "(")) -+ break; -+ else -+ { -+ if (type->value.text.whitespace) -+ putchar(' '); -+ -+ write_string(stdout, type->value.text.string, OUTPUT_MAN); -+ } -+ -+ if (type) -+ { -+ /* -+ * Output function type... -+ */ -+ -+ printf(" (*%s", name); -+ -+ for (type = type->next->next; type; type = type->next) -+ { -+ if (type->value.text.whitespace) -+ putchar(' '); -+ -+ write_string(stdout, type->value.text.string, OUTPUT_MAN); -+ } -+ -+ puts(";"); -+ } -+ else -+ printf(" %s;\n", name); -+ -+ puts(".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ /* -+ * List of unions... -+ */ -+ -+ if (find_public(doc, doc, "union")) -+ { -+ puts(".SH UNIONS"); -+ -+ for (scut = find_public(doc, doc, "union"); -+ scut; -+ scut = find_public(scut, doc, "union")) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", name); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ printf(".PP\n" -+ ".nf\n" -+ "union %s\n{\n", name); -+ for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ printf(" "); -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ printf("%s;\n", mxmlElementGetAttr(arg, "name")); -+ } -+ -+ puts("};\n" -+ ".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ /* -+ * Variables... -+ */ -+ -+ if (find_public(doc, doc, "variable")) -+ { -+ puts(".SH VARIABLES"); -+ -+ for (arg = find_public(doc, doc, "variable"); -+ arg; -+ arg = find_public(arg, doc, "variable")) -+ { -+ name = mxmlElementGetAttr(arg, "name"); -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ printf(".SS %s\n", name); -+ -+ write_description(stdout, description, NULL, 1); -+ -+ puts(".PP\n" -+ ".nf"); -+ -+ write_element(stdout, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_MAN); -+ fputs(mxmlElementGetAttr(arg, "name"), stdout); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ printf(" %s", defval); -+ puts(";\n" -+ ".fi"); -+ -+ write_description(stdout, description, NULL, 0); -+ } -+ } -+ -+ if (footerfile) -+ { -+ /* -+ * Use custom footer... -+ */ -+ -+ write_file(stdout, footerfile); -+ } -+} -+ -+ -+/* -+ * 'write_scu()' - Write a structure, class, or union. -+ */ -+ -+static void -+write_scu(FILE *out, /* I - Output file */ -+ mxml_node_t *doc, /* I - Document */ -+ mxml_node_t *scut) /* I - Structure, class, or union */ -+{ -+ int i; /* Looping var */ -+ mxml_node_t *function, /* Current function */ -+ *arg, /* Current argument */ -+ *description, /* Description of function/var */ -+ *type; /* Type for argument */ -+ const char *name, /* Name of function/type */ -+ *cname, /* Class name */ -+ *defval, /* Default value */ -+ *parent, /* Parent class */ -+ *scope; /* Scope for variable/function */ -+ int inscope, /* Variable/method scope */ -+ maxscope; /* Maximum scope */ -+ char prefix; /* Prefix character */ -+ static const char * const scopes[] = /* Scope strings */ -+ { -+ "private", -+ "protected", -+ "public" -+ }; -+ -+ -+ cname = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "

      %s%s

      \n", -+ scut->value.element.name, get_comment_info(description), cname, -+ cname); -+ -+ if (description) -+ write_description(out, description, "p", 1); -+ -+ fprintf(out, "

      %s %s", scut->value.element.name, cname); -+ if ((parent = mxmlElementGetAttr(scut, "parent")) != NULL) -+ fprintf(out, " %s", parent); -+ fputs(" {
      \n", out); -+ -+ maxscope = !strcmp(scut->value.element.name, "class") ? 3 : 1; -+ -+ for (i = 0; i < maxscope; i ++) -+ { -+ inscope = maxscope == 1; -+ -+ for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ if (maxscope > 1 && -+ ((scope = mxmlElementGetAttr(arg, "scope")) == NULL || -+ strcmp(scope, scopes[i]))) -+ continue; -+ -+ if (!inscope) -+ { -+ inscope = 1; -+ fprintf(out, "  %s:
      \n", scopes[i]); -+ } -+ -+ fputs("    ", out); -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_HTML); -+ fprintf(out, "%s;
      \n", mxmlElementGetAttr(arg, "name")); -+ } -+ -+ for (function = mxmlFindElement(scut, scut, "function", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ function; -+ function = mxmlFindElement(function, scut, "function", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ if (maxscope > 1 && -+ ((scope = mxmlElementGetAttr(arg, "scope")) == NULL || -+ strcmp(scope, scopes[i]))) -+ continue; -+ -+ if (!inscope) -+ { -+ inscope = 1; -+ fprintf(out, "  %s:
      \n", scopes[i]); -+ } -+ -+ name = mxmlElementGetAttr(function, "name"); -+ -+ fputs("    ", out); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_HTML); -+ else if (strcmp(cname, name) && strcmp(cname, name + 1)) -+ fputs("void ", out); -+ -+ fprintf(out, "%s", cname, name, name); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putc(prefix, out); -+ if (prefix == ',') -+ putc(' ', out); -+ -+ if (type->child) -+ write_element(out, doc, type, OUTPUT_HTML); -+ -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ fprintf(out, " %s", defval); -+ } -+ -+ if (prefix == '(') -+ fputs("(void);
      \n", out); -+ else -+ fputs(");
      \n", out); -+ } -+ } -+ -+ fputs("};

      \n" -+ "

      Members

      \n" -+ "
      \n", out); -+ -+ for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "
      %s %s
      \n", -+ mxmlElementGetAttr(arg, "name"), get_comment_info(description)); -+ -+ write_description(out, description, "dd", 1); -+ write_description(out, description, "dd", 0); -+ } -+ -+ fputs("
      \n", out); -+ -+ for (function = mxmlFindElement(scut, scut, "function", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ function; -+ function = mxmlFindElement(function, scut, "function", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ write_function(out, doc, function, 4); -+ } -+} -+ -+ -+/* -+ * 'write_string()' - Write a string, quoting HTML special chars as needed. -+ */ -+ -+static void -+write_string(FILE *out, /* I - Output file */ -+ const char *s, /* I - String to write */ -+ int mode) /* I - Output mode */ -+{ -+ switch (mode) -+ { -+ case OUTPUT_HTML : -+ case OUTPUT_XML : -+ while (*s) -+ { -+ if (*s == '&') -+ fputs("&", out); -+ else if (*s == '<') -+ fputs("<", out); -+ else if (*s == '>') -+ fputs(">", out); -+ else if (*s == '\"') -+ fputs(""", out); -+ else if (*s & 128) -+ { -+ /* -+ * Convert UTF-8 to Unicode constant... -+ */ -+ -+ int ch; /* Unicode character */ -+ -+ -+ ch = *s & 255; -+ -+ if ((ch & 0xe0) == 0xc0) -+ { -+ ch = ((ch & 0x1f) << 6) | (s[1] & 0x3f); -+ s ++; -+ } -+ else if ((ch & 0xf0) == 0xe0) -+ { -+ ch = ((((ch * 0x0f) << 6) | (s[1] & 0x3f)) << 6) | (s[2] & 0x3f); -+ s += 2; -+ } -+ -+ if (ch == 0xa0) -+ { -+ /* -+ * Handle non-breaking space as-is... -+ */ -+ -+ fputs(" ", out); -+ } -+ else -+ fprintf(out, "&#x%x;", ch); -+ } -+ else -+ putc(*s, out); -+ -+ s ++; -+ } -+ break; -+ -+ case OUTPUT_MAN : -+ while (*s) -+ { -+ if (*s == '\\' || *s == '-') -+ putc('\\', out); -+ -+ putc(*s++, out); -+ } -+ break; -+ } -+} -+ -+ -+/* -+ * 'write_toc()' - Write a table-of-contents. -+ */ -+ -+static void -+write_toc(FILE *out, /* I - Output file */ -+ mxml_node_t *doc, /* I - Document */ -+ const char *introfile, /* I - Introduction file */ -+ const char *target, /* I - Target name */ -+ int xml) /* I - Write XML nodes? */ -+{ -+ FILE *fp; /* Intro file */ -+ mxml_node_t *function, /* Current function */ -+ *scut, /* Struct/class/union/typedef */ -+ *arg, /* Current argument */ -+ *description; /* Description of function/var */ -+ const char *name, /* Name of function/type */ -+ *targetattr; /* Target attribute, if any */ -+ int xmlid = 1; /* Current XML node ID */ -+ -+ -+ /* -+ * If target is set, it is the frame file that contains the body. -+ * Otherwise, we are creating a single-file... -+ */ -+ -+ if (target) -+ targetattr = " target=\"body\""; -+ else -+ targetattr = ""; -+ -+ /* -+ * The table-of-contents is a nested unordered list. Start by -+ * reading any intro file to see if there are any headings there. -+ */ -+ -+ if (!xml) -+ fputs("

      Contents

      \n" -+ "
        \n", out); -+ -+ if (introfile && (fp = fopen(introfile, "r")) != NULL) -+ { -+ char line[8192], /* Line from file */ -+ *ptr, /* Pointer in line */ -+ *end, /* End of line */ -+ *anchor, /* Anchor name */ -+ quote, /* Quote character for value */ -+ level = '1', /* Current heading level */ -+ newlevel; /* New heading level */ -+ int inelement; /* In an element? */ -+ -+ -+ while (fgets(line, sizeof(line), fp)) -+ { -+ /* -+ * See if this line has a heading... -+ */ -+ -+ if ((ptr = strstr(line, "') -+ inelement = 0; -+ -+ *ptr++ = '\0'; -+ } -+ -+ /* -+ * Write text until we see ""... -+ */ -+ -+ if (xml) -+ { -+ if (newlevel < level) -+ fputs("\n" -+ "\n", out); -+ else if (newlevel > level && newlevel == '3') -+ fputs("\n", out); -+ else if (xmlid > 1) -+ fputs("\n", out); -+ -+ level = newlevel; -+ -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "", xmlid ++, anchor); -+ -+ quote = 0; -+ -+ while (*ptr) -+ { -+ if (inelement) -+ { -+ if (*ptr == quote) -+ quote = 0; -+ else if (*ptr == '>') -+ inelement = 0; -+ else if (*ptr == '\'' || *ptr == '\"') -+ quote = *ptr; -+ } -+ else if (*ptr == '<') -+ { -+ if (!strncmp(ptr, "", 4) || !strncmp(ptr, "", 4)) -+ break; -+ -+ inelement = 1; -+ } -+ else -+ putc(*ptr, out); -+ -+ ptr ++; -+ } -+ -+ fputs("\n", out); -+ } -+ else -+ { -+ if (newlevel < level) -+ fputs("\n" -+ "
      \n", out); -+ else if (newlevel > level) -+ fputs("\n", out); -+ } -+ } -+ -+ fclose(fp); -+ } -+ -+ /* -+ * Next the classes... -+ */ -+ -+ if ((scut = find_public(doc, doc, "class")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "CLASSES\n" -+ "Classes\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Classes" -+ "
        \n", -+ target ? target : "", targetattr); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "
      • %s
      • \n", name); -+ } -+ -+ scut = find_public(scut, doc, "class"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Functions... -+ */ -+ -+ if ((function = find_public(doc, doc, "function")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "FUNCTIONS\n" -+ "Functions\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Functions" -+ "
        \n", target ? target : "", targetattr); -+ -+ while (function) -+ { -+ name = mxmlElementGetAttr(function, "name"); -+ description = mxmlFindElement(function, function, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "
      • %s
      • \n", name); -+ } -+ -+ function = find_public(function, doc, "function"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Data types... -+ */ -+ -+ if ((scut = find_public(doc, doc, "typedef")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "TYPES\n" -+ "Data Types\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Data Types" -+ "
        \n", target ? target : "", targetattr); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "\t
      • %s
      • \n", name); -+ } -+ -+ scut = find_public(scut, doc, "typedef"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Structures... -+ */ -+ -+ if ((scut = find_public(doc, doc, "struct")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "STRUCTURES\n" -+ "Structures\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Structures" -+ "
        \n", target ? target : "", targetattr); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "\t
      • %s
      • \n", name); -+ } -+ -+ scut = find_public(scut, doc, "struct"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Unions... -+ */ -+ -+ if ((scut = find_public(doc, doc, "union")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "UNIONS\n" -+ "Unions\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, -+ "
    • Unions
        \n", -+ target ? target : "", targetattr); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "\t
      • %s
      • \n", name); -+ } -+ -+ scut = find_public(scut, doc, "union"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Globals variables... -+ */ -+ -+ if ((arg = find_public(doc, doc, "variable")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "VARIABLES\n" -+ "Variables\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Variables" -+ "
        \n", target ? target : "", targetattr); -+ -+ while (arg) -+ { -+ name = mxmlElementGetAttr(arg, "name"); -+ description = mxmlFindElement(arg, arg, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "\t
      • %s
      • \n", name); -+ } -+ -+ arg = find_public(arg, doc, "variable"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+ -+ /* -+ * Enumerations/constants... -+ */ -+ -+ if ((scut = find_public(doc, doc, "enumeration")) != NULL) -+ { -+ if (xml) -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "ENUMERATIONS\n" -+ "Constants\n" -+ "\n", xmlid ++); -+ else -+ fprintf(out, "
    • Constants" -+ "
        \n", target ? target : "", targetattr); -+ -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ if (xml) -+ { -+ fprintf(out, "\n" -+ "Documentation/index.html\n" -+ "%s\n" -+ "%s\n" -+ "\n", xmlid ++, name, name); -+ } -+ else -+ { -+ fprintf(out, "\t
      • %s
      • \n", name); -+ } -+ -+ scut = find_public(scut, doc, "enumeration"); -+ } -+ -+ if (xml) -+ fputs("\n", out); -+ else -+ fputs("
    • \n", out); -+ } -+} -+ -+ -+/* -+ * 'write_tokens()' - Write nodes for all APIs. -+ */ -+ -+static void -+write_tokens(FILE *out, /* I - Output file */ -+ mxml_node_t *doc, /* I - Document */ -+ const char *path) /* I - Path to help file */ -+{ -+ mxml_node_t *function, /* Current function */ -+ *scut, /* Struct/class/union/typedef */ -+ *arg, /* Current argument */ -+ *description, /* Description of function/var */ -+ *type, /* Type node */ -+ *node; /* Current child node */ -+ const char *name, /* Name of function/type */ -+ *cename, /* Current class/enum name */ -+ *defval; /* Default value for argument */ -+ char prefix; /* Prefix for declarations */ -+ -+ -+ /* -+ * Classes... -+ */ -+ -+ if ((scut = find_public(doc, doc, "class")) != NULL) -+ { -+ while (scut) -+ { -+ cename = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/cpp/cl/%s\n" -+ "", path, cename, cename); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ if ((function = find_public(scut, scut, "function")) != NULL) -+ { -+ while (function) -+ { -+ name = mxmlElementGetAttr(function, "name"); -+ description = mxmlFindElement(function, function, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s.%s\n" -+ "//apple_ref/cpp/clm/%s/%s", path, -+ cename, name, cename, name); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg && (type = mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST)) != NULL) -+ { -+ for (node = type->child; node; node = node->next) -+ fputs(node->value.text.string, out); -+ } -+ else if (strcmp(cename, name) && strcmp(cename, name + 1)) -+ fputs("void", out); -+ -+ fputs("/", out); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putc(prefix, out); -+ -+ for (node = type->child; node; node = node->next) -+ fputs(node->value.text.string, out); -+ -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ } -+ -+ if (prefix == '(') -+ fputs("(void", out); -+ -+ fputs(")\n" -+ "", out); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "", out); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_XML); -+ else if (strcmp(cename, name) && strcmp(cename, name + 1)) -+ fputs("void ", out); -+ -+ fputs(name, out); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putc(prefix, out); -+ if (prefix == ',') -+ putc(' ', out); -+ -+ if (type->child) -+ write_element(out, doc, type, OUTPUT_XML); -+ -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ fprintf(out, " %s", defval); -+ } -+ -+ if (prefix == '(') -+ fputs("(void);", out); -+ else -+ fputs(");", out); -+ -+ fputs("\n" -+ "\n", out); -+ -+ function = find_public(function, doc, "function"); -+ } -+ } -+ scut = find_public(scut, doc, "class"); -+ } -+ } -+ -+ /* -+ * Functions... -+ */ -+ -+ if ((function = find_public(doc, doc, "function")) != NULL) -+ { -+ while (function) -+ { -+ name = mxmlElementGetAttr(function, "name"); -+ description = mxmlFindElement(function, function, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/func/%s\n" -+ "", path, name, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "", out); -+ -+ arg = mxmlFindElement(function, function, "returnvalue", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ -+ if (arg) -+ write_element(out, doc, mxmlFindElement(arg, arg, "type", NULL, -+ NULL, MXML_DESCEND_FIRST), -+ OUTPUT_XML); -+ else // if (strcmp(cname, name) && strcmp(cname, name + 1)) -+ fputs("void ", out); -+ -+ fputs(name, out); -+ -+ for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, -+ MXML_DESCEND_FIRST), prefix = '('; -+ arg; -+ arg = mxmlFindElement(arg, function, "argument", NULL, NULL, -+ MXML_NO_DESCEND), prefix = ',') -+ { -+ type = mxmlFindElement(arg, arg, "type", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ -+ putc(prefix, out); -+ if (prefix == ',') -+ putc(' ', out); -+ -+ if (type->child) -+ write_element(out, doc, type, OUTPUT_XML); -+ -+ fputs(mxmlElementGetAttr(arg, "name"), out); -+ if ((defval = mxmlElementGetAttr(arg, "default")) != NULL) -+ fprintf(out, " %s", defval); -+ } -+ -+ if (prefix == '(') -+ fputs("(void);", out); -+ else -+ fputs(");", out); -+ -+ fputs("\n" -+ "\n", out); -+ -+ function = find_public(function, doc, "function"); -+ } -+ } -+ -+ /* -+ * Data types... -+ */ -+ -+ if ((scut = find_public(doc, doc, "typedef")) != NULL) -+ { -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/tdef/%s\n" -+ "", path, name, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ scut = find_public(scut, doc, "typedef"); -+ } -+ } -+ -+ /* -+ * Structures... -+ */ -+ -+ if ((scut = find_public(doc, doc, "struct")) != NULL) -+ { -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/tag/%s\n" -+ "", path, name, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ scut = find_public(scut, doc, "struct"); -+ } -+ } -+ -+ /* -+ * Unions... -+ */ -+ -+ if ((scut = find_public(doc, doc, "union")) != NULL) -+ { -+ while (scut) -+ { -+ name = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/tag/%s\n" -+ "", path, name, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ scut = find_public(scut, doc, "union"); -+ } -+ } -+ -+ /* -+ * Globals variables... -+ */ -+ -+ if ((arg = find_public(doc, doc, "variable")) != NULL) -+ { -+ while (arg) -+ { -+ name = mxmlElementGetAttr(arg, "name"); -+ description = mxmlFindElement(arg, arg, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/data/%s\n" -+ "", path, name, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ arg = find_public(arg, doc, "variable"); -+ } -+ } -+ -+ /* -+ * Enumerations/constants... -+ */ -+ -+ if ((scut = find_public(doc, doc, "enumeration")) != NULL) -+ { -+ while (scut) -+ { -+ cename = mxmlElementGetAttr(scut, "name"); -+ description = mxmlFindElement(scut, scut, "description", -+ NULL, NULL, MXML_DESCEND_FIRST); -+ -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/tag/%s\n" -+ "", path, cename, cename); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ -+ for (arg = mxmlFindElement(scut, scut, "constant", NULL, NULL, -+ MXML_DESCEND_FIRST); -+ arg; -+ arg = mxmlFindElement(arg, scut, "constant", NULL, NULL, -+ MXML_NO_DESCEND)) -+ { -+ name = mxmlElementGetAttr(arg, "name"); -+ description = mxmlFindElement(arg, arg, "description", NULL, -+ NULL, MXML_DESCEND_FIRST); -+ fprintf(out, "\n" -+ "Documentation/%s\n" -+ "%s\n" -+ "//apple_ref/c/econst/%s\n" -+ "", path, cename, name); -+ write_description(out, description, "", 1); -+ fputs("\n" -+ "\n", out); -+ } -+ -+ scut = find_public(scut, doc, "enumeration"); -+ } -+ } -+} -+ -+ -+/* -+ * 'ws_cb()' - Whitespace callback for saving. -+ */ -+ -+static const char * /* O - Whitespace string or NULL for none */ -+ws_cb(mxml_node_t *node, /* I - Element node */ -+ int where) /* I - Where value */ -+{ -+ const char *name; /* Name of element */ -+ int depth; /* Depth of node */ -+ static const char *spaces = " "; -+ /* Whitespace (40 spaces) for indent */ -+ -+ -+ name = node->value.element.name; -+ -+ switch (where) -+ { -+ case MXML_WS_BEFORE_CLOSE : -+ if (strcmp(name, "argument") && -+ strcmp(name, "class") && -+ strcmp(name, "constant") && -+ strcmp(name, "enumeration") && -+ strcmp(name, "function") && -+ strcmp(name, "mxmldoc") && -+ strcmp(name, "namespace") && -+ strcmp(name, "returnvalue") && -+ strcmp(name, "struct") && -+ strcmp(name, "typedef") && -+ strcmp(name, "union") && -+ strcmp(name, "variable")) -+ return (NULL); -+ -+ for (depth = -4; node; node = node->parent, depth += 2); -+ if (depth > 40) -+ return (spaces); -+ else if (depth < 2) -+ return (NULL); -+ else -+ return (spaces + 40 - depth); -+ -+ case MXML_WS_AFTER_CLOSE : -+ return ("\n"); -+ -+ case MXML_WS_BEFORE_OPEN : -+ for (depth = -4; node; node = node->parent, depth += 2); -+ if (depth > 40) -+ return (spaces); -+ else if (depth < 2) -+ return (NULL); -+ else -+ return (spaces + 40 - depth); -+ -+ default : -+ case MXML_WS_AFTER_OPEN : -+ if (strcmp(name, "argument") && -+ strcmp(name, "class") && -+ strcmp(name, "constant") && -+ strcmp(name, "enumeration") && -+ strcmp(name, "function") && -+ strcmp(name, "mxmldoc") && -+ strcmp(name, "namespace") && -+ strcmp(name, "returnvalue") && -+ strcmp(name, "struct") && -+ strcmp(name, "typedef") && -+ strcmp(name, "union") && -+ strcmp(name, "variable") && -+ strncmp(name, "?xml", 4)) -+ return (NULL); -+ else -+ return ("\n"); -+ } -+} -+ -+ -+/* -+ * End of "$Id: mxmldoc.c 390 2009-05-05 13:38:00Z mike $". -+ */ -diff -Naur mxml-2.6/temp1.xmlfd mxml-2.6-haiku/temp1.xmlfd ---- mxml-2.6/temp1.xmlfd 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/temp1.xmlfd 2009-10-26 02:35:54.000000000 +0000 -@@ -0,0 +1,29 @@ -+ -+ -+ -+ 123 -+ Now is the time for all good men to come to the aid of their -+country. -+ -+ -+ -diff -Naur mxml-2.6/test/class.cxx mxml-2.6-haiku/test/class.cxx ---- mxml-2.6/test/class.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/class.cxx 2008-01-26 23:27:19.000000000 +0000 -@@ -0,0 +1,84 @@ -+class foo_c : public bar_c // Foo class derived from bar -+{ -+ float foo; /* Real number */ -+ int bar; /* Integer */ -+ -+ public: -+ -+ foo_c(float f, int b); -+ ~foo_c(); -+ -+ // 'get_bar()' - Get the value of bar. -+ int // O - Value of bar -+ get_bar() -+ { -+ return (bar); -+ } -+ -+ // 'get_foo()' - Get the value of foo. -+ float // O - Value of foo -+ get_foo() -+ { -+ return (foo); -+ } -+ -+ // 'set_bar()' - Set the value of bar. -+ void -+ set_bar(int b) // I - Value of bar -+ { -+ bar = b; -+ } -+ -+ // 'set_foo()' - Set the value of foo. -+ void -+ set_foo(float f) // I - Value of foo -+ { -+ foo = f; -+ } -+ -+ // 'set_foobar()' - Set foo and optionally bar (should show default args). -+ void -+ set_foobar(float f, // I - Value of foo -+ int b = 0) // I - Value of bar -+ { -+ foo = f; -+ bar = b; -+ } -+ -+ protected: -+ -+ static int global; /* Global integer */ -+ -+ // 'get_global()' - Get the global integer. -+ int // O - Integer -+ get_global() -+ { -+ return (global); -+ } -+ -+ private: -+ -+ int barfoo; // Another private integer -+ -+ public: -+ -+ // 'get_barfoo()' - Get the barfoo value. -+ int // O - Barfoo value -+ get_barfoo() -+ { -+ return (barfoo); -+ } -+} -+ -+// 'foo_c::foo_c()' - Create a foo_c class. -+foo_c::foo_c(float f, // I - Value of foo -+ int b) // I - Value of bar -+{ -+ foo = f; -+ bar = b; -+} -+ -+// 'foo_c::~foo_c()' - Destroy a foo_c class. -+foo_c::~foo_c() -+{ -+} -diff -Naur mxml-2.6/test/dotest.sh mxml-2.6-haiku/test/dotest.sh ---- mxml-2.6/test/dotest.sh 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/dotest.sh 2008-03-19 21:09:21.000000000 +0000 -@@ -0,0 +1,47 @@ -+#!/bin/sh -+(cd ..; make mxmldoc-static) -+ -+files="" -+mode="" -+ -+while test $# -gt 0; do -+ arg="$1" -+ shift -+ -+ case "$arg" in -+ -f) framed="--framed framed" ;; -+ -g) mode="gdb" ;; -+ -v) mode="valgrind" ;; -+ *.h | *.c | *.cxx) files="$files $arg" ;; -+ *) -+ echo "Usage: ./dotest.sh [-f] [-g] [-v] [files]" -+ exit 1 -+ ;; -+ esac -+done -+ -+if test "$files" = ""; then -+ files=*.cxx -+fi -+ -+rm -f test.xml -+ -+case "$mode" in -+ gdb) -+ echo "break malloc_error_break" >.gdbcmds -+ echo "set env DYLD_INSERT_LIBRARIES /usr/lib/libgmalloc.dylib" >>.gdbcmds -+ echo "run $framed test.xml $files >test.html 2>test.log" >>.gdbcmds -+ gdb -x .gdbcmds ../mxmldoc-static -+ ;; -+ -+ valgrind) -+ valgrind --log-fd=3 --leak-check=yes \ -+ ../mxmldoc-static $framed test.xml $files \ -+ >test.html 2>test.log 3>test.valgrind -+ ;; -+ -+ *) -+ ../mxmldoc-static $framed test.xml $files >test.html 2>test.log -+ ;; -+esac -+ -diff -Naur mxml-2.6/test/enum.cxx mxml-2.6-haiku/test/enum.cxx ---- mxml-2.6/test/enum.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/enum.cxx 2009-05-05 04:43:18.000000000 +0000 -@@ -0,0 +1,17 @@ -+typedef enum foo_enum_e /* Sample enumeration type */ -+{ -+ FOO_ONE, /* One fish */ -+ FOO_TWO, /* Two fish */ -+ FOO_RED, /* Red fish */ -+ FOO_BLUE, /* Blue fish */ -+ FOO_PRIVATE /* Private fish @private@ */ -+} foo_enum_t; -+ -+typedef enum foo_enum2_e /* Sample enumeration type #2 */ -+{ -+ FOO2_ONE, /* One fish #2 */ -+ FOO2_TWO, /* Two fish #2 */ -+ FOO2_RED, /* Red fish #2 */ -+ FOO2_BLUE, /* Blue fish #2 */ -+ FOO2_PRIVATE /* Private fish #2 @private@ */ -+} foo_enum2_t; -diff -Naur mxml-2.6/test/function.cxx mxml-2.6-haiku/test/function.cxx ---- mxml-2.6/test/function.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/function.cxx 2008-01-27 08:01:43.000000000 +0000 -@@ -0,0 +1,107 @@ -+/* -+ * 'foo_void_function()' - Do foo with bar. -+ * -+ * Use the @link foo_float_function@ or @link foo_int_function@ functions -+ * instead. Pass @code NULL@ for "three" then there is no string to print. -+ * -+ * @deprecated@ -+ */ -+ -+void -+foo_void_function(int one, /* I - Integer */ -+ float *two, /* O - Real number */ -+ const char *three) /* I - String */ -+{ -+ if (one) -+ { -+ puts("Hello, World!"); -+ } -+ else -+ puts(three); -+ -+ *two = 2.0f; -+} -+ -+ -+/* -+ * 'foo_float_function()' - Do foo with bar. -+ * -+ * @since 1.2@ -+ */ -+ -+float /* O - Real number */ -+foo_float_function(int one, /* I - Integer */ -+ const char *two) /* I - String */ -+{ -+ if (one) -+ { -+ puts("Hello, World!"); -+ } -+ else -+ puts(two); -+ -+ return (2.0f); -+} -+ -+ -+/* -+ * 'foo_default_string()' - Do something with a defaulted string arg. -+ */ -+ -+int /* O - Integer value */ -+foo_default_string(int one, /* I - Integer */ -+ const char *two = "2") -+ /* I - String */ -+{ -+ if (one) -+ { -+ puts("Hello, World!"); -+ } -+ else -+ puts(two); -+ -+ return (2); -+} -+ -+ -+/* -+ * 'foo_default_int()' - Do something with a defaulted int arg. -+ */ -+ -+int /* O - Integer value */ -+foo_default_int(int one, /* I - Integer */ -+ int two = 2) /* I - Integer */ -+{ -+ if (one) -+ { -+ puts("Hello, World!"); -+ } -+ else -+ puts(two); -+ -+ return (2); -+} -+ -+ -+/* -+ * 'foo_void_func()' - Function taking no arguments. -+ */ -+ -+void -+foo_void_func(void) -+{ -+ puts("foo_void_func()"); -+} -+ -+ -+/* -+ * 'foo_private_func()' - Private function. -+ * -+ * @private@ -+ */ -+ -+void -+foo_private_func(void) -+{ -+ puts("foo_private_func()"); -+} -diff -Naur mxml-2.6/test/functype.cxx mxml-2.6-haiku/test/functype.cxx ---- mxml-2.6/test/functype.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/functype.cxx 2005-09-29 02:20:19.000000000 +0000 -@@ -0,0 +1 @@ -+typedef int (*foo_func_t)(void *foo, int bar); /**** Foo function type ****/ -diff -Naur mxml-2.6/test/struct.cxx mxml-2.6-haiku/test/struct.cxx ---- mxml-2.6/test/struct.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/struct.cxx 2008-01-26 20:50:28.000000000 +0000 -@@ -0,0 +1,55 @@ -+typedef struct foo_s /* Foo structure */ -+{ -+ float foo; /* Real number */ -+ int bar; /* Integer */ -+ -+ foo_s(float f, int b); -+ ~foo_s(); -+ -+ // 'get_bar()' - Get the value of bar. -+ int // O - Value of bar -+ get_bar() -+ { -+ return (bar); -+ } -+ -+ // 'get_foo()' - Get the value of foo. -+ float // O - Value of foo -+ get_foo() -+ { -+ return (foo); -+ } -+ -+ // 'set_bar()' - Set the value of bar. -+ void -+ set_bar(int b) // I - Value of bar -+ { -+ bar = b; -+ } -+ -+ // 'set_foo()' - Set the value of foo. -+ void -+ set_foo(float f) // I - Value of foo -+ { -+ foo = f; -+ } -+} foo_t; -+ -+// 'foo_s::foo_s()' - Create a foo_s structure. -+foo_s::foo_s(float f, // I - Value of foo -+ int b) // I - Value of bar -+{ -+ foo = f; -+ bar = b; -+} -+ -+// 'foo_s::~foo_s()' - Destroy a foo_s structure. -+foo_s::~foo_s() -+{ -+} -+ -+typedef struct foo_private_s /* @private@ */ -+{ -+ int a; /* Value of "a" */ -+ char b[255]; /* Value of "b" */ -+} foo_private_t; -diff -Naur mxml-2.6/test/type.cxx mxml-2.6-haiku/test/type.cxx ---- mxml-2.6/test/type.cxx 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test/type.cxx 2005-11-30 15:31:58.000000000 +0000 -@@ -0,0 +1,3 @@ -+typedef int foo_simple_t; /* Simple integer type */ -+ -+typedef int foo_simple_private_t; /* @private@ */ -diff -Naur mxml-2.6/test.xml mxml-2.6-haiku/test.xml ---- mxml-2.6/test.xml 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/test.xml 2005-01-29 17:03:33.000000000 +0000 -@@ -0,0 +1,29 @@ -+ -+ -+ -+ 123 -+ Now is the time for all good men to come to the aid of their -+country. -+ -+ -+ -diff -Naur mxml-2.6/testmxml.c mxml-2.6-haiku/testmxml.c ---- mxml-2.6/testmxml.c 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/testmxml.c 2009-02-05 06:06:11.000000000 +0000 -@@ -0,0 +1,748 @@ -+/* -+ * "$Id: testmxml.c 381 2009-02-05 06:06:11Z mike $" -+ * -+ * Test program for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2007 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Contents: -+ * -+ * main() - Main entry for test program. -+ * sax_cb() - SAX callback. -+ * type_cb() - XML data type callback for mxmlLoadFile()... -+ * whitespace_cb() - Let the mxmlSaveFile() function know when to insert -+ * newlines and tabs... -+ */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include "config.h" -+#include "mxml.h" -+#ifndef WIN32 -+# include -+#endif /* !WIN32 */ -+#include -+#ifndef O_BINARY -+# define O_BINARY 0 -+#endif /* !O_BINARY */ -+ -+ -+/* -+ * Globals... -+ */ -+ -+int event_counts[6]; -+ -+ -+/* -+ * Local functions... -+ */ -+ -+void sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *data); -+mxml_type_t type_cb(mxml_node_t *node); -+const char *whitespace_cb(mxml_node_t *node, int where); -+ -+ -+/* -+ * 'main()' - Main entry for test program. -+ */ -+ -+int /* O - Exit status */ -+main(int argc, /* I - Number of command-line args */ -+ char *argv[]) /* I - Command-line args */ -+{ -+ int i; /* Looping var */ -+ FILE *fp; /* File to read */ -+ int fd; /* File descriptor */ -+ mxml_node_t *tree, /* XML tree */ -+ *node; /* Node which should be in test.xml */ -+ mxml_index_t *ind; /* XML index */ -+ char buffer[16384]; /* Save string */ -+ static const char *types[] = /* Strings for node types */ -+ { -+ "MXML_ELEMENT", -+ "MXML_INTEGER", -+ "MXML_OPAQUE", -+ "MXML_REAL", -+ "MXML_TEXT" -+ }; -+ -+ -+ /* -+ * Check arguments... -+ */ -+ -+ if (argc != 2) -+ { -+ fputs("Usage: testmxml filename.xml\n", stderr); -+ return (1); -+ } -+ -+ /* -+ * Test the basic functionality... -+ */ -+ -+ tree = mxmlNewElement(MXML_NO_PARENT, "element"); -+ -+ if (!tree) -+ { -+ fputs("ERROR: No parent node in basic test!\n", stderr); -+ return (1); -+ } -+ -+ if (tree->type != MXML_ELEMENT) -+ { -+ fprintf(stderr, "ERROR: Parent has type %s (%d), expected MXML_ELEMENT!\n", -+ tree->type < MXML_ELEMENT || tree->type > MXML_TEXT ? -+ "UNKNOWN" : types[tree->type], tree->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (strcmp(tree->value.element.name, "element")) -+ { -+ fprintf(stderr, "ERROR: Parent value is \"%s\", expected \"element\"!\n", -+ tree->value.element.name); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlNewInteger(tree, 123); -+ mxmlNewOpaque(tree, "opaque"); -+ mxmlNewReal(tree, 123.4f); -+ mxmlNewText(tree, 1, "text"); -+ -+ mxmlLoadString(tree, "string string string", -+ MXML_NO_CALLBACK); -+ mxmlLoadString(tree, "1 2 3", -+ MXML_INTEGER_CALLBACK); -+ mxmlLoadString(tree, "1.0 2.0 3.0", -+ MXML_REAL_CALLBACK); -+ mxmlLoadString(tree, "opaque opaque opaque", -+ MXML_OPAQUE_CALLBACK); -+ -+ node = tree->child; -+ -+ if (!node) -+ { -+ fputs("ERROR: No first child node in basic test!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->type != MXML_INTEGER) -+ { -+ fprintf(stderr, "ERROR: First child has type %s (%d), expected MXML_INTEGER!\n", -+ node->type < MXML_ELEMENT || node->type > MXML_TEXT ? -+ "UNKNOWN" : types[node->type], node->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->value.integer != 123) -+ { -+ fprintf(stderr, "ERROR: First child value is %d, expected 123!\n", -+ node->value.integer); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ node = node->next; -+ -+ if (!node) -+ { -+ fputs("ERROR: No second child node in basic test!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->type != MXML_OPAQUE) -+ { -+ fprintf(stderr, "ERROR: Second child has type %s (%d), expected MXML_OPAQUE!\n", -+ node->type < MXML_ELEMENT || node->type > MXML_TEXT ? -+ "UNKNOWN" : types[node->type], node->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (!node->value.opaque || strcmp(node->value.opaque, "opaque")) -+ { -+ fprintf(stderr, "ERROR: Second child value is \"%s\", expected \"opaque\"!\n", -+ node->value.opaque ? node->value.opaque : "(null)"); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ node = node->next; -+ -+ if (!node) -+ { -+ fputs("ERROR: No third child node in basic test!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->type != MXML_REAL) -+ { -+ fprintf(stderr, "ERROR: Third child has type %s (%d), expected MXML_REAL!\n", -+ node->type < MXML_ELEMENT || node->type > MXML_TEXT ? -+ "UNKNOWN" : types[node->type], node->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->value.real != 123.4f) -+ { -+ fprintf(stderr, "ERROR: Third child value is %f, expected 123.4!\n", -+ node->value.real); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ node = node->next; -+ -+ if (!node) -+ { -+ fputs("ERROR: No fourth child node in basic test!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->type != MXML_TEXT) -+ { -+ fprintf(stderr, "ERROR: Fourth child has type %s (%d), expected MXML_TEXT!\n", -+ node->type < MXML_ELEMENT || node->type > MXML_TEXT ? -+ "UNKNOWN" : types[node->type], node->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (!node->value.text.whitespace || -+ !node->value.text.string || strcmp(node->value.text.string, "text")) -+ { -+ fprintf(stderr, "ERROR: Fourth child value is %d,\"%s\", expected 1,\"text\"!\n", -+ node->value.text.whitespace, -+ node->value.text.string ? node->value.text.string : "(null)"); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ for (i = 0; i < 4; i ++) -+ { -+ node = node->next; -+ -+ if (!node) -+ { -+ fprintf(stderr, "ERROR: No group #%d child node in basic test!\n", i + 1); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (node->type != MXML_ELEMENT) -+ { -+ fprintf(stderr, "ERROR: Group child #%d has type %s (%d), expected MXML_ELEMENT!\n", -+ i + 1, node->type < MXML_ELEMENT || node->type > MXML_TEXT ? -+ "UNKNOWN" : types[node->type], node->type); -+ mxmlDelete(tree); -+ return (1); -+ } -+ } -+ -+ /* -+ * Test indices... -+ */ -+ -+ ind = mxmlIndexNew(tree, NULL, NULL); -+ if (!ind) -+ { -+ fputs("ERROR: Unable to create index of all nodes!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (ind->num_nodes != 5) -+ { -+ fprintf(stderr, "ERROR: Index of all nodes contains %d " -+ "nodes; expected 5!\n", ind->num_nodes); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexReset(ind); -+ if (!mxmlIndexFind(ind, "group", NULL)) -+ { -+ fputs("ERROR: mxmlIndexFind for \"group\" failed!\n", stderr); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexDelete(ind); -+ -+ ind = mxmlIndexNew(tree, "group", NULL); -+ if (!ind) -+ { -+ fputs("ERROR: Unable to create index of groups!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (ind->num_nodes != 4) -+ { -+ fprintf(stderr, "ERROR: Index of groups contains %d " -+ "nodes; expected 4!\n", ind->num_nodes); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexReset(ind); -+ if (!mxmlIndexEnum(ind)) -+ { -+ fputs("ERROR: mxmlIndexEnum failed!\n", stderr); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexDelete(ind); -+ -+ ind = mxmlIndexNew(tree, NULL, "type"); -+ if (!ind) -+ { -+ fputs("ERROR: Unable to create index of type attributes!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (ind->num_nodes != 3) -+ { -+ fprintf(stderr, "ERROR: Index of type attributes contains %d " -+ "nodes; expected 3!\n", ind->num_nodes); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexReset(ind); -+ if (!mxmlIndexFind(ind, NULL, "string")) -+ { -+ fputs("ERROR: mxmlIndexFind for \"string\" failed!\n", stderr); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexDelete(ind); -+ -+ ind = mxmlIndexNew(tree, "group", "type"); -+ if (!ind) -+ { -+ fputs("ERROR: Unable to create index of elements and attributes!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (ind->num_nodes != 3) -+ { -+ fprintf(stderr, "ERROR: Index of elements and attributes contains %d " -+ "nodes; expected 3!\n", ind->num_nodes); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexReset(ind); -+ if (!mxmlIndexFind(ind, "group", "string")) -+ { -+ fputs("ERROR: mxmlIndexFind for \"string\" failed!\n", stderr); -+ mxmlIndexDelete(ind); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ mxmlIndexDelete(ind); -+ -+ /* -+ * Check the mxmlDelete() works properly... -+ */ -+ -+ for (i = 0; i < 8; i ++) -+ { -+ if (tree->child) -+ mxmlDelete(tree->child); -+ else -+ { -+ fprintf(stderr, "ERROR: Child pointer prematurely NULL on child #%d\n", -+ i + 1); -+ mxmlDelete(tree); -+ return (1); -+ } -+ } -+ -+ if (tree->child) -+ { -+ fputs("ERROR: Child pointer not NULL after deleting all children!\n", stderr); -+ return (1); -+ } -+ -+ if (tree->last_child) -+ { -+ fputs("ERROR: Last child pointer not NULL after deleting all children!\n", stderr); -+ return (1); -+ } -+ -+ mxmlDelete(tree); -+ -+ /* -+ * Open the file... -+ */ -+ -+ if (argv[1][0] == '<') -+ tree = mxmlLoadString(NULL, argv[1], type_cb); -+ else if ((fp = fopen(argv[1], "rb")) == NULL) -+ { -+ perror(argv[1]); -+ return (1); -+ } -+ else -+ { -+ /* -+ * Read the file... -+ */ -+ -+ tree = mxmlLoadFile(NULL, fp, type_cb); -+ -+ fclose(fp); -+ } -+ -+ if (!tree) -+ { -+ fputs("Unable to read XML file!\n", stderr); -+ return (1); -+ } -+ -+ if (!strcmp(argv[1], "test.xml")) -+ { -+ /* -+ * Verify that mxmlFindElement() and indirectly mxmlWalkNext() work -+ * properly... -+ */ -+ -+ if ((node = mxmlFindElement(tree, tree, "choice", NULL, NULL, -+ MXML_DESCEND)) == NULL) -+ { -+ fputs("Unable to find first element in XML tree!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ if (!mxmlFindElement(node, tree, "choice", NULL, NULL, MXML_NO_DESCEND)) -+ { -+ fputs("Unable to find second element in XML tree!\n", stderr); -+ mxmlDelete(tree); -+ return (1); -+ } -+ } -+ -+ /* -+ * Print the XML tree... -+ */ -+ -+ mxmlSaveFile(tree, stdout, whitespace_cb); -+ -+ /* -+ * Save the XML tree to a string and print it... -+ */ -+ -+ if (mxmlSaveString(tree, buffer, sizeof(buffer), whitespace_cb) > 0) -+ fputs(buffer, stderr); -+ -+ /* -+ * Delete the tree... -+ */ -+ -+ mxmlDelete(tree); -+ -+ /* -+ * Read from/write to file descriptors... -+ */ -+ -+ if (argv[1][0] != '<') -+ { -+ /* -+ * Open the file again... -+ */ -+ -+ if ((fd = open(argv[1], O_RDONLY | O_BINARY)) < 0) -+ { -+ perror(argv[1]); -+ return (1); -+ } -+ -+ /* -+ * Read the file... -+ */ -+ -+ tree = mxmlLoadFd(NULL, fd, type_cb); -+ -+ close(fd); -+ -+ /* -+ * Create filename.xmlfd... -+ */ -+ -+ snprintf(buffer, sizeof(buffer), "%sfd", argv[1]); -+ -+ if ((fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666)) < 0) -+ { -+ perror(buffer); -+ mxmlDelete(tree); -+ return (1); -+ } -+ -+ /* -+ * Write the file... -+ */ -+ -+ mxmlSaveFd(tree, fd, whitespace_cb); -+ -+ close(fd); -+ -+ /* -+ * Delete the tree... -+ */ -+ -+ mxmlDelete(tree); -+ } -+ -+ /* -+ * Test SAX methods... -+ */ -+ -+ memset(event_counts, 0, sizeof(event_counts)); -+ -+ if (argv[1][0] == '<') -+ mxmlSAXLoadString(NULL, argv[1], type_cb, sax_cb, NULL); -+ else if ((fp = fopen(argv[1], "rb")) == NULL) -+ { -+ perror(argv[1]); -+ return (1); -+ } -+ else -+ { -+ /* -+ * Read the file... -+ */ -+ -+ mxmlSAXLoadFile(NULL, fp, type_cb, sax_cb, NULL); -+ -+ fclose(fp); -+ } -+ -+ if (!strcmp(argv[1], "test.xml")) -+ { -+ if (event_counts[MXML_SAX_CDATA] != 1) -+ { -+ fprintf(stderr, "MXML_SAX_CDATA seen %d times, expected 1 times!\n", -+ event_counts[MXML_SAX_CDATA]); -+ return (1); -+ } -+ -+ if (event_counts[MXML_SAX_COMMENT] != 1) -+ { -+ fprintf(stderr, "MXML_SAX_COMMENT seen %d times, expected 1 times!\n", -+ event_counts[MXML_SAX_COMMENT]); -+ return (1); -+ } -+ -+ if (event_counts[MXML_SAX_DATA] != 61) -+ { -+ fprintf(stderr, "MXML_SAX_DATA seen %d times, expected 61 times!\n", -+ event_counts[MXML_SAX_DATA]); -+ return (1); -+ } -+ -+ if (event_counts[MXML_SAX_DIRECTIVE] != 1) -+ { -+ fprintf(stderr, "MXML_SAX_DIRECTIVE seen %d times, expected 1 times!\n", -+ event_counts[MXML_SAX_DIRECTIVE]); -+ return (1); -+ } -+ -+ if (event_counts[MXML_SAX_ELEMENT_CLOSE] != 20) -+ { -+ fprintf(stderr, "MXML_SAX_ELEMENT_CLOSE seen %d times, expected 20 times!\n", -+ event_counts[MXML_SAX_ELEMENT_CLOSE]); -+ return (1); -+ } -+ -+ if (event_counts[MXML_SAX_ELEMENT_OPEN] != 20) -+ { -+ fprintf(stderr, "MXML_SAX_ELEMENT_OPEN seen %d times, expected 20 times!\n", -+ event_counts[MXML_SAX_ELEMENT_OPEN]); -+ return (1); -+ } -+ } -+ -+ /* -+ * Return... -+ */ -+ -+ return (0); -+} -+ -+ -+/* -+ * 'sax_cb()' - Process nodes via SAX. -+ */ -+ -+void -+sax_cb(mxml_node_t *node, /* I - Current node */ -+ mxml_sax_event_t event, /* I - SAX event */ -+ void *data) /* I - SAX user data */ -+{ -+ /* -+ * This SAX callback just counts the different events. -+ */ -+ -+ event_counts[event] ++; -+} -+ -+ -+/* -+ * 'type_cb()' - XML data type callback for mxmlLoadFile()... -+ */ -+ -+mxml_type_t /* O - Data type */ -+type_cb(mxml_node_t *node) /* I - Element node */ -+{ -+ const char *type; /* Type string */ -+ -+ -+ /* -+ * You can lookup attributes and/or use the element name, hierarchy, etc... -+ */ -+ -+ if ((type = mxmlElementGetAttr(node, "type")) == NULL) -+ type = node->value.element.name; -+ -+ if (!strcmp(type, "integer")) -+ return (MXML_INTEGER); -+ else if (!strcmp(type, "opaque") || !strcmp(type, "pre")) -+ return (MXML_OPAQUE); -+ else if (!strcmp(type, "real")) -+ return (MXML_REAL); -+ else -+ return (MXML_TEXT); -+} -+ -+ -+/* -+ * 'whitespace_cb()' - Let the mxmlSaveFile() function know when to insert -+ * newlines and tabs... -+ */ -+ -+const char * /* O - Whitespace string or NULL */ -+whitespace_cb(mxml_node_t *node, /* I - Element node */ -+ int where) /* I - Open or close tag? */ -+{ -+ mxml_node_t *parent; /* Parent node */ -+ int level; /* Indentation level */ -+ const char *name; /* Name of element */ -+ static const char *tabs = "\t\t\t\t\t\t\t\t"; -+ /* Tabs for indentation */ -+ -+ -+ /* -+ * We can conditionally break to a new line before or after any element. -+ * These are just common HTML elements... -+ */ -+ -+ name = node->value.element.name; -+ -+ if (!strcmp(name, "html") || !strcmp(name, "head") || !strcmp(name, "body") || -+ !strcmp(name, "pre") || !strcmp(name, "p") || -+ !strcmp(name, "h1") || !strcmp(name, "h2") || !strcmp(name, "h3") || -+ !strcmp(name, "h4") || !strcmp(name, "h5") || !strcmp(name, "h6")) -+ { -+ /* -+ * Newlines before open and after close... -+ */ -+ -+ if (where == MXML_WS_BEFORE_OPEN || where == MXML_WS_AFTER_CLOSE) -+ return ("\n"); -+ } -+ else if (!strcmp(name, "dl") || !strcmp(name, "ol") || !strcmp(name, "ul")) -+ { -+ /* -+ * Put a newline before and after list elements... -+ */ -+ -+ return ("\n"); -+ } -+ else if (!strcmp(name, "dd") || !strcmp(name, "dt") || !strcmp(name, "li")) -+ { -+ /* -+ * Put a tab before
    • 's,
      's, and
      's, and a newline after them... -+ */ -+ -+ if (where == MXML_WS_BEFORE_OPEN) -+ return ("\t"); -+ else if (where == MXML_WS_AFTER_CLOSE) -+ return ("\n"); -+ } -+ else if (!strncmp(name, "?xml", 4)) -+ { -+ if (where == MXML_WS_AFTER_OPEN) -+ return ("\n"); -+ else -+ return (NULL); -+ } -+ else if (where == MXML_WS_BEFORE_OPEN || -+ ((!strcmp(name, "choice") || !strcmp(name, "option")) && -+ where == MXML_WS_BEFORE_CLOSE)) -+ { -+ for (level = -1, parent = node->parent; -+ parent; -+ level ++, parent = parent->parent); -+ -+ if (level > 8) -+ level = 8; -+ else if (level < 0) -+ level = 0; -+ -+ return (tabs + 8 - level); -+ } -+ else if (where == MXML_WS_AFTER_CLOSE || -+ ((!strcmp(name, "group") || !strcmp(name, "option") || -+ !strcmp(name, "choice")) && -+ where == MXML_WS_AFTER_OPEN)) -+ return ("\n"); -+ else if (where == MXML_WS_AFTER_OPEN && !node->child) -+ return ("\n"); -+ -+ /* -+ * Return NULL for no added whitespace... -+ */ -+ -+ return (NULL); -+} -+ -+ -+/* -+ * End of "$Id: testmxml.c 381 2009-02-05 06:06:11Z mike $". -+ */ -diff -Naur mxml-2.6/vcnet/config.h mxml-2.6-haiku/vcnet/config.h ---- mxml-2.6/vcnet/config.h 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/config.h 2009-04-18 17:05:52.000000000 +0000 -@@ -0,0 +1,125 @@ -+/* -+ * "$Id: config.h 387 2009-04-18 17:05:52Z mike $" -+ * -+ * Configuration file for Mini-XML, a small XML-like file parsing library. -+ * -+ * Copyright 2003-2009 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 -+ * License as published by the Free Software Foundation; either -+ * version 2, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ */ -+ -+/* -+ * Beginning with VC2005, Microsoft breaks ISO C and POSIX conformance -+ * by deprecating a number of functions in the name of security, even -+ * when many of the affected functions are otherwise completely secure. -+ * The _CRT_SECURE_NO_DEPRECATE definition ensures that we won't get -+ * warnings from their use... -+ * -+ * Then Microsoft decided that they should ignore this in VC2008 and use -+ * yet another define (_CRT_SECURE_NO_WARNINGS) instead. Bastards. -+ */ -+ -+#define _CRT_SECURE_NO_DEPRECATE -+#define _CRT_SECURE_NO_WARNINGS -+ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+/* -+ * Microsoft also renames the POSIX functions to _name, and introduces -+ * a broken compatibility layer using the original names. As a result, -+ * random crashes can occur when, for example, strdup() allocates memory -+ * from a different heap than used by malloc() and free(). -+ * -+ * To avoid moronic problems like this, we #define the POSIX function -+ * names to the corresponding non-standard Microsoft names. -+ */ -+ -+#define close _close -+#define open _open -+#define read _read -+#define snprintf _snprintf -+#define strdup _strdup -+#define vsnprintf _vsnprintf -+#define write _write -+ -+ -+/* -+ * Version number... -+ */ -+ -+#define MXML_VERSION "Mini-XML v2.6" -+ -+ -+/* -+ * Inline function support... -+ */ -+ -+#define inline _inline -+ -+ -+/* -+ * Long long support... -+ */ -+ -+#define HAVE_LONG_LONG 1 -+ -+ -+/* -+ * Do we have the snprintf() and vsnprintf() functions? -+ */ -+ -+#define HAVE_SNPRINTF 1 -+#define HAVE_VSNPRINTF 1 -+ -+ -+/* -+ * Do we have the strXXX() functions? -+ */ -+ -+#define HAVE_STRDUP 1 -+ -+ -+/* -+ * Define prototypes for string functions as needed... -+ */ -+ -+# ifndef HAVE_STRDUP -+extern char *_mxml_strdup(const char *); -+# define strdup _mxml_strdup -+# endif /* !HAVE_STRDUP */ -+ -+extern char *_mxml_strdupf(const char *, ...); -+extern char *_mxml_vstrdupf(const char *, va_list); -+ -+# ifndef HAVE_SNPRINTF -+extern int _mxml_snprintf(char *, size_t, const char *, ...); -+# define snprintf _mxml_snprintf -+# endif /* !HAVE_SNPRINTF */ -+ -+# ifndef HAVE_VSNPRINTF -+extern int _mxml_vsnprintf(char *, size_t, const char *, va_list); -+# define vsnprintf _mxml_vsnprintf -+# endif /* !HAVE_VSNPRINTF */ -+ -+/* -+ * End of "$Id: config.h 387 2009-04-18 17:05:52Z mike $". -+ */ -diff -Naur mxml-2.6/vcnet/mxml.sln mxml-2.6-haiku/vcnet/mxml.sln ---- mxml-2.6/vcnet/mxml.sln 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/mxml.sln 2009-05-17 16:10:38.000000000 +0000 -@@ -0,0 +1,37 @@ -+Microsoft Visual Studio Solution File, Format Version 10.00 -+# Visual Studio 2008 -+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mxmldoc", "mxmldoc.vcproj", "{D909892E-520A-4322-9A47-DAEBDA9CC7A7}" -+ ProjectSection(ProjectDependencies) = postProject -+ {E5AA9476-9751-4654-8109-B1A2112D5E73} = {E5AA9476-9751-4654-8109-B1A2112D5E73} -+ EndProjectSection -+EndProject -+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mxml1", "mxml1.vcproj", "{E5AA9476-9751-4654-8109-B1A2112D5E73}" -+EndProject -+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testmxml", "testmxml.vcproj", "{75CAC6C4-A6BC-4935-A3C9-8F0AE0744227}" -+ ProjectSection(ProjectDependencies) = postProject -+ {E5AA9476-9751-4654-8109-B1A2112D5E73} = {E5AA9476-9751-4654-8109-B1A2112D5E73} -+ EndProjectSection -+EndProject -+Global -+ GlobalSection(SolutionConfigurationPlatforms) = preSolution -+ Debug|Win32 = Debug|Win32 -+ Release|Win32 = Release|Win32 -+ EndGlobalSection -+ GlobalSection(ProjectConfigurationPlatforms) = postSolution -+ {D909892E-520A-4322-9A47-DAEBDA9CC7A7}.Debug|Win32.ActiveCfg = Debug|Win32 -+ {D909892E-520A-4322-9A47-DAEBDA9CC7A7}.Debug|Win32.Build.0 = Debug|Win32 -+ {D909892E-520A-4322-9A47-DAEBDA9CC7A7}.Release|Win32.ActiveCfg = Release|Win32 -+ {D909892E-520A-4322-9A47-DAEBDA9CC7A7}.Release|Win32.Build.0 = Release|Win32 -+ {E5AA9476-9751-4654-8109-B1A2112D5E73}.Debug|Win32.ActiveCfg = Debug|Win32 -+ {E5AA9476-9751-4654-8109-B1A2112D5E73}.Debug|Win32.Build.0 = Debug|Win32 -+ {E5AA9476-9751-4654-8109-B1A2112D5E73}.Release|Win32.ActiveCfg = Release|Win32 -+ {E5AA9476-9751-4654-8109-B1A2112D5E73}.Release|Win32.Build.0 = Release|Win32 -+ {75CAC6C4-A6BC-4935-A3C9-8F0AE0744227}.Debug|Win32.ActiveCfg = Debug|Win32 -+ {75CAC6C4-A6BC-4935-A3C9-8F0AE0744227}.Debug|Win32.Build.0 = Debug|Win32 -+ {75CAC6C4-A6BC-4935-A3C9-8F0AE0744227}.Release|Win32.ActiveCfg = Release|Win32 -+ {75CAC6C4-A6BC-4935-A3C9-8F0AE0744227}.Release|Win32.Build.0 = Release|Win32 -+ EndGlobalSection -+ GlobalSection(SolutionProperties) = preSolution -+ HideSolutionNode = FALSE -+ EndGlobalSection -+EndGlobal -diff -Naur mxml-2.6/vcnet/mxml1.def mxml-2.6-haiku/vcnet/mxml1.def ---- mxml-2.6/vcnet/mxml1.def 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/mxml1.def 2007-12-06 06:07:50.000000000 +0000 -@@ -0,0 +1,59 @@ -+LIBRARY "MXML1" -+EXPORTS -+ _mxml_strdupf -+ _mxml_vstrdupf -+ mxml_ignore_cb -+ mxml_integer_cb -+ mxml_opaque_cb -+ mxml_real_cb -+ mxmlAdd -+ mxmlDelete -+ mxmlElementDeleteAttr -+ mxmlElementGetAttr -+ mxmlElementSetAttr -+ mxmlElementSetAttrf -+ mxmlEntityAddCallback -+ mxmlEntityGetName -+ mxmlEntityGetValue -+ mxmlEntityRemoveCallback -+ mxmlFindElement -+ mxmlIndexDelete -+ mxmlIndexEnum -+ mxmlIndexFind -+ mxmlIndexNew -+ mxmlIndexReset -+ mxmlLoadFd -+ mxmlLoadFile -+ mxmlLoadString -+ mxmlNewCDATA -+ mxmlNewCustom -+ mxmlNewElement -+ mxmlNewInteger -+ mxmlNewOpaque -+ mxmlNewReal -+ mxmlNewText -+ mxmlNewTextf -+ mxmlNewXML -+ mxmlRelease -+ mxmlRemove -+ mxmlRetain -+ mxmlSaveAllocString -+ mxmlSaveFd -+ mxmlSaveFile -+ mxmlSaveString -+ mxmlSAXLoadFd -+ mxmlSAXLoadFile -+ mxmlSAXLoadString -+ mxmlSetCDATA -+ mxmlSetCustom -+ mxmlSetCustomHandlers -+ mxmlSetElement -+ mxmlSetErrorCallback -+ mxmlSetInteger -+ mxmlSetOpaque -+ mxmlSetReal -+ mxmlSetText -+ mxmlSetTextf -+ mxmlSetWrapMargin -+ mxmlWalkNext -+ mxmlWalkPrev -diff -Naur mxml-2.6/vcnet/mxml1.vcproj mxml-2.6-haiku/vcnet/mxml1.vcproj ---- mxml-2.6/vcnet/mxml1.vcproj 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/mxml1.vcproj 2008-10-26 19:44:57.000000000 +0000 -@@ -0,0 +1,255 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff -Naur mxml-2.6/vcnet/mxmldoc.vcproj mxml-2.6-haiku/vcnet/mxmldoc.vcproj ---- mxml-2.6/vcnet/mxmldoc.vcproj 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/mxmldoc.vcproj 2008-10-26 19:44:57.000000000 +0000 -@@ -0,0 +1,203 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff -Naur mxml-2.6/vcnet/testmxml.vcproj mxml-2.6-haiku/vcnet/testmxml.vcproj ---- mxml-2.6/vcnet/testmxml.vcproj 1970-01-01 00:00:00.000000000 +0000 -+++ mxml-2.6-haiku/vcnet/testmxml.vcproj 2008-10-26 19:44:57.000000000 +0000 -@@ -0,0 +1,203 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ diff --git a/dev-cpp/mxml/mxml.OptionalPackageDescription b/dev-cpp/mxml/mxml.OptionalPackageDescription index 6f894c398..b02595277 100644 --- a/dev-cpp/mxml/mxml.OptionalPackageDescription +++ b/dev-cpp/mxml/mxml.OptionalPackageDescription @@ -1,5 +1,5 @@ Package: mxml Version: 2.6 Copyright: 2009 Pierre Sarrazin. -License: LGPL v2.0 -URL: http://www.minixml.org/index.php +License: GNU LGPL v2 +URL: http://www.minixml.org/index.php diff --git a/dev-cpp/mxml/patches/mxml-2.6.patch b/dev-cpp/mxml/patches/mxml-2.6.patch new file mode 100644 index 000000000..b886bdcf3 --- /dev/null +++ b/dev-cpp/mxml/patches/mxml-2.6.patch @@ -0,0 +1,1542 @@ +diff -urN mxml-2.6-orig/configure mxml-2.6/configure +--- mxml-2.6-orig/configure 2009-04-18 10:05:52.000000000 -0700 ++++ mxml-2.6/configure 2009-11-18 18:25:08.000000000 -0800 +@@ -4715,6 +4715,14 @@ + echo "${ECHO_T}yes" >&6; } + LIBMXML="libmxml.so.1.4" + DSO="\$(CC)" ++ DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi1.0,-soname,libmxml.so.1 -shared \$(OPTIM)" ++ ;; ++ ++ BeOS | Haiku) ++ { echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6; } ++ LIBMXML="libmxml.so.1.4" ++ DSO="\$(CC)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)" + LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)" + ;; +@@ -4821,6 +4829,10 @@ + # BSD, Darwin (MacOS X), and Linux + mandir="/usr/share/man" + ;; ++ BeOS* | Haiku*) ++ # BeOS, Haiku ++ mandir="/boot/common/share/man" ++ ;; + IRIX*) + # SGI IRIX + mandir="/usr/share/catman/u_man" +diff -urN mxml-2.6-orig/mxml.list mxml-2.6/mxml.list +--- mxml-2.6-orig/mxml.list 1969-12-31 16:00:00.000000000 -0800 ++++ mxml-2.6/mxml.list 2009-11-18 18:25:08.000000000 -0800 +@@ -0,0 +1,107 @@ ++# ++# "$Id: mxml.list.in 399 2009-05-17 17:20:51Z mike $" ++# ++# EPM software list file for Mini-XML, a small XML library. ++# ++# Copyright 2003-2009 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 ++# License as published by the Free Software Foundation; either ++# version 2, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++ ++# Directories... ++$prefix=/boot/common ++$exec_prefix=/boot/common ++$bindir=${exec_prefix}/bin ++$datarootdir=${prefix}/share ++$docdir=${datarootdir}/doc/mxml ++$includedir=${prefix}/include ++$libdir=${exec_prefix}/lib ++$mandir=${datarootdir}/man ++$srcdir=. ++ ++$PICFLAG=1 ++ ++# Product information ++%product mxml ++%copyright 2003-2009 by Michael Sweet ++%vendor Michael Sweet ++%license ${srcdir}/COPYING ++%readme ${srcdir}/README ++%version 2.6 ++ ++%description < +- +- +- Add a node to a tree. +- +-Adds the specified node to the parent. If the child argument is not +-NULL, puts the new node before or after the specified child depending +-on the value of the where argument. If the child argument is NULL, +-puts the new node at the beginning of the child list (MXML_ADD_BEFORE) +-or at the end of the child list (MXML_ADD_AFTER). The constant +-MXML_ADD_TO_PARENT can be used to specify a NULL child pointer. +- +- mxml_node_t * +- Parent node +- +- +- int +- Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER +- +- +- mxml_node_t * +- Child node for where or MXML_ADD_TO_PARENT +- +- +- mxml_node_t * +- Node to add +- +- +- +- Delete a node and all of its children. +- +-If the specified node has a parent, this function first removes the +-node from its parent using the mxmlRemove() function. +- +- mxml_node_t * +- Node to delete +- +- +- +- Delete an attribute. +- +-@since Mini-XML 2.4@ +- +- mxml_node_t * +- Element +- +- +- const char * +- Attribute name +- +- +- +- +- const char * +- Attribute value or NULL +- +- Get an attribute. +- +-This function returns NULL if the node is not an element or the +-named attribute does not exist. +- +- mxml_node_t * +- Element node +- +- +- const char * +- Name of attribute +- +- +- +- Set an attribute. +- +-If the named attribute already exists, the value of the attribute +-is replaced by the new string value. The string value is copied +-into the element node. This function does nothing if the node is +-not an element. +- +- mxml_node_t * +- Element node +- +- +- const char * +- Name of attribute +- +- +- const char * +- Attribute value +- +- +- +- Set an attribute with a formatted value. +- +-If the named attribute already exists, the value of the attribute +-is replaced by the new formatted string. The formatted string value is +-copied into the element node. This function does nothing if the node +-is not an element. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Element node +- +- +- const char * +- Name of attribute +- +- +- const char * +- Printf-style attribute value +- +- +- Additional arguments as needed +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Add a callback to convert entities to Unicode. +- +- mxml_entity_cb_t +- Callback function to add +- +- +- +- +- const char * +- Entity name or NULL +- +- Get the name that corresponds to the character value. +- +-If val does not need to be represented by a named entity, NULL is returned. +- +- int +- Character value +- +- +- +- +- int +- Character value or -1 on error +- +- Get the character corresponding to a named entity. +- +-The entity name can also be a numeric constant. -1 is returned if the +-name is not known. +- +- const char * +- Entity name +- +- +- +- Remove a callback. +- +- mxml_entity_cb_t +- Callback function to remove +- +- +- +- +- mxml_node_t * +- Element node or NULL +- +- Find the named element. +- +-The search is constrained by the name, attribute name, and value; any +-NULL names or values are treated as wildcards, so different kinds of +-searches can be implemented by looking for all elements of a given name +-or all elements with a specific attribute. The descend argument determines +-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. +- +- mxml_node_t * +- Current node +- +- +- mxml_node_t * +- Top node +- +- +- const char * +- Element name or NULL for any +- +- +- const char * +- Attribute name, or NULL for none +- +- +- const char * +- Attribute value, or NULL for any +- +- +- int +- Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST +- +- +- +- Delete an index. +- +- mxml_index_t * +- Index to delete +- +- +- +- +- mxml_node_t * +- Next node or NULL if there is none +- +- Return the next node in the index. +- +-Nodes are returned in the sorted order of the index. +- +- mxml_index_t * +- Index to enumerate +- +- +- +- +- mxml_node_t * +- Node or NULL if none found +- +- Find the next matching node. +- +-You should call mxmlIndexReset() prior to using 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(). +- +- mxml_index_t * +- Index to search +- +- +- const char * +- Element name to find, if any +- +- +- const char * +- Attribute value, if any +- +- +- +- +- mxml_index_t * +- New index +- +- Create a new index. +- +-The index will contain all nodes that contain the named element and/or +-attribute. If both "element" and "attr" are NULL, then the index will +-contain a sorted list of the elements in the node tree. Nodes are +-sorted by element name and optionally by attribute value if the "attr" +-argument is not NULL. +- +- mxml_node_t * +- XML node tree +- +- +- const char * +- Element to index or NULL for all +- +- +- const char * +- Attribute to index or NULL for none +- +- +- +- +- mxml_node_t * +- First node or NULL if there is none +- +- Reset the enumeration/find pointer in the index and +-return the first node in the index. +- +-This function should be called prior to using mxmlIndexEnum() or +-mxmlIndexFind() for the first time. +- +- mxml_index_t * +- Index to reset +- +- +- +- +- mxml_node_t * +- First node or NULL if the file could not be read. +- +- Load a file descriptor into an XML node tree. +- +-The nodes in the specified file are added to the specified top node. +-If no top node is provided, the XML file MUST be well-formed with a +-single parent node like <?xml> for the entire file. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +- mxml_node_t * +- Top node +- +- +- int +- File descriptor to read from +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- +- +- mxml_node_t * +- First node or NULL if the file could not be read. +- +- Load a file into an XML node tree. +- +-The nodes in the specified file are added to the specified top node. +-If no top node is provided, the XML file MUST be well-formed with a +-single parent node like <?xml> for the entire file. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +- mxml_node_t * +- Top node +- +- +- FILE * +- File to read from +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- +- +- mxml_node_t * +- First node or NULL if the string has errors. +- +- Load a string into an XML node tree. +- +-The nodes in the specified string are added to the specified top node. +-If no top node is provided, the XML string MUST be well-formed with a +-single parent node like <?xml> for the entire string. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +- mxml_node_t * +- Top node +- +- +- const char * +- String to load +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new CDATA node. +- +-The new CDATA node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-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. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- const char * +- Data string +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new custom data node. +- +-The new custom node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-element node has no parent. NULL can be passed when the data in the +-node is not dynamically allocated or is separately managed. +- +-@since Mini-XML 2.1@ +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- void * +- Pointer to data +- +- +- mxml_custom_destroy_cb_t +- Function to destroy data +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new element node. +- +-The new element node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-element node has no parent. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- const char * +- Name of element +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new integer node. +- +-The new integer node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-integer node has no parent. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- int +- Integer value +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new opaque string. +- +-The new opaque node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-opaque node has no parent. The opaque string must be nul-terminated and +-is copied into the new node. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- const char * +- Opaque string +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new real number node. +- +-The new real number node is added to the end of the specified parent's +-child list. The constant MXML_NO_PARENT can be used to specify that +-the new real number node has no parent. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- double +- Real number value +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new text fragment node. +- +-The new text node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-text node has no parent. The whitespace parameter is used to specify +-whether leading whitespace is present before the node. The text +-string must be nul-terminated and is copied into the new node. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- int +- 1 = leading whitespace, 0 = no whitespace +- +- +- const char * +- String +- +- +- +- +- mxml_node_t * +- New node +- +- Create a new formatted text fragment node. +- +-The new text node is added to the end of the specified parent's child +-list. The constant MXML_NO_PARENT can be used to specify that the new +-text node has no parent. The whitespace 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. +- +- mxml_node_t * +- Parent node or MXML_NO_PARENT +- +- +- int +- 1 = leading whitespace, 0 = no whitespace +- +- +- const char * +- Printf-style frmat string +- +- +- Additional args as needed +- +- +- +- +- mxml_node_t * +- New ?xml node +- +- Create a new XML document tree. +- +-The "version" argument specifies the version number to put in the +-?xml element node. If NULL, version 1.0 is assumed. +- +-@since Mini-XML 2.3@ +- +- const char * +- Version number to use +- +- +- +- +- int +- New reference count +- +- Release a node. +- +-When the reference count reaches zero, the node (and any children) +-is deleted via mxmlDelete(). +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Node +- +- +- +- Remove a node from its parent. +- +-Does not free memory used by the node - use mxmlDelete() for that. +-This function does nothing if the node has no parent. +- +- mxml_node_t * +- Node to remove +- +- +- +- +- int +- New reference count +- +- Retain a node. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Node +- +- +- +- +- mxml_node_t * +- First node or NULL if the file could not be read. +- +- Load a file descriptor into an XML node tree +-using a SAX callback. +- +-The nodes in the specified file are added to the specified top node. +-If no top node is provided, the XML file MUST be well-formed with a +-single parent node like <?xml> for the entire file. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +-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. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Top node +- +- +- int +- File descriptor to read from +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- mxml_sax_cb_t +- SAX callback or MXML_NO_CALLBACK +- +- +- void * +- SAX user data +- +- +- +- +- mxml_node_t * +- First node or NULL if the file could not be read. +- +- Load a file into an XML node tree +-using a SAX callback. +- +-The nodes in the specified file are added to the specified top node. +-If no top node is provided, the XML file MUST be well-formed with a +-single parent node like <?xml> for the entire file. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +-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. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Top node +- +- +- FILE * +- File to read from +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- mxml_sax_cb_t +- SAX callback or MXML_NO_CALLBACK +- +- +- void * +- SAX user data +- +- +- +- +- mxml_node_t * +- First node or NULL if the string has errors. +- +- Load a string into an XML node tree +-using a SAX callback. +- +-The nodes in the specified string are added to the specified top node. +-If no top node is provided, the XML string MUST be well-formed with a +-single parent node like <?xml> for the entire string. The callback +-function returns the value type that should be used for child nodes. +-If MXML_NO_CALLBACK is specified then all child nodes will be either +-MXML_ELEMENT or MXML_TEXT nodes. +- +-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. +- +-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. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Top node +- +- +- const char * +- String to load +- +- +- mxml_load_cb_t +- Callback function or MXML_NO_CALLBACK +- +- +- mxml_sax_cb_t +- SAX callback or MXML_NO_CALLBACK +- +- +- void * +- SAX user data +- +- +- +- +- char * +- Allocated string or NULL +- +- Save an XML node tree to an allocated string. +- +-This function returns a pointer to a string containing the textual +-representation of the XML node tree. The string should be freed +-using the free() function when you are done with it. NULL is returned +-if the node would produce an empty string or if the string cannot be +-allocated. +- +-The callback argument specifies a function that returns a whitespace +-string or NULL before and after each element. If MXML_NO_CALLBACK +-is specified, whitespace will only be added before MXML_TEXT nodes +-with leading whitespace and before attribute names inside opening +-element tags. +- +- mxml_node_t * +- Node to write +- +- +- mxml_save_cb_t +- Whitespace callback or MXML_NO_CALLBACK +- +- +- +- +- int +- 0 on success, -1 on error. +- +- Save an XML tree to a file descriptor. +- +-The callback argument specifies a function that returns a whitespace +-string or NULL before and after each element. If MXML_NO_CALLBACK +-is specified, whitespace will only be added before MXML_TEXT nodes +-with leading whitespace and before attribute names inside opening +-element tags. +- +- mxml_node_t * +- Node to write +- +- +- int +- File descriptor to write to +- +- +- mxml_save_cb_t +- Whitespace callback or MXML_NO_CALLBACK +- +- +- +- +- int +- 0 on success, -1 on error. +- +- Save an XML tree to a file. +- +-The callback argument specifies a function that returns a whitespace +-string or NULL before and after each element. If MXML_NO_CALLBACK +-is specified, whitespace will only be added before MXML_TEXT nodes +-with leading whitespace and before attribute names inside opening +-element tags. +- +- mxml_node_t * +- Node to write +- +- +- FILE * +- File to write to +- +- +- mxml_save_cb_t +- Whitespace callback or MXML_NO_CALLBACK +- +- +- +- +- int +- Size of string +- +- Save an XML node tree to a string. +- +-This function returns the total number of bytes that would be +-required for the string but only copies (bufsize - 1) characters +-into the specified buffer. +- +-The callback argument specifies a function that returns a whitespace +-string or NULL before and after each element. If MXML_NO_CALLBACK +-is specified, whitespace will only be added before MXML_TEXT nodes +-with leading whitespace and before attribute names inside opening +-element tags. +- +- mxml_node_t * +- Node to write +- +- +- char * +- String buffer +- +- +- int +- Size of string buffer +- +- +- mxml_save_cb_t +- Whitespace callback or MXML_NO_CALLBACK +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the element name of a CDATA node. +- +-The node is not changed if it is not a CDATA element node. +- +-@since Mini-XML 2.3@ +- +- mxml_node_t * +- Node to set +- +- +- const char * +- New data string +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the data and destructor of a custom data node. +- +-The node is not changed if it is not a custom node. +- +-@since Mini-XML 2.1@ +- +- mxml_node_t * +- Node to set +- +- +- void * +- New data pointer +- +- +- mxml_custom_destroy_cb_t +- New destructor function +- +- +- +- Set the handling functions for custom data. +- +-The load function accepts a node pointer and a data string and must +-return 0 on success and non-zero on error. +- +-The save function accepts a node pointer and must return a malloc'd +-string on success and NULL on error. +- +- mxml_custom_load_cb_t +- Load function +- +- +- mxml_custom_save_cb_t +- Save function +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the name of an element node. +- +-The node is not changed if it is not an element node. +- +- mxml_node_t * +- Node to set +- +- +- const char * +- New name string +- +- +- +- Set the error message callback. +- +- mxml_error_cb_t +- Error callback function +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the value of an integer node. +- +-The node is not changed if it is not an integer node. +- +- mxml_node_t * +- Node to set +- +- +- int +- Integer value +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the value of an opaque node. +- +-The node is not changed if it is not an opaque node. +- +- mxml_node_t * +- Node to set +- +- +- const char * +- Opaque string +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the value of a real number node. +- +-The node is not changed if it is not a real number node. +- +- mxml_node_t * +- Node to set +- +- +- double +- Real number value +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the value of a text node. +- +-The node is not changed if it is not a text node. +- +- mxml_node_t * +- Node to set +- +- +- int +- 1 = leading whitespace, 0 = no whitespace +- +- +- const char * +- String +- +- +- +- +- int +- 0 on success, -1 on failure +- +- Set the value of a text node to a formatted string. +- +-The node is not changed if it is not a text node. +- +- mxml_node_t * +- Node to set +- +- +- int +- 1 = leading whitespace, 0 = no whitespace +- +- +- const char * +- Printf-style format string +- +- +- Additional arguments as needed +- +- +- +- Set the the wrap margin when saving XML data. +- +-Wrapping is disabled when "column" is 0. +- +-@since Mini-XML 2.3@ +- +- int +- Column for wrapping, 0 to disable wrapping +- +- +- +- +- mxml_node_t * +- Next node or NULL +- +- Walk to the next logical node in the tree. +- +-The descend argument controls whether the first child is considered +-to be the next node. The top node argument constrains the walk to +-the node's children. +- +- mxml_node_t * +- Current node +- +- +- mxml_node_t * +- Top node +- +- +- int +- Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST +- +- +- +- +- mxml_node_t * +- Previous node or NULL +- +- Walk to the previous logical node in the tree. +- +-The descend argument controls whether the previous node's last child +-is considered to be the previous node. The top node argument constrains +-the walk to the node's children. +- +- mxml_node_t * +- Current node +- +- +- mxml_node_t * +- Top node +- +- +- int +- Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST +- +- +- +- An XML element attribute value. +- +- char * +- Attribute name +- +- +- char * +- Attribute value +- +- +- +- struct mxml_attr_s +- An XML element attribute value. +- +- +- void(*)(void *) +- Custom data destructor +- +- +- int(*)(mxml_node_t *, const char *) +- Custom data load callback function +- +- +- An XML custom value. @since Mini-XML 2.1@ +- +- void * +- Pointer to (allocated) custom data +- +- +- mxml_custom_destroy_cb_t +- Pointer to destructor function +- +- +- +- char *(*)(mxml_node_t *) +- Custom data save callback function +- +- +- struct mxml_custom_s +- An XML custom value. @since Mini-XML 2.1@ +- +- +- An XML element value. +- +- mxml_attr_t * +- Attributes +- +- +- char * +- Name of element +- +- +- int +- Number of attributes +- +- +- +- struct mxml_element_s +- An XML element value. +- +- +- int(*)(const char *) +- Entity callback function +- +- +- void(*)(const char *) +- Error callback function +- +- +- An XML node index. +- +- int +- Allocated nodes in index +- +- +- char * +- Attribute used for indexing or NULL +- +- +- int +- Current node +- +- +- mxml_node_t ** +- Node array +- +- +- int +- Number of nodes in index +- +- +- +- struct mxml_index_s +- An XML node index. +- +- +- mxml_type_t(*)(mxml_node_t *) +- Load callback function +- +- +- An XML node. +- +- struct mxml_node_s * +- First child node +- +- +- struct mxml_node_s * +- Last child node +- +- +- struct mxml_node_s * +- Next node under same parent +- +- +- struct mxml_node_s * +- Parent node +- +- +- struct mxml_node_s * +- Previous node under same parent +- +- +- int +- Use count +- +- +- mxml_type_t +- Node type +- +- +- void * +- User data +- +- +- mxml_value_t +- Node value +- +- +- +- struct mxml_node_s +- An XML node. +- +- +- const char *(*)(mxml_node_t *, int) +- Save callback function +- +- +- void(*)(mxml_node_t *, mxml_sax_event_t, void *) +- SAX callback function +- +- +- SAX event type. +- +- CDATA node +- +- +- Comment node +- +- +- Data node +- +- +- Processing directive node +- +- +- Element closed +- +- +- Element opened +- +- +- +- enum mxml_sax_event_e +- SAX event type. +- +- +- An XML text value. +- +- char * +- Fragment string +- +- +- int +- Leading whitespace? +- +- +- +- struct mxml_text_s +- An XML text value. +- +- +- The XML node type. +- +- Custom data @since Mini-XML 2.1@ +- +- +- XML element with attributes +- +- +- Ignore/throw away node @since Mini-XML 2.3@ +- +- +- Integer value +- +- +- Opaque string +- +- +- Real value +- +- +- Text fragment +- +- +- +- The XML node type. +- enum mxml_type_e +- +- +- union mxml_value_u +- An XML node value. +- +- +- An XML node value. +- +- mxml_custom_t +- Custom data @since Mini-XML 2.1@ +- +- +- mxml_element_t +- Element +- +- +- int +- Integer number +- +- +- char * +- Opaque string +- +- +- double +- Real number +- +- +- mxml_text_t +- Text fragment +- +- +- +diff -urN mxml-2.6-orig/mxmldoc.c mxml-2.6/mxmldoc.c +--- mxml-2.6-orig/mxmldoc.c 2009-05-05 06:38:00.000000000 -0700 ++++ mxml-2.6/mxmldoc.c 2009-11-18 18:21:26.000000000 -0800 +@@ -57,7 +57,9 @@ + #ifndef WIN32 + # include + # include ++#ifndef __HAIKU__ + # include ++#endif + # include + extern char **environ; + #endif /* !WIN32 */ +diff -urN mxml-2.6-orig/temp1.xmlfd mxml-2.6/temp1.xmlfd +--- mxml-2.6-orig/temp1.xmlfd 1969-12-31 16:00:00.000000000 -0800 ++++ mxml-2.6/temp1.xmlfd 2009-11-18 18:25:08.000000000 -0800 +@@ -0,0 +1,29 @@ ++ ++ ++ ++ 123 ++ Now is the time for all good men to come to the aid of their ++country. ++ ++ ++