From bb6fa214f4fff82d1d3eabd586aec2a7ea2f98a6 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 17 May 2004 02:14:54 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'web'. --- .cvsignore | 12 - ANNOUNCEMENT | 6 - CHANGES | 161 -- COPYING | 482 ----- Makefile.in | 261 --- README | 203 --- TODO | 16 - config.h.in | 70 - configure | 4161 -------------------------------------------- configure.in | 192 -- doc/.cvsignore | 7 - doc/advanced.html | 21 - doc/basics.html | 299 ---- doc/index.html | 408 ----- doc/install.html | 94 - doc/intro.html | 275 --- doc/license.html | 512 ------ doc/makedocs.sh | 29 - doc/mxml.book | 10 - doc/mxml.html | 2545 --------------------------- doc/mxml.man | 181 -- doc/mxml.pdf | Bin 621473 -> 0 bytes doc/mxmldoc.html | 378 ---- doc/mxmldoc.man | 48 - doc/mxmldoc.xsd | 188 -- doc/refapp.html | 9 - doc/reference.html | 1224 ------------- doc/relnotes.html | 251 --- makesrcdist | 51 - mxml-attr.c | 176 -- mxml-entity.c | 455 ----- mxml-file.c | 1936 --------------------- mxml-index.c | 644 ------- mxml-node.c | 636 ------- mxml-private.c | 132 -- mxml-search.c | 199 --- mxml-set.c | 224 --- mxml-string.c | 377 ---- mxml.h | 229 --- mxml.list.in | 95 - mxml.pc.in | 10 - mxml.spec | 99 -- mxml.xml | 844 --------- mxmldoc.c | 2752 ----------------------------- test.xml | 27 - test/.cvsignore | 5 - test/class.cxx | 83 - test/dotest.sh | 12 - test/enum.cxx | 7 - test/function.cxx | 76 - test/struct.cxx | 48 - testmxml.c | 556 ------ 52 files changed, 21716 deletions(-) delete mode 100644 .cvsignore delete mode 100644 ANNOUNCEMENT delete mode 100644 CHANGES delete mode 100644 COPYING delete mode 100644 Makefile.in delete mode 100644 README delete mode 100644 TODO delete mode 100644 config.h.in delete mode 100755 configure delete mode 100644 configure.in delete mode 100644 doc/.cvsignore delete mode 100644 doc/advanced.html delete mode 100644 doc/basics.html delete mode 100644 doc/index.html delete mode 100644 doc/install.html delete mode 100644 doc/intro.html delete mode 100644 doc/license.html delete mode 100755 doc/makedocs.sh delete mode 100644 doc/mxml.book delete mode 100644 doc/mxml.html delete mode 100644 doc/mxml.man delete mode 100644 doc/mxml.pdf delete mode 100644 doc/mxmldoc.html delete mode 100644 doc/mxmldoc.man delete mode 100644 doc/mxmldoc.xsd delete mode 100644 doc/refapp.html delete mode 100644 doc/reference.html delete mode 100644 doc/relnotes.html delete mode 100755 makesrcdist delete mode 100644 mxml-attr.c delete mode 100644 mxml-entity.c delete mode 100644 mxml-file.c delete mode 100644 mxml-index.c delete mode 100644 mxml-node.c delete mode 100644 mxml-private.c delete mode 100644 mxml-search.c delete mode 100644 mxml-set.c delete mode 100644 mxml-string.c delete mode 100644 mxml.h delete mode 100644 mxml.list.in delete mode 100644 mxml.pc.in delete mode 100644 mxml.spec delete mode 100644 mxml.xml delete mode 100644 mxmldoc.c delete mode 100644 test.xml delete mode 100644 test/.cvsignore delete mode 100644 test/class.cxx delete mode 100755 test/dotest.sh delete mode 100644 test/enum.cxx delete mode 100644 test/function.cxx delete mode 100644 test/struct.cxx delete mode 100644 testmxml.c diff --git a/.cvsignore b/.cvsignore deleted file mode 100644 index 5cce254..0000000 --- a/.cvsignore +++ /dev/null @@ -1,12 +0,0 @@ -*.bck -*.bak -Makefile -autom4te*.cache -config.cache -config.h -config.log -config.status -libmxml.a -mxml.list -mxmldoc -testmxml diff --git a/ANNOUNCEMENT b/ANNOUNCEMENT deleted file mode 100644 index 7aba2ea..0000000 --- a/ANNOUNCEMENT +++ /dev/null @@ -1,6 +0,0 @@ -Mini-XML 1.3 adds support for all of the standard HTML entity -names, entities in element names, attribute names, and attribute -values, null attribute values, and a new error callback for -catching errors instead of displaying them to stderr. The new -release also fixes some bugs with handling of poorly formed XML -data and in the mxmldoc utility. diff --git a/CHANGES b/CHANGES deleted file mode 100644 index 559f928..0000000 --- a/CHANGES +++ /dev/null @@ -1,161 +0,0 @@ -README - 05/16/2004 -------------------- - -CHANGES IN Mini-XML 2.0 - - - New programmers manual. - - 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 --git a/COPYING b/COPYING deleted file mode 100644 index 43433c4..0000000 --- a/COPYING +++ /dev/null @@ -1,482 +0,0 @@ - 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 --git a/Makefile.in b/Makefile.in deleted file mode 100644 index 711734e..0000000 --- a/Makefile.in +++ /dev/null @@ -1,261 +0,0 @@ -# -# "$Id: Makefile.in,v 1.21 2004/05/16 05:25:38 mike Exp $" -# -# Makefile for Mini-XML, a small XML-like file parsing library. -# -# Copyright 2003-2004 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@ -CC = @CC@ -CFLAGS = $(OPTIM) @CFLAGS@ @CPPFLAGS@ -CP = @CP@ -LDFLAGS = $(OPTIM) @LDFLAGS@ -MKDIR = @MKDIR@ -NROFF = @NROFF@ -OPTIM = @OPTIM@ -RANLIB = @RANLIB@ -RM = @RM@ -f -SHELL = /bin/sh - - -# -# Configured directories... -# - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -includedir = @includedir@ -libdir = @libdir@ -mandir = @mandir@ -docdir = @docdir@ -BUILDROOT = $(DSTROOT) - - -# -# Manpage extensions... -# - -CAT1EXT = @CAT1EXT@ -CAT3EXT = @CAT3EXT@ -MAN1EXT = @MAN1EXT@ -MAN3EXT = @MAN3EXT@ - - -# -# Rules... -# - -.SUFFIXES: .0 .1 .3 .c .man .o -.c.o: - $(CC) $(CFLAGS) -c $< -.man.0 .man.1 .man.3: - $(RM) $@ - $(NROFF) -man $< >$@ - - -# -# Targets... -# - -DOCFILES = doc/mxml.html doc/mxml.pdf 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.a mxmldoc doc/mxml.$(CAT3EXT) \ - doc/mxmldoc.$(CAT1EXT) testmxml mxml.xml - - -# -# Make everything... -# - -all: Makefile configure config.h $(TARGETS) - - -# -# Clean everything... -# - -clean: - $(RM) $(OBJS) $(TARGETS) - $(RM) *.bck *.bak - $(RM) config.cache config.log config.status - $(RM) -r autom4te*.cache - - -# -# Install everything... -# - -install: $(TARGETS) - -$(MKDIR) -p $(BUILDROOT)$(bindir) - $(CP) mxmldoc $(BUILDROOT)$(bindir) - -$(MKDIR) -p $(BUILDROOT)$(docdir) - $(CP) $(DOCFILES) $(BUILDROOT)$(docdir) - -$(MKDIR) -p $(BUILDROOT)$(includedir) - $(CP) mxml.h $(BUILDROOT)$(includedir) - -$(MKDIR) -p $(BUILDROOT)$(libdir) - $(CP) libmxml.a $(BUILDROOT)$(libdir) - -$(MKDIR) -p $(BUILDROOT)$(libdir)/pkgconfig - $(CP) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig - -$(MKDIR) -p $(BUILDROOT)$(mandir)/cat1 - $(CP) doc/mxmldoc.$(CAT1EXT) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT) - -$(MKDIR) -p $(BUILDROOT)$(mandir)/cat3 - $(CP) doc/mxml.$(CAT3EXT) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT) - -$(MKDIR) -p $(BUILDROOT)$(mandir)/man1 - $(CP) doc/mxmldoc.man $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT) - -$(MKDIR) -p $(BUILDROOT)$(mandir)/man3 - $(CP) doc/mxml.man $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT) - - -# -# Uninstall everything... -# - -uninstall: - $(RM) $(BUILDROOT)$(bindir)/mxmldoc - $(RM) -r $(BUILDROOT)$(docdir) - $(RM) $(BUILDROOT)$(includedir)/mxml.h - $(RM) $(BUILDROOT)$(libdir)/libmxml.a - $(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc - $(RM) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT) - $(RM) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT) - $(RM) $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT) - $(RM) $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT) - - -# -# 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 - - -configure: configure.in - autoconf - 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 - - -# -# mxmldoc -# - -mxmldoc: libmxml.a mxmldoc.o - $(CC) $(LDFLAGS) -o $@ mxmldoc.o libmxml.a - -mxmldoc.o: mxml.h - - -# -# testmxml -# - -testmxml: libmxml.a testmxml.o - $(CC) $(LDFLAGS) -o $@ testmxml.o libmxml.a - @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 File test passed!; \ - $(RM) temp2.xml temp2s.xml; \ - else \ - echo 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 - -testmxml.o: mxml.h - - -# -# mxml.xml -# - -mxml.xml: mxmldoc mxml.h $(PUBLIBOBJS:.o=.c) - $(RM) mxml.xml - ./mxmldoc mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/reference.html - -valgrind: mxmldoc - $(RM) valgrind.xml - valgrind --leak-check=yes ./mxmldoc valgrind.xml mxml.h \ - $(PUBLIBOBJS:.o=.c) >valgrind.html 2>valgrind.out - - -# -# All object files depend on the makefile... -# - -$(OBJS): Makefile config.h - - -# -# End of "$Id: Makefile.in,v 1.21 2004/05/16 05:25:38 mike Exp $". -# diff --git a/README b/README deleted file mode 100644 index 252418c..0000000 --- a/README +++ /dev/null @@ -1,203 +0,0 @@ -README - 05/01/2004 -------------------- - - -INTRODUCTION - - This README file describes the Mini-XML library version 2.0. - - 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 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. Also, since Mini-XML does not support the - UTF-16 encoding, it is technically not a conforming XML - consumer/client. - - -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 - - -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 - - You can email me at "mxml@easysw.com" to report problems - and/or ask for help. Just don't expect an instant response, - as I get a *lot* of email... - - -LEGAL STUFF - - The Mini-XML library is Copyright 2003-2004 by Michael Sweet. - - 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. diff --git a/TODO b/TODO deleted file mode 100644 index 3908528..0000000 --- a/TODO +++ /dev/null @@ -1,16 +0,0 @@ -TODO - 05/16/2004 ------------------ - - - New documentation. - -- Use HTMLDOC to generate - -- Provide more tutorials - -- Release notes - - Add access methods and make node structure opaque. - -- To allow for C++ migration - -- To make future binary compatibility easier - - Add VC++/VC++.NET project files. - -- Include DLL .def file for making a DLL. - - Add C++ class/struct. - -- Make this the core implementation which the C API accesses? - -- Class would allow for subclassing, is that necessary? - - Binary XML support??? diff --git a/config.h.in b/config.h.in deleted file mode 100644 index 7470e0c..0000000 --- a/config.h.in +++ /dev/null @@ -1,70 +0,0 @@ -/* - * "$Id: config.h.in,v 1.5 2004/05/02 16:04:40 mike Exp $" - * - * Configuration file for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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 "" - - -/* - * Do we have the snprintf() and vsnprintf() functions? - */ - -#undef HAVE_SNPRINTF -#undef HAVE_VSNPRINTF - - -/* - * Do we have the strXXX() functions? - */ - -#undef HAVE_STRDUP - - -/* - * 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 *, va_list); - -# 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,v 1.5 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/configure b/configure deleted file mode 100755 index 29e8728..0000000 --- a/configure +++ /dev/null @@ -1,4161 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.57. -# -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# 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 Bourne compatible -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+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi - -# Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -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 -n "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; 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'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# 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 - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - 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 - - ;; - 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_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - 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=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # 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 before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, 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 - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\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 sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -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$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - - -# 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` - -exec 6>&1 - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_config_libobj_dir=. -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= - -ac_unique_file="mxml.h" -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 datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS VERSION LDFLAGS OPTIM docdir CC CFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB AR CP MKDIR NROFF GROFF RM ARFLAGS CAT1EXT CAT3EXT MAN1EXT MAN3EXT PC_CFLAGS PC_LIBS LIBOBJS LTLIBOBJS' -ac_subst_files='' - -# 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. -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -ac_prev= -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 - - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_option in - - -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 | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir=$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" ;; - - -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'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - 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 ;; - - -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 ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - 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 ;; - - -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'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - 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; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - 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 paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -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 - - -# 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 its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$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 - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi -fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS - -# -# 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 \`..'] - -_ACEOF - - cat <<_ACEOF -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] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --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] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] -_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 - -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-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 - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -_ACEOF -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - ac_popdir=`pwd` - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style 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 - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir - done -fi - -test -n "$ac_init_help" && exit 0 -if $ac_init_version; then - cat <<\_ACEOF - -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -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 0 -fi -exec 5>config.log -cat >&5 <<_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.57. Invocation command line was - - $ $0 $@ - -_ACEOF -{ -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` -hostinfo = `(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 - -} >&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_sep= -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_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " - ;; - 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: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. -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, -{ - (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) - sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; - *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - sed "/^$/d" confdefs.h | sort - 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 && - rm -rf 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 -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >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 -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; 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 `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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.0rc1 - -cat >>confdefs.h <<_ACEOF -#define MXML_VERSION "Mini-XML v$VERSION" -_ACEOF - - -CFLAGS="${CFLAGS:=}" -CXXFLAGS="${CXXFLAGS:=}" -LDFLAGS="${LDFLAGS:=}" - -OPTIM="-O" - - - -# Check whether --with-ansi or --without-ansi was given. -if test "${with_ansi+set}" = set; then - withval="$with_ansi" - use_ansi="$withval" -else - use_ansi="no" -fi; - -# Check whether --enable-debug or --disable-debug was given. -if test "${enable_debug+set}" = set; then - enableval="$enable_debug" - if eval "test x$enable_debug = xyes"; then - OPTIM="-g" -else - LDFLAGS="$LDFLAGS -s" -fi -fi; - - -# Check whether --with-docdir or --without-docdir was given. -if test "${with_docdir+set}" = set; then - withval="$with_docdir" - docdir="$withval" -else - docdir="NONE" -fi; - - - - -# Check whether --with-vsnprintf or --without-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 $as_executable_p "$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 - -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 $as_executable_p "$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 - -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 - - CC=$ac_ct_CC -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 $as_executable_p "$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 - -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 "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_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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -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 - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -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 $as_executable_p "$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 - -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 - 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 $as_executable_p "$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 - -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 -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 $as_executable_p "$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 - -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 - - CC=$ac_ct_CC -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` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&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 -#line $LINENO "configure" -/* 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" >&5 -echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext - break;; - * ) - break;; - esac -done -else - 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 -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 - -# Check 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' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&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 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 { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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 | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - 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 -#line $LINENO "configure" -/* 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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; - *) 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 -#line $LINENO "configure" -/* 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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; 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 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 -CFLAGS="-g" -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 - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* 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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cc_g=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -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 ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_stdc=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* 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; -} -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 -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext -done -rm -f conftest.$ac_ext conftest.$ac_objext -CC=$ac_save_CC - -fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; - *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; -esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - ''\ - '#include ' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -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=cc -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 -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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 $as_executable_p "$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 - -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 $CCC g++ c++ gpp aCC CC cxx cc++ cl 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 $as_executable_p "$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 - -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 -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - - CXX=$ac_ct_CXX -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` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&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 -#line $LINENO "configure" -/* 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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; 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 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 -CXXFLAGS="-g" -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 - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* 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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cxx_g=no -fi -rm -f conftest.$ac_objext conftest.$ac_ext -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 -for ac_declaration in \ - ''\ - '#include ' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -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}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 $as_executable_p "$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 - -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 $as_executable_p "$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 - - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" -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 - - RANLIB=$ac_ct_RANLIB -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 $as_executable_p "$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 - - ;; -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 $as_executable_p "$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 - - ;; -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 "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 $as_executable_p "$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 - - ;; -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 "nroff", so it can be a program name with args. -set dummy nroff; 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_NROFF+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $NROFF in - [\\/]* | ?:[\\/]*) - ac_cv_path_NROFF="$NROFF" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_NROFF="$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 - - ;; -esac -fi -NROFF=$ac_cv_path_NROFF - -if test -n "$NROFF"; then - echo "$as_me:$LINENO: result: $NROFF" >&5 -echo "${ECHO_T}$NROFF" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -if test x$NROFF = x; then - # Extract the first word of "groff", so it can be a program name with args. -set dummy groff; 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_GROFF+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $GROFF in - [\\/]* | ?:[\\/]*) - ac_cv_path_GROFF="$GROFF" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_GROFF="$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 - - ;; -esac -fi -GROFF=$ac_cv_path_GROFF - -if test -n "$GROFF"; then - echo "$as_me:$LINENO: result: $GROFF" >&5 -echo "${ECHO_T}$GROFF" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - if test x$GROFF = x; then - NROFF="echo" - else - NROFF="$GROFF -T ascii" - fi -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 $as_executable_p "$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 - - ;; -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 - - - -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 eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* 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 -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -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 -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; 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 conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&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 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 eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* 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 -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -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 -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; 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 conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&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 -n "$GCC"; then - CFLAGS="-Wall $CFLAGS" - - if test "x$use_ansi" = xyes; then - CFLAGS="-ansi -pedantic $CFLAGS" - fi -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 - -case "$uname" in - *BSD* | Darwin*) - # *BSD - CAT1EXT="0" - MAN1EXT="1" - CAT3EXT="0" - MAN3EXT="3" - ;; - *) - # All others - CAT1EXT="1" - MAN1EXT="1" - CAT3EXT="3" - MAN3EXT="3" - ;; -esac - - - - - - -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, don't put newlines in cache variables' values. -# 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. -{ - (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *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 \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" - ;; - esac; -} | - sed ' - t clear - : clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - /^ac_cv_env/!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 "updating cache $cache_file" - cat confcache >$cache_file - else - echo "not updating unwritable cache $cache_file" - 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}' - -# 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 - -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_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $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 Bourne compatible -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+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi - -# Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -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 -n "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; 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'` - - -# PATH needs CR, and LINENO needs CR and PATH. -# 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 - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - 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 - - ;; - 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_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - 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=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # 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 before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, 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 - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -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 sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi -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$$.file - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - as_mkdir_p=false -fi - -as_executable_p="test -f" - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" - - -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - -exec 6>&1 - -# Open the log real soon, to keep \$[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by $as_me, which was -generated by GNU Autoconf 2.57. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 -_ACEOF - -# Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -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, 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.57, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" - -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -_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 - ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; - esac - - case $ac_option in - # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -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 0 ;; - --debug | --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;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -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" ;; - - 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 $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF - - - - - -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_config_target in $ac_config_targets -do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "mxml.list" ) CONFIG_FILES="$CONFIG_FILES mxml.list" ;; - "mxml.pc" ) CONFIG_FILES="$CONFIG_FILES mxml.pc" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - *) { { 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 to put it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. -$debug || -{ - trap 'exit_status=$?; rm -rf $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 -q "./confstatXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF - -# -# 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 - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@VERSION@,$VERSION,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@OPTIM@,$OPTIM,;t t -s,@docdir@,$docdir,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@CXX@,$CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@AR@,$AR,;t t -s,@CP@,$CP,;t t -s,@MKDIR@,$MKDIR,;t t -s,@NROFF@,$NROFF,;t t -s,@GROFF@,$GROFF,;t t -s,@RM@,$RM,;t t -s,@ARFLAGS@,$ARFLAGS,;t t -s,@CAT1EXT@,$CAT1EXT,;t t -s,@CAT3EXT@,$CAT3EXT,;t t -s,@MAN1EXT@,$MAN1EXT,;t t -s,@MAN3EXT@,$MAN3EXT,;t t -s,@PC_CFLAGS@,$PC_CFLAGS,;t t -s,@PC_LIBS@,$PC_LIBS,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi -fi # test -n "$CONFIG_FILES" - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$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'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$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'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` - - - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # 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. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo $f;; - *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } -_ACEOF -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,@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,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo $f;; - *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #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. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # 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. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in - if test x"$ac_file" != x-; then - 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 - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$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'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$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'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file - fi - else - cat $tmp/config.h - rm -f $tmp/config.h - fi -done -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -{ (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 --git a/configure.in b/configure.in deleted file mode 100644 index 7a012f0..0000000 --- a/configure.in +++ /dev/null @@ -1,192 +0,0 @@ -dnl -dnl "$Id: configure.in,v 1.11 2004/05/02 22:02:36 mike Exp $" -dnl -dnl Configuration script for Mini-XML, a small XML-like file parsing library. -dnl -dnl Copyright 2003-2004 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.0rc1 -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="-O" -AC_SUBST(OPTIM) - -AC_ARG_WITH(ansi, [ --with-ansi set full ANSI C mode, default=no], - use_ansi="$withval", - use_ansi="no") - -AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no], -if eval "test x$enable_debug = xyes"; then - OPTIM="-g" -else - LDFLAGS="$LDFLAGS -s" -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_RANLIB -AC_PATH_PROG(AR,ar) -AC_PATH_PROG(CP,cp) -AC_PATH_PROG(MKDIR,mkdir) -AC_PATH_PROG(NROFF,nroff) -if test x$NROFF = x; then - AC_PATH_PROG(GROFF,groff) - if test x$GROFF = x; then - NROFF="echo" - else - NROFF="$GROFF -T ascii" - fi -fi -AC_PATH_PROG(RM,rm) - -dnl Flags for "ar" command... -case "$uname" in - Darwin* | *BSD*) - ARFLAGS="-rcv" - ;; - *) - ARFLAGS="crvs" - ;; -esac - -AC_SUBST(ARFLAGS) - -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(vsnprintf) -fi - -dnl Add -Wall for GCC... -if test -n "$GCC"; then - CFLAGS="-Wall $CFLAGS" - - if test "x$use_ansi" = xyes; then - CFLAGS="-ansi -pedantic $CFLAGS" - fi -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 More manpage stuff... -case "$uname" in - *BSD* | Darwin*) - # *BSD - CAT1EXT="0" - MAN1EXT="1" - CAT3EXT="0" - MAN3EXT="3" - ;; - *) - # All others - CAT1EXT="1" - MAN1EXT="1" - CAT3EXT="3" - MAN3EXT="3" - ;; -esac - -AC_SUBST(CAT1EXT) -AC_SUBST(CAT3EXT) -AC_SUBST(MAN1EXT) -AC_SUBST(MAN3EXT) - -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,v 1.11 2004/05/02 22:02:36 mike Exp $". -dnl diff --git a/doc/.cvsignore b/doc/.cvsignore deleted file mode 100644 index bd4a040..0000000 --- a/doc/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -*.bck -*.bak -mxml.0 -mxml.3 -mxml.d -mxmldoc.0 -mxmldoc.1 diff --git a/doc/advanced.html b/doc/advanced.html deleted file mode 100644 index 0b6a51a..0000000 --- a/doc/advanced.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -

3 - More Mini-XML -Programming Techniques

- -

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

- -

Load Callbacks

- -

Save Callbacks

- -

Changing Node Values

- -

Formatted Text

- -

Indexing

- - - diff --git a/doc/basics.html b/doc/basics.html deleted file mode 100644 index df65b45..0000000 --- a/doc/basics.html +++ /dev/null @@ -1,299 +0,0 @@ - - - -

2 - Getting Started with -Mini-XML

- -

This chapter describes how to write programs that use -Mini-XML to access data in an XML file.

- -

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.

- -

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

- -

Each node has pointers for the node above (parent), -below (child), to the left (prev), and to the -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>
-        <node>val9</node>
-    </data>
-
- -

the node tree returned by mxmlLoadFile() would look -like the following in memory:

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

Loading and Saving XML Files

- -

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);
-
- -

The third argument specifies a callback function which -returns the value type of the immediate children for a new -element node: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. This 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 default value type is MXML_TEXT if no callback is used.

- -

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);
-
- -

Callback functions for saving are used to optionally insert -whitespace before and after elements in the node tree. Your -function will be called up to four times for each element node -with a pointer to the node and a "where" value of -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 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);
-
- -

Finding and Iterating Nodes

- -

The mxmlWalkPrev() -and mxmlWalkNext()functions -can be used to iterate through the XML node tree:

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

In addition, 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 ...
-    }
-
- -

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" 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
    -    node
    -    val9
    -
    - -

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

  • - -
- - - diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index 4b3f169..0000000 --- a/doc/index.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - Mini-XML Home Page - - - - -

Back to Home Page ]

- -

Mini-XML Home Page

- -

Current Release: v1.3, December 21, 2003
-[ Download Source (.tar.gz 82k) -| Download Linux RPM (.i386.rpm 76k) -| Change Log | Documentation | Rate/Make Comments ]

- -

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 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. Also, since -Mini-XML does not support the UTF-16 encoding, it is technically -not a conforming XML consumer/client.

- -

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

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 currently a work in progress. Aside from -the information that follows, the documentation page provides a -handy reference and is automatically generated using Mini-XML. -You can also look at the testmxml.c and mxmldoc.c source files for examples of -using Mini-XML.

- -

The Basics

- -

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

- -

Each node has pointers for the node above (parent), below (child), -to the left (prev), and to the 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>
-        <node>val9</node>
-    </data>
-
- -

the node tree returned by mxmlLoadFile() would look -like the following in memory:

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

Loading and Saving XML Files

- -

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);
-
- -

The third argument specifies a callback function which -returns the value type of the immediate children for a new -element node: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. This 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 default value type is MXML_TEXT if no callback is used.

- -

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);
-
- -

Callback functions for saving are used to optionally insert -whitespace before and after elements in the node tree. Your -function will be called up to four times for each element node -with a pointer to the node and a "where" value of -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. -The callback function should return 0 if no whitespace should be -added and the character to insert (space, tab, newline) -otherwise.

- -

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);
-
- -

Finding and Iterating Nodes

- -

The mxmlWalkPrev() -and mxmlWalkNext()functions -can be used to iterate through the XML node tree:

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

In addition, 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 ...
-}
-
- -

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" 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
    -    node
    -    val9
    -
    - -

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

  • - -
- -

Getting Help and Reporting Problems

- -

You can email me at "mxml at easysw dot com" to -report problems and/or ask for help. Just don't expect an -instant response, as I get a lot of email...

- -

Legal Stuff

- -

The Mini-XML library is Copyright 2003-2004 by Michael Sweet.

- -

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.

- - - diff --git a/doc/install.html b/doc/install.html deleted file mode 100644 index 722eebf..0000000 --- a/doc/install.html +++ /dev/null @@ -1,94 +0,0 @@ - - - -

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

- -

This chapter describes how to build, install, and package -Mini-XML on your system.

- -

Compiling Mini-XML

- -

Mini-XML comes with an autoconf-based configure script; just -type the following command to get things going:

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

- -

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; this is especially useful when installing on -systems with different Linux distributions. Use the -mxml.install script to install the software and -mxml.remove script to remove 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 --git a/doc/intro.html b/doc/intro.html deleted file mode 100644 index 2e9e44a..0000000 --- a/doc/intro.html +++ /dev/null @@ -1,275 +0,0 @@ - - - Mini-XML Programmers Manual, Version 2.0 - - - - - - -

Introduction

- -

This programmers manual describes Mini-XML version 2.0, a -small XML parsing library that you can use to read and write 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 encoded XML files and - strings.
  • - -
  • 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.

- - -

Legal Stuff

- -

The Mini-XML library is copyright 2003-2004 by Michael -Sweet.

- -

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.

- - -

History

- -

Mini-XML was initially developed for the Gimp-Print 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 Gimp-Print -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 2,240 -lines of code, compared to 96,335 lines of code for libxml2 -version 2.6.9. Aside from Gimp-Print, 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:

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Example   Description
 
lpstat
- lpstat(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
- /usr/share/cups/data/testprint.ps
   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)
 
- -
-
- - - diff --git a/doc/license.html b/doc/license.html deleted file mode 100644 index 873b9f9..0000000 --- a/doc/license.html +++ /dev/null @@ -1,512 +0,0 @@ - - - -

A - 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

- - - diff --git a/doc/makedocs.sh b/doc/makedocs.sh deleted file mode 100755 index aa787d6..0000000 --- a/doc/makedocs.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# "$Id: makedocs.sh,v 1.1 2004/05/03 03:21:16 mike Exp $" -# -# Script to make documentation... -# -# Copyright 2003-2004 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 --batch mxml.book -f mxml.pdf -htmldoc --verbose --batch mxml.book -f mxml.html - -rm -rf mxml.d -mkdir mxml.d -htmldoc --verbose --batch mxml.book -t htmlsep -d mxml.d - -# -# End of "$Id: makedocs.sh,v 1.1 2004/05/03 03:21:16 mike Exp $". -# diff --git a/doc/mxml.book b/doc/mxml.book deleted file mode 100644 index 49875d1..0000000 --- a/doc/mxml.book +++ /dev/null @@ -1,10 +0,0 @@ -#HTMLDOC 1.8.24b12 --t pdf12 -f mxml.pdf --book --toclevels 3 --no-numbered --toctitle "Table of Contents" --title --linkstyle underline --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 11.0 --headfootfont Helvetica --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 680 -intro.html -install.html -basics.html -advanced.html -mxmldoc.html -license.html -relnotes.html -refapp.html diff --git a/doc/mxml.html b/doc/mxml.html deleted file mode 100644 index b57f856..0000000 --- a/doc/mxml.html +++ /dev/null @@ -1,2545 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.0 - - - - - - -

Mini-XML Programmers Manual, Version 2.0


-Michael Sweet
-Copyright 2003-2004
-
-
-

Table of Contents

-
-
Introduction - -1 - Building, Installing, and Packaging Mini-XML - - -2 - Getting Started with Mini-XML - -3 - More Mini-XML Programming Techniques - -4 - Using the mxmldoc Utility - -A - GNU Library General Public License -
-
B - Release Notes - -C - Library Reference - -
-

Introduction

-

This programmers manual describes Mini-XML version 2.0, a small XML - parsing library that you can use to read and write 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 encoded XML files and strings.
  • -
  • 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.

- - -

Legal Stuff

-

The Mini-XML library is copyright 2003-2004 by Michael Sweet.

-

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.

- - -

History

-

Mini-XML was initially developed for the -Gimp-Print 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 Gimp-Print 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 2,240 lines of code, - compared to 96,335 lines of code for libxml2 version 2.6.9. Aside from - Gimp-Print, 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:

-
- - - - - - - - - - - - -
Example   Description
 
lpstat -
lpstat(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 -
/usr/share/cups/data/testprint.ps
    -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) -
 
-
-

-

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

-

This chapter describes how to build, install, and package Mini-XML on - your system.

-

Compiling Mini-XML

-

Mini-XML comes with an autoconf-based configure script; just type the - following command to get things going:

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

-

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; this is especially useful - when installing on systems with different Linux distributions. Use the - mxml.install script to install the software and mxml.remove - script to remove 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.

-
-

2 - Getting Started with Mini-XML

-

This chapter describes how to write programs that use Mini-XML to - access data in an XML file.

-

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.

-

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

-

Each node has pointers for the node above (parent), below ( -child), to the left (prev), and to the 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>
-        <node>val9</node>
-    </data>
-
-

the node tree returned by mxmlLoadFile() would look like the - following in memory:

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

Loading and Saving XML Files

-

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);
-
-

The third argument specifies a callback function which returns the - value type of the immediate children for a new element node: -MXML_INTEGER, MXML_OPAQUE, MXML_REAL, or -MXML_TEXT. This 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 default value type is MXML_TEXT if no callback is used.

-

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);
-
-

Callback functions for saving are used to optionally insert - whitespace before and after elements in the node tree. Your function - will be called up to four times for each element node with a pointer to - the node and a "where" value of 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 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);
-
-

Finding and Iterating Nodes

-

The mxmlWalkPrev() and -mxmlWalkNext()functions can be used to iterate through the - XML node tree:

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

In addition, 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 ...
-    }
-
-

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" 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
    -    node
    -    val9
    -
    -

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

    -
  • -
-
-

3 - More Mini-XML Programming - Techniques

-

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

-

Load Callbacks

-

Save Callbacks

-

Changing Node Values

-

Formatted Text

-

Indexing

-
-

4 - Using the mxmldoc Utility

-

This chapter describes how to use the mxmldoc(1) utility - that comes with Mini-XML to automatically generate documentation for - your programs.

-

The Basics

-

The mxmldoc utility scans C and C++ source and header files - and produces an XML file describing the library interface and an XHTML - file providing a human-readable reference to the code. Each source and - header file must conform to some simple code commenting conventions so - that mxmldoc can extract the necessary descriptive text.

-

The mxmldoc command requires the name of an XML file to - store the code information; this file is created and updated as - necessary. The XML file is optionally followed by a list of source - files to scan. After scanning any source files on the command-line, -mxmldoc writes XHTML documentation to the standard output, which - can be redirected to the file using the >filename syntax:

-
-    mxmldoc myfile.xml >myfile.html ENTER
-    mxmldoc myfile.xml file1.c file2.cxx file3.h >myfile.html ENTER
-
-

If no source files are provided on the command-line, the current - contents of the XML file are converted to XHTML.

-

Code Documentation Conventions

-

As noted previously, source code must be commented properly for -mxmldoc to generate correct documentation for the code. Single line - comments can use the C++ // comment sequence, however all - multi-line comments must use the C /* ... */ comment sequence.

-

Functions and Methods

-

All implementations of functions and methods must begin with a - comment header describing what the function does, the possible input - limits (if any), and the possible output values (if any), and any - special information needed, as follows:

-
-    /*
-     * 'do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    float            /* O - Inverse power value, 0.0 <= y <= 1.1 */
-    do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */
-    {
-      ...
-      return (y);
-    }
-
-

Return/output values are indicated using an "O" prefix, input values - are indicated using the "I" prefix, and values that are both input and - output use the "IO" prefix for the corresponding in-line comment.

-

Variables and Class/Structure/Union Members

-

Each variable or member must be declared on a separate line and must - be immediately followed by a comment describing the variable or member, - as follows:

-
-    int this_variable;   /* The current state of this */
-    int that_variable;   /* The current state of that */
-
-

Types

-

Each type must have a comment block immediately before the typedef, - as follows:

-
-    /*
-     * This type is for foobar options.
-     */
-    typedef int this_type_t;
-
- - -

Classes, Structures, and Unions

-

Each class, structure, and union must have a comment block - immediately before the definition, and each member must be documented - in accordance with the function and variable documentation - requirements, as follows:

-
-    /*
-     * This structure is for foobar options.
-     */
-    struct this_struct_s
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-
-    /*
-     * This class is for barfoo options.
-     */
-    class this_class_c
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-
-      /*
-       * 'get_this()' - Get the current state for this.
-       */
-      int                /* O - Current state for this */
-      get_this()
-      {
-        return (this_member);
-      }
-    };
-
-

Enumerations

-

Each enumeration must have a comment block immediately before the - definition describing what the enumeration is for, and each enumeration - value must have a comment immediately after the value, as follows:

-
-   /*
-    * Enumeration of media trays.
-    */
-    enum this_enum_e
-    {
-      THIS_TRAY,   /* This tray */
-      THAT_TRAY    /* That tray */
-    };
-
- - -

XML Schema

-

Listing 4-1 shows the XML schema file mxmldoc.xsd which is - included with Mini-XML. This schema file can be used to convert the XML - files produced by mxmldoc into other formats.

-
- - -
Listing 4-1, XML Schema File "mxmldoc.xsd"
-
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <xsd:annotation>
-    <xsd:documentation xml:lang="en">
-      Mini-XML 2.0 documentation schema for mxmldoc output.
-      Copyright 2003-2004 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.
-    </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"/>
-
-
-
- - -
- - -
Listing 4-1, XML Schema File "mxmldoc.xsd" (con't) -
-
-	<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"/>
-
-
-
- - -
- - -
Listing 4-1, XML Schema File "mxmldoc.xsd" (con't) -
-
-	<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>
-
-
-
- - -
- - -
Listing 4-1, XML Schema File "mxmldoc.xsd" (con't) -
-
-  </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>
-
-
-
-
-

A - 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

-
-

B - Release Notes

-

Changes in Mini-XML 2.0

-
    -
  • New programmers manual.
  • -
  • 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.
  • -
-
-

C - Library Reference

-

Contents

- - - -

Enumerations

- - - -

mxml_type_e

-
-

Description

-

The XML node type.

-

Values

-

- - - - - - - - - -
NameDescription
MXML_ELEMENTXML element with attributes
MXML_INTEGERInteger value
MXML_OPAQUEOpaque string
MXML_REALReal value
MXML_TEXTText fragment
- - -

Functions

- - - -

mxmlAdd()

-
-

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.

-

Syntax

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

Arguments

-

- - - - - - - - -
NameDescription
parentParent node
whereWhere to add, MXML_ADD_BEFORE or - MXML_ADD_AFTER
childChild node for where or - MXML_ADD_TO_PARENT
nodeNode to add
-

Returns

-

Nothing.

- - -

mxmlDelete()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - -
NameDescription
nodeNode to delete
-

Returns

-

Nothing.

- - -

mxmlElementGetAttr()

-
-

Description

-

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

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
nodeElement node
nameName of attribute
-

Returns

-

Attribute value or NULL

- - -

mxmlElementSetAttr()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - -
NameDescription
nodeElement node
nameName of attribute
valueAttribute value
-

Returns

-

Nothing.

- - -

mxmlEntityGetName()

-
-

Description

-

Get the name that corresponds to the character value. If val does not - need to be represented by a named entity, NULL is returned.

-

Syntax

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

Arguments

-

- - - - - -
NameDescription
valCharacter value
-

Returns

-

Entity name or NULL

- - -

mxmlEntityGetValue()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - -
NameDescription
nameEntity name
-

Returns

-

Character value or -1 on error

- - -

mxmlFindElement()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - - - - -
NameDescription
nodeCurrent node
topTop node
nameElement name or NULL for any
attrAttribute name, or NULL for none
valueAttribute value, or NULL for any
descendDescend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
-

Returns

-

Element node or NULL

- - -

mxmlLoadFile()

-
-

Description

-

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.

-

Syntax

-
-mxml_node_t *
-mxmlLoadFile(
-    mxml_node_t * top,
-    FILE * fp,
-    mxml_type_t (*cb)(mxml_node_t *node));
-
-

Arguments

-

- - - - - - - -
NameDescription
topTop node
fpFile to read from
(*cb)(mxml_node_t *node)Callback function or - MXML_NO_CALLBACK
-

Returns

-

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

- - -

mxmlLoadString()

-
-

Description

-

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.

-

Syntax

-
-mxml_node_t *
-mxmlLoadString(
-    mxml_node_t * top,
-    const char * s,
-    mxml_type_t (*cb)(mxml_node_t *node));
-
-

Arguments

-

- - - - - - - -
NameDescription
topTop node
sString to load
(*cb)(mxml_node_t *node)Callback function or - MXML_NO_CALLBACK
-

Returns

-

First node or NULL if the string has errors.

- - -

mxmlNewElement()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
nameName of element
-

Returns

-

New node

- - -

mxmlNewInteger()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
integerInteger value
-

Returns

-

New node

- - -

mxmlNewOpaque()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
opaqueOpaque string
-

Returns

-

New node

- - -

mxmlNewReal()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
realReal number value
-

Returns

-

New node

- - -

mxmlNewText()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
whitespace1 = leading whitespace, 0 = no - whitespace
stringString
-

Returns

-

New node

- - -

mxmlNewTextf()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - - -
NameDescription
parentParent node or MXML_NO_PARENT
whitespace1 = leading whitespace, 0 = no - whitespace
formatPrintf-style frmat string
...Additional args as needed
-

Returns

-

New node

- - -

mxmlRemove()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - -
NameDescription
nodeNode to remove
-

Returns

-

Nothing.

- - -

mxmlSaveAllocString()

-
-

Description

-

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.

-

Syntax

-
-char *
-mxmlSaveAllocString(
-    mxml_node_t * node,
-    const char * (*cb)(mxml_node_t *node, int ws));
-
-

Arguments

-

- - - - - - -
NameDescription
nodeNode to write
(*cb)(mxml_node_t *node, int ws)Whitespace - callback or MXML_NO_CALLBACK
-

Returns

-

Allocated string or NULL

- - -

mxmlSaveFile()

-
-

Description

-

Save an XML tree to a file. The callback argument specifies a - function that returns a whitespace character or nul (0) before and - after each element. If MXML_NO_CALLBACK is specified, whitespace will - only be added before MXML_TEXT nodes with leading whitespace and before - attribute names inside opening element tags.

-

Syntax

-
-int
-mxmlSaveFile(
-    mxml_node_t * node,
-    FILE * fp,
-    const char * (*cb)(mxml_node_t *node, int ws));
-
-

Arguments

-

- - - - - - - -
NameDescription
nodeNode to write
fpFile to write to
(*cb)(mxml_node_t *node, int ws)Whitespace - callback or MXML_NO_CALLBACK
-

Returns

-

0 on success, -1 on error.

- - -

mxmlSaveString()

-
-

Description

-

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.

-

Syntax

-
-int
-mxmlSaveString(
-    mxml_node_t * node,
-    char * buffer,
-    int bufsize,
-    const char * (*cb)(mxml_node_t *node, int ws));
-
-

Arguments

-

- - - - - - - - -
NameDescription
nodeNode to write
bufferString buffer
bufsizeSize of string buffer
(*cb)(mxml_node_t *node, int ws)Whitespace - callback or MXML_NO_CALLBACK
-

Returns

-

Size of string

- - -

mxmlSetElement()

-
-

Description

-

Set the name of an element node. The node is not changed if it is not - an element node.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
nodeNode to set
nameNew name string
-

Returns

-

0 on success, -1 on failure

- - -

mxmlSetErrorCallback()

-
-

Description

-

Set the error message callback.

-

Syntax

-
-void
-mxmlSetErrorCallback(
-    void (*cb)(const char *));
-
-

Arguments

-

- - - - - - -
NameDescription
(*cb)(const char *)Error callback function
-

Returns

-

Nothing.

- - -

mxmlSetInteger()

-
-

Description

-

Set the value of an integer node. The node is not changed if it is - not an integer node.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
nodeNode to set
integerInteger value
-

Returns

-

0 on success, -1 on failure

- - -

mxmlSetOpaque()

-
-

Description

-

Set the value of an opaque node. The node is not changed if it is not - an opaque node.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
nodeNode to set
opaqueOpaque string
-

Returns

-

0 on success, -1 on failure

- - -

mxmlSetReal()

-
-

Description

-

Set the value of a real number node. The node is not changed if it is - not a real number node.

-

Syntax

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

Arguments

-

- - - - - - -
NameDescription
nodeNode to set
realReal number value
-

Returns

-

0 on success, -1 on failure

- - -

mxmlSetText()

-
-

Description

-

Set the value of a text node. The node is not changed if it is not a - text node.

-

Syntax

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

Arguments

-

- - - - - - - -
NameDescription
nodeNode to set
whitespace1 = leading whitespace, 0 = no - whitespace
stringString
-

Returns

-

0 on success, -1 on failure

- - -

mxmlSetTextf()

-
-

Description

-

Set the value of a text node to a formatted string. The node is not - changed if it is not a text node.

-

Syntax

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

Arguments

-

- - - - - - - - -
NameDescription
nodeNode to set
whitespace1 = leading whitespace, 0 = no - whitespace
formatPrintf-style format string
...Additional arguments as needed
-

Returns

-

0 on success, -1 on failure

- - -

mxmlWalkNext()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - -
NameDescription
nodeCurrent node
topTop node
descendDescend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
-

Returns

-

Next node or NULL

- - -

mxmlWalkPrev()

-
-

Description

-

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.

-

Syntax

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

Arguments

-

- - - - - - - -
NameDescription
nodeCurrent node
topTop node
descendDescend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
-

Returns

-

Previous node or NULL

- - -

Structures

- - - -

mxml_attr_s

-
-

Description

-

An XML element attribute value.

-

Definition

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

Members

-

- - - - - - -
NameDescription
nameAttribute name
valueAttribute value
- - -

mxml_node_s

-
-

Description

-

An XML node.

-

Definition

-
-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;
-  mxml_type_t type;
-  mxml_value_t value;
-};
-
-

Members

-

- - - - - - - - - - - -
NameDescription
childFirst child node
last_childLast child node
nextNext node under same parent
parentParent node
prevPrevious node under same parent
typeNode type
valueNode value
- - -

mxml_text_s

-
-

Description

-

An XML text value.

-

Definition

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

Members

-

- - - - - - -
NameDescription
stringFragment string
whitespaceLeading whitespace?
- - -

mxml_value_s

-
-

Description

-

An XML element value.

-

Definition

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

Members

-

- - - - - - - -
NameDescription
attrsAttributes
nameName of element
num_attrsNumber of attributes
- - -

Types

- - - -

mxml_attr_t

-
-

Description

-

An XML element attribute value.

-

Definition

-
-typedef struct mxml_attr_s mxml_attr_t;
-
- - -

mxml_element_t

-
-

Description

-

An XML element value.

-

Definition

-
-typedef struct mxml_value_s mxml_element_t;
-
- - -

mxml_node_t

-
-

Description

-

An XML node.

-

Definition

-
-typedef struct mxml_node_s mxml_node_t;
-
- - -

mxml_text_t

-
-

Description

-

An XML text value.

-

Definition

-
-typedef struct mxml_text_s mxml_text_t;
-
- - -

mxml_type_t

-
-

Description

-

The XML node type.

-

Definition

-
-typedef enum mxml_type_e mxml_type_t;
-
- - -

mxml_value_t

-
-

Description

-

An XML node value.

-

Definition

-
-typedef union mxml_value_u mxml_value_t;
-
- - -

Unions

- - - -

mxml_value_u

-
-

Description

-

An XML node value.

-

Definition

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

Members

-

- - - - - - - - - -
NameDescription
elementElement
integerInteger number
opaqueOpaque string
realReal number
textText fragment
- - diff --git a/doc/mxml.man b/doc/mxml.man deleted file mode 100644 index 2057d61..0000000 --- a/doc/mxml.man +++ /dev/null @@ -1,181 +0,0 @@ -.\" -.\" "$Id: mxml.man,v 1.1 2004/05/01 23:41:51 mike Exp $" -.\" -.\" mxml man page for mini-XML, a small XML-like file parsing library. -.\" -.\" Copyright 2003-2004 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 mxml 3 "mini-XML" "1 May 2004" "Michael Sweet" -.SH NAME -mxml \- mini-xml library -.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 and writing of UTF-8 encoded XML files. -.IP \(bu 4 -Reading and writing of UTF-8 encoded XML 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 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. Also, since Mini-XML does not support the -UTF-16 encoding, it is technically not a conforming XML -consumer/client. -.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 -.SH SEE ALSO -mxmldoc(1), Mini-XML Programmers Manual, http://www.easysw.com/~mike/mxml/ -.SH COPYRIGHT -Copyright 2003-2004 by Michael Sweet. -.\" -.\" End of "$Id: mxml.man,v 1.1 2004/05/01 23:41:51 mike Exp $". -.\" diff --git a/doc/mxml.pdf b/doc/mxml.pdf deleted file mode 100644 index a3bb527cb2601156a530eed0b9bc61da2efa53f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621473 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

a<;(keq8MR2ENLF-4rNFlX!4Cly{ppA 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%0A*|E7(i?BLFb4K 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 l$vvF(-%^Zkp!c*uKMU;8-z!e=`NIO zX%MtS+w2)P?D9b%*%@{SobI5+GEhaMV3pUA#SaG7*&qm4D8uNhl*6!#SGW+0o5{|? z1?Gft;uNJhK}ql>;r#Gf-N&E3z->0KU4UJ9)cyzf89N0S^#%ozCyu$gk&Q~S@*Snf z<_a;62~(y$y_7}koBdmZXPw6CwM8We1x#PL^Uv}RT#@wQT3G$d_s2TZ42LS_$VI_k zC4HbL70>NNIqvdZGE@lNk4=mOf#tS-r%=huu`M2Q*zhT&gTvW_we;~mMt+FHqihHn zysoo+kg6^(R&l?VIWeh3_xCvS*g;QwS{{zkBpzXo<>Y;K6H(vVm)i$dT(1=m&-7-J z4E&>kA5$nr9;Lr-PxA7I#p8pI`Sz1qb*(|>l3($&W0l-6Qf7u$k^l>!81?VT)H^a9 zjt?{%T`7oCn7Lb12CQI{Y__~&>smAY*nax~WIg~&>MH=MHV22X7pSLa439l_JtFj{ zod!GSEXlAKk#=Efe))luTmZR)fs6ME{hc^d?Ljq*sI$KKr0|D#n_#!WEWiC3hT;)i z;hTOfkSSgA&3Ar%3OOv7K2tR8_+8MNEOP>AA=G@$zQX8ELX(Q=92;Khe1CE7y}QYv zcQ?wZarT{(n%>^&Dy z+)i&evAHZIUWW|@kr%R6*k6WypoHj)(TC)w)5Kvug9@#>*b?38y^TM0D>$(%hXKRn z433YQ3oxoJeJt0%{`QOF!Ig?Yi*`Z1Aapb2XIGJ13`M}mu!{Mo$TwNHb=xp~y;GE~ zelI;%UC8f}I3fUql=~sh%2#uBWv@M^BEX0n-S1sd@2YQ8MP;ReUABLQI;D6h+(8jF zA&kIP0+tJV^LlFv1H*7%?}2x(tdafC+@SUG2kt~ACvRI)Zeefik(*RGDT;ZU>Egxq zvL8`XjV&@Bz9WJHvKhweOfN(`9*|pk^o^0_3OQ6g8JF3wn5QR*GCD!26 ztNozP<<}WDmv13eEv+L7Ak8Ypj}a)0Urkm5*(k9m+UM^{uVy0l$k^{%ynz8F4A`{1 zMB?1W8}>-jvhFAxz?aC~k7g)KlXW678YV)o0qwcl4;o)?xCO*7pN-szqY<(f~B`p4>9(brw5xd ztmBU6Z!pn~h=h9v1&{CGuW(luo%zshN4Zy~di4`1CDC&U^CZK-x&dRy(F}a|F zYCdPL$KaAP(K@?3<*h~`*k^#fznN>p z*B06vZFR0ItG8PbTH^hlg>z^ zsEtscHF@FS8&CVF9jA7^gHj-|)!i|l&FgPh0n#!@STs_d7!*G;C<;c?Jf`U}d6Le6 zm)n%zMq&#fF6g&whT&l~`Dw6pd8RFyH%N5<1QgXJ^dTaz-X+BmO(uhFnc^eK6@G7= zDY76zf1{IB)ovJ{kusgo9!&HJaVw1IS*TK@Bgqi8r^s9P{u16X<6cxA6qke zruuD;VzM<-Z{}g6z-TF}0`1eYH{?@%p5#_BsTz5Sy0XWo5yp(^b9gEDs?x6f7V4m< zA080#c>CC(xS=IIRqgN2>)MYvQ+_Rw6;=Wp1i(xix)b2_TMnVGp4lzw6SP z6Ich?mDHBpYM3>Q<2^bG-QuW2D?F6fPjHStp~Ghd401F)~M* z1bdCq_(WYto9KUSZjOQ2JfocttIRe=0Gr$+1%v~K>vA8lFjh6EhdRr0U@SKzD9Shm zv$SLE0=Q_0V(k0;w@Y}ir!^9ZYon1EOgH1usfZ<-ukqNShi z>aifBUC|pm4AfbawH_T7Y+$zVCcCjfV5WixDFn_Wf|;YO^H=w*A;4SU^I+uo)MJ}C z+t#+4-^3zAgNK<(e%Y(F_g%uVtKQqil^Guw|G)-gKj)8#O{~LuHJ$a#Hd$nl zudql64T*M*ay?)2aDDp&4kWAeH$3sA79`C-f!Pi=4i~CLV*(rc-Q_=I(pdl{4YZQj zZi*cpM6S;GP}9d>pQ5a1Lq?=$NbpZT={bva@SDW!z9uZn8?EJCgD?CJt9g)-c!K|> z?N3S=WcPq&1$Lc{y*?&H_^~4Dby%5N$^Yhyap|_eRQGd{dMrVE<2-1klQHMm1X6cs z$YqWe?Ph8JjZF-O(QVn+G7Q?IHN{gsbt(TU$Zknktn0M8*{RaWBMy_t7O{;x7_*0) z>dsAmQ9nm9ovp*S+NCkO_U}ooVBaaJszevc*FsXhly>De;jvkF|9lo1K-mT7Lekja!DgHXYJ#DU$hO-Aj^Ux67!XDrl9XA?Qpq zgSPWk<>{#7*0d?L2HU~wU=63Rzhx3TP|_K^eb$^ed8+uGs4nO`tu3>kXrm(r-ev}YQ<8oV#H#GYbNViuxwxYq2;F;5-$Fjcvpxi6QXhW*l@G%nnPa`|gvSH;pYtHOzWEee0Rk5qjPGx_PTmSL3ivU-)%6i^`okn0+N27{MyiRXUNDoOin*e3qf;L_Ubw!8Md| z`~nH%+Q0dzWIckBt8P9V>1&mFO$xDzKs}vR?GK8*jz}x26z0SDx}){9Q}M^6AlJrT z(?a-nXa09iWud|VkyRb3!1 za|2$oaPtLOBIM+Tm)5oG3hgK(!b17S(K03dImpO-*ZHqoAvnPh))$D-v!evv>29kx zF(^1$io8yF9WowpfExq-IPihQb@RLJ;!+4FsM`_;7F%O|-3PaT$6+?_Ox?MIw+d+8x1ZceNgs=$d8wyoHQ+PzZ)N!h@@&2Fm zG6YO?)+H@FLYugII<*RvLt39^x5Ch3`LXf1JzK?*n|gtDp*_W(7}t8-aBot$M&s4< zcRP#)H=-kG|F=uEU;R}GhMQ&S7-Y|QR9rab?J3~KGMCoU*We^TRa{FqimGo)5r2qs zCPhuEPqRz8^a$yFaG79kM}7t;g8W@QJ$O4Q>?>)YDg|iDaP0`5Jutbxom`oi%N6v;>Bd5qWJ;Q7#et|RWj zjl^3@Y*m{GW*zz>S#FD~0JYB+Oc&j-+MCM3;ZUnUR!TR~%OG*mc+ZVg zs^-u&;hRD59}Q(SzetjA^56AaL84rfHK^q7j;I4LxF;ap9)d3;b|Atm>LBONNl+V1 zRdQLmb=KHH6O*%mCp$*L$KzS}=;=F2H-8Tkw zQEA(~I!NyKk$g_v*Iv9*V+7N|97*3HjX8Zh-ZupiUv<~5!xK_c>at4?Po&@eB!SwI zT24%@jr(ihN=4U%_TvDjJP)we6$3s^`me{0pSP5e$jf0AvHr8L0cmrRwEh~Ads@zH=<#+j0ZXQ;Xqk|Z#Dk2 z-O8T$k-vECtwN61SgCl=WV#T3EF-pW!T%vukVFp7I-Ut^jTGjS`_Q!k_HGshq0ha$ zh@7_fZIOwTCtYGj-**ZF_Eghm&h0{KG$eEURY@lX5fS(a_O)8`OqOm4DQ~V0Gndgv zoeX+%T@0RYAZmgmt~iAc<6BYOL_${KL7c5W6Iy)x^W7l3v8MN+6g_j~0%pc|%II#+ z7W1|Ot*UA-u!Jp|c{5Q5bgFRz$GA1BM#tjV940bv8&tEsZ9eu}QM0oBC4!Tsq})%! z>AlF&Xv;!`?K^Ujw~+n9i_Tz#7}ddPu&cY^GwHzC zytq&f-iXUAqg9){Ydu{8RA#mtLQZO-KY| z2KDRvmrl!$828{=UA<&=b!uKe7}m2X&v5yLWtP9HU{|Vyvt{%3L{q{45K+$LjED99 zf=g1moMh6ivz6Ay>~t|3E@ftPk$cd;mo1q2;^!^ON5!m%=^b=DvE>M!5ALuIOp_RE zGvL9q8MK1M*Ac2q!3L*jp+c={(~hO>zxxbrI-msIcBiI8EpztkEz}gx;griGhO+fn zB@F?@H^tCiKH=bwD147*0$ia7>^z#ysk-*pe7aS#u#fmUgTvescljoK=xa&It)eZw z7Fv|iVKnoEHYsida+1qq9z6F=DBDHFjRxMy_QAK9VPKQ*mVG!L%W~=c)nOS%`A03V zbJ(r|QCZyLJgWvbSQ;8dw^dk-Y;*BC7L>Qb3)*FRd{o(Jy~90T^YYwI(?4!QMht3N z^IpdDO)UW+BGDKLjAdWG zO@4%P5IvVJWVf>N?DKu=4ud``Jqa@e|0$|rIDej9O6yg(sGt}JyO=eh>Orsi(wZsu z5Ody|UGuX?008cjiq@B`xQqSNJO*QY=0Ecr^v%197K{^t`P4(-<{%%k?=;0rx)Am2 zB_&>cj%-tT0%{jkBtG2odF}FD0}nOZOYNMPdvpGtpS9xqg%V*%X45CHv5GPf->-V~`f-4cC*qLuT_;4SgHZMk)F(AnpmzF*axzX#BcVa>F8T4sx-6T1@*<4)&LD82&>4}k{HUkR; zFLNf^6mzeahxS@728`IsXNW(X!9uYEo%;(Y2A{3@|oC`((It5vTiF!!Jp z+;zUX2o}7gh|`wNp$r`#hl&fPQggYw2@Vfy)!xumQ{G8B#-8qjfX@*M44(Y24{iCK zP4hqh$kXSQTey=mBR?@qgzE-tn^AmOkYHF^w|P!(1{H@%4htyiNj~X$1;p=!X-1!l zWEn__Asg4Odnp30?TR&M9S3|8j^EH3pi<3igCEsVS4F(pwPKSB1H7c@Gse6(oZz$) z=93TcN{}i4ApdwgkM{~I$i^p#-027E&bEOXR1N$R-=U02!YFYye)ZcHmK0cM4%k3( zc4UMnXEHc;MmPByaL&08WA1KJn+QaznTrPfi5SI#XU>A9=Ji1dtoQco>iEU&->-mU0YyN??pE7jEE~7C**~^ULBIKyy|5;b^9J|#L;Bs@Clg>)^y^5En z&)JSKe5sw`)3N&}m%ImFB;KHF9IpBto}m%w=hqq2f&qlSo>>efqKhJQVXf!%0P(c2 zzDCgS0&O^kYhtUfno{neNA0=Sg(w14X^jYpGut372XNt z08Azh>I&xE-O0QQ-=%?%PaftnIauQ@`Xl1skMdgp^zh4Max zOG-GuHSl7NW36JC*M-DMg~r&_1Hqu-WG5c%Zp4M9B=UbZZ_F)B`DOV* z#u@C`DR%N&@upf$c7)1Ta8#->yZ6-*UoMClT6aBGv?(eq3g*7`7vP<+TQqSS6WtG&4*BYMW!Cnm zf*l-J&4%R^jYq}SObI%r@2kjK_q{fxDTfI3#zgc>L&Ec6x$k%|V?Sz93Evhb#9d>_ zgH{N)%sbd4G}T%=o-^H-%D9(9#`c-j%F-I*-{F;MGGLNTuQKrsG3Wn%+l* zC06Wrj2}YQX6Oysc7%1)(Zse=ll+*0nG=0Wi}!InQ=r9V3N4t;NHQmw1WRyefvb01 z<mVxQKd1&d;n7lBw-@r}*>qOAJ z(kc!Mdg~t_78i~F^j=ES&yZ^mt4owpB|`o=yG$~UkT{b z!?pR>+4Axf?b;y7M3uoIOy^mf7fKGleaS=|O!&MOQJK22!mEP`KS87wX?s76#Z}SK zA|haa%J&pj>6|&`vm~^xA4dY~nY7&R#{6UKDj5T&ic$(1UUU_@$lAB=x+7%_O}uD{ zFE%)*du`lm$@OCHX`Nh^lzXcr`m#pwvng$41Jm@RND^iwiv(L39K|t#@B3bzYqKD7}MJ!y@nYYbv!Bv37N+w#b zm$#QBA|crB=QTPH!k%^0f|>50bIwt$Kmw!;dR@{gZMg6ti8kxdV{ilwp4OQkL|(*c zHo_TpOYbT#i?2OQ7N%1^%M*;-nGr;HGe)Yw-wKG$M}{SlYJ_X!(96L;xp>EeT$_ap zjPf;c;BRQYB&We{FG_OHFs9}6X}@i04xJCQw~-@SwczY4>2`Z(k5P-<6qKNyhp~_XI6TVXmQ%n^1T`u$@kIrYN;1JQKlTa$dxa*1c z5;p-MS0NA=%;$#L%}e7%-j>&zNW(X>`}Q>Mv^xdx#M?o$ZQCv|^2aw)St$V{hbX35 z4^@cm=wou!MQ-x2ja7O~{V7sVJCR8;(2`IldQidUe;5cN{25Wl7Y>Vlr6gqI*Q@wb z04P1hJOj;0YI0=GbHN#|K>T||E07e8wNz$uPk3i6v%G0+7oIT{r-a<17y5X1Mi|@? zSR`|H5+^^Uxx**iE3tOGr?JMQbC#<{=fAN=2=H@4Inn>r?ei>T$_So2YNFX>Bz~oW zg&K_yn3^jEuZ_Fn>w>bIL^ z1?ex>4*|vM^j#?1=~A!a=Z_j1zIbe*vl+?L0pdu$;Sk(R+}{L+cd5)djYzYkIz84E zQ3SmPOcoP$CZ^!gB2MK?(mK_bBrRQMOm5@!wh84!y|o!6db`d=TKb_dP&I8rl?aqI zQr{B5JLi$|4qRG}NVK2uN`P)VBL79;e<3}=X|9Z)noQx#@x$JB|^+kk;v+)jZg?-UAeP$00 zvdC_p0T)01Y}9jk=xqm#^Ri@@Nc|y7SU{t=q@27w&KN@`)sM8e%>~DBd1&yr))Q`z zYmR?z{tYL#lsl=t!(DzzDS3ai)2Tmr7%02MgVSnpMe+ktWwJv9SwsY7^^l6TfRo(e z5Au}}d@1<8H6IOJ-)t^;KT}o1^Ylt|K{xBO98P^@>T(Sb(<%Tl$C32rw$7>D%Uw2=Zc=#0-?Q#JOkyTIYRjMCzJP&%euK=b-gkOSSmv^vw0m zYq^$UKoza_nD5V3aZHa+vR{@DE-Uek6b(V$DpyIeppZkc+~aRy@w%R&(REj*S^oxw zpNgAwFWg-k!*%r$^m{$Iy%i<~9W5SzzWJqdFBWHG8*#NOL$yuezIvPQDs;K;kx46o zjIo{13x10Am@quiD{IrL7s#2W*XOo<$jxKIIC{V56oJC)b4&BfcIuQNB;OfWp;0i# zX=iKB@VMc)k=#TrlAuE%Ct-P4pTfqyaDOxO%(A9;d}ZGmBvjK-?MB)zaa1`tiejp}lzr z*EcB44sfG8Z)Su}e9pr8p2)2J`}@}%jm_~YB04z=YFmbE`T^iGT@vLrV1^D=ll~Kxv4iXqyf9#W^0A@Kkx2S z_stnRd&ZJ=q}gR~yOH9tKl92Z1kPsp?y+ zD6APSjV36P_KDj@h#X%~Aji*6ihJZWf+PALrMY_6jdJT_4ye~woX?}Mc+JsO#1YrU zpP3tV!QdvJ3@J$UI?)qndahu}AZ)^Qx(23qhc%s`oSGPp)(-I9Mb6!#cC0kC?LrYh z_-I}zl8|v(y>?Zdhz{QlJK%gZe_@7ju=X-&SlD?QWSdt{`(Zd5`$GM$K^et6Hzb!g zC54SeE&d15tNYp*qVq<&FDH`JZgyEhD^>-Uv@S^73#hPg1@@va?a$m`T;x4CBxY$g zi&k3gA^FNw$lRVQV7pBZszX?QI4oNVzPt-rTZe6)Tm<6)a%xe)}@j7wU zVS#}$fy`yrHpnE%;NgU+YpCr5dUIwD18l7KbCL12TBm})_9yt)R`M1am=MN~50^HP z^=PJ(p!!4H6o2=9i@Y-Rr+xNChBx_J(McFyCZlU240!wNb1sCsY`M+w=dh0CvXtE) z3UcP#Oab8+$aDu_$4>vtNT?5>!QwUwlosp5tc!uF-bsdTf(hPJ&j%EQeqbiBu&qv=d6G=Jh9<@HHB;8X- zotQd)6W8N1SYLi=od9=lt>E5_5O?}cp=7>XO4GfzG#Dzx_^@>fQ+n-SM8%+TwWy$U ztuNXjBbAzrh5opm!X7x#=0Ofkj6EmK%pJ6uefPvG6GAL9Z<5gQzQpsO6T0LQa7djX z&GoH+)XYRO#PhZ>T-`V>*7{&ajegv(IqHdDpax7gok50z0$ODc?(Ak*g=-@+!da0S zloE8|w7T$lvgT>HrQ^RDdrR2%9S_cD(273isp->|Fq;02J6oo3qG7jqEHPYh75X#w ziTZ>O`9ch7PrRw1EnE-j?*XoY!bmVF#B7(=z1iEY$c{=#ypJ!OUwKZii)E9uk zm7?xH@d?mS>%$@4Ypfk+Df-UPv)JWUDmB2O(l=_gnqUXyh=%iA|o;;^EL9m?x_X#8sT|# zOQ{{KJ_FL%&xg2FyFrH&nd_zhY4e7M>NUI z(;`;s>*jR=4No;Jg&4>0(fU&@6+gi|aX6ogzG+*?rQHsdLZkyl+^4-Jl|6yFeKtOn zh%#m!--_?}iVE76!!@Yg%|kI61h04W(8OLN3NA79+>au3Hl7g?M-zzCLHae6VsjU% z8<+T{O3yx?;y|YmPDFGwvRj;i7rkBe3i`C>AOS)VtX_9|T_R%*zK)@ow6 z%Tnh!b2Fi9Otq&!1fCKkfj1Ed^ojoP(5(C6w<#HwU*R$BN3g3`;SLgv4?m)A<;kSd zwu9e|_Y0>i5N;b^YE@2Pi@5;)71+tRE67iQ3mxikA#6(AF!^>8CD5WvO*>y;hZhYa z^FUFkrg9(h!6>~?IGcN&q6erq4Fi~}QF}+zw=zI?LF>H49vP(4xB0YX6{^0OlXG-wa6f9fB++gz#o?HYp%tSXeW>_l z@6hR4<|f5sR2mS0G#>pjSN=p_;B1^#OG?iyGa}$Zk@=F~oH$}k>(V4N-rkj$*Od^~9bx*Yhg6KL{N?)@>}6(rxGU0_J=rc}ck!zSl)^ zMmRRKHc>V43}v~(oW+Vt5dfZ@5~W1&;^HcwSyaKPxahGfqVqh=o@sIr2~Q{a5=Q5g zewTk==7_Vw=ctcZ1wT+4IX~-U3g&im=@@ou3PYw~gj6v_p4H zPKZTot`E7!QC-_kr)-jsQCW$Te(gN#QX|dvVaz3Gb<;H#J8{(f3HQvR%-Km zQOohz7m5RB6R{Gn`}p!D$_w;6j`AL1biz0qqCR#phdL*dI8-C_-D z`oZ{$m>%dJ5|iEK5~Z9^%j=|8b| z+hD`nf*fAvSprC7sJGtWW7$ykD)r5-f(`78x0PN~>;q=$j$BZTQG0J;cuWm+ePOr9 zsBGSD9lElowRCZxFUZL8gLvHHd^NR@8Wv2+Z7rse`Aue z=FIR~q>>a1o?fZ3((J^|5UD;Fx1<(lDuK5I6&TkRpSdkz-#3W01g!RObg3CIx-+i^ zD(1ikxw38qp|ioC=EbJ@g04xF+kJ?%Ab|R8>W8x*x2r@gqK)&6%X?b?c^UsaFJ7lh zF6L^qQ8fL;Ol&$1cC80CAGPI>5zv#JVG3wR$U>RUjpOt>xi>n=bd|!IrS}LCG_{MX zUB3qK5?S6t2^BC|ncHg311C2@Ls3XS+%o9(oLS}xRpr3m+UfAFro8h}QY1=5+qtZy zu1OkJpt)Ik$TTsxcz?ptdWvF zWTm?O!87*7IYYO$w@A3}QsVJ@CS&OjlCgmUc4DInPkhtgzveK+iV_Zk*xDF4F8H-< zbL`Y(lnq+f3yM5&6Kj)FN>F$ZU$60!V#g(OJ(S$9L5#xotu(7PIftD6X>Jt z2b^}B(tho>KDk}&j-w<+JJzk!WNL(h>3-GU+}}CJvlyv3a(G}bi3N+A?tTsg;&5Zj z3K42{702t5PZo{vZT45fA*ZQ~fpe-(%oVyoOXgEIp=*BEM2Vh~-&NS@|G|u-Gw)@) zn7y~Zana#3BRx!f>NiLH`C})SQ4M3<2YVB`VxU^AP5;d!z|6zl4@!QFb&>9I()P}f zt^&=GUNdB+iBdojmWO_MZ9}BDqDT8>akzJvF><+gmkGCrD0Yy+MKQM5(=i=gCHuFN zDmD~Dyv4FheuNw-(x-(y=nBXGA`tyE3cuQUI%-=?G88-D?^j>Y1kz`n+1d`f`hzl@ z&{@QV43~#*aa=;5F~Q4|I7WH?aIqN!KK{+9SiWygOQQvEULpz69nDv=%c3JZ#!4io zeBuJ+f;``BCPj19pFAt_roJ**x}N=M$!vIWB(jtYC5lUZ$MuAEg1we)rQbGN&y}A2 zy@J*tg`$0pj;d?Y6Pn*0#a0=lP&7%$T{0>0ib`n~A%MQ3OEL<_Tx3rOeU1`Tlg^d9 z0~ReqaOH2MmlNV#99^vuB{MGiaA3HHZ2v0ZP=wkka5b6(G1Rh7 zNg?Ws;edum!FGqaAp66gfefH~jn6pLQ2>%i+xEhFeVQ)m!`4w&RXDagHLEH@_2Fp0 z_^{uZDKgGD5TGMClESO~Lclp;j52qu(x4Km+5P?|qKU9%nXutq>tjO-WV6AVyWR8^dU@Z$+(BshrI8svAyVu zV9j-rE_I>?6X4Ffm>&tOCCFD39yskY9hHi3+3*!dAATesx7EYxr7UxK)2au#a6yY(bT z;^21TY;#}0$w*~IG6iXyzg@MY{MxP=lk)|L%H1*w_KTB0cmDDcQ83z8UYe4gM$-DO zaeKegZAKx=I+bcut3-Qbp#O4)hp@bN7SnsqyXl~;P^5Vdcv*VFPa?yvIgHK}DXoSh zZJ~LStuigJy1wLm_xqGP>g(b-?NoNDX;>{(@2O@iqcZ~i(nkNyb!#9$#zrzrNd6E4rt%y5y(r}i`)6O-Vq|T_K|jStJX?W?2Y}&Hz^BbMWBJTA)r5VTWq@Mm z0}=9N;y2(wfB%ShBkr}zgfulM+*_Y|M(3Gj<77ECHmpV1Y1Rhw!)g9Ge@Qznt2|-V z`E_u~`D(oTWnv68!igV>yu!Zi|NGQ3p=$2O8`*GadGDod9MWR+YUM<;REL8an923F znJY0PDTSK#?cPd~vAOjwxqSuneeaSQ5eo+hA!(7}3XqV(Q<4xJ+Ao{q06q>k?Iu44 z&4AuB;E$8HbLz5fo0~qWf$02j%Pd7|TwNPk%)$(o;I%%Zr_t}6(7ZyW5c9rTZu{Z^ zt1E}a2&HQ`=uK2jMbVbmtA69_Y5;5f`@Y6O1!F61`owO01HYEee$MnYdUT*s_byv* zbteCJLTPsk`0Pyj!CCzjzJ876A?Md$d&eUX{x`9I`mf6XHzcI78LwoCaRWX20>sB0 zhI@Dl6`^1Zv|V_EXzw$+1#$ysGL&m`2OmxNtE|*2X}q zo_gkeXPPZP^U2R4ZT1Z)Y@?!(NMOmX$AI6mS9%lIj8*p7_GO!9nxCD^ei|s7+EMgt zmr7R1m269dR#JR!JnJ@gw!%j)LYpJxrWam9p#;S6 zKH-ta2bI{|Cm;5Bnw8t}<*IO2gF94vp|IB)+Q~uDtlX7)w28pY|6V2&VjiN)U`}o` zCB{Hj`_98P>=t9I_KB?SDD(cjov(Qo1~Z1j1OVnek3=sMa;g5R-JLWITKf5Gu=1?n z+l|LG6gg~qSir?RyqkjBN54*^(mf1G^1)q zZ1y5ZGZ~9Ka<*4&bkV7i8R}@HTatOP8zUuC89nP~_Zve}2-$MhkI@M_gZo-qQw4F| zR=wJ(dWJW`YHWG#%?~@&*z=Yi#j&M!s)&c2+!m3r2)JoZM?V0|v*Nv_5|IRGy%JJ2 zl8%!4kPO3sS&`Q~l`~wvd}S;*dca-NsH0=hRBcsS4D_0(Vyb)s%n?+(s`0l`cPZ#< z8JA(gwWF&~MT8`rIoqp%X^|Q`p-pjK%1NXOI10mqx0J7qVzW8=DO0yZ>4n!zjcmNO zlH>N_vs>^)3LnXn3o^e6XO%15FvMLm;44ye7y_yGrm}`vu5M&&g{*2FeussvSCw=9 zF%2zsAyrNJAb+wMfurAz0vV>lz)C;b)5jGl5TLdaH+6s|t&0ce7sUR!-h7wH%_e-8 z5_as$^*@V%;1=M)Dz!xfUfttnDk;-{?4Ce?f}Kdbwo(-Bi60EU*Yg&Iou`F4o4;n! zXVmVh;zZ4VH2^}sT-A8lGWjVpdfN5d8MZ==^$-cXG5f2hf2vr!(bPxWzmSQ}Ws3%A zETcK7qA^Z!aAxbz!4i?l*aY@yl}Al{s&V0r;a-HqKX12~Dmb{rD@4k&U0?U~)1JSK z>`idbF8>GtP->>->sKD$;Q(5z)k0D-qVX|3zo4wg&c+PhHHz3^a=I72;Rd(EHwe(Mc`z&H;-}v*s}V`FR!QObCSZL4+tGc9iUbEN0W! z!lT85AF+|kHBX4{`t8?XydQ*5uQO=5y2si#g5Xiad@n=fy!_5cO0eIDf6`v8t60a?_fU|`AQcM&<`IJvBjX93{anfYh?!6 zNxuknQ0No#Y-E?okKsim{$bk=Ujy^8M2Qs>-&KMGjUfKfU{d0!Qy=8%uNOof94D;% z9)0iV^O&(}ifg^l`T#eGg{i^EBN zwyOJg!e=(-h{8Lx$i(Nb_C%?ZrVM8JzU{>A??&`%QYX16G@>yKv~g87s97BXZ9}t} z9O+53yTtY)4gMlq>Ciq$SPiI1C=Q6F0XwDQ9QzlAWL}F`+xAFv@5+SJFE+_(E3VI6wk|fqMx$A{Z z=eethQu>R^30o|7Rvny1Bc{g%f7E5KS@O$EuFGmeC;g&ip2&wN%+Z~ z6rM9W7T!=*50Zb9x5;CA9y#!s;LPl7=1wl&RZw$<%&BN{j1yl~X9oZ1e3Sqllg89-ezJySy!;AgksGG+`Iral~TIwQSY8Xm{Y zlA0e7<40^dI4K?A=Las4%olGig|lg~#M+N?*qIHYn;?5@Hq6_U_%*i{bhI&RHJ5geHQfg?zA+Y;+h&%QPYaD=; zoMWq5z+w%wPwYXDuahjga)RwNP}2jkCp~2ktbR91QF}X#O@JP{A!^dEeZ_IVNFcSS zW5Z$Pm|R_{wcXZ*PBnA2MzZkx@84#N%g_KB%k7oG#_pz3Ey z?M+p$Ah+TiC~C0xj%E&og|A)IgtGUlGAaCTF^xLTq(5tGq9VbTUsv=ARA|*RS6s`u z;zB~jpE4+qBWr)X%cN~S4nh6O%3^}yfKS^5+iQI!X6O7k*-FR*OdZ+C-)EZTx}|9* zEmb%DmRZC-0svShbIJ~yXm5I0*C)H|$}%VowI>hR7su%@=aPi-T7F#GA?MeHg~C=& z1f>+!*xSD99Rq@6oO5at@qFnx@CvFm;o>6tq|zvVBNhk8+}WuLyy9+JgrXG-@x88Xu-fMbzGzVEnPlYnmYciTSO_EstUQX>BhxnvF!% z`OiY~IOMe&k$y{K*uxse;g8%7p(LL%b>>-QnxOL22j7PMq%DA>y+)VXTN?$_Mzi|v z(#X;u$EruVJ}T|r09BlnhDhnrx4RbR8>o9u2+HN2gOPav??Hg%*E7)I98~JB-?dRs zGlYuk(3c?g_eX3)4-VS)#w~*sn*+5IE+iasbE5MiGr|(a`skNF$&ZJ(<0+}@XEv<` z=HmtT(}WXMzxJQK^3D7~$wIs-dc8k4y311#onwhd(v7)ybGH2r8`H58Mx%-$+XO&v z50!^>Tbe8B>&)>5N>E&@Ck2QgkkvRZZ<%C|I{}_zM-;XDvH9T0(OpO7g-ojnHO(6G z6S4@ltR)e8AxvtK_COjY?X%ZBlXVg9cwaAV*Vble2G_5Pr2-@4;IdJ?mdf2oc%q$E(LuLmcQAN&PmFZ?URALNw;9`hBFq4P2gZgwSKQmmqH$_+c-jt=KY4f#P==T;uqRgA zM=n8>o@l z-2-)ak2y(o$tVW+wDhvVu(4hE%d!;A4S%tHj6W{*H|^la?Ouc+DN;rl#RjS&!Mm60 zuo>w3-bRRlQ=oG#$irN)hH*n6lpCe19D>GQjHkfl@Ih5A|Fh3w+xw=x2i$G{1R=Yy z0;Dp*W_x80T$cBIZEA?i5wZZtnKuX_H7KeFjmWC70Y>vx)g|r3IB~abceTDd>!)OA zZNL4-0oM8{*j6X(8j+n+tQDUwB^Mmc&?x@vDe5f~b*60ePM-L|4uBLspTp<}EFN27t z+oESu^dYY6`_{yB6q|1$S)CT5N9{qbX$5l;UpQ3wtKPa*B0N@*jQ|-8M;P0Z2DZc% zXp06*7&eml4lOD+rA6i+EQ+w7l7e*9zWlC54BhJn2b#PpIsTUp(o&pW2+&IbIWI?c zmr`I1U9sa&`!GfEoqcYz#KOW=SyLabI9Y{^F)p=^Q8SJqG?b`N7@{mcY?cSNm>+BD zLwuSjkvhwYAt_WgP=0XJ>xi+iw$8->|DSfohCdDFCNTqAD;(I6R`MU=ggURL_*5m0 z-MQDcUWHQO_u%G9PPb?@2T6(D;uB+*cYc7Chs~*Uc7HxDStHU5jt~oWVO!t_f;D< zZZbT_G+6Fn?G?3}%|Jlh>?;`jgqoeKM3Anwv(juk=o9Y2XRt1!b#c$8Of#^_F)96F zB{VmsWRi+A5cJqt(O0Zpj%;7 z|3}7}Vvc(*MD~nQ)4hktI;!&s?b{n&>Qt$nIB!v_wj};|_r}P(YMp#n!QLU6FJl6o z%mC`-$!fs_WA`EAin zGip-Cksp{GsYMArM}D#OHx1F!)pS1<7ieM4W9n8L8RnGd;bQv0lu>;$hw6o-h)hLQ znoTK_ei(|{WLOs%t@ZnCkQ-^y?}FWa{eqaqziB@<67j33os@qOax*Uz@DBd~WI&t0 zcjCYtBaKL>*z-^X=ezaMNrGZezo4%e>nnVmxlJff;i5uQDdRiIlAdMChD!T?+6`n; zzJSS40Hn_>3OyG|9T`yLC@uM_)*YP0asoM#(uQeP%J63~YM20lTsd_|#NN=oEJ`Zk z{p*3m@j>-QTef`t)CYZ|ofcF?>8PJ68$VB+*7T)DbCYc4l^|)ao z%?1wD_>*O;Xz(^|%L1?HrDr@}m(x5;;kE{RGS!@ni=pl8>T8fnyF#lR|42E$#hk$X=TXpm%%kt0euE z8C38Z$O=S-q?6^x!rjcmP3+W_Nl(G}49|_d-*oi=Cz)v)k*u*U9xA>svll)jK!hwt+tGOX|muj(CE z%h_m(7^ZDL1!?pkDTJXAlKm-mL8 z-?Ri%9avAe)|vk}#}QZ?u@1B|WUwfu2S6uzRL=B6+^=St-dG`~lD5 zx+arN>MF0eJwtP87jmH>zIxh23BQGBpoEBgu)gv-rK@a(l2l!MEny#nBB<{qRQ9u5 z=NrRV=DpV>y{-QR4~+`bba~U#6P$Ytz3f>67b~LQz6JQP@5QR;@Zk)l z1}B=TFm}u||7>tji=NUY+18t75$GbG6M)F5Wu(*k7&%q5e*W2mDKrsyLai?=AIz54 z^3hy=vHKP%gkqOScyd@=7c@*v-E8Ly$I!R!yAiF-Gw@?mG+UlrHrZdj(GTBNyKILHdRg=lh0l)6x<>aw3rwhhp_sUaj}+`S%wGfCC72Ujr_2a0rDX5g~ug)^Ff zKDI=mUjkd+!-Gv}{l&K+PgnEFuBi7T!bQIr-n@O`GgP>0{VMA|e1DBXz;x(_05!J2 z%-6igtCKw__dG=M`3p&n&TSCY{=E3A)USA7m#T{lMuQo;DRZ8pIUJ)@R4!MZ)Jrm6 ze?82`a;*N!NCsfF6ylIRySn!edUw|-_7IE^MMPbzfNFsoo4Gi%aVoZ3KBlp8MwipM zZOdoEEQxtmIJwjAwXdt@pY*x1byHPlisJ$)FhcvmlDE{KT;(cqsbYyrx+}Z6wP)(o zTdXc5#+D2B?zDvwdW!DBke}Q$i1n|9Mq6jtG@vh*;ZyHh?dV$U6Me6CX{!%46tt}B ze9N=>+S`o~xu^%_rq0)uU9Kr)nmUYk56slcvH|HRmsdb*vPBh~^P@F4gIjxiHy=1{ zI2<|Fi#rRT#8;IweTqeD^#X+Foe+jRS2nJvuaeAZS)xpWrw*Hk(&6O8R>}p!_dv!i zPk&KffYgxa;wJDaDia*fry?e56W)nkZ)(PL%aYcedmI5aP2B4~VdP{$Qub!HQnx&g1K$S2 zp2}(Yhy5rwLFW)7fpBjORO6;_xx%o{jgS_oz@B6?gmviQY=O90$B?4O9B(}*MVI?F zWlgvQC3O|mdiW<_83?dNI|mnORPQYgOMjY0w=j#87+>pWsE(`%3`}$DKG_pS)o zqFmSoV)hh+dy8ilUyD9?CuVAm=y~0Z2*dWan@@J z89d06{wh|0(#RkBn^l5x55Jv`ogAL z4t1w=tEq)t*888YMqr}I8t0w(%2Dat;+9E|Q;D$IqD17xbBq!FIAoe}cLk=! zX3Fi`HRicN6z+PrHV_l>t1c=?V7FlY>R$ThIm6DU*n{^W#Vu-M94JzP3xIqe>bK_B z%b9WQ$GL?wQL|QdNJyNm{oU+-%wt=eK)})?{}BETB3y_WrrGR!`Wq1fzp}Sqn^70N zZGH%Br+zkTE7o~N%FF3ch_D&RA%~L;$^R=u?`7hUL@)X0eZnNqY)}Ykm{0#Vk6yGXdrtZ6-HXm6*SedHtep9d2&M?Bh zlk(j1HCCpb>hhnk(w9#lPBkZgC0p_U?XlhAR_`irPkuf5BDqFu?aG=pc`6|qu_5=j z^$eUJ1#K$-7FrP~J)B_JvyYl#i}X#%K%EIA1TU-qNT&s!m;8Qu zt03|EpPYYkN_XFX#XeF|Jn`AwmCAdtPXK`i7J$M%g9n;*yvD7YtXGdF>Y7W`PM^)t|AGoaL<{orDQSRBT8Pt(3?tD+ zI9-WjgS3?f`d78;rGR9vBjsoOYdrmSmp;HJ-x5f6g>&n^(Fk+^&0kDe5F<0je;VEk zXW%fq(hxQ`36`#-0J^yjB+-^-igr4V#3;_-xku9F2Ab6TqQG@IInCw{DwZiQ)6m1J zymhP`V!&O%St3oIRhN6*h!Xa8e=)}y6 zhDu^8QpQ9G^xQKA9MxV>P>-U|R*gMoF{g6S5#a$;$31y)5w++iAq^Wbv{%O+r)1k= zJst}5H@HAqcJ@TpJR{xOgZfPr*5QMaS%2lBMcmjD{jD{Dt)o zzQf-elEU%l@6oL4CBm$^A(`2+AdyjnV`$N$AzE_l4B3lps=z34V`*6YimrUD1E~^P zJCM#39jKxtJ)O&E)4N087LpyvvH(-oMIjpKF8z2QQN}5#g(4YLB&fPvv`#2s<@P|! z^Bu=7KzLKp5ogq0_CI7oq0prEiQR6e(cYJh2>4uA-gaEpvhzSNFB)BfBg5mV{uom3YQjXzX!ev^58rU1Kt(5z&7?$rmG9Wm@otw{Vpit^KR(K_Uthn5CL$2;D2Dm$xmB6 zTB5xl+r>^gRa^+cAp4_057M=DdsnCRNgiE!Hb6SEJ{wfc7vfGdP2cw~yNHgR?Oa_+ zDug)iz@PyEH`E4tCc-nLT?_>xU!ERmV|J&Ht2?<#+6%7isXe+g(Uzn)>aGyav@i5Iz zQ?!4PH3CzQC7FBHeke+f#cJYQ)ojjhHUL9bT$v%!r-Ka#>y(HJ9NYdkOqd8G#H+5dD?7 z;eLZ@`7r^65G@u>UaqgGBCP;KFhDYPR;P< zOALL!;U6lHKD;;}_Kt}}Z2do|?{lR!$GL)015MOGA_f8BMN6d*w>_JPPC>L-L zvh~gPGY7gA)gS@IW%5+?h%Yd+S3Y4qUF6S?NITDYm30e%-OquS=8%H8am(%tpD&j+ zZ1eo+IXVd#1DSy40p?lN^P@w`;9u&)QGmCnGa`!w{wn&l>F_HAHHXk zuzP+Uc%SFPTUdpP@SL_hWv}1{h-q~7E_eOjIMTHD+iz9LBOw=Tfoc_ONDn$yad;Tp zTVL8xDAww)gJDakFXil z0Ql?Q$>8V*%?H}|F?z!n5Q6KMji4cMLDX_01oS-~tkN8R7u?X{I3zjA9;^eokg6No zJBW)yW#@7VCJA|7>82N-!!A-t;XxdbkOYTinX+*ET_vl7TTTTKt?!OPieu=WWj}Yc zcorN3^sqQ0nv&k!_6e|Sb6%sbAzI9hD+o&F4OgrNh#l=?V;8BhV=Ki|uOdamgxdh3 zwg{S8f8IpW2+^wx!-zZApKLw!oiKc^Y20LD!JZ48q)9kT_NiCG|7}G!U4?3lG`wpa`wN#- z)~VU*`R4duE3d2jw}ngwF-7c==?HmZLyb}=G8)qYUw@KtlRb+TeI?}c#{iMTSHrZ2 zJL<(vPn%^Lw#1<$rP6{HI8R~Qo0o_qab0?=Els;J7pcm(7ro?Ke63cq;{{*v3~*ok zck&d4tHGPFKqt6DNQ2iZmz;C@cd@Z3o0;Y!$#ICx{?oTzx_AC=WzKm%P+d)+hah=s zJ_+^G2ME)VaL#^HJo=~jNNxo4k`{iTpp*WYxG8)q6PU&!T}x1sQ#iU=SB#kfWnPjl z7_{%iv?kjq#RoGymr#zCmBJ zMYccu?AUCEytAa=0|nC;WKT)|A5~`yUi;o+z|#-Isg4pKomow~6MD4P{;zt-?h4fp6+qgE)k)V73>w#OK2H2STif^t(mpu_8B_jUAtykC;59BC{j&kZo@u*152pCtlDr; z(mj+^+Sppx5wU6v!AvhT8||)+lyg7l>m(i`LQg(x*n^9eXmDI%-o@TGNZAo5=qFor`&yiCvywg7Cp6SYrQdV>;5L^PosN#t zL*iUw{LT-<@Et$}x53|<+sGO}C0&IlZeB)GW2_yGby$ZGx8|ZHIjeAJfX_JdYAjNiIrXL5#D=x!{HSz} zh0RarE0P9yE86$B;n^QinQo?|Nkh$_kV^i?6Ak4mNs*IGQ6Hv>Hcc)625wvKH(P!I z0jLWC#i}-r4y62~G|_?XqeGsiIf`;%ASd({%E8aLM=_xZU!fCRw_H!I=M;oLVHc|& zK4^q@*w39K7(}D60A6AbpSnG~lZ;MB+oSoZvX zpd+xW_+-k*UQ66K+xKKxq*=c>uKUBp$HK_CBuTp!cCX6Lff+!Fxu%1@#A0GGCI=fF zM8h^j^{`#_o3L5jF}`orA$5f9n-^t&qbb0TG!6N-3|r*tUnNqg>;jzom}5zgP6>yn zC7tyRhbN_7#W+jhXhla#U&P>;)dr`i1a;blgKy;4I`)Q+{@NYih^;KcgS%OoV;F%j zd~pzl2FT6H__ijN6>!2b)piI%Wnb+^)Rihv9M*~;0>dxnImKo)$UU9s6M6lq_rIuMRRr4s zY7IzHrqx=86GHXoIahgs=Q1tlkvwT&Q_hEd#Qg7C!4{f=_4fR>u%VIopL4}=Zu`|A zy|3Yg4zLHxwK8Ip%*(trG2$-5O`kT>_3$NnQzVub^Ylpvw*W%Da_74?{gMWt$>;ht z&>u|}Q^8`G`!1jaa#x2psq9lytrc{tfd{5=RQw3>P%$UpRPFapC#NO47xnqc`im9V zK9^_7C7e@JewU#`--K7HpoFLK@3V5*&f*=<-dTWWWiLPxMOWL2Q2Cj*+=CPn%isT? zkNRMSp$hd&>){Q}NFT{TPC!E6wV;#lR65~KDzyFmK*J8vv&~ zAGK#lX0Ed-e!wCOk@&j=zk_gh^pN{Ll9%|l3tQx@4?=i!W3^NA>jPQazUAW=b6z{Y zrCW2x#o=X!Z`>1vE7Dap(S{xL_Y)3R9r`tf0p_OoaI+)y-=C`)TdCiE4~*^Wyfjej zmo48ZJFnF(E4iQHZ4_Bg<@Kp0JCYJv|5>@Kj?sHJQ$QBD?lR%kMx zD-<{zKeyyAgqx$<8EB42TMp*V`a`L_(*L#dsu9gWxH~~x#=3u;^D%~mUN}VIrxkk?Cz>~+=Ie`0xFSk z6@x6A&VL|$03CogoB5Ij1KwDOkhY)~<=Tq#>F1h%u&hIP^!=o54t+D5d}SfCyiUGB z?_ZN=KZg|VL%dsE=^Ji6V4Bl3a(aLTzXwrC1{xSt(eab_&=+=U4Aa@(uZ{L~rk=-fW!4~v zRc~PX7m+C^H+)QgX{`+tx5CmYJ~4;C8A$tm2D(%cCYEjLgaIiiVbbJWa6COY(x7jM zkmgLg;dTN_rj4J(F&0@7?9$#4jO^r?80`3;{W8aI=Mm~Z*fcc_R*y`}Zljj_*9&2K zh%Y6CiBZ>=kFtu*lNM8Jsk;n(axVh=A;QF@CaJ_tXTrpOC#_d-N-yZ)tAju!?mCPH4{ z+g`ILp>AME{G>moqqToxfwG}4{@=b%l=R5hv3u~tdTaaPGEgQB$gBE*uymRU^6r0T z2N&R7de3QT0DX*~Q?PVl8k7){N$<&q)mFvh9!Tc_9-~T9hb{bO)rGDxJYxzfgt;=4 z_Mh|r2ABs!>7y=cJ3kQ;ekqphYq<_xZvaL>gT963IXhQu7OT3{my2KN%M90+=!P^~ zB>^e~6_`4(-hZ$rUfqw{wriiDal^_`Df*~IW9=O$4J zaN6DNi%X13i?NS1?2k=!Gv>yw%H7n$F(%&)gF&TD>gn?`Dp)P{ph90f^cJfSPmMoz zNh8OLeC!MT-rLA-)2jj?G_>e>o_3RG-D^a+6N0cGc3W~(b*X;kjyuNi4ODGo{W$~% zc1nM$f&xGqzI51H<~5iq&;)nXkj0xONOmzG1EIzkSG&2*YOzV{uW^e&HV#LmpzPMl zR!B9d^>X^de6Of*)0EaV%MMy5PHIg%I8}^d8zoEMGplrh6S5!dz?tQPCJf8_uGF{i z4l0N=G5x5|2Z6vg`Isg>)7f_pQGIpB9=jgY{IQTjY4a2#yG~ur0S(om$jw7kXm64n z=ta4YkUoGlsa|Rz3nnhgl+0nJCQqfksZpq^TDL@wHas_={u&g4+?YQzlDIZdyY&m$ z>2H1?#^aljidXE5B5h0u?hErwx}#jFDB4JB zS?im573NkQLRR3ghpt}bM0 zJrsxF6J6_*7!{Lo4o$nJBB6x`!W?T0{3!!oRc`r=SqVO zyMu8PvLB}J9AV_qjh357aNGf<00|*-aL9=NJj$s{(wdNmVr)RsbD6$Yj_pGc+7Ku! zhg(xLzMQ(1F<|QEiI#F{SUYJ2S~DOQEygEUa5QIEA*a7oWGB0f40wCJ=#sSYdC^f% zN!3b4u5CA~1?Tf$%u2{jkpTHQZ}Ng*t!UVmU%gS7w}nNas!lWSt3K)(ZR55YCalTESuUI6576S zUcuB+U!X_?dAhprN>&zAIceGyw0 z%MaIx$9f;1vuJDE$tMLIMtJx>jl;QQXvL_?gQRSG<|bpitrwlW#ap1hZNc7GHK5QY z5HOUwSHV>Qo;!x3VElVO!l13KrMdf70-7izSM|@-&fqICtY8~gJVk#;Xu*Q#Xo_a2 zpt=R^tS!Ct{K${iAC;`5GiW`_o%fTt4O-%Wf($~&FqXwN!{**R zl=NcJ&wZUQ9rBBl)c$&s;Y*`Jo8JzKLpY{bEz)Hos$6oLQs#!IAoHS#3s!N)CcO@z zuHnHK>OMDQ-39)%0yM|+xn9Tt&$c?FTV+u~9p`a78t+F2(neAc2kte2ndg5$(~>y& zALfV;HAK4!So#Oj={;p&J&OHOkXgeargL+sG2C?&7;iAL2fG#$Wd;QG9 z*{IL+$o@#MK-U^o0Nc~_f)$kuLr%FG`0WHh!i8a~jycNa%p4EF0g>*|xFYNNvleV}}RU6r9Le53-Vd+ zHYA@qGPq=xM0ujBCz7>Wfwu()LN0`UP-A8f^|4#Qo@6IUXHbf@H9KS|s~5V*{^AnT zA<4$xKj@=JNdb;uSMikt&C%fHPJIfa$oT#vUq?PPI4JEiQBUz3ZEj!KOs)7ncDC|h)!fhrqUB&0Jpx%SQceHxg7{&3ve%dySvL8=ub zikvq-EF!;G0B+S-zv+e5GxT0q?HGjfNA$z8O%y440QpYHnexUt15$$@ zgtaCH|KAj%Fc>oZu@}tUqAK+$j`7cumAiNURPYqcfd|UMc)HCV)TxB*xo-k6#WVa! zbQQfjicq#Gn*PruDs+012pfN{-0VKHgm|2x4gUnXnKZWeeoqFFTN6R1t^$FhrbU=U zk9r-)-S#ksQ}#)Eu`}bUg%AK$6V02otz29e2-KqVgg0AYFgl+oN<%lo@2UfKV72nS zVWq1e$Sbvi&X6knG*^DOg1eF1`qurtVNK6{OW9EY^@Q95#!==MaqM!lC7l%x!z3$Pdf*PlbL;6fI+F5 zT@8vVV_+Czi=PJdet?y20Y9)nF7jy?S**+bv3{k5x>v_*5&3EPtqDUNdbm$hTJ2{_9PnI6bakrDL#!IN>J!9@ zJ0yD;;`rDsqL<-68)HGJx%#X7+-Sz@U7{^=IDG5iVP(cTz7N^VlDBHhw|IY}><@N9 zxOlyG>(Y2Elk2NeQApT6={p>AOTxKJQ8()!Szc;Rr4pV|nn_eKCJjQYykb!g;9K4L zn$_R4U}FKUZGX!vS1XQIek5=IWs1Dv!iAg~6TweNT7f?v#jgBA79 zA@LqKr68apK>4~XHAw<~R`pY;c5)ZK@&u6wLdVC%$6uB2qj(Rx%KJgUn*tF9K?CmE z%iKWgxk9t9E7RE~4;|a9k#1v;(Fo#(pi{HNW2EF+RU}76jglGQn0Ys;Kp+DZ-H_cM z)2WE^;EcgRC^gg6Vy7S8^-53L2q1b{XqSaHmMBd54IZbIwpJL!q{R^al|_)CZq*gL zesHdAO&aYvJn?i+E5S+4uDzT~Iuq7BbwC=Wv0mQ0D5^16sq00mOxkYZ8P<~fnm?)CuQq-m+u6&E!2p&f0#%Aq+ zbMUN!d1#_t8d{IGt_Dlt;<){Yz9m3q6(Q8-3_RjM?(vfP>Yg}KDQ0Q;chHj8PHw*; zlOf3q#I%>bMU5|-x&xJS^KxO|OrGfc*}6v)1){0W+U9d~zWE_lj$o zk22{7Bo4!_BX0|08rC8ao!XEJwCCH|YHbXi}3?b%}3b}BZ}eOh@0p_Gt5)}NVq4}f1uK>GlRj+ zQlQy!#D0J#bVuzZ9LqFribzInV6M1gFf&ur3)Vd8WpzDW%>oDUY9dc%fK`C>>;H$j zi2Us04M7_t7|w^fdgn^#Mq+TgR8NNS2L?CIMg1_Ma52t8S6Yr(|9k0OZ$#G%w{J-m zZyeeQ5;_%G&&0*f4aS!Q7+%*_S#66Z-q<=m7^D=TGN)Q48d%0JFd}MtWXZoUt$uO= zSbZ1dJzQ>PK*h(FjXbLXFg5V=RUUw6y0u|ueCW+63xv1U2mcOG1Zw;Km`3ZS!5Eh; z!@;>NP!aaA9`MoVTduY@9%4P%-G$~{YDI1CZ%FWk?5_UbJt z!FFH_*6$?5DVF04ZJx6|9(PM;KG?;UnU0r|`fO7kTAZ@W_@(?i3AEoQ9b*2B9?lxT zq1CYrv7I12A+^bqSuZFkt%^$-p2pabYx`@p7qyeF0>bxS)brPD4V#9i0G0BPdjbsD zCwChGm=vX zYe!7jNhpFgvHrI2O_v38t!c@~EteGsXs`(EIY9Q7tYrt!_^73y+s=aY)MY2|y+q*SF&dpC6Ai>p~(fx|2Wj%E&YN?Y6X01s{33hQ=wT*F^B z7?ft-z|R53jvZJv(6_hyUIOIb<<>1dN|TZ48K$>W!`TYw9ZG)wX3Dnz{mPQ}#3HUZ z+TzJEFXH@k5<02mFV_Mdln+X)snK8hqlP3uJDLI_{}hJ#jGW^Iw5U0hJd&m{%fqOjVpK4$IBEn6!PXl0qOva0%? zTZ*>^qY^wT4AdLa0CK&Je$Sm>@X7edho_tZ+}+v>v7%p7)rbL0&-AC0rlR;c7_ux^ zRF0~aeLN|Iqk7*`zuQS`Dww@E252M+<|s%C(;h{-h!CvCmv;bn9nf-`R;j1?s4166 za>Gj`Y+~ZmVX`PG+^YnHb!rh;C7@S%KeKBEycHu>IN)yT$t8?6S@ZQK;X& z=*(1}UNS_ZMKGy|ASId&HEl>Wd^L{R!J}*i&{w6Frg1FPTObD&6IoULH?C5q_`HUy zmDwXhp>d$yF=dir;Q;V9FO*6r3w377);CIc^*|fSQOHxArl0Jd16gEAE-^L zD+bF&xQJCs+X3|=x&-AJ$}zF2_Q(qpR-B~sEL~EuUzQ;mCE>CW=?#LJW!F-4yHP7E z%&SwggIo8|z=0~=k{bb=Z<=$4?6gic4AlYKcSkI%+}B}z;*w}S=b~o^da#{A;1aO# z_ORHC_oPYvv+$QnL5S=`y_5 zZCTVYgOFp{ozRC3lgoW*TW?1VCcf#;&M)McX+|M8UX}Amj;AE6FFlD}AtQ`j2IlC~ z2)X+Y6kHl+ukU-z0KYiXJx-$n?C#!n34nwcW~J| zXDa6aFEWv&_&Qe8i@L_HY2-RTK%-)i)rI5L<93ol!EwfhNKH`ViORd!jJ{3(*N4$3 zv1d)x3r5UxQM!6|G)unz=nJ`^(u(LdpPj$6r+_3QjrMs_81GFGwX%!|PQF3rm)6#? zgYk7Nk}(vxMa!DiVlzgfMDM=Sj!TJWpt4$>Dal??d(wORTIMa9L%kC#Y-1+vd=%l$j({i%Pal(BRk?WLX3!3$2YG(w z^E`$&A-rsge!KIR5=q~4W!}wK{`nAL2fRl)FAU`$nE+@H8X1yTdRs)io3?Zz1 zFRLp9g7hh2JJ8I;fEDp?{)+g@5bso?N9WvzrdM+juKEfe<51_Vu6`ku`V$2;i@x18 zA1-7D=-$Z;+d=SzrAq-ov=d%E5|8Dn#Ix{bZ?*6)@D!yv62hHL3?Wx#>L>HG20zOX zl+3H2nX(O@pxo?z`l{D~##*KZYA#ME1vV;R*gWs>U+((63;p-Eger9_hhe|-&XG-2 zOt>c6-hcc3kg6s%7rfxoMQlpOfl&Rn>v^4wD{!0fTfNR!NMbv+tOU4qCd`GUCe{Q0B%VQ8cNk`7Dz=qA&nU6S< zPaEek`om^=&pm`y(Y#8%aUF|daY{r}^$~{)EcLsi9CUaN)J+k79F#AfdQ7Q!PQt(5 z@}CkiIsdKRbsqCMgHu@U0GN~HQKXtIQE6LA0g|`Z8*AdXt~ zNL{O{scrlTYx@xk=~jISf5d{tt&att2O^M~I%MtiV)IV;bO0#1Uw++1!9PI;59~za z`bksgF{A;=@PV0l1TMP?>G&`^(^WHb!xD=IPU62W6ZhbYkQ^Vn;F>tVreL7w1*?b~ zJj^A1yjcrrpGpNleOjTm!Z?!tOJ-^)9gm(m9Mh@~}O zFjpbr!}F(dMQ?Op=H*uzhc1TzytA26=7U^!H7*GCF~<{MS%aOvdwlGsT84nTqC=^m zw=EKpOPfSIp}=JTn9VDX6Z-1&Hz&W?Z9M@+;o|k;c)_^M!2+pBR^|#BX5ToDA)f_H zT@kSnW7+b%ab9j-a>&i*)p4{v72HLu?wU^E<)tjZaMEgo>RGKtvZp=2KR)fttH9wP zasLP$|LSJOUK+Qea-H)lcHcxrn&6n8oHqP#4|7Y%T0?{LfX8sHqHf)F7gQe5Mwion zO@)!=_k|F};NqC18RSg<(82K5HQ6QYF5FHMfp4y>hnbK3pihOkTnNx@C&O&HIiW;V zhZB?81$}3uKmlhQba`s>iQ5`%*$WbyTBFTqaP2*ak}JexvyaJG3bk)D=Cz3nb;*Oe zuJ-7XJSB!_jr~E%*k(ZixFREOlb}o0%sVm;<6vcaScKtU2g{o#jFxnFfH))hXJ&~! zEGk>Ld+{8!cAaKe)Lh%5nbf8Oo4*2nY_Ow9n$t%`QstukAlfb3{pDFF-LQwN(bp&C z5qJSim^PLw;w=iYG%!(?@(?S29vn(ujyNZG)x1LKcMif&%8p;nOUFl2Uw@;K-cz!a zH*V9?ZO7CaO1l!>aNtS#mG%WEuP{T-WX zyocG=TIbR}i*@bYNP}SNvY(&!s>w3(hXTxw1xzz=D&!d zGlPkf19H6XiZtML1lk=_I#?~dqx$Mu=X{8{RbiQ8*4r66QRYQb#E1X-ys@|!(nhvP zQ?L!+6}Ntch?@)23LST{$^{vvpB%}RZ4>d6TgQoR>EEU-?RG8G#aA{Tkb%Mos~H_) zBYr_9@SZe+*qrom|oLTqly+`f=Vn5%L{p z=kkV|%LZ<9^qs%N4X+uG>AbwoyJZt1{%A< zCm#FwC5F_VWS5aBNvAEOy+cvuf`_pt-Ijx+B70HHv}~vqL)R)=W&3-RaE@P?YbMha z+l&1cN9)#@Mvm+QTN<_Zy)8*QU5Ts1s3oHgPY5H(=2S^}rq;DU7JF#S;jbtHIAbSI z>q{B+<*CB3E0Znuw`k2xfU8QDX1K)fa+2E>BSq91#|vO$eRHSzTJh^ad~?yrYxGsI z(#@QMxOs0#{B-IiK)GVku##F<&`?>bU!o&b+)17^RiS`(5z+dZb^a~6#L+m@7bc1y zm7dHpOX!})_~+F{dw$z3RS8*9#!eY~bZ7#&Jq^~0Fnp*VZ=b1tR;8@iLQy2veg-n* zdKI4;DOHpNhQb{d8dl@t8)jfz=;68kzpck;==DL-IIe3=Ndk}d?0v-1Y!N*Fp}sbF zBOG7iUGJ*3Kq=E`*HE_PVac}X96}i?GIvjAg?Z_PHG@JR&@&SCxTgmu1KS_I5TP-K z88dW-^_XZrCn&mGPKq56HyQtKsq&B|{kNP#{0|4?A)t==Kkr zAoO(egL3!8$TZ}6+TlSEHp@sddW2!gKK{G-N^*u8j!)?PEhU`K`)_Bsue(3!uGdVAV4AIJ>GTAbPUNJ);IZv9l?aMO!15neei^FxFciBed0kp#a( zVa_cN$(8dy0i#dmYcu^ze#|Wp{)z^EoND z^!%xtPh{)Dos4QZXvJr9i4^`C{ze0<( zF0QC*LiWuQlS@%TYzaX>>5@|&cZR}{Xxo*M47?OA7^IK-p9*4?1N^+8np;V@zA7bA z9W1yBq3j;7`@VCur9h%*o>N=|j2W5BZB&h;fjauAjM<4o`h?~qsvc@9wSTfUM28Lx zvi;O{1x)h73Fw+2wUQrKS4TRLM)VbOUQ<*i+WuMFJ!>0uih5JbJk6F~AXMt2VoH9# z!g7$z<6KzYrzZbs*t4l8ENS)`Q$S?p1Xys{Uqqt=YF^9$|A>0+mUcsK9}*bcq*?J4 zmc!gj28{sguNLA15cb<-q-So@l7aT-jFiqY0v;}s=HJxH(>^-hY=zJHH9aPvj%eJz z^Xs~S8mou^g^-CXEk|Ll4ar=+JjDM1bys^>QyuxEIa=WBOJM|GH{lDDqkH%j@B<^p zJmO_kP3+43{P2}_PK&6|8XZK;w1c{7Jxa&fowQOT?RLjNT#w3vXsj!5`s{yk8+%-s zV^HV`LuBtzLNB@7#;1-q=S(u_ zuBrwK!^1Vx506FG@4Lo~&CW6EbX9a-egU$Kg663)@A*K~D(@nk7ypf_)V~OQ^CqQE zq<}p?Hhpi%l*f_Myv1ztB0pYqJ0Pd%78R9n2{a6s7iolS_&t-XI}p03K6&z!>$E#< zU?w6vkL$+jZ%%4HC?ZwPPL8r`ALjM%iAKP zm*|7Jy}ZCPj;h!9mhwR;pkTW^&L+&*M-y~I_S!pdnkFANRI^%an@jkG?BH}A?YJ3RnaXRWQGeB(ErX{MShXjJME4{Z}gNNwAdv;b7aA~Z4ryuj*4G_cPb5NDtzZ`u;* zss#od+BZaaur|x#$*(1kbR;%~B)GtSs=ZPH%;7xGJLID0*`GL)$2iGrH77$|u}J`s z9j|4#xVUhhHO^lJqysFkKnpxqf5A>zoW|*k;Yj~02 z#JzKHXHC;E9NXr`wr$(CZ6}*#W82Bbwr$(CwHw=clk2{(x1M_Isrvr>Qq|Qx?U|nH z`sLI)Gm^_@o447BjmbJ^+`!n4dxV?E`y+H~2a~+XkS^rJ*Dj%cS31vvH?VVr=iIox zaRhT)N1Z=)-O5(^DvU@{xt*lX;+aa{mv%oK@|D}UvCvJ;D9TY>u2OZ?hH;L@jRF6arfypqBe)rg+kb=_9AV#MV4Hgoz@XDi zlT7=VOLM1ABDW`J3D|kc7{^jQ#%Ha1Y#>ljFO^BN_t`-dDyCnetbjilE=`8$^Lkd3 zS;<%+>HT%~M+t`Klo*MB8O=CIcW1L$j^wU#lQ%ON7-Zp9G~_3}0{WcI?Mm9DJ&>^J zH8~P5Pmrwg~C7HnEo=xA>KQ;Szn%WFn=M(UmtiLMy*6d8}U)9lmiDiUx71GMA#Fjdn z3lK&S->yLFW0vzhZr#~5b^Y#ICKZT0=*XE(5SX6|aan?<(Uei!UDaN`W1BfmLkWuy z55$FyZB=on&G4biN8KD_3SN61gl#H4ut4IqA9$bn!|zz|yUSvat%dQYaZe7#V9IYf z8z~cgD!{EnJ)WnTYmrB4eS0L9b9!nlW*`qm5$#_=&Ia5VDS=ZB3@bjeSczW;LDjaC zW|7Rg*H+c1r1!*$37n_kU9Zvkh=F8aB)3@rrt( z5xn3-%y}laopj*Fok%A>)IJG`r94dO8Fai_@d)hlI1ao{eB+N*Nkppy+HtZiqVAId zQToBCUClt-PTo-B+>sLWF*}=Le^PWB!<58~|DBW4ecT7&LgH;&5T2chyWt=OfMd4N zAAHe3UP)gIOB!6K5Rn)JEbOlGYo5Ukaw-lMk9{v6WgsX~`Zn)3etM_@DRxEYVbmSK zJ2y*kYvq!B6JLM3Ct~dV{%XZ817J}DzD}P-~2n+=T@>}HZig?fV zoFKU^{RlefLe3LSV$_@z`6hKs4*Ub%g2RLlo)T{Zm+j-U(~Xl}uV|udaF!mv6Bn@h z6p}Ma0vJ%P>ng&O`k&V41xoy#u8@4UTbgIUc!Hm(WnK`_okh0Bg5YcnFM&0CeyR(4 zq~6rsnNk#vcNcE@a%k*3L}0z0JJ}d0;c|iVgqET2987CJRk|8NQb8UZWmiE5<8879 zUR(v|D^C)lK?xufAXV$oaFMR%N#kc>*tIttUhjOpLsjb4<8n8xPa_jfM3QTe!7A9D zz(`81*9zhltRKQqOsL5ek=W%Q@5L#0w8UWUZT^g>mqGZ!S)1t}Iw>y-Y@w#RS? z+FG_%D6EZ<;rKXOCFbd4;x6Q)n$1!O%(2!W=~W3$?mDrGrD1B>Nb4@2(skQZtX8uai$<5<&A?s-yP6Ja^?=anfa!*cPFw_{ zQHfcP41}GW;t!0}mN!q=RD34EAJVe`xZ`DA_e6Bil&jfnes?UmV0-6yI3ylP%tl`8?j{Ec) zk-6KrxGammkL4f+Bd(6=aJh&g8C%uk)|t;JV?=_U@x-wePmwKMOC z`4hIgKvgbV{RduWp`j1$O~L+Uo;IA*GivjWS;Meq;d~NVXw;LI>p83DvT02|zB#Zh z!4yGj++%X%V9s_Qb0#YGy|v(Y?}f1YU1i3(q({68ALDG9^;|?qNlymn8G_GW(mAM+ zn#6MAz#KNMzM8Vk1L5Q%sVfvvr=)mdo$O!*0=9Y)8$$J(v2CqQn@H{GD>jNbRWcO9 zb4dPXYb3aK0++=SrwRQZH~4+WHDMO$64BBvL7csLO{+6%GAP>gcPv4 zeWqJ78C?dT795JkGGGU|dhG~Yp`srXr3lC`m~@ESa?B&3-+?ApDF)hR@Np}4bkW}B zvQe2*TJ5G}Q$9lGun09Yt@n!k(Y-=MILSJ4EtG3@3I^SF+>~HA1aU$+wf!tI>x+of zXhkHr4uO?|9-p8?H^PSFKeIbo8bIwGN~wM|Aq?at0K@g7lv0gsiehv|X2HGGoTOq5 zC0on&%}xO|;$ms{f$MldAmPivIg3NlCHni8+rU&Xlc3KFLcZvoPhP^f#|9#I#zZ?;@LbE&`3LMvxf$9k?qwah2gCgN@VMx#i_e9PJ-G4;;AryUly>}c0GF(XS*7LBKa_!=EH0G*QZOHN3%Q37>SK6 zk@sHB18`09T1*?;97HiK*Ium&UKdx|2WsY@u-eJIfAdV{aF7XbNmRYCRaQyLk(lkR zN3PnCc0lL>M_r^Kzpd~bok{qR?Qvx=*1kVdOKdDuh-CZMIr@`g^Jl&~mSZ@pHD-VSpNSeg2 zp^Nlj!X;_6!UexrklU-tn+fmSO8bRz7UjN zdTpRp<#LMlx$&NTDeh5Zt3NNpq-^$Yy|KgsHy2R5L_&G7uiGB#9-L}yy~R894hrS``;goLDtWX~F4Y|1=5aqWarv}YFY)lzCmpf}$sXYG&y zCy{T%>@7$r8LVp#VZgzGWZO@Z%x1rkhs|LW3w2Rn2DjTvK`q-O8>8C>D%tn{vUwL7>jx706ZUPs9Q;;>zWciLYsFywZ; zlMY!DA$_oOc7DJ;8z_i!*3cW_xpX^z&9h07R_!O`bn0a11DrbIgJ;7jqY z8Dn-BE$FW{p2>rqhP)C80ot_9FfD#BbsU!AhLeLmx7}zpiJ|HUojLZFLvZf=Mp7rVBqs2q zoCGg;h`Cqd&B3@zxXoa%X!)ClJqUG0xK=wxr-m zWXHFXBMCgA+>|xX!!To28SHMB>1_$UeaMJ>k((O zTt-pAq+JfCY?0=B7Q1BdUgQ^0Fm{oRk*?2YkD(!2lGnO=ceYn03cMcwMEdR099k*K z0$2mfX#C5L1h>#4&Kega7Q;r=k}2Z(9njLyO^(zt;-d);L(xU%j3hh>n#8eq0OIa)ynYMeP#+Bhy083n@jbKT<*mk`i)u?YCVLxi zdE$@0(}?3j`F@xBdSYfzFt0e)Ox5%V-PAQQM=LBmkN2G#?J~957j)+LTxkjGhcw=iSX|X23pZorW z<&O1w@+DHSX&>fTfy6W(DqD8z-f1H} z3jKPJUmra+pWRw52coMrEdt`1Lmr^c3U^U0unNctG62^fv8p6?#%S|neXRSPABM!M zrhf{;#`|PdST*1`LzRwuLz5MI++{w`m8!pdUb6&8jED%0O!J zbXv*rE4>YGNqo#K8SIrnmGa&u3nYA!#>>y&zR%=4N2Rzy9NcGO+gc+Q1ZR|qo~_`Z zYwUR=1Xz}q5n5(1{(0s6%{4QlCeJNFKOfjL^so6p3U# z>*>=jCrIm)f&1tdSfXlwfM(oy!imi@^vUO$1_g6@K;Aq4()SZLQ~6YxS;XcD$E(dC zm9!}>85a&VpHTPBqmEs+#*+5V2T`+qPT9?}83ld%{E%6z=YKwB0G)K>q)8G6Y2@ ztG85OsuD+DH1zll(hfjwP|5F8KcS$Vxht!Ls0jNps|1Aw8#{T(A)r0vC#H$7i{9HK zZI>|&^2QL5Kn(BYvs#3{roMUKEl-Y?h4P(x%u|Z(Pja@&2k5P9y^n zcUy_WG@Dk`pVE=w#a?)|EeMflx}OdEBKkRn07u?6tl)Zs9h-&DVj3vk#VxmsZxJ&>6x~q)e$s(W z`kp^p@2+KkqMmWJw|630P^`E&i2@!DLTYGdYqc4OXba!-vO0B}hTiRW_02L0%|-oG zAXpdPcLrvjMU4{%Y>CH{%^N*av;xNHfA#_n@G;##AdgfyLB)-Nr5tCr}ZdiH}X zBUkyo!i2cANzO^z7MNRU>5gqBPh>v*289wzl{wIsJ zCGSLo26QIPyP2%IWdNnCPd5%8$kR^ms+nMia--1}rc2^FU4UY%32>*ZxX zjY<_zEeHz8*kYDEFE_@0R7UCo0N7rBR8@q>F-vo>d+mczZSHBobh7T@)17G;+8?i+ zg~If%=7%l0%tiaX0y7*;*fNjL`JfkeK9^xQ{!Dr!{{guy=91@X@#Ggdw+{QSb;D;>9JwZ@0A)^O(v;&p{t%2KWFDm z!tO*mGN%#@ti>j%Xt7Q(c-d!*stKj_n4;k0TfV=w!TZ)&y4OYFqFV-Rpdl@lNw*X* zDVoiR8at-TQCD?%Zki!dI$Jftn%&Sx!jqOOjpJE_3{a6=_v;-uvKp^>1gJ`8Btm8G z_oGb^4qf>N+nBHD`3bYw{Z|t&=nqoIw!?04kpMFaa>oSufew&O2c@mqy?f%Rx-a@c zl;JRV4gVW@LIp?xj~)vDW_`P8n3D(baCHg1ppXAvfk;nLv}M;{P!0w?Uf&L79wKFk zH=O`R2KNc~;2xSGs#M!ae9J%O`PNahObZ+-06741D^0&*p2uB_97 z30I|!9VQ5Bn{*qv-7-|0XqS9kxSYyH6GpWAfJS)J z>gI%(RjB&}SPL3I;F$LU0;O8jOq~gnHgktvFUkc>nEMP5PSO*?UkrW{GSUNC*Kb65 zf3wkAq*Ayknbmk9vR1o=7{y@7L>r5s-SiaJoYLs1AS$teoQzPpYE^$sf?>=~`V?2S z2q0zlM!Q=+xkxTm{zwLtPw-uJi>}>nd6A88@*?`fwNd;bWhncHUX3M8H?6m{6{?uq zbX;A~y=M-pN_(ErLC~k{)RBGfc{I~fq65$az?w+E6R(+C+GSUNM4BUHVRyX5l5;Fa ztlJ%DK?HQy$ra>;ko?owRuu14^OxWIEkgd!td&8Q!lB+woTmcJ3J9;-yxI(CV0v~# zJU8+w0v^7tG=(v;f)R&1An__K6+WlnzfUimdU#>ep|$of)1YieHFxNnoIJuHC-o8$ zgS22$pG%?B!zp5=oyEih;YsY8dN~n*8;o~T*PW#A6 zgB$ds9JoHu5=<64*#pLJht&R7+%+qWqWuY#vreSn!)c32Om0H6Ny=0;kQ6V#(76Nr z^Q%-q5m>)|?ZPm?c?u6ojVHX?WhqKBT=R&)tqDI$Dz;DM%nu`#GXAds4ghiomm9JT z@N37>4{vVDtg2>lf^y&SYnuL!Aa=+r|#~ zg2Dt-@bVl)pw@$L_?a|uWBMwQtUea4lbIak*@vHzPQF_dss$c!;r2RH&d|E;Lk`_S>N!Z? z1cPE64M2GJ0^>^66q53ooPW~x@j0E2vQ5qcfTS1VGwPmOexX35z_RqSPDl?`ht3L> zppDe+ZxZp!JJ%FgFrj$ory5Is4|-JSIObHd14iw0+yW=@5K7L&1CupMB6z$$ESFTo z*1FOY1^P@@e-uc0_=3Ft-yq_E;jqC0nvs7u>ncu5+~VwbXl($Tg~fq@CvbwuX#Klen{`0mReBs zp?z8a;Gm;Ph(^$h1Nke-C5brKt872o15&3oKo&6Si5iLq(6~Fi-2rgim84m9PogA^ zVNhxb2|ECc^wMF!-?#J^kFyb|+2xiuF?iP!)h1^{^c1^LUNC9I1YCo54ydN*kq z-d$OEjFGcOH}NYq@8%47l;AEXv>hguo;+l8BVv^I*>9*{)RWp@zZPX?xotImqEAc*Q00S?99p`4?l!H*8~TcZh}{ftE>97H%&)bx~irImTy zp#_BCJmw4MMZgacU*7^(KyKd3Vg2o=sybh1s?W(%=PO!pH<=uU>j3CXi(M~)C1xW_XF@ufRiI;6dc57B;5VasPEINj-x2#0C*WYow;g`@S047;N0j81=tLo;E_lO>Ndi<# z65vs}bb(Cdc$wuB<(Z79i4!371!(0{1TEPdzjI9f47~=aM=DZ+$8XiF{>Mc|-Xbb# z6SbvJ#OuI8HdXsH6&zxHSkSH!REQ?L`{nWaJE`nkHIRB-NJE974cr2j8;iqP1E$03 zp@(r7s(yFq8^A@8xX}qUnkylg!V~jIv|gszrZvu8lC@o8w{lb|i5@#HB&;}cDGPr{ z=C&fF1YA+IRZakhC(yQ&Y%B?Y(#b$1qK9Hg zjJq=&4JaSR#1ZqNAP>Y+LdVhB(%R%C^>fRjIXGtGN64ATwuYof%Jn%2UX7;UQ+$#}ZU)4CW>hL_mb4cc3j6sA2F% zwqsq(`oT^B^X4MlG=-Kcp`Vij!n5X^`S9-3&D@c$;S1{}=`zmznD+~IY_maSmd}!X zt8gi~NjH!-@vkYtbJvpUU8eZv#hJ&-^IFFbT2&=Sgmf_YBj2IFDZkE#dAOHBGY=|==CrrknzMGduo(s9qXL%6hF~$z*GV6V<#KgQKMaso zduXj-fB}rp?V2acS4Qj+@8%^Zx~Ei2RqIvGLq>aYNzv;|ZP_c+;XUjzx1L<^kI&&R z%(XT8fpbOGzFx=HRAY`0vz7{qQmYIP0K>^rJStqc6Yn(wh*@ldDE_pUF;Pj|5Y0#@ zb#)CjXtYTCdL<4*y~+$SCQmBj${2oJBQWY@CIkwOU?Q8? z&-PhsJ|P*NzzgZ`{wPtgV(jZ08hMbp4A`M&F&T++K4<}BZ6>0}&2=Y_(8WG@yFf_2 zagK&lAKnadJGS9b25)*Qql1$1@|#ySRryJhz~YOlpEXvtt;^+7HsHm-rx?f1<{e=qoHz^yGs26JR`MEnyRi1TBKgen>KFg;=7(x zt#BlX_~2hBs#wU-2T^e!pO_1uzdoUQM%D&;W>=?%dS;>i@BviqjhWaQJ2^X=7}!94 zQFexwPz+4?^!Q%{H#eQKhrJ1%sGY5|u!)nAqlLY*ogjgtLLQ zg^_@*nY9T%J)M%XiH#~g3;maowSk!vJ`?jl*0KgRCUnXcHYQI03`H%zlo=Sm(p2Q- z{Wojo|75Mj`sMlmPhe!B$7f<VE>QoTmFxXl^OqApXI-p z@k{4loBuETt^1Gum+iOxH!w3Zf2}G5J{u$BR~6X)fq!TQ27DG4)_?fl>U5m z`;xK$m;RRhtM_gHO|yQ9(=-#Pv>$N#S5Kl%Na{`SrMwVsUMalSAMGs8c1|F-|G|G)9R z_5Rsz|I_h*7+-M_qV%>1qQ&HL8w2Xy{z2`vA&kx84_nmL<)^&M7v4!Zvg81b1IS(sS=JNhaX z6C>SMV{tZd{O&!@Cc-90cE%?E72`8AF*C8?fB*6F{y32nwzm~r8{$_aSV_Vj?s)qH z5BE?7LmfHM0l-4Vl>;465>Sb`Q#}bNCO~im!|dAVScA^y3VH*?>}Lw#kVEk+3ALxM zzaLl(5W&g*&atVk#u-$;yxe?lW_I>7X9Y&Iu8M0TpTH+Jy^qo?3}na)0jKKv;-T3XstIkh<2fId`J zkW${*vZ|7Ysy@rk4e!}t?CC!h#BoY8zl0P^%;nj4&1n?gG~JVW22zv|6DSMvgXYCR4`M>pwy z{&syL`^(3n-r5FWGl{vYuKu~i?DDR)-Z%Cm`c#jL(8%rrK;PhltvfAa-*;fcZ|V~! z^hJ+L=r$#=HZ7pD61@k;9B#N^XXmAv_}9y)jLFa^N8Bek@dqB_ldtgBC!fP-yXfaS z$;W5s^e3+7+~ksK@5;p`(A%voU~OS#%ER$U;5Z zwNqXmTowQx7@Djt05CS!`1bgH3LrdL{q|?!5FbDFr-?6*xEU zUh;=;KwJ%*3;pY|Zb=)~dd9m>;ivPP*RratEkEXUcV`{rZB6a_K8uT!>qq%tKDQ6M z+fRef`ak?RWHTri#ApvO3I=%ZuovTPDx?9^K+snQLP(p z<<`rj$CDfE?dajdep;ak83b8HjW;9EYk(VcoNY2hn=L$&L9kAUU?TAZs{(TuZh9^? zDIe{?Hk`ctH{8BUe+M`ErY})(O)A<2t^Yr zUazN?VJ16Xyx5rrd-JP^v1s>ix?Xryg}RcwA$zKDGu7p8!k=RR9O#mkPgT0AT%`tu zZS0pSrFcp!N7!JltiEtJ6Lro86)P~KKbe^_DB#s!H^vNDa<*KT%;?FtwSouLhK1lq zNn3B7?pKV*g=qvNE`V#kJ2i3i9n4T)(;EP$%OoCV+I+SioHBxoBqf+5TAUpxunmdnZ z5TiF^RwLd@8VwcapPIpIBO|#se`VCFsZjnwf*^wRhP}pQUf-vjhfWdxqtZeh%n$yU! zJglwVhJM3hPKL(BHYq?8*06@laUw2w8yLUsm)3uWO@MfS=;Z(}-Yp?59r0mm{UE?86(&dxY;UHvfD*0*{|!v#Y5;4Ss&>PBkx z14Kw7UmHt6T?VkX6hROMcDEV^+yg^+^DJE5h3IkBd=H8Q47^7}ntqwwbjXhnx5||Q zQ3C{f8y%&7jb!lEO>z-G+0F>s04ReF z@KqZy27W#ek`Zw72djZm@lh}55J-+zB@q$zjic+;l08~MEtHp%Nx|GfgO>V4#h5I^S?y`ggU7Omf!fAS%~5KuU}Db6s*(lU#2 zD`?)08S#|;Ob7^k1Vq1iVG5Bo101a=3Y~J#c*Yf7pgnKa6XF^!OqGx!MvL!*RTF~}!#WD6y9)?JezOrx(Q4SWOKUf4XoMVQD7|Ji&y9Dkth}D9U zgTqq{1ol~`doCfS^UqF{-Zr{8u^e@1dd0R)KflQ;atqd{0DC|5Ut9-#a~ew!*jKpp zf=?WGTQC{1)-kjj z)SX+q;Gwwo#B6i3q%Oaj%( zoAFeBt)u0gU^L=QQ}g?K816+h-DRvQp^2qeJ9E?js>^HSic-gKG0WEO`{0EL3P!RvGLcz%TWKQ{cgAl?(VooTv}xX6s%w+kJa%kup>hqnRIRu5b-in5eYV2}!wJ?eBqCp%IHYe#BM=<2J2H^ZB({|8bM|`Z2OOih73V?Jnv@FjxXF z3w7T?(v0f`(#hXwT<>fXb2cw89b(CM6$GPJvr;IFG^lzdTHEL`2`cAJlYEUjN-s&3%>5r`*VW&Z#UJ+nIHaif} zaqvDWF?)HGe|)F}qiiC%2)lRJ6h<_^u2Gr4CbC7P|B;R~-GR4ws*wJ=!zu`QUm0w+ zE;d@waKd!%jdY`h=t`lni{8s&PXOG`W9iS(s+&0idwsU443K#zaj~vHb7tqAEo>VQ zqW>r>h$|?EP6T9~M3Gu5{%h?4la>4e@@77i_$bSzKaItvw+MK;z?HBb2H0AHJOET2 zlZD+1yc8;nCK-h(kRuH-=mFnY^A%k@>NbKrRoXtAaxji2sOfnNLBO7YImPyNzXePs zCIKd^soNVn>8zJm5ePFC4RY1p-eAekx7fZ<>+YccLnJ&5cs{ z=tkUiB5p^f)XmHaoxHA5F5J}gx@K5rwh^L~DuL5+)+UE>EQMu{?#l9AawIigq2;5s^W?Lr2Y<}Ag8u10zxvgY-dJRw=~s51jwLERIw;Kl zGH}p$crcU&b`6$|a1}2Q#mqNZsOU}qUbUVzw!dBsBb8TrF4M`{`#L#y@KT3Q4@?^V z^$!mf*pjz5s9`3SB})?C#M-*>N);$+ zOz`c<6JoFaZNGCozJ82h6oT1KNfq%UC?0dRvRkv^F@8?tNF6XVL1pB{M!{-I?px@x zZpj%T7NJrrSk~x?Q(YC`KULt5fG$yDe>k>ZB9vmMGuil9}Q%JpdBrGE} zatMp+U&G*i6qJNl>k41ea*3~!mL(?M#2dAU>l{!&xQn-V_EE?RY#C$8et)-y&4Fz6 z?%70Hcx|~9R=cjzC=(T4j70f3e}Ra^d?DoY6y#6iP@GG zRhc{^pthF&OC`boV|r1vvCLnO5fKL5eteCVD=_fE^*7Q1QSF0im@?Y*B$Nti$0)t1 z8?oD6r#tqxNDGXO=z=LVQxhQsAaRB%6>iic9Y$kdz|7!nYKSXI-0M9Y9a_k-@}(+n z1N_gJ`^6upM-che zQ4>aXhB@J2c*kWvppTOKUXjTg{WRDcT(Sc4 zcMAjN`?Jh+a#KS`=!NPhRLldd77}6X?JyxCGUKRaW(=C;QLLsroz4_T6ma$eIHlb0 zBL0wW9Z%3jzn`zD8>V_D#{ePnSPP6XEVG=G^NhGUbk|JN5;L^Q@A+z>VFofJ$Mro` z*o&>rX?EFVuO@y|!4A_m#SMakmghXY+T`{ZGbO}Ac_~-kJz&W1LCLFd({>CO=}YKR z3f*&3A$d7U@qWU9A00KR+$17zb7Ej*ADFF8-X=>W-Ztk=yCsKP`#4?hj8vn^e778A z$}FqngDpZ&e-|i@%{h|`RG{v_mC!-TbqF^_NKic-iK(qf$eEHt^PlAkAZ{;Nxa1AY zko?0(4hC=D0oT#}ZzTG!>+>7eo{%FJ#kvo(05=0X3@BEQL_)){KNwEwAd;&H$1EPDZJtNOAl`ZypsHKLQoKz)cRv5t!Z@sRus=j2v^-f({p2GbL6Jzby$eccWjOq@ z&vdiNf*eMyS%uQ(5{dtO9AlcG-*_a~&e_B=OV(Q<(pG$@bLW0a5Ms)!5%2247bk6P z`eAq~`N8mPz*?3+vTbwc-f{EsV z$ddv&Zlm)Nx6K2N_NY$FpC4XykR5>vktgzE8aO=K)80sE!Bpe{VAg+E-ola;=S7;K zhNcEK_V_z9`GV*%!`ml?NY$)Oh^Z40DEc&C&dDNEnc`EYMwkAh3)g8kLUC|y*=NV%sAl20$nA*kA4(R9U5ie5U5lp} zu&J4ItFq29Fn9550d5K=ra|9b;rN;=(jhAD6L8MhT3Qt{QL?P7U=F+x#y( zr*Hoqq?Lf6qWDP=x2yGWAD#2zqDCGr>P8nl#WkSHTD?tg+5{*)OO5jc(Y?=SZ+)}( z=;%NgN{Wp|X-M6TYzdPf@`&7_>W1uqM0yylV|fR$ww>T=)-+REMp=4@V*OWdRbKX- z%@l!GGF#%A;L-}VWJ(&4oAE7M0E>_R-5>=45x9VfR5MP-yQ1~j)Ig?Jh^fCc=Zp36 z+9++#-7gVcD#B9KZofS0+ksBLa-z+dOSQV}37hLV|)nizWJ6kJy!Z5xLf37F#qyw+K3+=FL z7fp?Q8V+E^tPxMcl%_)$bVxA2qx9mV^X<)0Yo_2FSs z4{9;#SSL1MxjWs@tp<^l-P+&{DV%*E_gO}`oBIi7t@^g1^*L%f2|^gX+o)sr$i^`B z<2XAuY@_=2t5p2UTA8m8I?sd8adM&*sA10mJ;+j0!1v;nr}EVd2^5*E4Ib9yoTe-y zB6(m8)F*IbUXD1gqoAQiuO+tY7SXdh^_*QvCiV&oet_%lsjjB|ntiA^cc z+D{!cSl7}vUuw0gybi<~>bKB6T}IyXfUa_TCVT5LBL({bnW6qD1VZ{E+g*QZr?wft z7-SO+Wj?VEBA;QcXsI8G+PZd>sfR~kU7R>|V5uiu5RXI6a|oxe$1*rZ&ymnmW*n`5 z`J2nerbEaj8L~bJuMvJB*}n7Y5iB2MpQ*FsfB_xOiylf@<&l8nGcayqRj5v!Y{9t) z0*})v7ZqcrdhrQtWq+GA4I?QUDN`&Yo+|#~_)FA)fRt?8C4Vvi3D;{JS z6?n1P*xra6U*f3)kgkw8-DYq2O_QY^jCP!5Rw{V)06*~%0nlX~%qr1Yx%%#T6dSgh zw`)@s7@j0REXs=uog3VsgFJF|X0t!G=bW)5wPS`FQR5Gn9=Wv^l7yJpw$;~w%+I)(EZSKsqw(;z)?m~<(C?=EgO=b zuJS%_B)HXp-J>#VfbVtvx-Ry;!-5;qLCb}jlbC7jmB?Q^{~S+#q`MF>ars#%Poqhvpo-?Nq>o4wk-81?AT zP;11e8+c(gCKx}Fi$EmPA4s^OqWf&i5$kLS^EZW_mM?$sQmn-9KwSXh7)1@PAV&50 zo?|l7n9yCQnIXH@`AjD0D9^O09h~l4KRn$0$fQJ02ma=V9Iq=TzN z&r;>n)fvN8q$qEj*t+rJB{6i#kx-Ucv9V@IUhMA+h;&aTQ1TSp4|Y+fWjxHkzKI$q z%Ag^c?zQ_y*Tt;ATKIhrtbkbjl;Rco^TY4P=qzIV>cAR}aTO5z`~;ivhO<&?zN^Fi z$h0X_hXC8IQbsd65esE@Y3q(xuv1KaWIDp0f1h570(GoZS8G~K8{Lffy1j6%WR9$C zAE*mB6&S~<-!hCwr&>$FlM-H2VN`f7z9tRvb4G^FK_F`CU(fW=uXl6vZvEN2|D?0~l<;Hgixynur6{ax9ok6WUCJq9E3Tc?fxdOrh_)B` zRLW=%HA((+G25o>w;%BX9{a7QeB8;PQnrF98;BJ(xHG-Cpt~;D5ZvuvyAvs_NUMs> zM3f4H!(rw+qr?W^^=CDjwMU{(SOkR<5jV1$byTHWe(%9&GOQk}!2Vwvbyty+G?z#`F>W9;E{I^T%WG07>nydraO4~!z}03mJEoJ@2% ztMV>+@gOMZE}c&KbAUnUkL98fDV+1&vXm|7-Sqn$uA)Ax@OT*ul%M%yc-eu=%JJcg zoRR7C)n(1-%}MIT8^@!zILgabxoN1Y2SDBFt=knCW4Kh?QujQNNYG9R=$f;ss9BV9 zQ|tuC`8E(ekrFgrq!r1e0%|Vk(Kr8%YQn|VA-Z7<3Z?)+D6y|y9;jCG?(9&txZK+s zUEM1OZRAOi7QlasL`doz46h|DE4=5@??5~Q{fI7Fu4(TXxx29}kgd-&HSe|%@Cwf? z(;(d{8tpB+q=K4r+dT$S?^Ldu`=1RV*6Di6Y3U|P5)^H#c3D*_8TqcQ3TAB~QO6En zTtk*#F1h}pIXsU6YmoJ_StASV?2=;7inFD)f$g=^k$)J;gcvX{|16bm;;gyuUXx8z zs(B=iTHTNx*zM28taFg_P0eFnYGP9FW);az{o|D{6lwnNX$OO(wk zYBP+a)ikqHm2(OUsYroom@W|Mj{fqy=#mG~mZ_e5} z-=9YwshZiV>`oW{jhBI$=7vn5Zk;bSV8m-&*O&3`@ z5qfo&NvRW>B)6&G7{MALdd6bJ9(#964u%@mT3*Jkjh@dqEG&zJ$)ENJuSZZ~MP7U| z-H5Z-87z88ce1n44_rKfZrTxhJn7N0_!Oc*td=U21QL@-&{z76*Ychwezw)Ld-lOidkyY@11P-q<=LnMk{eia&QrkSpq zzL-Ad!o(VreoPw68<0vT;-b4Y`e}>zhU5R|T1d zP)bjtpV>=tTW|}e)e`xw*vfXZsDX9MZ|6R+#;WwWT*Kh#4bE-8Mpk>A1N)BGh4>r9 zUFbOMS2%b2Z``J7qYf9@b!bbzFeoKop}R~%qJgW9|HH1TpnnaM5SpzLRTgkX`CJ<3uHnqJTZMON?Sh=W0Iq zU6<(AZU*DHvsB%({$suG+8^ro)Z@RTBbwSn+ek6y2Mg_RTIgg0h z)?|JRsOM#vo<_})M`EgwiUz`|NcMeC8eW9V=N|+Y#~J+NZ|-UnF#gX=6~k35S)qzd z$=}a()q0kkes*z0s3_tPGfTPIyfXj{E6qAod}LW2_k``gM2oiOJw!k9n0OsNG}9wy zXUc5bu`#@?u0n8|D(kq0l`5s)$Ezl(ldh-hO(O*;f|H&Ni8Jp`J$KN%jAQ9kcih#a z#D(R`@7ZahE-$h}#if)rwQM$_pcp}q2M>lwkTYAxdCxnDF$-A(`o!vsV3Y@8A*5Ye zYF%!mK5v#P5>w!XTNcZDx{5eG!E1WOYDbjA`4zG3vNjh0v?AL0jr!-2Rt_zS)U%@U zqE6PHcYOqX)2_#>qzG-K4d8sK)A^rY3+mo*87o0~QTeI|-U)Igu_)arrm>+;SAqTR zJ7|Q+u9L>g-O0&@KSQQ4n72ivkbsBi^)|^A6eqdf#=5^kXWVa3H7Ph2b%{O3C$6Mt z_|jZjB`eRDatG55F+UIs!%~f`9eX$MO*Vvr=^P%|$Lh?y0mVt~Lu?^UE6FMzcx0zR zmm^(SLP+H%r`|L8gS^PRk4iW~JUiIWNuPr$Rz|85zWe*y>7^m##uzV}hj8&kKjLls z*JnAdRviG%sR0hIU-npICPa~rDM2uL2ZDj?dP`r8b#`P6RoyY8_vAvhzvL4ea2W~- zqXq*mN!aUE#*5c@M;i14*{A8Vj1X!C>4`wE)YdI?1Zh@xWao=oXDJSo)D);*RD@x$ zxUQ+xYpcT7L8pf_CVNlP%UdNLDH~w%0KwE4FZVZVDdPzx=MBV!*MP`QIq#}`;_XmM z83#*Xf3@t0Z%8Q3Fzl7LnTqH81}%1LxoE2}2ndxS>hzl~+J~^1tgddi%0tCZVeYty zpb4?eMS?tis5x;oiW?95>@?P5?62arsR&F;U4*4Ev3c4s z9>O9qsJ6-CY)M~RMow7;lHgerlNrNGR6u`3a<n&d;Nf&dP$eG@i7os5M6_`_fx%cIjEN*p2)G@`hyD ztaK~~`kWI`Xkq*d((+?I-!MEqg6w7vlHqYZ6RI5KJlCH1(}C+!V9)UU+=k^8-XS}z zJ3F_ZIWdsg*;f6CAixY~4dbVvl@z7DvzdDtspevQ~}x_z-wRuNq_FnGPjL zpr?4GPMVEpVAcD>hGcP8y!ewd6be-RMMf7~q{>$<(()8_(OX*6M1~He)1kM@5akn5 zGF(4mXD<>;IIuP$&tOBip+S3}wV(WSwf>ahUyO=yZss~`r2)ZDxp1^#(GYQEf_q~;ZUhr2Af8!OG>WBX+$lIF-Px0eBK8PvxTOzxWB~Y;g?RbCwUS6Wu zYqa^akkRIhEWqarms7x2E0X4yKIL5g)WZ)nIcIFPc!+n=uN2Ywwg|~_<$lVih45V6 zciQ1KgcYe_Cxv9^7O1LWFY#e7^itWo=80OE0MQxlnHH?VT!UQbN>{K66W3r8;fxS8 z=DtSIyOnHHV*vbf9N{>p+i=cZu=ib)r5EEQ=}h?3v7<5bDR#a`VO~6>SmN(jo%gQf zDNcs+EMM2S7}6p38e4;K#G22PVeCs4rc$Q8WPvX3r~SsS!6K4NBt1mU_B)ejg%;UZ zpBR^6Eno1&NLoD1+2FK-6$`L2q$K~RWz~g~0jc3k*5&dyhB^2NoZepiv>T==l8O%GMSzRLVv&=hG zz=VO7xG7bx3)d_*PL-A2dX1i^h=MCJL+!pakq;e4wLn+;IaH}ecXb}C4ZJ`4J6SL- z|xt=?7H&1k-8lakDiyCyOLk8_2e-Sa~k^o93KDUgY&# zG|j^PnSQj3<6OWMDBfA|1!yMz!B>n1|P-cMTtw<7vOFBdrSDFO5F-H z516OgJodf0g(4X*OSv*R+lQf+hRf(wjMDu!c6Aw(CM@Z8N$DXTp0N{}+{$_O#^Yhb zwy|T%&1odPAPP*0eVw08-(+0?=X zcg!A#EO|PFWX;VXm4$ab>oSovq#MO}KAaq^TRZK*RK@UV$hH)mkW<25%0<#jb{VVh%AU8bcg3}o<`XxnEOO9gX%*R&jd$SP z8QDV1AUUp;s3?jE3@yUswkIJ2U|%0_a&ZH2(K#H)HSf_5{10v!IHO0Tt#E_c`W)8g z_{LR>wT!-&Q8)Me&;Ti31rgbR5g@Qm_f+tEq0Qo4*q2NFQ;oc}LQ%P`l^y*9!Q*Cl zw3Jx-huE<=1f=6w6%9+@ymr`Ed>`W%tY$+#|3q~1*IQUfdrnsPm21Qhre{Q{g2=Br zXA`MO?~qh{(04%*~GZ;)v7ilr4DDjd*P$yX-^qrTI<+};%8NAJlrr$y^lfN6-j@6n%;Zy zsc*Zs?kyHr2)KmqRzh7#;aozA*-%|1dFsZe`yhy$1_sG5km<7UT+rKy4It+bhRTO{ zrDi-8I8;4s`@pdcyJ-tp?q}CO$v)Rb9HT>Lz==pXt*gBUD`T}@R z;k-FeQ1%^xlYhho-!GT2FhQ+h`H-eDF3^*N>A02<2*{Bd(ggW!!|<}XCIH!skW-kZ z1k!sAV)*a#w+qSpv2*rFy`w=#kZA!u)`Wp-uA;Po<;!Bc8QFt7wjPLInNPdg`3-bm zLPaSLZ?7W|ic)k!IR4NLv2tbFszX%?JlzvZn}_3g5WHvAyqP_zld+!8V9(7uq07Kk zm8lb3r^wsmQO>o*>FVisR&FW%bJ#y>)qvfL&vTq2s z!NgYinx?D3MY}rJAEGs_GG{87baiqMg}GM@z9FS*C05KvNHVL~=Dp<(McFKym)QmaDwnMSAfPD7D1QC{IL@VRnag4V`tRgBAfe*K{1f=cBzKQWYdB2hpuY9K*KE1owGIGk)eLCren|6;mfqT8 zB=lOaVUCPUNDAk)-~}g8sFNcQx#?k-lG9^7yIiLH-7$Bu?X~=d{ZUVd>jr*fkABcc z_iLxL+_%DhpJ)~SF=lkDp6b|k#N}ejT;{0`1y=w4u$T3!-;h*qAR)Lzb<)$Dx5#Wq z+-vh^PkRjiHq?#wJWZCMcN`UqEryd`f9HWQ+zOoD*Lj>2*f(}*9HRJ{rF;@;2qc!@ z;yNGx1>p1S^uNuHOo4Y80;*DKA$aQ16B~p)$(pA>Q*R{v=sz~DGW%LAc4W_bM8dJK_W8%0@*+ouN6;CIW431;Szhs6Quk;HxI+g?Q$YjZo zwgzM_#@%->0(G)@1Tlh@A2J6Mw=oaVzAaH)jo}D>FMSQm>n*W2@p1ZeDl09%3KZ4Eg*DOVQ;>1-i8O z6Kx8E(5jzI2L4V{>>uNx10!hn%&uqrpyBLoMygyQ!MYHpMV18f+eH06@f+D45c*K6 zUGViwDgI-?&&{B)C>J58bW+vlw!}w=2(oMC*aecn#p|_S!(oHUSjvNV<$I<53^qTM zB3C+0N9ipIwcfRw!qI*XJ*n@Xs-H_an9o>y*PX@bkPUGvi@f_zQr}h@R)JWq8eHX* z1rt<(;FARyG`qx^HR5|G*UgHs4o^()hgx8Yfw!>vNgGB=K&XrDDo*ktzfqpyrkd{J z+3A??lkvll7&6cdQ5l=~o2nD-g!Yq#&EjsK5)iT_`9hF|hMyt?oUtSNXlF6Vwm}st zK7XuzXpnd7k>Qy&PSjE3GA;W^ul=QC- zzwbY)bE1&Lmrz>B{<*JZS5;|vGfYL1d^v`@R ze>}8zdqp<&-Ck?zuRLU*@qv*nl$W_a8JmvMJG;h)rrxqwGi4;J9I{Q$I~X@>^em4q zzDJYQf$4Kv0arM7l)u2_;5elmXH3&G?M8`LUC>qObzn=I3?r_-uWp2YglSc?T z-)rdl{yQV~m{MaYxQDT}m#$~f*|c`mm1D%#!-;}|+S;4ee z#N`TOrGeSaB*7wS3QtSu8kgu;TVW*C_Zfu4*p2O^`h6lS=(GJttjoOv9gXr@Sj25w zbm-8s-trp-X7T+`U)|4N#Np-#S!>U^L1=#AtMfIsu-^Nxg0xx*x6bPfW!ES@_m$GD zc-_1T=ku-jo)@w5&^{GxS$|wHv5ek}`?!e*E=F59nBZBtoai4Az4Y?{mRWUZ zW;HzWQ&%W!2~m(hgbRydKa!ubJrA6j!47LT|J|kdG~w>rICOsE?(C6 z!q9uzY&;5O*?pL!qMz`@(fBHljaU|A7%*VNnVui~!fqyA*Woy5#S7CG94;RQDf(uI`2$cS6J0^9(s<+mt@BhyVl#n2rAW+*=08V zky2cPGx{0=qFL@J6i7)6s)H1jDV{n9#gM;jReup?B6~KIh`Knu!4;gfq=hh7^LWO> zYldT-XRR+3yNQEdrod`n`Q9baJ?>3r`@pfRMcbX?r$8BSmeCtTgf6jhS}K6Bc(xbU zYFWDY3cU!^BV>v}Sv5k2tVzbhAtm{B56KlQG)sf#x#?otw>by{0i3Omj3g`}aQ-|5 z-eBnSVNkax2}_w!)_D@wTnZB7>n{{Tx>-bbG}HcK=K0xVyVRLs;F-pI6(<)zUDBhJn4B-p%wI(deRT|`0It;&c`pToPNCdPL{HP7m@OGGo5 znta)o27`6ik9by4g)Ow-vNfA5T#X~HYxP7GFt>;(VS4{so^E1JvE{Ft;9kn!Em#Ov zHe}!@Z{)fqbUD9H^nT25Ch;edWIhh}5_0{A?)HEVqx{`Brx*`zhZQXpiV_Vm#N^c` zzMlyslnNuTB-H!H^;55F6ff!OHMo3ImnJLb>ZF|dSPVP8rZ|6Cg|aMEs)cHf*Sy9^ zZ^QjYbFL-A$;6bqfcB-S84u;7&&ijXL3hq?{lZJ#0|6sR!n2eYzInlS8v|t@bb7o3 zB>22sUid$Ar$@PjdJXV8(N8O7#>YEQ-D^M#rSt>^7Kj4!ha%Td;-IMP0rAvmj{)=C z);xv>LQm~@`O^P(1* z)?;ME4HhwJh3F)%vQiSTc9Ca_uC4kYzH&$UkOg#UUtzxX072|Q)mDG=)3prcF5gg_ z2qLE%nKj>L1}43>)7fgvQDP_x+1oDeOTahZIZZQ2eI~Pd+>8OsVbGd}9y&!8#MLf} zFX!18Jt%!_)+83lwZN8ZxW~wRBd984#mzN?2t9AXQ{F&s<(U%Y{d+`7?hhUx>W|*O z&EXY_BL9q4*Q=*dV-0`Et`)0iB^okKg={6_7?PpC!+5=|`|bqgi+&tz&3ce_ly$}Y zL13a`8>Ewt#2_O&77#Q}I4melz5~x+)M(}P$1*WF)t9O62|>WW`+&@Y5gaeEE*+Ye zDkgNPs9swtv2{Rv&026ky7h@IOOvuObVyAT5nl63ke8FBm3cVVQ5bHHG9D35V99uY z@N?<78jYJx#ai0z#D~XI4u-=4F^wn?fmuGZW$6LJ;EqHuAyHdCeJ7rbc=6Y(PIW$1Nx%Zlh{uUDNxkT59Qn$DjMx$d#R1Z*ho14{ z#K9*C#WQ~H&HfaoHtC{&?&kdg3Jp^mk;*$hpz!h{SQ(sJ{j}%-S{m%SKbBfy_snm? zt}Jo}m5F1ODu)zx#XgA+3K=jtVa1{HFDzIIFeMo0rgQ`K zKSu$DV}tpI{p0nA7&wp4x*MJ$z$7tc;*@YWJA{02oqe91opicN5880rKN!)cjU*EW zKb^*Eb+8vF<)McfdDgV?3RRdUaBG%a&@MQvNrFWsIV>38_Xfn^zk% z)w6!2k|;FFFml%2uR=f)?bi-~>r=H$C8wdqG`4^zfdIi5Lxr z>ZzV&vGj*?Qk5?@$+OO=w(ado3fa%z49vww={`?5fhuXUlP8SyO?T(PZ-h>EPpgQg z6h|j7pl0INm*TqeN`jm?+YNLC@ZXS8yC@ct(y!W+RrJ|4Q}tz6&}De{_YFo|n-+Lx zXdo>k$NPB`$dSD^mflmGg>A+?QFC2frQuYItk$>!v`U=&KUf^0KvAjY!V{j6_{`Gw zJqD*F3A;;9w9OVYYiKMV~8JJaKHcEi4+f{W7sGn+<>e zgBmd55>|2=x@ScJvp_RM5#})y0Zr_O)Q4RdMjyO4z4~U-VUhXmo4wyypQ6Heqajg{ zuq@9XW61%5 zF}K21ipC!dk2XvuTS>l*_osVrRdfkDV&QXmXf1T&1}tHAMD34wx~ykvf{TCJG=SWa z-9GRxey-Q2A%)CfB@0YW{%W}0_HF_b!C32E>8UPoVRjODf|RyE&`SKFIllFK;9E%A z60r^I+$9FVfyBfeZHNAYHzxY10HOZ=JZx39m(tJ-Oy!-PWwTDC)ik#QDQCR{ z?W7~pdKWE8;3v|K{Cd%K$~9dP{g@(#%uP>JS?sa;z2Hj$MUUOlTw4$$NHt*gsx}44 z8QaoVg-c9`H?~W^8zV2E3b-v}bT+8`&J6wGEwT{}w;8jgp5(e4`0E)02`<*Dp0Efg zK&7!oZsBQofR-3vMq8Mc1NHhq;<8qNyc$NeT=9Z+q{FbumqhD zi-Z2qztPbmbWblX!vAu5l*^yERvcCl9q|`pw9mvE_%1^LbhY6#L64MYE5NX%^NNOcvodRwrBW zoP7+s$=m_aQFbfyoPHQf{dQ84Y!FS`dX6)!T?5Djo^K)3?@Z_3?*OQV6stKx&{ve| zt~k61j((_I42gpD`2 z@?zzxkX#mv?1EPCP}@3#J(ZVQ&MK4}W!13&7}ctQjn{jL}wXFWmAjw`^(`Z)`~GmC_Y3IPGGJjixV{<=#4(!`mv5fI~o0M#$h5 zAX629Pm_`V`igz_$=?%3nE3awTfw3@$Q(Z|GSEEWocH30WWk;3av5e9sLM_NAp0$r z$oZD~w(uMi|3v_O3sikBp>C;x4I=j2T%Ml{-!cOWuc4LUG|pl^Yh2(=BZ<+fG83bW zdDq~|KY=s^hs5Ocf6spo1YZgcQA$-#LY9k}i7?k>d*ssWc(B{F)RMXc{5Iv+R8RW; zLh41Pku>>i)FXz%G^ytLRPJ^)&>Zo8lCq8naMs#UaF%sgC@D7`OBL?~g)Ww4h*JG< zdqC~)9ojJ3m9?TyNpuV=4TON;>U&_GZ^Muj92he=~nBpp?( z{K4Bb#^Fx!;`;SElsMqAiu4gnlwCFTO~KKesR8IanMu%9jakrY;>nr8waC2-9@j<0 z4#^SlK`)#7kcYwnIRTzw_NiwfbHk}fXcx^R{oVhvEDo(H6@WRk$0u&fB7m>x5kA8E zTpxAl1BV#~@`tCz!7!_)Hi0M}&Y!ilQO_B^PcnO9hPt_|coMY+4f-5hy8I5w{r&g+ zWuY-(xJx1Mr*rTLkAvv68_cO-(J7UKjQfu|;X8)scF}Rg3_n4Ega>d{QnvQMi?QOa zOTlyP!V30+Y?bjwia0EaX=^{!H2vW+n}5YpX*uFQDq;d4AroeFemA7cOuy$HzcE*H z5u9&V1kPhgFh4(PTN)^+!(m}M0)=wc8v3}hvH^-ZFNW21#9AF~wlfo$riq%iZ%bVP7hj z)AnHQBQVFFOZrWBAa&uOvvWZhZmS2*kuQxle<@pS}_pmM-)-1kPTxpsjuLA|6 z3tb~|e#~A)v2|a!cn`%u&8#yFtK@tYEp(}-3TecwwT0wUcthTOy9LptZAI|7>SCx$ z#kH|VBLdWM?Camusz%};^T(>ewJe;3BY!Y3O7)t8QAu%96lkpvLN4#;26`{eMwd3SAmNCSHIp zm-C^6BIyg9p&&*qqv7{TrtB^eme3@r5Ft58BRA#7hG)RtrF9zs5EEW*UnV<10`UBb zlH_}{jO2T-jU&GpUiA<~Cil(WZdZlw14Hn2&|gKU>r-!G>86k@kWVk8ga)elk*rA9=82p3wo7$ zj9-_Hww>vUoZ9|Bsq$m2vlM^~FBacz;iwsO%`#8Xfyi(Dk={d-so)4!eFf5z#q+O# zNQl)X2}n)4pcoX|u!0-Bg48N?pSSbHc8;YO_%u7rB(tsaE@;70UOw^C-`6)l#y^h~YxvntGKFMfR((IeH00_08gwyIpu=yHRB!7_8U4V$#08vG=k67l%rx%*}tAWRP*RWe%A}GV!TVBP6@g z;{my|wh(x(1*a|1AOZMnsWDUD`@D43R;}f7B53_J6|4$8I`4d4QV$?Jx!}HCND3Vi3gHd&AN3 z$vSQ=!vpZ;>f5}tG39zx%!g6p-V9a*aG)UFp13yX30@uqtu_qM`P-Cpa38UhwOybU zzqswL@*!E;$Fg@8edSyV$d7ln^?ihmtAF_{7U5StO~U-Au1t8f376#^^_JZK@#)Et zxyah5D>i7#4K%_z#Qy2Pfc`JBicx?>fEY=Vp%;S>s)@u({c^H7>b0>O$A~fj>7zzw zAPW(wj;MB>PL=IP1A?>{uZTgODR@1J)oz`EP8t)H)7-S;+`=YRaC7p6Xn)QKRq|MO;SNN1apKF3a%(bM z8vAmBCq1iAWP@ovmb&;grQZi5UK9eNhI+@QFX~E&I9R3 ztuN!)wh+|^ntg4Y|8W4aJ)Cp6|}j0$R^d!oTv;$3UAz< z8R(wUCesa`T`CiuKQ!qa;HG1^l}+|| zAc=d{xePX8Y?HrsI*SBb&|f+!;qM=Uhz*lIhc-;`PSY$IF-pdBYqE*4X9iVUx>K0T zcn5l(OAQi5{eBNvY`-n~GY}K!2hSw*-Bow`L>7OuQO}!SZc_-3Q^x`XJy6txdnX4= zo2=9Y$uW@x$9=lSs?P`x#F4)Lz-5`xn!#C39hv0EA&YpEoF`VkUxq0!c(vDUU)N|0FZGpj1j z=av)QX6iMY+XjXUvD2bmvFF%|QV3`78gPjBY9XT$a6~5busD7)fF{Wm%kg;9-?0+B zY%Cu*N5>=sl=IJD-iZpv0tAZbqjcn^0!M3J6}$ddN?(u(01I_2`qk2jYZrp=J`Nb7#j6~9iT&6TveY@1f^(PSJEz%+MX zVA{`M;Lh-}w&5zO#jzjGLg?EH+B2kM&^og=Q%vGaFNuu!DGV}OyuEcpzw~~Unh#iL zkk$rmzL|^n>V!=2+$0Q$lSo7VuVE~>qRP&ssxnWaeX<9Q{KPli?m4FbIZEJ2`z_C# zU&0=V6l7`#h?xds*Vv0nqP*yaTZT!&R zeS}6d4280qGGCr(*yun%uYfqfJXb-3*fTzT`o#pcz?tOOYc+u77$OO8(BM-~s;IAiyd_t6ovDX1=TcC%&?_N!z+8E97#27Owx@&*cuoLsuBIJz? zieqgvP$q|2#=iRf<&0@tvOdpF_?FVTzI?p6<@l5Ab6KoF#wc7C`Z6(eMYyqY_uE*;1gt9ulTEn!B#PX?3(LK4%V@Hc!j#LcUo1d4SRn!y_SgtOL6yv z0syIr#^_w`rD0tL5mETSbG}ZvvBU1$OJJ{Np(*Pr8QDdmOH<`KMGAZKX#o6?8e}Af zr2av-*Gb|4+ZQqc6ipq&2Dx?#Gg;TDTC+XJnBk2lYbLFggf6vK5EvJpMOJycM*s_#~Y*gBu{Turh`v453y+7aU9J%ZhM_c~BXjs6&QW)3hiJBBJFu z{ERHnOqaoBZKN)qhVhLYz%Wkl%6~se%1}7A9ypZKx%+`J1b<<_de){$BMy~IN^PcL zeyVqN-SELs=M5g&ds;TPxrQJ)x=o~(Wnr2%IE(887W3h0Hc=oIBPrstr!3HfeOXX$3^Fll< z>fjlIx>0&%*j;_mYDdFm$5UA;IOPXZH62j^d7lUSXHMgN8-5JqINtV=-Uy%$SniFA zZ&|)L16Oby&$+65pAJrJ?Xi^(RlWGtK3Ljv;PGdi367bZSfUH=hOUsX={UdESe05n z=bN}NqV}4tuHL6OAiTaq@NB&sLm3CJyqx-DK)rU1Z8m`CDx9iVI_vk;sEY(a0~bufvboGun{T zgZ|>n=~iH1;?}8`Ww9-@f?Ti(X#$%`!<01A9>s1|-mf;cbrD&P z#>F?q4_s6R6y1m+Cp}3Y0ipxLunsaNB9f^b4JipVo9sBzGnJB%sW{n3fiqd|HYA^U zzh1+uNwf=W7ig&q5f5%o6dvmx6x;-FiwvU<)$GhudWE|`1~;ce!!-F;_cchvqj^*P zi1~Qr$viN9+)QV#NqD5dXQ9Cd>}v{C&I2lTPQ@IulZ?nWs|?KI4y&UcFUzlLcR%(T zG=Loh@gy(vA&9nJIz5`EdD+f;Ofs5%^-!v{O-JIXFGft{# ze^~_5FckP0NQ?ao)r>qgW?`U=fTW5~|Jh6y^i3!z7hCg#J!jCL#89EfUM-Ia*}%bj zt3I&^lwLQzR}{yZ(xt*Hm__oFTu9izh_Sd>_joB51>7%EQVlUXohs@9A-^Rlh#rQN zVs1jQH&HO@eiq;N&AP1QqCUjh(@f4i3ST%tu<5Ptiq>yo zsSNM44S5%LdSr=W8Iz@GnJ(p@NfPkE!5ClPn?HTXB8DG@I5Wnrf7=SV-7o(5#X~#r^`;jgHIXA(g%Ig9ga^@Oy(Za;oej`GUa4!H;ANP)-MD z4w<>SLBC*l0)?_^4FM$m=4ILE-?;R`QzwrI_;91zsMMB+CLA0%XSW@sltB(y~D6uI@4);rFU*zQ*sg+0>v;j>MVtHo}>l z#gDj;oeGz1P6;^IglEr}t^1vq#sMbm_~qv%gw2uHQ=F?yMo-v~xc20zIit_^d&T>Ggz+W!WkP} zS|t@@!gM983U839{FuaSlB@ey2p@;4oUk^#iQNw3NEe9a4+DL4HnAth&^vWgSN+Ac z3Jy1!h9`2eLDsUFx-8yg4YgYl+nF1`>evSlH|N(KyXdmvY|LK$hX8_YLTX=&yBjwf z=HB07bH4V|d_?A{Ww{Dvs8ca6j|6hDvDl;xcA7QqBjvww6`r6U1}0c&G4m&LJ#xEw z4$2jbmp9o7+UBjtk0S8W{>yd_5sSD}QS+3=8@^!MS*Z* z2(fG@v{=4f?yr5_(VF1GDA#`-!?%Q>_Li2WXilDY30;nDr!A;vh$#?mTU4gK62NN= z(gazt5Z6<0{#LE+A4Ke!Cvjbk!tENC2I)B$skct#R(oGg*tFy}v1o;llasHSrREKQ z?`nFj5m=m8gBIcMjowuXKYW7Fj15*I&F;qGN|J2ib;(s+oO_U91B&J|4m;DtY*Otn z9n*?es|whvuczM;UZ7mVt>v?!^CQ{-tQbR?yRE6CLhb_~f5Vka@Uyq7We?Zyip=_p zWEgXuh%t9AqIdxmVedV+7+vGM?uJA3GE=XtBMR(kt&HZ-Fp4b)O#FVdz*o$49mS3Gv3m@QJ_CDDksyal8mZq&cNp`3N{-Wj z5W3bsaE1CmT_!kMA~3XPHj<+Vi2_G%yDAj8X3Y-!&H7@`lZh?-tt}yNtMvcaHd?u-in_j!O$5RBDCP}|X|*oL2R z70mxY?iEu12gzo(8vz)X5jOZD(e-N?U&Jb0r(*QDUK1(wm~Xv*=7S4}*&6DzlMQ@E zMy!iKTn{=iBNNFk08v1$zdlkyN}J&cl#1nCS!)xwuSdTG&MtLcn%6Cn{o+#5K!z%f zFba1A-i$$Hykk~Wt0m7@^EIUABGG?k9!V+7PB$Y54XinoJMUbael&V9)GimytOgK3B$dz0iblB?Gb})Yc-_8Gg|%QLr>Bmlj4k#Z6_y z)gAUNX07_d2W~vtEUCE-g>`PbmbC(glHB*Jp`N0vu{`4WwBEEDA-?5NEpT%r%L_PK zL9;hvm=;)z_N>S|qP}}Ty;EVaDQJO4VHIAflnu7D#fW&E%Cl7C!r_tqED_=HbhO52Q z?+y6Uy87%Idz)G{3(wa~?8LdJDEk|Y;Y!`I_MLc%bQ(a_kE^l&QleL*>g@a%Z zyUDxEaio;KJOcZv^9)n#{?^G!Ch~*8bm?FGVEucKOhWjJ zEU?sjcyLQwheQgOjQ@BU_CJ?&0%Lks?uFt0>tgL~YMe{dt2C5o(a1Veb=fUs99<=9 zez6f$WJJJGq;c}N$2#fKS!|g_kbeeou$AT{%Us6B94eO?lJhHX%m!VYH$nUtk%l}T z&Yu)D0(a4Og;59VncK_Y?|pCZ09A!-*N(>q3&bD&cD7Xp>a0?AfO>%<5?>gj17ABy zI{$n?{NPkW!x--=OwYd?w|_&$w=5Jxb)tZr#qEOwrGa=zytwyh{=;x(DN*vHEBSjs z)_#5JtQzI;#X11%8BN{Qo6EoEt(~|(uHrVCVv>ij8YP&Sa!F-obkYqkj%E-op6b;% zarb}~P@=#wu*kzmFJ1qcyak1OwAU(_$1Q4w-#cd|<15CAWY-D82L7jiMG+!rP{>h> z|DF%9IT(PmhL_K=rhqL1?1gpr?C^E2_36SsQfAfE*|Sxsv4kc9m|32tP4-sBB;j0s zUC@Z4UiXC?)HF>QA6U5=c-U537F;PT3jBYbuHt^D&7+^1I%cmw`+_h#**z`1ux=ej zRXfqpY3CsX$DVuwv@;<>?bus?PLm9y=LScwFUnAKvF_~sUPi>0^S}+=IPK{fiZ4wF zD{&riCOB{#mU~tE=Woj6Z)|JIM8o%|CPat8Ez)=tf50-RaT)u_(9>rtw(U(WR+P6$ZUOM}EsNN^ zs)U2*`f@7{La@UP?T!hsk)zx@WON@&$A7*w>Ns@7hx!}@4Z;qDW~?RChAe#B&2d*8 zCJw&p%-#Z$z#8i9b>w&!<(uX)oAcOSBqeqsU^Wcb(}{uOD^a(jPD_TKa(1Q5!^!4c zdQSZ(W+?OG#s>gT&8L`Qd8suxn??+W3+!Zs>)~A&?{P{fRg#w|l$`XVe97KRf z%$OZcO5TK>+J0k$h+&?(D0r2#gDH#GcsNSVG#3`VY;-vYtu$x5@HWVH0-+5*W#4RX z0vlB|J4#6d1ib*v(C3{}4e}UV6l^;sNTY>|+J5}Z-2u1wZ=s0QvV_u$DV5OQHL4|> z>V2V-(gPtx)+2PwL@yqF-?tZ#K!Yuc>7>UHNk{S9i z5=<_b?_jnN);CeO&50>l6Q#5XK10fvR6j+ot_xx@m=uRM$fmA52Y2Onptb{AJm4~6 zAFHxhL;M_q@?9~^hm^N>$K?2QGKZlv5EQ=yCi~f)jkjI`$B-$7fa<;E3fdz03+2Of zCZlT<=Z3-Wk2l_;Jj?e%Ego!a5di@>0@o*_c%IrVoW1x($WW6Hf<8Q=)Q3AU0nxU} zKw@zRRVwPbN47wKLulbF?QmN1M(i_RkpfT32ra)G$4%W`lVx+aa#riv>b0AIc8f(~ zRR!qH89eDF-%d_p{m(1D4TC8|@~oBhzDSYHSW6l24?Xsgo3EtT8Tu1h;?A`$CVW2g z={yD-S{}Lnfg@pfPuCAKDZY7U%tz8Ra0auMpMai`*{8L9-RCdKSi+?x;Xqw(j{pbs z28VWmkD#y39&`qaVh0yWilAnp?h*|=;uv~*st{lQr*{z3JNJiPfq4as^bzN zN#yuosIZX>M$Q_h7sQm(xMvy$=oU}pl0#V@s_=I=-`3+483Aj~{X){_!^gCbXU~m0 z@@9!5+ZT=4#2=-}Mqwtf$P_+jEwD_DFt#oeS2k1Is=|cm_C7iOKCOl&s3}Ix{gILm z%qt>BeaeJeuGvX-F?ar$piN&{^K-chdgmtG%~bN{usrc5LA8KbJcMg1J0%GB2%ANZ zWY`kC@xfqWH>-%_QMAu&AeoKIY#k?r&B?&`C@3iDF?eA(+3eL?<^PBcDI>eXguyw> zQ0I`FVU9~V3qr1&4lZV;|n|^#REL>tqh>m z?9I5fU+mUnPzswD_SqYoNOv=lyF`;r6<*XsPfnW0u})HT>E&!WXig*7jH`gVFA&RY z7u{lld7R$*svam}Zymhs8_6v00tvZ9EZA4 zX^L8>8QYJ4myVMielSmZ559B@QEujgGAvS8b%}h(X$Ju9&oXp=p-Ok9HYzHLqsj`` zFm_}7=~8{LjvVoKz8?mzJD>aus>c5oWn9ASQ7s|U!HYwa9y`0(FspRqVZB#EhPm)> z@;2x>5a_zD4|JgkU{)0Sb}e|%wG#I$DGL@f*d7Ledv7xq(T3q9=qQ_Hu3sBLbnT&* zQsQh!`@I|5qJT_Pr5bDa%kf2%8QOmM-bHQgJT1mP@9bk8D<3AxS_}L*2zgRbcoRXX z|El}0>O2r)?DW5sp5wCCiO%r5au^XCD0Tf$Upis|gl2~+^q;8KVg1w_Y|N?_4%SiT z_E#N+KPR9mrCyJJNgeYI#-*3nuW1QjvOIfXh|R7$ff(Y@k1=m_&$)3R)od%5dsh~| zs(D06*-k#o|4s%p_fm#v+HqyUaGh<_E|s!Y`wH<69Ui_B8)^L5J#rzsQvYSreU_iK zY=S|r=swF4KnDN)@SnN4JQ zW3=uil%4dWGuzXcY^x{nx>p{OGrxH)x$irck@ow zjrsN~-MuEhRKd~-!OHIjVrV!61rx4G7#9%bEEcr)PB!eU!k(%rmL|Z5DMM_bMX;%2 z)G1Y4{jW4b$fNq2yVtQ9E~uVeEa;^@-WEMg@p;A`3N3O~RH0U_3&#ZnymA9xy#re@ z!RK@+0g+cYq#Yd~Fj^f@U_b*s9is=A_%nI#AqN?xEB2%15^oh7Pck#wj?CDILL-#j z)6&5uK`w7Xfl9#&)??8ZV7?FQpA_01>v&Vl^ zoOS6{X=&b_O@DmN3WWd7jY89_s<2iIlAl@F+C|+55t^v>N2r=aVlO~n>Zka5{q1VZ z@7-(R#&)K80&MA*w)ej9#VslK>c?OkSY;k3%rG&Jrc1q3qc=h8?;~HA8=W)qvm@_@ zt3~s@-{G*t36j!dD&#eBmD-Ke?}HGg7)w&5AwB5w(V~7Irm!^U?Y3#8K4N|11g*YG zqpj^2MM&>QeICj^W3(W9^OzXs6+1Z$0}tl?tH#xetCBc*+3EhX*4FqvipGUX5*)bX z+)$p7tcTzyfO-8rCVqC@`hzN&QK*(~JRpCJV0otzC3{kze{i&#*nQE)OpnHd#+>$d zE7)xMyQxtlV*C~`heos}g(!yNKPCp9sk1#r3C>IqO$r53#{hm5Sg2wkbuw_!28*qt zj`;PG?~u0rg2^PPbEE{UyX3wzlDC$z5|}Eh?#tl`$>Z?c`j=1*S^?Y)jLOKrto-nK z4JuDIqIBeK_WZ8dgn%gES;l)EnbWrL>9>?vYMjv=gz^h^1$HDUKQlJfcGL(CAGJhl zgv>hklz|Pz{!rfjuXFSRR!EHA&uP@N)T zkymJ@WWFfhafKr##No@6?DLF6a!Z)PprnGjBCr{WRJD@i#TEv*&Qf_!P=Dn(2%JYQ zV2u<-dqTaZ6$H^kaLNCC+9&lk$sA|On4Q0b|3Q7}1J0&H_(#_oOnRWK&yVQ2?My|ua`omc ztvODLfc97320Iv=EGX6=m(3)A4k>VWvr*wLo*cxwH05Z!P2%ju8{zFcFdWV1Gns)^ z4(ZfZvQEyd_9J!As7{r$zgv7RO3xl6)V-W^(;r@>v%C|jha?xK6>XeXYR=L!CL9rX z^z1;D$xryu;F}URRQGiy2j0=TZ(Abk1>1ofv%I##Lz+KLktk285y%x}g$R8Y8$t=} z*J;}r)cnHgsGY+;BPbj_yGVgvLNR9faTodzCk+UTV1iiIUVSRBeJP>CP^s$2y*Fua>lr&*7 zQ20Hcqf%J4=m4$QMVJM>IH|c%dwMIUS5vP2VE01TGR~gip4MCY9GejEk?asyB<4qk)v) z|8E&Pm+%sc*KI>#lRwKN-9+G9+-3iB6Y<*SLs1ADSA>4Isl`D%cQ$>~Eopwt;wb*) zfRmU;V+0e0V_F3Gsb@yo>$pD5C`Qsk+nu#h+WZ+iL8e?sJ7H7U8e#H z9x3USzXPD|Iuslt3R=Tq`lqF624n8|^;oX0B@}Gd`2No~Sr0A^Po9W##)@Q7xfecG z6iJ-%{qP0ffXlVU*}iUki`=h`Bilyf=}D(+ux}Mu8u9$LJFsXWc_h?vPF^QiXv}VA<6w=Z*HpNqhld6IEg`3Rn2BnzS3RO^+$Qi&R-tqYVcp zai7Mofg|%eUHM*G?EVN6=jEnYG0(16cP@)0AZB#xyz*_{;n9)G|c%SA&2<*?&wB6MgSia3UMR6#ApayZMttS-ur zkG?PdiVFjS^X{+HdjqF1N7r%5iaP_V#H3G&UR^`NSmkXjr>26xnsB z#)PZfvyo@<1-UIXsgqDvK4}x`&RlFk)9XJ@&L##dRlziOEq3q9B-#3^;WO%lCg^Bd z>Vz_uEuOr4qvlNc8HL3L?YER{lf5}>Kky%Sm7PEKc zV5dWMLu?)SbSH6Vf+*O`9xp>sg>ivB2{a?=F%giOQyeio75-qsg*8{41eFrc(+6(o z`oHq2?qThXA&a%VDA?l!dhFv#yk}j<%|C3kN}@u6KEw}7v0xmLh1MD|R5lb|Z@M8K zdrpRU%R6b;v!6$ZkKz9fdAG0@b((b(&L4=(!L0aO@h*I0S6=sJ!?GBK5!rlyY(yi z3c4}QB_cjbRxZD`)c2aBEEAYgELTBN6df<-zXtZCUN-u12$8e`F9i<%K$!;&mSI-j zrsDUial~PkRZIb_06Kb8S{4+|s)B%l_ z#nghI3M-n@T}>yMfmqL2D-v(tQbg#IHZG>Kz(CR3?T--MddvnNbwd{OK1wrhwA%lZ z)UnR2_+~qyHTJYv%B|+4@hSYD{eFrmuI9(7COLJvm`leDy!FR~iMpq*dZ!i(y_jol zm9`_77%w-E>pAWrbwQ-T@1TLoqB*hA&dZwx%3vT1{H=Ax$Z8|ccdYI%b{(vX#<$4v zu}ol#_LtQ6b`ItZcK|G$xQz!-HG}sk8_n9HW3cco~ z*{+CtASPO3+a~y+OIn5ls)uf0ffGi^2c1{54hd$(GN>Yws--d3;F3ESpZ=>uI|ZHy z59!gT?2BarQ$ibz<2zLIe2p%~x4O~}0g^V@xiD_fHrY=6u+fSb-RVvAW$$wA7`-egngMZ(ZRwwLdy zaa9)}GnG&Qcd`qB%=^5o~Ag*jpt4hhvoBKID&n{#n8NPCLxsX>)(t>&fHFL`Ky|PKVF`bgBO*5qJ9a>qQWT;$^UYj!iEJx_ zztO)`T>~l&_gLNPGatV9?CMq0Yi0v0Pmq-Wn^N;q^32Yuvi@-m@iLC`!=h8ZEa>7* zgtIUva5yUre}2%-TCZ_m_q66^7e-B5PvBY9OzQ{cFQ+4OK~rkrRGT&GeRj}euhtx_ zC{NqYwUV`uzMJWX6_v(<&bQ)9mgNA}V5)O5NYksf(F{o5)@t}rm;VU`?$J73$odDncTH5fL z9^b_tj@(F2Bge;4g~Z)Sjtr7f-ArgAsF*b{SEkzQE{@Ag<0>;t z%9T4dcZfc<@Uc)AX*VZi5AC-2NTCSJJ)TR9S(CJYhr#qBP0MO= zzi4vIzkt2(GxaXYN#s9gRT8hCsyG+kswBC!7YN&2o~LCqm+(n{VjmH5;z)!U@q&1Q zj7ZXimo(-1-ONxkIVk` zJdjzyW1O48BYImER@T8O2MSfk>sZ4eaHA^Xlm7=%BRNOD8TkPaOf5aFXZ#-5Zl5k) zNTs_XiN1GCY*zOZ!_)moO39Z{e*G(6!xqrapBsG*QQU)4!PHW~aW<#}+$CM?H$%&j zSjZ{YWAHy6G6PiH*s46vZO7CO%M~3HiC_I$I&7*41CcoVd zBR|&xqfLXQ7hk;SA7HWLuJ}}di_78->>Z_G{74Q8UjmgB8lZ6Vvy;%Gf732) zzUDJm)?%3b6;94Cb+s01QCjqaN2GbAJufu%T-dyf{WjAcV;o5lxg5`s&;sbcOY~=k zn-fd*BWW+iZ)t>PT7f$}SGT<785Nc4X&Ay)wiHW@l6v&ai}S&#I|g-fYSAU=!HT9) z93Q109rU;mOYVv7Pt4u#y?vubHh92T3s5@y_J0oW3997c8&F0$W|ZskuwV6RjxbAM zGyAhT;8YIiO)_=$p%2&b32@_JZNZRDFS1NQHzdFJsw<^1J93nb`lWMkf~hfmbyKuL z7qWPp4M}um@*by#@Hs6waD8?d1T1idk8w5F`msS6qpOlXNXszSYuczyxnXq-9u19k zNU(s2v?tcd{3%=u&cO(+(unDCzWHthZ+qk6@z++dgcRjGjzjnVyeq1dz2YS|b34!6SSZS)_=(C7^~+f3s4n8^`qEpya)XovFh##vL_*;e&V|w_%R`S$9oD zKUiep;grd?+fxL<#WPS#${QP5H$%>-*nUE?-R(16RbMsnu=y%$CNo97C7RIEd ze+nh=YYygf1e0%Jc+0X(e$e1E#Nyc(skGG&X3~OrVTsN}2Pf@l-Vl~p&NFj)j#;J- zMj%dz=af)#FKsPQ&Xi?0;ILXtqGu5s@^Du`;>!x?E~y9ePe_#2lN`s#(sq9-$g zy$%F($2bNU$mbUKdT!fuKZ3aeN$q*Cpz09y0SP&Um9>qK`Z?S@a{c^dQV)>lgyPqhx&#c{+lOGV!6I^%`&HD*b{0m-4*gx5i%f}!a5q$#YKRSI zZ6vd5Dz)?*uN}mOYx(DZmsP-=fDDQCjQ?R0Bl|z*sKv$0=f-IuF6BXt%9H(nTNXSO zlxeY94@_)2)}fuJ_}ejtu*_UT_WdKG5trU6v~&NUn(Yqfm&|gr;yl!M{;{D zU-meZ+@3vTq6<*ODmatMa(>PU2`L8?_-qTk3d|`B-g2=c2>j-)j>o_mM&0(q{yxS zZLHg%(O4lM;nQpdG|jAmPsRume0>Bw6H|9vjB@gF zqtBGD7&^9;WMWb;VAqwC6P7Aq!m@J-05CvoA(l;q?POp6-@0B?Q~hT38*&+&@l`9l;))d*f%p zn>-M^p{I-JPNj87yn0Kg4ZnU*WYJj+Wwoh1hZi3ulugj#>+RIrnJAH}*R_8ommtPS zll?#p8bjK*r>=`CtNvacOeKkmt{1AZ-%t3%L!g;x9kOWvOPecR$(bX?Uy z)$~@l>=iiSxAet{5?4j)|CTD%t=#+rLb7P!FuXAu{wDVpzATnC03*}uOrqS)xgf&K zT8JmCPf?eX!AG8I3A8ccSvDCvn77iIH+(i*&K%a*QV?@`9~Cpkgw8V~RDXj0o*F;?oR!=5p7?Ok~fq};k6}|VH@9ZrM~#r++u1Mjm0?%uN?DdOR{ucp$Nw^a!O`- zW??QmVx5|aRVNFisv9zF@a~!vmP~CTxKrbnakzp7MOfqOa_}2K=!3WAhZVZZS8ts> zpLI*J5vGBMnKXLHZFL$Z6(EX2CVvcyW1NgvFpy##yvVVK$!PB|pF2Q{3gT5c)`Top zCFc0Ppnl*3>hK49f>Rt>MJ;|`eX-&F8yoR2wKR9MQ7#|ss%X3mgtP9X+zblq zoj^`;%&qVzTD?osvnyXoJx`OC2!R4f^|56~2i;Dds`PjS*@TA==usFB@7!X=3LqFBc=@^sJ z@DsySA&eVjWDTq}n&C&+{sdqomD36(jp6zlG63UGD-Fana}QDCHPq!jwTsvU8&9AA*3dz@#6+W4JP+-5+_dPbiJHk!VjV;a_ z{du-3))Tr^j=b}$2E#u>*JmR3>jh{4o1>*#Pn0C{uVkk1e`5mPoJ;K(K5h1j9r}z} zRqi+&CSx(o zM+V7)12FH{^d+$#B-rH&`b$tKfgS4aBZQHiL#{JJT z+}){@2goW_Nj6CXoo&R4(Cjc~>wnIXykQTX(ENyJ5XrLsXb->K)>=|;Ib?uA=5X2w zK2RGzuXxH`r8HIM5=u(h&HM*5HL!!nS}rkuRIyuQf#an`j+e%|C|FP?q0wAI{taq} z^Op92d<@H8FFr2)=z?}R3J6BR&aNBy@4J6H@72Ek$@%fT_iuwZj^xdnM9Az||97f* zBx8&xrgINT{qvd}EbbLMRoZ%J^<-g(41Mo#UF%EueqzIY5bO)hE@aU*SU9T7aAY#| zKQmOpId%nx+T2?1t5++dKGa zpsdx`7!RCc(LkaH9`&*sG_o4ih@ZTP!GMR)eR+R1`HuU5Tve&`7~$oO(0_f)Eh8!U z$i84hn_c7OaK7-0+2I2oaw?`=a06R5l}&}S-Cy9XI#wS}Lf6jq4;v6B^KcfVr}h2X z=7bm)(U>f)DB1>}X9I_T(|{5XXKny*m26$`=Fh8hxxpPMNY8x3bO}hV)HNZ)9g&C( zC41K31AZ_AqyV{QqQ{tZf6%N7dbLb1X|R^Dww!M6NUX@R)p-w>L%8$Us@oBUct)}zBI7qSyz&kJ zDC(8W%dp!>DhH;q0sAJ|PkQ1%Z8fKFd4YCH+&?LWeXdig{rIINbhCeu-65p{hC7>R z!5&^GiQH-viIH!T`+;tOA=ne)JGedk_H( zSLLXLr4jtgZ`5Y=eYT@z4W@4j8U15w9ao30dra=FJRY}_i&lM9t0g})!m8wE@ZrUd z-(hy3cF(%)7WZqq5sAs{p{<27l-mjPx~xggkh_B=?!QNKxfJpTb$o)wGQF&fHhc(> zTlk97%cK56fW*vS6y2LD03{&evVJj2OffBkYgOt8oS|cL1JD1DGsvV0R{z}!nz{u+ z6Ay7z(}oicRCDNX6c7Ibe3ksU)!l_}IfVPRJsMYKv8Vbwq=&gZ*D_A#8&&Vif@(py zZS_%y`6S$l4QR}1s?l7^W*R}jG^&2La3&nu z8GzV!bmC|)OLC3fVY8Sa<;7P zOv|{X5%EbpU6Jkk&D)gTcP{`9Oz3R9v9nd3rC*o?`9UC0}oaV&w> zt#1(mSdvYa+lVi%8iY-LC5N3i)JVYxL)JzafE>|8zU#uxZW@dySZz?WBB2}Z+38tL zQ}@&L{e_&N9(Siwe42#oJ?C@dH&ne|d{#~n{#*fiJ$Ch$G{b#eJqi8KiYzHr>mJJ-s#&9TO^7O_k7rs5 zkQxB$$hYABJK=7DR?RY&daoMQcd6k0abOHR2dp0Xu&rOO?uUcZDF?cl9j@t%Cho_buGLyu1mNtlAQt;OetM5RUz5`S*7&MJewup)`z<5v*Y8dACI=qgNM8 zYQO+gd8zLr2XR*^5cBxh)7hZoPoh~}bg4Zcg6*h_B*)~=V_BsB8O&69y>_H*Ek_J7 zit25QFqyPM!OW^!TDZ)j9N)k%^;|4u6t6>}C+OmtVVmyC@Fz{O_KC~Zg1r#7<=lp7 zDJk}-zHm~oSEB{Al%0H;Pbm(JIXAX}HyrfgsB>5p-TKO(*xxoqaARg2TDK9JKmY5u zsk>W6K{Z;BtSD}l(7EN@r__H($`O4%BfQKgq zu=6X0V>IHgELcwr)9)1n2ZES1vVgbi!;)fmZh*@5Lm9YGv0AjU(fd7)Lu zxGZ3+z67nXPN|dJ0#BWJSVgsAfC6LJH7s)NbI6UR^;E3B%u?D$y)pi=uotF|rnE@| z?1YUR=3Tr9gEGfF58;zUK^Pl`jbAaCPwf!^oH}WzyWZT}>Yi$gX}1ZkoOJBn_|$Ti zHu@bwoa5!t6fo?n`8Qss1y{g2(1V1)>nvg4`Lf=~(cFlS>UV%Ipgxa=Sb zS!QCY1F7uRbweG%EpRB&>xJG$0tUSZ$9(zf_S#cdMf>1|fg$6_~ zs*qx5)o%g9wjDlZT%3u?Nz3adb$xpHv zm2OZsQzetPl?V4`ZL`<}d~E4povOt?osmb zFI6mYw}Lc(c4Bas=qfawuU0#j!$+F{K=p~5489WWnJri08t-=A`FA7emIAWkf3Xev ztp&<#{xcDuoj@E;sHq$O*mHQ`-!7I5`hvO%Jr#A!mvS!Dn=p2<4)Wy=)@56Pc*^xp z$=Zn~w2PZ0FAlD3)2A8!3fAdHUfJS-p-YA1Wy>kGgU4WbCG<;1FhbJ(j;939k5FyM z-!2<;4#j9@O?+2ncgBWfYH@c{;;=pxGWg!@cgGt2DQ+Ldsb*-p$>+m9T)c^<)bNTV znT8gX_lJpmudoS~QO<%Kvrg7#PzPS0{E*STwm)@rV}IW$D0W+qc2d6=jG85%eL^~mNCj>mkj zCZ&7H@UOh{1J;Kvy?^kTsD^1PwmNt#*nq(V0mU&WwKw4K47o#gq0JsDQsy99l2L6t zO$ckqu+A!cY!DyJ-t==I+pKz4gUCR=E3e*B7Yj&uxq%>R?d4y!^~Xtk+Bjhlhcf)j zwpC&=7CMa?_2UwT(H~bkZN~9iLZl3$qEa0`Gv*X({Rm_fW5le{rsfGyWXFk=invG( zj&y&Lb|{6 zF+>3q1qvUtxzUg3!6PH@CQHWH^T@;D_nWT|k6RPLb&CjET%S8Q%#qPN#0?ZxqLv8i zQ@42@0hgnec8t0F5DY?VVJABVKnXu4Z&r&NuC1XrKx$d}`T}5}jaYe#n3HKn#VW$Y zRJFIY2XeDo=nL{=zj<-r8?1JJm$euZb(x$rz)JGKM?eeRfp>miPUZ#6;|BP>UM^!=#Q$jIn?UJpqx>`$b_S_+xR=E=xLTP0sWC!4Zbdry=(b>|Ls{&w=uiiFG)os7c9AB| zqLo`RnklRO(Nl@u4HvO@6nX4lsrJ^ZC0NUYZ`%m>eq!3!iUl@(XU6-d9T9xKXIZvz zCr)pq?vh!#b3A3*YtF8gyZ7s6Kt#+JcD8#mgLS-iNGA5N5=@9FWAK|@jYkkmj;4Tb z8CX^(Fo}#<8A)2DTSIiW`!hu3OYsD|Nn9Hjvqtx)p*~n>AVb$+{Mk_&{^<9JAbw?6 zmgbfI%L3wO_u(=AVg?Iuq>48}U116QmMG9}0U3d+kF5-23?RhlSj ztu$r8TAb!vWLRteQ;w_l@8@tUyjAwF8o&0zfEDmq1>F+#vYH`_0 zs#6M*H-0K9Fq$lE$wbVXZN$5ev1RdK%38!1d&Wf!>h*4y>~#iGfZ6L#a*X{4zl!(e zCH1#%=Ome5Q}KFuY;{;5TM|^R5N3yk__5s9c%jJol^?|1Ruu%LzG3+LqL(+j@#;hfpqlL_zbZFFi!D_QCA+;nok>~Run0O`vm{{cjSz#(v(|xm7j!-JKWLEHFI-nO z4+#>*I1eT;a1CI*k~NSE+%p8xn+$Qv0u~!j@=rR%rLfT>53TV2=oi;mWIL*B>Hi`L z#0J)ed*e49(eyg}Ai;!24-_m3C)RX*`7VBQl^4bF$_6P3uWy~5Q@4dpR7(hpsfn9JT? zvp?leI24%iahTu@qJP!3_5P9=cS0tZJa~7>M{uu@4nX6FR$p7h!a@;M(i0X4)GMxef4;V1yOc zsgxZN7CtJyq{X(0_Yb;)opY$T}} zL3n*CO0kz}=dY0kNylgzJw(T15UQBk&7xvJBDT1HL;pE-4#TWwQ0A%)5+wC5(PSl? zc(KxY7Mc+Pe*d(UOG7vtVOgh#L6<$*+1go~dyV1&kyH$*Tc|Dj+@_&z*P`*2k&Jhq zJ}{kJaf#kJD?<94o8)F?{606)mJW53Gs!G(o!0nC! z`-;yi!0{H~%IOjy(F**_Z5*ta$l2_$5D^eJ@igpr*%^E((FFF&nl;VtEMgXSP*0U>b@jdTE6qW$WE+za2U

  • 3MkoR9aFYTKLy#4h^B3W@dN&s*KIny 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

    4 - Using the mxmldoc -Utility

    - -

    This chapter describes how to use the mxmldoc(1) -utility that comes with Mini-XML to automatically generate -documentation for your programs.

    - -

    The Basics

    - -

    The mxmldoc utility scans C and C++ source and -header files and produces an XML file describing the library -interface and an XHTML file providing a human-readable reference -to the code. Each source and header file must conform to some -simple code commenting conventions so that mxmldoc can -extract the necessary descriptive text.

    - -

    The mxmldoc command requires the name of an XML file -to store the code information; this file is created and updated -as necessary. The XML file is optionally followed by a list of -source files to scan. After scanning any source files on the -command-line, mxmldoc writes XHTML documentation to the -standard output, which can be redirected to the file using the ->filename syntax:

    - -
    -    mxmldoc myfile.xml >myfile.html ENTER
    -    mxmldoc myfile.xml file1.c file2.cxx file3.h >myfile.html ENTER
    -
    - -

    If no source files are provided on the command-line, the -current contents of the XML file are converted to XHTML.

    - -

    Code Documentation Conventions

    - -

    As noted previously, source code must be commented properly -for mxmldoc to generate correct documentation for the -code. Single line comments can use the C++ // comment -sequence, however all multi-line comments must use the C /* -... */ comment sequence.

    - -

    Functions and Methods

    - -

    All implementations of functions and methods must begin with -a comment header describing what the function does, the possible -input limits (if any), and the possible output values (if any), -and any special information needed, as follows:

    - -
    -    /*
    -     * 'do_this()' - Compute y = this(x).
    -     *
    -     * Notes: none.
    -     */
    -
    -    float            /* O - Inverse power value, 0.0 <= y <= 1.1 */
    -    do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */
    -    {
    -      ...
    -      return (y);
    -    }
    -
    - -

    Return/output values are indicated using an "O" prefix, input -values are indicated using the "I" prefix, and values that are -both input and output use the "IO" prefix for the corresponding -in-line comment.

    - -

    Variables and Class/Structure/Union Members

    - -

    Each variable or member must be declared on a separate line -and must be immediately followed by a comment describing the -variable or member, as follows:

    - -
    -    int this_variable;   /* The current state of this */
    -    int that_variable;   /* The current state of that */
    -
    - -

    Types

    - -

    Each type must have a comment block immediately before the -typedef, as follows:

    - -
    -    /*
    -     * This type is for foobar options.
    -     */
    -    typedef int this_type_t;
    -
    - - -

    Classes, Structures, and Unions

    - -

    Each class, structure, and union must have a comment block -immediately before the definition, and each member must be documented -in accordance with the function and variable documentation -requirements, as follows:

    - -
    -    /*
    -     * This structure is for foobar options.
    -     */
    -    struct this_struct_s
    -    {
    -      int this_member;   /* Current state for this */
    -      int that_member;   /* Current state for that */
    -    };
    -
    -    /*
    -     * This class is for barfoo options.
    -     */
    -    class this_class_c
    -    {
    -      int this_member;   /* Current state for this */
    -      int that_member;   /* Current state for that */
    -
    -      /*
    -       * 'get_this()' - Get the current state for this.
    -       */
    -      int                /* O - Current state for this */
    -      get_this()
    -      {
    -        return (this_member);
    -      }
    -    };
    -
    - -

    Enumerations

    - -

    Each enumeration must have a comment block immediately before -the definition describing what the enumeration is for, and each -enumeration value must have a comment immediately after the -value, as follows:

    - -
    -   /*
    -    * Enumeration of media trays.
    -    */
    -    enum this_enum_e
    -    {
    -      THIS_TRAY,   /* This tray */
    -      THAT_TRAY    /* That tray */
    -    };
    -
    - - -

    XML Schema

    - -

    Listing 4-1 shows the XML schema file mxmldoc.xsd -which is included with Mini-XML. This schema file can be used to -convert the XML files produced by mxmldoc into other -formats.

    - -
    - - -
    Listing 4-1, XML Schema File "mxmldoc.xsd"
    -
    -<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    -  <xsd:annotation>
    -    <xsd:documentation xml:lang="en">
    -      Mini-XML 2.0 documentation schema for mxmldoc output.
    -      Copyright 2003-2004 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.
    -    </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"/>
    -
    -
    - -
    - - -
    Listing 4-1, XML Schema File "mxmldoc.xsd" (con't)
    -
    -	<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"/>
    -
    -
    - -
    - - -
    Listing 4-1, XML Schema File "mxmldoc.xsd" (con't)
    -
    -	<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>
    -
    -
    - -
    - - -
    Listing 4-1, XML Schema File "mxmldoc.xsd" (con't)
    -
    -  </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 --git a/doc/mxmldoc.man b/doc/mxmldoc.man deleted file mode 100644 index 3dbcc90..0000000 --- a/doc/mxmldoc.man +++ /dev/null @@ -1,48 +0,0 @@ -.\" -.\" "$Id: mxmldoc.man,v 1.1 2004/05/01 23:41:51 mike Exp $" -.\" -.\" mxmldoc man page for mini-XML, a small XML-like file parsing library. -.\" -.\" Copyright 2003-2004 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" "1 May 2004" "Michael Sweet" -.SH NAME -mxmldoc \- mini-xml documentation generator -.SH SYNOPSIS -.B mxmldoc -.I filename.xml -[ -.I source file(s) -] > -.I filename.html -.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 and -a HTML representation of the XML file is written to the standard -output. If no source files are specified then the current XML -file is converted to HTML on 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 -Configuration Management Plan which is available at -"http://www.cups.org/documentation.php". -.SH SEE ALSO -mxml(3), Mini-XML Programmers Manual, http://www.easysw.com/~mike/mxml/ -.SH COPYRIGHT -Copyright 2003-2004 by Michael Sweet. -.\" -.\" End of "$Id: mxmldoc.man,v 1.1 2004/05/01 23:41:51 mike Exp $". -.\" diff --git a/doc/mxmldoc.xsd b/doc/mxmldoc.xsd deleted file mode 100644 index 7a3df87..0000000 --- a/doc/mxmldoc.xsd +++ /dev/null @@ -1,188 +0,0 @@ - - - - Mini-XML 2.0 documentation schema for mxmldoc output. - Copyright 2003-2004 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 --git a/doc/refapp.html b/doc/refapp.html deleted file mode 100644 index df478c8..0000000 --- a/doc/refapp.html +++ /dev/null @@ -1,9 +0,0 @@ - - - -

    C - Library Reference

    - - - - - diff --git a/doc/reference.html b/doc/reference.html deleted file mode 100644 index f39d325..0000000 --- a/doc/reference.html +++ /dev/null @@ -1,1224 +0,0 @@ - - - - Documentation - - - - -

    Contents

    - - -

    Enumerations

    - - -

    mxml_type_e

    -
    -

    Description

    -

    The XML node type.

    -

    Values

    -

    - - - - - - - -
    NameDescription
    MXML_ELEMENTXML element with attributes
    MXML_INTEGERInteger value
    MXML_OPAQUEOpaque string
    MXML_REALReal value
    MXML_TEXTText fragment

    - -

    Functions

    - - -

    mxmlAdd()

    -
    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - - -
    NameDescription
    parentParent node
    whereWhere to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
    childChild node for where or MXML_ADD_TO_PARENT
    nodeNode to add

    -

    Returns

    -

    Nothing.

    - -

    mxmlDelete()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    nodeNode to delete

    -

    Returns

    -

    Nothing.

    - -

    mxmlElementGetAttr()

    -
    -

    Description

    -

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

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    nodeElement node
    nameName of attribute

    -

    Returns

    -

    Attribute value or NULL

    - -

    mxmlElementSetAttr()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    nodeElement node
    nameName of attribute
    valueAttribute value

    -

    Returns

    -

    Nothing.

    - -

    mxmlEntityAddCallback()

    -
    -

    Description

    -

    Add a callback to convert entities to Unicode.

    -

    Syntax

    -
    -void
    -mxmlEntityAddCallback(
    -    int (*cb)(const char *name));
    -
    -

    Arguments

    -

    - - - -
    NameDescription
    (*cb)(const char *name)Callback function to add

    -

    Returns

    -

    Nothing.

    - -

    mxmlEntityGetName()

    -
    -

    Description

    -

    Get the name that corresponds to the character value. - -If val does not need to be represented by a named entity, NULL is returned.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    valCharacter value

    -

    Returns

    -

    Entity name or NULL

    - -

    mxmlEntityGetValue()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    nameEntity name

    -

    Returns

    -

    Character value or -1 on error

    - -

    mxmlEntityRemoveCallback()

    -
    -

    Description

    -

    Remove a callback.

    -

    Syntax

    -
    -void
    -mxmlEntityRemoveCallback(
    -    int (*cb)(const char *name));
    -
    -

    Arguments

    -

    - - - -
    NameDescription
    (*cb)(const char *name)Callback function to remove

    -

    Returns

    -

    Nothing.

    - -

    mxmlFindElement()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - - - - -
    NameDescription
    nodeCurrent node
    topTop node
    nameElement name or NULL for any
    attrAttribute name, or NULL for none
    valueAttribute value, or NULL for any
    descendDescend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST

    -

    Returns

    -

    Element node or NULL

    - -

    mxmlIndexDelete()

    -
    -

    Description

    -

    Delete an index.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    indIndex to delete

    -

    Returns

    -

    Nothing.

    - -

    mxmlIndexEnum()

    -
    -

    Description

    -

    Return the next node in the index. - -Nodes are returned in the sorted order of the index.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    indIndex to enumerate

    -

    Returns

    -

    Next node or NULL if there is none

    - -

    mxmlIndexFind()

    -
    -

    Description

    -

    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().

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    indIndex to search
    elementElement name to find, if any
    valueAttribute value, if any

    -

    Returns

    -

    Node or NULL if none found

    - -

    mxmlIndexNew()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    nodeXML node tree
    elementElement to index or NULL for all
    attrAttribute to index or NULL for none

    -

    Returns

    -

    New index

    - -

    mxmlIndexReset()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    indIndex to reset

    -

    Returns

    -

    First node or NULL if there is none

    - -

    mxmlLoadFile()

    -
    -

    Description

    -

    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.

    -

    Syntax

    -
    -mxml_node_t *
    -mxmlLoadFile(
    -    mxml_node_t * top,
    -    FILE * fp,
    -    mxml_type_t (*cb)(mxml_node_t *node));
    -
    -

    Arguments

    -

    - - - - - -
    NameDescription
    topTop node
    fpFile to read from
    (*cb)(mxml_node_t *node)Callback function or MXML_NO_CALLBACK

    -

    Returns

    -

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

    - -

    mxmlLoadString()

    -
    -

    Description

    -

    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.

    -

    Syntax

    -
    -mxml_node_t *
    -mxmlLoadString(
    -    mxml_node_t * top,
    -    const char * s,
    -    mxml_type_t (*cb)(mxml_node_t *node));
    -
    -

    Arguments

    -

    - - - - - -
    NameDescription
    topTop node
    sString to load
    (*cb)(mxml_node_t *node)Callback function or MXML_NO_CALLBACK

    -

    Returns

    -

    First node or NULL if the string has errors.

    - -

    mxmlNewElement()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    nameName of element

    -

    Returns

    -

    New node

    - -

    mxmlNewInteger()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    integerInteger value

    -

    Returns

    -

    New node

    - -

    mxmlNewOpaque()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    opaqueOpaque string

    -

    Returns

    -

    New node

    - -

    mxmlNewReal()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    realReal number value

    -

    Returns

    -

    New node

    - -

    mxmlNewText()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    whitespace1 = leading whitespace, 0 = no whitespace
    stringString

    -

    Returns

    -

    New node

    - -

    mxmlNewTextf()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - - -
    NameDescription
    parentParent node or MXML_NO_PARENT
    whitespace1 = leading whitespace, 0 = no whitespace
    formatPrintf-style frmat string
    ...Additional args as needed

    -

    Returns

    -

    New node

    - -

    mxmlRemove()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - -
    NameDescription
    nodeNode to remove

    -

    Returns

    -

    Nothing.

    - -

    mxmlSaveAllocString()

    -
    -

    Description

    -

    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.

    -

    Syntax

    -
    -char *
    -mxmlSaveAllocString(
    -    mxml_node_t * node,
    -    const char * (*cb)(mxml_node_t *node, int ws));
    -
    -

    Arguments

    -

    - - - - -
    NameDescription
    nodeNode to write
    (*cb)(mxml_node_t *node, int ws)Whitespace callback or MXML_NO_CALLBACK

    -

    Returns

    -

    Allocated string or NULL

    - -

    mxmlSaveFile()

    -
    -

    Description

    -

    Save an XML tree to a file. - -The callback argument specifies a function that returns a whitespace -character or nul (0) before and after each element. If MXML_NO_CALLBACK -is specified, whitespace will only be added before MXML_TEXT nodes -with leading whitespace and before attribute names inside opening -element tags.

    -

    Syntax

    -
    -int
    -mxmlSaveFile(
    -    mxml_node_t * node,
    -    FILE * fp,
    -    const char * (*cb)(mxml_node_t *node, int ws));
    -
    -

    Arguments

    -

    - - - - - -
    NameDescription
    nodeNode to write
    fpFile to write to
    (*cb)(mxml_node_t *node, int ws)Whitespace callback or MXML_NO_CALLBACK

    -

    Returns

    -

    0 on success, -1 on error.

    - -

    mxmlSaveString()

    -
    -

    Description

    -

    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.

    -

    Syntax

    -
    -int
    -mxmlSaveString(
    -    mxml_node_t * node,
    -    char * buffer,
    -    int bufsize,
    -    const char * (*cb)(mxml_node_t *node, int ws));
    -
    -

    Arguments

    -

    - - - - - - -
    NameDescription
    nodeNode to write
    bufferString buffer
    bufsizeSize of string buffer
    (*cb)(mxml_node_t *node, int ws)Whitespace callback or MXML_NO_CALLBACK

    -

    Returns

    -

    Size of string

    - -

    mxmlSetElement()

    -
    -

    Description

    -

    Set the name of an element node. - -The node is not changed if it is not an element node.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    nodeNode to set
    nameNew name string

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlSetErrorCallback()

    -
    -

    Description

    -

    Set the error message callback.

    -

    Syntax

    -
    -void
    -mxmlSetErrorCallback(
    -    void (*cb)(const char *));
    -
    -

    Arguments

    -

    - - - -
    NameDescription
    (*cb)(const char *)Error callback function

    -

    Returns

    -

    Nothing.

    - -

    mxmlSetInteger()

    -
    -

    Description

    -

    Set the value of an integer node. - -The node is not changed if it is not an integer node.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    nodeNode to set
    integerInteger value

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlSetOpaque()

    -
    -

    Description

    -

    Set the value of an opaque node. - -The node is not changed if it is not an opaque node.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    nodeNode to set
    opaqueOpaque string

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlSetReal()

    -
    -

    Description

    -

    Set the value of a real number node. - -The node is not changed if it is not a real number node.

    -

    Syntax

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

    Arguments

    -

    - - - - -
    NameDescription
    nodeNode to set
    realReal number value

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlSetText()

    -
    -

    Description

    -

    Set the value of a text node. - -The node is not changed if it is not a text node.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    nodeNode to set
    whitespace1 = leading whitespace, 0 = no whitespace
    stringString

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlSetTextf()

    -
    -

    Description

    -

    Set the value of a text node to a formatted string. - -The node is not changed if it is not a text node.

    -

    Syntax

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

    Arguments

    -

    - - - - - - -
    NameDescription
    nodeNode to set
    whitespace1 = leading whitespace, 0 = no whitespace
    formatPrintf-style format string
    ...Additional arguments as needed

    -

    Returns

    -

    0 on success, -1 on failure

    - -

    mxmlWalkNext()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    nodeCurrent node
    topTop node
    descendDescend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST

    -

    Returns

    -

    Next node or NULL

    - -

    mxmlWalkPrev()

    -
    -

    Description

    -

    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.

    -

    Syntax

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

    Arguments

    -

    - - - - - -
    NameDescription
    nodeCurrent node
    topTop node
    descendDescend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST

    -

    Returns

    -

    Previous node or NULL

    - -

    Structures

    - - -

    mxml_attr_s

    -
    -

    Description

    -

    An XML element attribute value.

    -

    Definition

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

    Members

    -

    - - - - -
    NameDescription
    nameAttribute name
    valueAttribute value

    - -

    mxml_index_s

    -
    -

    Description

    -

    An XML node index.

    -

    Definition

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

    Members

    -

    - - - - - - - -
    NameDescription
    alloc_nodesAllocated nodes in index
    attrAttribute used for indexing or NULL
    cur_nodeCurrent node
    nodesNode array
    num_nodesNumber of nodes in index

    - -

    mxml_node_s

    -
    -

    Description

    -

    An XML node.

    -

    Definition

    -
    -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;
    -  mxml_type_t type;
    -  mxml_value_t value;
    -};
    -
    -

    Members

    -

    - - - - - - - - - -
    NameDescription
    childFirst child node
    last_childLast child node
    nextNext node under same parent
    parentParent node
    prevPrevious node under same parent
    typeNode type
    valueNode value

    - -

    mxml_text_s

    -
    -

    Description

    -

    An XML text value.

    -

    Definition

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

    Members

    -

    - - - - -
    NameDescription
    stringFragment string
    whitespaceLeading whitespace?

    - -

    mxml_value_s

    -
    -

    Description

    -

    An XML element value.

    -

    Definition

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

    Members

    -

    - - - - - -
    NameDescription
    attrsAttributes
    nameName of element
    num_attrsNumber of attributes

    - -

    Types

    - - -

    mxml_attr_t

    -
    -

    Description

    -

    An XML element attribute value.

    -

    Definition

    -
    -typedef struct mxml_attr_s mxml_attr_t;
    -
    - -

    mxml_element_t

    -
    -

    Description

    -

    An XML element value.

    -

    Definition

    -
    -typedef struct mxml_value_s mxml_element_t;
    -
    - -

    mxml_index_t

    -
    -

    Description

    -

    An XML node index.

    -

    Definition

    -
    -typedef struct mxml_index_s mxml_index_t;
    -
    - -

    mxml_node_t

    -
    -

    Description

    -

    An XML node.

    -

    Definition

    -
    -typedef struct mxml_node_s mxml_node_t;
    -
    - -

    mxml_text_t

    -
    -

    Description

    -

    An XML text value.

    -

    Definition

    -
    -typedef struct mxml_text_s mxml_text_t;
    -
    - -

    mxml_type_t

    -
    -

    Description

    -

    The XML node type.

    -

    Definition

    -
    -typedef enum mxml_type_e mxml_type_t;
    -
    - -

    mxml_value_t

    -
    -

    Description

    -

    An XML node value.

    -

    Definition

    -
    -typedef union mxml_value_u mxml_value_t;
    -
    - -

    Unions

    - - -

    mxml_value_u

    -
    -

    Description

    -

    An XML node value.

    -

    Definition

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

    Members

    -

    - - - - - - - -
    NameDescription
    elementElement
    integerInteger number
    opaqueOpaque string
    realReal number
    textText fragment

    - -

    Variables

    - - -

    num_callbacks

    -
    -

    Definition

    -
    -static int num_callbacks = 1;
    -
    - - diff --git a/doc/relnotes.html b/doc/relnotes.html deleted file mode 100644 index b28957d..0000000 --- a/doc/relnotes.html +++ /dev/null @@ -1,251 +0,0 @@ - - - -

    B - Release Notes

    - -

    Changes in Mini-XML 2.0

    - -
      - -
    • New programmers manual.
    • - -
    • 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 --git a/makesrcdist b/makesrcdist deleted file mode 100755 index 7634c61..0000000 --- a/makesrcdist +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# -# makedist - make a source distribution of mxml. -# - -echo "Getting distribution..." - -CVS_RSH=ssh; export CVS_RSH -MAINTAINER=mike - -cd /tmp -cvs -q -d$MAINTAINER@cvs.easysw.com:/development/cvs get mxml - -if test $# = 0; then - echo -n "Version number for distribution? " - read version -else - version=$1 -fi - -rm -rf mxml-$version -mv mxml mxml-$version -cd mxml-$version - -if test x$version != snapshot; then - echo "Tagging release..." - - tag=`echo v$version | tr '.' '_'` - - cvs tag -F $tag -fi - -echo "Removing CVS directories..." - -find . -name .cvsignore -exec rm -f '{}' \; -find . -name CVS -exec rm -rf '{}' \; - -rm makesrcdist -rm index.html - -cd .. - -echo "Making UNIX distribution..." - -gtar czf mxml-$version.tar.gz mxml-$version - -echo "Removing distribution directory..." - -#rm -rf mxml-$version - -echo "Done!" diff --git a/mxml-attr.c b/mxml-attr.c deleted file mode 100644 index 519f92d..0000000 --- a/mxml-attr.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * "$Id: mxml-attr.c,v 1.8 2004/05/02 16:04:40 mike Exp $" - * - * Attribute support code for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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: - * - * mxmlElementGetAttr() - Get an attribute. - * mxmlElementSetAttr() - Set an attribute. - */ - -/* - * Include necessary headers... - */ - -#include "config.h" -#include "mxml.h" - - -/* - * '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 ++) - if (!strcmp(attr->name, name)) - return (attr->value); - - /* - * Didn't find attribute, so return NULL... - */ - - 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 */ -{ - int i; /* Looping var */ - mxml_attr_t *attr; /* New attribute */ - - -#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; - - /* - * 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)) - { - /* - * Replace the attribute value and return... - */ - - free(attr->value); - - if (value) - attr->value = strdup(value); - else - attr->value = NULL; - - return; - } - - /* - * Attribute not found, so add a new one... - */ - - 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; - } - - node->value.element.attrs = attr; - attr += node->value.element.num_attrs; - - attr->name = strdup(name); - if (value) - attr->value = strdup(value); - else - attr->value = NULL; - - if (!attr->name || (!attr->value && value)) - { - if (attr->name) - free(attr->name); - - if (attr->value) - free(attr->value); - - mxml_error("Unable to allocate memory for attribute '%s' in element %s!", - name, node->value.element.name); - - return; - } - - node->value.element.num_attrs ++; -} - - -/* - * End of "$Id: mxml-attr.c,v 1.8 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml-entity.c b/mxml-entity.c deleted file mode 100644 index bfd9657..0000000 --- a/mxml-entity.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - * "$Id: mxml-entity.c,v 1.4 2004/05/16 05:25:38 mike Exp $" - * - * Character entity support code for Mini-XML, a small XML-like - * file parsing library. - * - * Copyright 2003-2004 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. - * default_callback() - Lookup standard (X)HTML entities. - */ - -/* - * Include necessary headers... - */ - -#include "config.h" -#include "mxml.h" - - -/* - * Local functions... - */ - -static int default_callback(const char *name); - - -/* - * Callback array... - */ - -static int num_callbacks = 1; -static int (*callbacks[100])(const char *name) = - { - default_callback - }; - - -/* - * 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode. - */ - -void -mxmlEntityAddCallback(int (*cb)(const char *name)) - /* I - Callback function to add */ -{ - if (num_callbacks < (int)(sizeof(callbacks) / sizeof(callbacks[0]))) - { - callbacks[num_callbacks] = cb; - num_callbacks ++; - } -} - - -/* - * '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 */ - - - for (i = 0; i < num_callbacks; i ++) - if ((ch = (callbacks[i])(name)) >= 0) - return (ch); - - return (-1); -} - - -/* - * 'mxmlEntityRemoveCallback()' - Remove a callback. - */ - -void -mxmlEntityRemoveCallback(int (*cb)(const char *name)) - /* I - Callback function to remove */ -{ - int i; /* Looping var */ - - - for (i = 0; i < num_callbacks; i ++) - if (cb == callbacks[i]) - { - /* - * Remove the callback... - */ - - num_callbacks --; - - if (i < num_callbacks) - memmove(callbacks + i, callbacks + i + 1, - (num_callbacks - i) * sizeof(callbacks[0])); - - return; - } -} - - -/* - * 'default_callback()' - Lookup standard (X)HTML entities. - */ - -static int /* O - Unicode value or -1 */ -default_callback(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 }, - { "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 } - }; - - - first = 0; - last = (int)(sizeof(entities) / sizeof(entities[0]) - 1); - - while (last > first) - { - 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; - } - - current = (first + last) / 2; - - if (!strcmp(name, entities[current].name)) - return (entities[current].val); - else - return (-1); -} - - -/* - * End of "$Id: mxml-entity.c,v 1.4 2004/05/16 05:25:38 mike Exp $". - */ diff --git a/mxml-file.c b/mxml-file.c deleted file mode 100644 index 338edcf..0000000 --- a/mxml-file.c +++ /dev/null @@ -1,1936 +0,0 @@ -/* - * "$Id: mxml-file.c,v 1.31 2004/05/16 21:54:47 mike Exp $" - * - * File loading code for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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: - * - * 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. - * mxmlSaveFile() - Save an XML tree to a file. - * mxmlSaveString() - Save an XML node tree to a string. - * mxmlSetErrorCallback() - Set the error message callback. - * mxml_add_char() - Add a character to a buffer, expanding as needed. - * mxml_get_entity() - Get the character corresponding to an entity... - * mxml_file_getc() - Get a character from a file. - * mxml_file_putc() - Write a character to a file. - * 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_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... - */ - -#include "config.h" -#include "mxml.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 */ - - -/* - * Global error handler... - */ - -extern void (*mxml_error_cb)(const char *); - - -/* - * Local functions... - */ - -static int mxml_add_char(int ch, char **ptr, char **buffer, - int *bufsize); -static int mxml_get_entity(mxml_node_t *parent, void *p, - int *encoding, - int (*getc_cb)(void *, int *)); -static int mxml_file_getc(void *p, int *encoding); -static int mxml_file_putc(int ch, void *p); -static mxml_node_t *mxml_load_data(mxml_node_t *top, void *p, - mxml_type_t (*cb)(mxml_node_t *), - int (*getc_cb)(void *, int *)); -static int mxml_parse_element(mxml_node_t *node, void *p, - int *encoding, - int (*getc_cb)(void *, int *)); -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, - int (*putc_cb)(int, void *)); -static int mxml_write_node(mxml_node_t *node, void *p, - const char *(*cb)(mxml_node_t *, int), - int col, - int (*putc_cb)(int, void *)); -static int mxml_write_string(const char *s, void *p, - int (*putc_cb)(int, void *)); -static int mxml_write_ws(mxml_node_t *node, void *p, - const char *(*cb)(mxml_node_t *, int), int ws, - int col, int (*putc_cb)(int, void *)); - - -/* - * '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_type_t (*cb)(mxml_node_t *node)) - /* I - Callback function or MXML_NO_CALLBACK */ -{ - return (mxml_load_data(top, fp, cb, mxml_file_getc)); -} - - -/* - * '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_type_t (*cb)(mxml_node_t *node)) - /* I - Callback function or MXML_NO_CALLBACK */ -{ - return (mxml_load_data(top, &s, cb, mxml_string_getc)); -} - - -/* - * '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. - */ - -char * /* O - Allocated string or NULL */ -mxmlSaveAllocString(mxml_node_t *node, /* I - Node to write */ - const char *(*cb)(mxml_node_t *node, int ws)) - /* 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); -} - - -/* - * 'mxmlSaveFile()' - Save an XML tree to a file. - * - * The callback argument specifies a function that returns a whitespace - * character or nul (0) before and after each element. If MXML_NO_CALLBACK - * is specified, whitespace will only be added before MXML_TEXT nodes - * with leading whitespace and before attribute names inside opening - * element tags. - */ - -int /* O - 0 on success, -1 on error. */ -mxmlSaveFile(mxml_node_t *node, /* I - Node to write */ - FILE *fp, /* I - File to write to */ - const char *(*cb)(mxml_node_t *node, int ws)) - /* I - Whitespace callback or MXML_NO_CALLBACK */ -{ - int col; /* Final column */ - - - /* - * Write the node... - */ - - if ((col = mxml_write_node(node, fp, cb, 0, mxml_file_putc)) < 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. - */ - -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 */ - const char *(*cb)(mxml_node_t *node, int ws)) - /* I - Whitespace callback or MXML_NO_CALLBACK */ -{ - int col; /* Final column */ - char *ptr[2]; /* Pointers for putc_cb */ - - - /* - * Write the node... - */ - - ptr[0] = buffer; - ptr[1] = buffer + bufsize; - - if ((col = mxml_write_node(node, ptr, cb, 0, mxml_string_putc)) < 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); -} - - -/* - * 'mxmlSetErrorCallback()' - Set the error message callback. - */ - -void -mxmlSetErrorCallback(void (*cb)(const char *)) - /* I - Error callback function */ -{ - mxml_error_cb = cb; -} - - -/* - * '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 < 128) - { - /* - * Single byte ASCII... - */ - - *(*bufptr)++ = ch; - } - else if (ch < 2048) - { - /* - * Two-byte UTF-8... - */ - - *(*bufptr)++ = 0xc0 | (ch >> 6); - *(*bufptr)++ = 0x80 | (ch & 0x3f); - } - else if (ch < 65536) - { - /* - * 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_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[1] == '#') - { - if (entity[2] == 'x') - ch = strtol(entity + 3, NULL, 16); - else - ch = strtol(entity + 2, 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"); - - return (ch); -} - - -/* - * '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)) - 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); - } - 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); - } - 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); - } - else - return (EOF); - break; - - case ENCODE_UTF16BE : - /* - * Read UTF-16 big-endian char... - */ - - ch = (ch << 8) | getc(fp); - - if (ch >= 0xd800 && ch <= 0xdbff) - { - /* - * Multi-word UTF-16 char... - */ - - int lch = (getc(fp) << 8) | getc(fp); - - if (ch < 0xdc00 || ch >= 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 (ch >= 0xd800 && ch <= 0xdbff) - { - /* - * Multi-word UTF-16 char... - */ - - int lch = getc(fp) | (getc(fp) << 8); - - if (ch < 0xdc00 || ch >= 0xdfff) - return (EOF); - - ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; - } - break; - } - - 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 */ -{ - if (ch < 128) - return (putc(ch, (FILE *)p)); - else if (ch < 2048) - { - /* - * Two-byte UTF-8 character... - */ - - if (putc(0xc0 | (ch >> 6), (FILE *)p) < 0) - return (-1); - else - return (putc(0x80 | (ch & 0x3f), (FILE *)p)); - } - else if (ch < 65536) - { - /* - * Three-byte UTF-8 character... - */ - - if (putc(0xe0 | (ch >> 12), (FILE *)p) < 0) - return (-1); - else if (putc(0x80 | ((ch >> 6) & 0x3f), (FILE *)p) < 0) - return (-1); - else - return (putc(0x80 | (ch & 0x3f), (FILE *)p)); - } - else - { - /* - * Four-byte UTF-8 character... - */ - - if (putc(0xf0 | (ch >> 18), (FILE *)p) < 0) - return (-1); - else if (putc(0x80 | ((ch >> 12) & 0x3f), (FILE *)p) < 0) - return (-1); - else if (putc(0x80 | ((ch >> 6) & 0x3f), (FILE *)p) < 0) - return (-1); - else - return (putc(0x80 | (ch & 0x3f), (FILE *)p)); - } -} - - -/* - * '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_type_t (*cb)(mxml_node_t *), - /* I - Callback function or MXML_NO_CALLBACK */ - int (*getc_cb)(void *, int *)) - /* I - Read function */ -{ - mxml_node_t *node, /* Current node */ - *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 */ - - - /* - * 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; - whitespace = 0; - encoding = ENCODE_UTF8; - - if (cb && parent) - type = (*cb)(parent); - else - type = MXML_TEXT; - - while ((ch = (*getc_cb)(p, &encoding)) != EOF) - { - if ((ch == '<' || (isspace(ch) && type != MXML_OPAQUE)) && 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; - - default : /* Should never happen... */ - 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 = isspace(ch) && type == MXML_TEXT; - - if (!node) - { - /* - * Just print error for now... - */ - - mxml_error("Unable to add value node of type %d to parent <%s>!", - type, parent ? parent->value.element.name : "null"); - break; - } - } - else if (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) - { - mxmlNewText(parent, whitespace, ""); - whitespace = 0; - } - - if (ch == '<') - { - /* - * Start of open/close tag... - */ - - bufptr = buffer; - - while ((ch = (*getc_cb)(p, &encoding)) != EOF) - if (isspace(ch) || ch == '>' || (ch == '/' && bufptr > buffer)) - 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; - } - else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) - goto error; - else if ((bufptr - buffer) == 3 && !strncmp(buffer, "!--", 3)) - break; - - *bufptr = '\0'; - - if (!strcmp(buffer, "!--")) - { - /* - * Gather rest of comment... - */ - - while ((ch = (*getc_cb)(p, &encoding)) != EOF) - { - if (ch == '>' && bufptr > (buffer + 4) && - !strncmp(bufptr - 2, "--", 2)) - 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; - } - } - - /* - * Error out if we didn't get the whole comment... - */ - - if (ch != '>') - break; - - /* - * Otherwise add this as an element under the current parent... - */ - - *bufptr = '\0'; - - if (!mxmlNewElement(parent, buffer)) - { - /* - * Just print error for now... - */ - - mxml_error("Unable to add comment node to parent <%s>!", - parent ? parent->value.element.name : "null"); - break; - } - } - 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 != '>') - break; - - /* - * Otherwise add this as an element under the current parent... - */ - - *bufptr = '\0'; - - node = mxmlNewElement(parent, buffer); - if (!node) - { - /* - * Just print error for now... - */ - - mxml_error("Unable to add declaration node to parent <%s>!", - parent ? parent->value.element.name : "null"); - break; - } - - /* - * Descend into this node, setting the value type as needed... - */ - - parent = node; - - if (cb && parent) - 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->value.element.name); - break; - } - - /* - * Keep reading until we see >... - */ - - while (ch != '>' && ch != EOF) - ch = (*getc_cb)(p, &encoding); - - /* - * Ascend into the parent and set the value type as needed... - */ - - parent = parent->parent; - - if (cb && parent) - type = (*cb)(parent); - } - else - { - /* - * Handle open tag... - */ - - node = mxmlNewElement(parent, buffer); - - if (!node) - { - /* - * Just print error for now... - */ - - mxml_error("Unable to add element node to parent <%s>!", - parent ? parent->value.element.name : "null"); - break; - } - - if (isspace(ch)) - ch = mxml_parse_element(node, p, &encoding, getc_cb); - else if (ch == '/') - { - if ((ch = (*getc_cb)(p, &encoding)) != '>') - { - mxml_error("Expected > but got '%c' instead for element <%s/>!", - ch, buffer); - break; - } - - ch = '/'; - } - - if (ch == EOF) - break; - - if (ch != '/') - { - /* - * Descend into this node, setting the value type as needed... - */ - - parent = node; - - if (cb && parent) - type = (*cb)(parent); - } - } - - 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 || !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) - { - while (parent->parent != top && parent->parent) - parent = parent->parent; - } - - return (parent); - - /* - * Common error return... - */ - -error: - - 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 */ - int (*getc_cb)(void *, int *)) - /* 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 (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); - ch = EOF; - } - - break; - } - 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 (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 (ch == '=') - { - /* - * Read the attribute value... - */ - - if ((ch = (*getc_cb)(p, encoding)) == EOF) - { - mxml_error("Missing value for attribute '%s' in element %s!", - name, node->value.element.name); - return (EOF); - } - - 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 (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 - { - /* - * Set the attribute with a NULL value... - */ - - mxmlElementSetAttr(node, name, NULL); - } - - /* - * 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)) - 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)++; - - 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; - - 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; - - return (ch); - } - else - return (EOF); - - case ENCODE_UTF16BE : - /* - * Read UTF-16 big-endian char... - */ - - ch = (ch << 8) | (*s[0] & 255); - (*s) ++; - - 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 (ch < 0xdc00 || ch >= 0xdfff) - return (EOF); - - ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; - } - - return (ch); - - case ENCODE_UTF16LE : - /* - * Read UTF-16 little-endian char... - */ - - ch = ch | ((*s[0] & 255) << 8); - - if (!ch) - { - (*s) --; - return (EOF); - } - - (*s) ++; - - 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 (ch < 0xdc00 || ch >= 0xdfff) - return (EOF); - - ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; - } - - 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 (ch < 128) - { - /* - * Plain ASCII doesn't need special encoding... - */ - - if (pp[0] < pp[1]) - pp[0][0] = ch; - - pp[0] ++; - } - else if (ch < 2048) - { - /* - * Two-byte UTF-8 character... - */ - - if ((pp[0] + 1) < pp[1]) - { - pp[0][0] = 0xc0 | (ch >> 6); - pp[0][1] = 0x80 | (ch & 0x3f); - } - - pp[0] += 2; - } - else if (ch < 65536) - { - /* - * Three-byte UTF-8 character... - */ - - if ((pp[0] + 2) < pp[1]) - { - pp[0][0] = 0xe0 | (ch >> 12); - pp[0][1] = 0x80 | ((ch >> 6) & 0x3f); - pp[0][2] = 0x80 | (ch & 0x3f); - } - - pp[0] += 3; - } - else - { - /* - * Four-byte UTF-8 character... - */ - - if ((pp[0] + 2) < pp[1]) - { - pp[0][0] = 0xf0 | (ch >> 18); - pp[0][1] = 0x80 | ((ch >> 12) & 0x3f); - pp[0][2] = 0x80 | ((ch >> 6) & 0x3f); - pp[0][3] = 0x80 | (ch & 0x3f); - } - - pp[0] += 4; - } - - 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 */ - const char *(*cb)(mxml_node_t *, int), - /* I - Whitespace callback */ - int col, /* I - Current column */ - int (*putc_cb)(int, void *)) -{ - 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 (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 ((col + width) > MXML_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) - { - /* - * The ? and ! elements are special-cases and have no end tags... - */ - - if (node->value.element.name[0] == '?') - { - if ((*putc_cb)('?', p) < 0) - return (-1); - if ((*putc_cb)('>', p) < 0) - return (-1); - if ((*putc_cb)('\n', p) < 0) - return (-1); - - col = 0; - } - else 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)) < 0) - return (-1); - - 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] == '!') - { - 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); - - col += 2; - - col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); - } - break; - - case MXML_INTEGER : - if (node->prev) - { - if (col > MXML_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 (col > MXML_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 (col > MXML_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; - } - - /* - * 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 */ - int (*putc_cb)(int, void *)) - /* 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 */ - const char *(*cb)(mxml_node_t *, int), - /* I - Callback function */ - int ws, /* I - Where value */ - int col, /* I - Current column */ - int (*putc_cb)(int, void *)) - /* 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,v 1.31 2004/05/16 21:54:47 mike Exp $". - */ diff --git a/mxml-index.c b/mxml-index.c deleted file mode 100644 index 494d73c..0000000 --- a/mxml-index.c +++ /dev/null @@ -1,644 +0,0 @@ -/* - * "$Id: mxml-index.c,v 1.4 2004/05/16 18:25:20 mike Exp $" - * - * Index support code for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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 */ - - - /* - * 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 and right partitions as needed... - */ - - if (left < (tempr - 1)) - index_sort(ind, left, tempr - 1); - - if (right > (tempr + 1)) - index_sort(ind, tempr + 1, right); -} - - -/* - * End of "$Id: mxml-index.c,v 1.4 2004/05/16 18:25:20 mike Exp $". - */ diff --git a/mxml-node.c b/mxml-node.c deleted file mode 100644 index 68f0598..0000000 --- a/mxml-node.c +++ /dev/null @@ -1,636 +0,0 @@ -/* - * "$Id: mxml-node.c,v 1.13 2004/05/02 16:04:40 mike Exp $" - * - * Node support code for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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. - * 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. - * mxmlRemove() - Remove a node from its parent. - * 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; - } - - /* - * Free this node... - */ - - free(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 */ - - /* - * Range check input... - */ - - if (!parent) - return (NULL); - - /* - * 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 (!parent || !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 */ - - /* - * Range check input... - */ - - if (!parent) - return (NULL); - - /* - * 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 (!parent || !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 (!parent || !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_strdupf(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 */ -} - - -/* - * '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; - - /* - * 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,v 1.13 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml-private.c b/mxml-private.c deleted file mode 100644 index c9d01ef..0000000 --- a/mxml-private.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * "$Id: mxml-private.c,v 1.4 2004/05/02 16:04:40 mike Exp $" - * - * Private functions for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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. - */ - -/* - * Include necessary headers... - */ - -#include "config.h" -#include "mxml.h" - - -/* - * Error callback function... - */ - -void (*mxml_error_cb)(const char *) = NULL; - - -/* - * '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; /* Message string */ - - - /* - * Range check input... - */ - - if (!format) - return; - - /* - * Format the error message string... - */ - - va_start(ap, format); - - s = mxml_strdupf(format, ap); - - va_end(ap); - - /* - * And then display the error message... - */ - - if (mxml_error_cb) - (*mxml_error_cb)(s); - else - { - fputs("mxml: ", stderr); - fputs(s, stderr); - putc('\n', stderr); - } - - /* - * Free the string... - */ - - free(s); -} - - -/* - * '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); -} - - -/* - * End of "$Id: mxml-private.c,v 1.4 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml-search.c b/mxml-search.c deleted file mode 100644 index 0973e03..0000000 --- a/mxml-search.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * "$Id: mxml-search.c,v 1.10 2004/05/02 16:04:40 mike Exp $" - * - * Search/navigation functions for Mini-XML, a small XML-like file - * parsing library. - * - * Copyright 2003-2004 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->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) - 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,v 1.10 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml-set.c b/mxml-set.c deleted file mode 100644 index f267d1f..0000000 --- a/mxml-set.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * "$Id: mxml-set.c,v 1.3 2004/05/02 16:04:40 mike Exp $" - * - * Node set functions for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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: - * - * 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" - - -/* - * '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,v 1.3 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml-string.c b/mxml-string.c deleted file mode 100644 index 25ccd7b..0000000 --- a/mxml-string.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - * "$Id: mxml-string.c,v 1.4 2004/05/02 16:04:40 mike Exp $" - * - * String functions for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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_strdup() - Duplicate a string. - * mxml_strdupf() - Format and duplicate a string. - * mxml_vsnprintf() - Format a string into a fixed size buffer. - */ - -/* - * Include necessary headers... - */ - -#include "config.h" - - -/* - * '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 */ - 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); -} - - -#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 */ - const char *bufformat; /* Start of format */ - int width, /* Width of field */ - prec; /* Number of characters of precision */ - char tformat[100], /* Temporary format string for sprintf() */ - 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 == '%') - { - bufformat = format; - format ++; - - if (*format == '%') - { - *bufptr++ = *format++; - continue; - } - else if (strchr(" -+#\'", *format)) - sign = *format++; - else - sign = 0; - - width = 0; - while (isdigit(*format)) - width = width * 10 + *format++ - '0'; - - if (*format == '.') - { - format ++; - prec = 0; - - while (isdigit(*format)) - prec = prec * 10 + *format++ - '0'; - } - else - prec = -1; - - if (*format == 'l' && format[1] == 'l') - { - size = 'L'; - format += 2; - } - else if (*format == 'h' || *format == 'l' || *format == 'L') - size = *format++; - - if (!*format) - break; - - type = *format++; - - switch (type) - { - case 'E' : /* Floating point formats */ - case 'G' : - case 'e' : - case 'f' : - case 'g' : - if ((format - bufformat + 1) > sizeof(tformat) || - (width + 2) > sizeof(temp)) - break; - - strncpy(tformat, bufformat, format - bufformat); - tformat[format - bufformat] = '\0'; - - sprintf(temp, tformat, va_arg(ap, double)); - - bytes += strlen(temp); - - if (bufptr) - { - if ((bufptr + strlen(temp)) > bufend) - { - strncpy(bufptr, temp, bufend - bufptr); - bufptr = bufend; - break; - } - 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 ((format - bufformat + 1) > sizeof(tformat) || - (width + 2) > sizeof(temp)) - break; - - strncpy(tformat, bufformat, format - bufformat); - tformat[format - bufformat] = '\0'; - - sprintf(temp, tformat, va_arg(ap, int)); - - bytes += strlen(temp); - - if (bufptr) - { - if ((bufptr + strlen(temp)) > bufend) - { - strncpy(bufptr, temp, bufend - bufptr); - bufptr = bufend; - break; - } - else - { - strcpy(bufptr, temp); - bufptr += strlen(temp); - } - } - break; - - case 'p' : /* Pointer value */ - if ((format - bufformat + 1) > sizeof(tformat) || - (width + 2) > sizeof(temp)) - break; - - strncpy(tformat, bufformat, format - bufformat); - tformat[format - bufformat] = '\0'; - - sprintf(temp, tformat, va_arg(ap, void *)); - - bytes += strlen(temp); - - if (bufptr) - { - if ((bufptr + strlen(temp)) > bufend) - { - strncpy(bufptr, temp, bufend - bufptr); - bufptr = bufend; - break; - } - 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 *), 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, slen); - memset(bufptr + slen, ' ', width - slen); - } - else - { - memset(bufptr, ' ', width - slen); - strncpy(bufptr + width - slen, s, slen); - } - - bufptr += width; - } - break; - - case 'n' : /* Output number of chars so far */ - if ((format - bufformat + 1) > sizeof(tformat) || - (width + 2) > sizeof(temp)) - break; - - strncpy(tformat, bufformat, format - bufformat); - tformat[format - bufformat] = '\0'; - - sprintf(temp, tformat, va_arg(ap, int)); - - bytes += strlen(temp); - - if (bufptr) - { - if ((bufptr + strlen(temp)) > bufend) - { - strncpy(bufptr, temp, bufend - bufptr); - bufptr = bufend; - break; - } - else - { - strcpy(bufptr, temp); - bufptr += strlen(temp); - } - } - break; - } - } - else - { - bytes ++; - - if (bufptr && bufptr < bufend) - *bufptr++ = *format++; - } - } - - /* - * Nul-terminate the string and return the number of characters needed. - */ - - *bufptr = '\0'; - - return (bytes); -} -#endif /* !HAVE_VSNPRINTF */ - - -/* - * End of "$Id: mxml-string.c,v 1.4 2004/05/02 16:04:40 mike Exp $". - */ diff --git a/mxml.h b/mxml.h deleted file mode 100644 index 0e7ab27..0000000 --- a/mxml.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * "$Id: mxml.h,v 1.20 2004/05/16 05:25:38 mike Exp $" - * - * Header file for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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_WRAP 72 /* Wrap XML output at this column position */ -# 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_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_type_e /**** The XML node type. ****/ -{ - MXML_ELEMENT, /* XML element with attributes */ - MXML_INTEGER, /* Integer value */ - MXML_OPAQUE, /* Opaque string */ - MXML_REAL, /* Real value */ - MXML_TEXT /* Text fragment */ -} mxml_type_t; - -typedef struct mxml_attr_s /**** An XML element attribute value. ****/ -{ - char *name; /* Attribute name */ - char *value; /* Attribute value */ -} mxml_attr_t; - -typedef struct mxml_value_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 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_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 */ -} 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; - - -/* - * 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 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 mxmlEntityAddCallback(int (*cb)(const char *name)); -extern const char *mxmlEntityGetName(int val); -extern int mxmlEntityGetValue(const char *name); -extern void mxmlEntityRemoveCallback(int (*cb)(const char *name)); -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 *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 *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 void mxmlRemove(mxml_node_t *node); -extern char *mxmlSaveAllocString(mxml_node_t *node, - const char *(*cb)(mxml_node_t *, int)); -extern int mxmlSaveFile(mxml_node_t *node, FILE *fp, - const char *(*cb)(mxml_node_t *, int)); -extern int mxmlSaveString(mxml_node_t *node, char *buffer, - int bufsize, - const char *(*cb)(mxml_node_t *, int)); -extern int mxmlSetElement(mxml_node_t *node, const char *name); -extern void mxmlSetErrorCallback(void (*cb)(const char *)); -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 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); - - -/* - * Private functions... - */ - -extern void mxml_error(const char *format, ...); -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,v 1.20 2004/05/16 05:25:38 mike Exp $". - */ diff --git a/mxml.list.in b/mxml.list.in deleted file mode 100644 index 5b3e473..0000000 --- a/mxml.list.in +++ /dev/null @@ -1,95 +0,0 @@ -# -# "$Id: mxml.list.in,v 1.13 2004/05/02 16:04:40 mike Exp $" -# -# EPM software list file for Mini-XML, a small XML-like file parsing library. -# -# Copyright 2003-2004 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=@prefix@ -$exec_prefix=@exec_prefix@ -$bindir=@bindir@ -$docdir=@docdir@ -$includedir=@includedir@ -$libdir=@libdir@ -$mandir=@mandir@ -$srcdir=@srcdir@ - -# Product information -%product mxml -%copyright 2003-2004 by Michael Sweet -%vendor Michael Sweet -%license ${srcdir}/COPYING -%readme ${srcdir}/README -%version @VERSION@ - -%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 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 --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/libmxml.a -%dir /usr/lib/pkgconfig -/usr/lib/pkgconfig/mxml.pc -%dir /usr/share/doc/mxml -/usr/share/doc/mxml/* -%dir /usr/share/man/cat1 -/usr/share/man/cat1/* -%dir /usr/share/man/cat3 -/usr/share/man/cat3/* -%dir /usr/share/man/man1 -/usr/share/man/man1/* -%dir /usr/share/man/man3 -/usr/share/man/man3/* - -# -# End of "$Id: mxml.spec,v 1.11 2004/05/02 16:04:40 mike Exp $". -# diff --git a/mxml.xml b/mxml.xml deleted file mode 100644 index a19c082..0000000 --- a/mxml.xml +++ /dev/null @@ -1,844 +0,0 @@ - - - - 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 - - - - - 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 - - - - Add a callback to convert entities to Unicode. - - int - 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. - - int - 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 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_type_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_type_t - Callback function or MXML_NO_CALLBACK - - - - - 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 - - - - 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 - - - - - 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. - - mxml_node_t * - Node to write - - - const char * - 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 -character or nul (0) before and after each element. If MXML_NO_CALLBACK -is specified, whitespace will only be added before MXML_TEXT nodes -with leading whitespace and before attribute names inside opening -element tags. - - mxml_node_t * - Node to write - - - FILE * - File to write to - - - const char * - 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. - - mxml_node_t * - Node to write - - - char * - String buffer - - - int - Size of string buffer - - - const char * - Whitespace callback or MXML_NO_CALLBACK - - - - - 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. - - void - 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 - - - - - 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. - - - struct mxml_value_s - An XML element value. - - - 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. - - - 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 - - - mxml_type_t - Node type - - - mxml_value_t - Node value - - - - struct mxml_node_s - An XML node. - - - An XML text value. - - char * - Fragment string - - - int - Leading whitespace? - - - - struct mxml_text_s - An XML text value. - - - The XML node type. - - XML element with attributes - - - Integer value - - - Opaque string - - - Real value - - - Text fragment - - - - enum mxml_type_e - The XML node type. - - - An XML element value. - - mxml_attr_t * - Attributes - - - char * - Name of element - - - int - Number of attributes - - - - union mxml_value_u - An XML node value. - - - An XML node value. - - mxml_element_t - Element - - - int - Integer number - - - char * - Opaque string - - - double - Real number - - - mxml_text_t - Text fragment - - - - static int - - diff --git a/mxmldoc.c b/mxmldoc.c deleted file mode 100644 index 2759509..0000000 --- a/mxmldoc.c +++ /dev/null @@ -1,2752 +0,0 @@ -/* - * "$Id: mxmldoc.c,v 1.36 2004/05/02 22:02:36 mike Exp $" - * - * Documentation generator using Mini-XML, a small XML-like file parsing - * library. - * - * Copyright 2003-2004 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. - * 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. - * write_documentation() - Write HTML documentation. - * write_element() - Write an elements text nodes. - * write_string() - Write a string, quoting XHTML special chars - * as needed... - * ws_cb() - Whitespace callback for saving. - */ - -/* - * Include necessary headers... - */ - -#include "config.h" -#include "mxml.h" - - -/* - * 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 */ - - -/* - * Local functions... - */ - -static mxml_node_t *add_variable(mxml_node_t *parent, const char *name, - mxml_node_t *type); -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 write_documentation(mxml_node_t *doc); -static void write_element(mxml_node_t *doc, mxml_node_t *element); -static void write_string(const char *s); -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 */ - FILE *fp; /* File to read */ - mxml_node_t *doc; /* XML documentation tree */ - mxml_node_t *mxmldoc; /* mxmldoc node */ - - - /* - * Check arguments... - */ - - if (argc < 2) - { - fputs("Usage: mxmldoc filename.xml [source files] >filename.html\n", stderr); - return (1); - } - - /* - * Read the XML documentation file, if it exists... - */ - - if ((fp = fopen(argv[1], "r")) != NULL) - { - /* - * Read the existing XML file... - */ - - doc = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); - - fclose(fp); - - if (!doc) - { - mxmldoc = NULL; - - fprintf(stderr, "mxmldoc: Unable to read the XML documentation file \"%s\"!\n", - argv[1]); - } - else if ((mxmldoc = mxmlFindElement(doc, doc, "mxmldoc", NULL, - NULL, MXML_DESCEND)) == NULL) - { - fprintf(stderr, "mxmldoc: XML documentation file \"%s\" is missing node!!\n", - argv[1]); - - mxmlDelete(doc); - doc = NULL; - } - } - else - { - doc = NULL; - mxmldoc = NULL; - } - - if (!doc) - { - /* - * Create an empty XML documentation file... - */ - - doc = mxmlNewElement(NULL, "?xml"); - mxmlElementSetAttr(doc, "version", "1.0"); - - mxmldoc = mxmlNewElement(doc, "mxmldoc"); - -#ifdef MXML_INCLUDE_SCHEMA - /* - * Currently we don't include the schema/namespace stuff with the - * XML output since some validators don't seem to like it... - */ - - mxmlElementSetAttr(mxmldoc, "xmlns", "http://www.easysw.com"); - mxmlElementSetAttr(mxmldoc, "xmlns:xsi", - "http://www.w3.org/2001/XMLSchema-instance"); - mxmlElementSetAttr(mxmldoc, "xsi:schemaLocation", - "http://www.easysw.com/~mike/mxml/mxmldoc.xsd"); -#endif /* MXML_INCLUDE_SCHEMA */ - } - - /* - * Loop through all of the source files... - */ - - for (i = 2; i < argc; i ++) - if ((fp = fopen(argv[i], "r")) == NULL) - { - fprintf(stderr, "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 (argc > 2) - { - /* - * Save the updated XML documentation file... - */ - - if ((fp = fopen(argv[1], "w")) != NULL) - { - /* - * Write over the existing XML file... - */ - - if (mxmlSaveFile(doc, fp, ws_cb)) - { - fprintf(stderr, "Unable to write the XML documentation file \"%s\": %s!\n", - argv[1], strerror(errno)); - fclose(fp); - mxmlDelete(doc); - return (1); - } - - fclose(fp); - } - else - { - fprintf(stderr, "Unable to create the XML documentation file \"%s\": %s!\n", - argv[1], strerror(errno)); - mxmlDelete(doc); - return (1); - } - } - - /* - * Write HTML documentation... - */ - - write_documentation(mxmldoc); - - /* - * 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 */ - - - /* - * 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); -} - - -/* - * '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 - fputs(" duplicating comment for typedef...\n", stderr); -#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 to %s...\n", - 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 - fputs(" duplicating comment for typedef...\n", stderr); -#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 - fputs(" adding comment to enumeration...\n", stderr); -#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; - - 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 (parens > 0) - parens --; - - if (type && parens) - { -#ifdef DEBUG - fputs("Identifier: <<<< ) >>>\n", stderr); -#endif /* DEBUG */ - mxmlNewText(type, 0, ")"); - } - - if (function && type && !parens) - { - variable = add_variable(function, "argument", type); - type = NULL; - } - break; - - case ';' : -#ifdef DEBUG - fputs("Identifier: <<<< ; >>>\n", stderr); - fprintf(stderr, " function=%p, type=%p\n", function, type); -#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) - { - 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) - { -#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, last comment %p...\n", - comment->child, comment->last_child); -#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, tree=\"%s\"\n", - variable, constant, tree->value.element.name); -#endif /* DEBUG */ - - if (variable) - { - description = mxmlNewElement(variable, "description"); -#ifdef DEBUG - fputs(" adding comment to variable...\n", stderr); -#endif /* DEBUG */ - update_comment(variable, - mxmlNewText(description, 0, buffer)); - variable = NULL; - } - else if (constant) - { - description = mxmlNewElement(constant, "description"); -#ifdef DEBUG - fputs(" adding comment to constant...\n", stderr); -#endif /* DEBUG */ - update_comment(constant, - mxmlNewText(description, 0, buffer)); - constant = NULL; - } - else if (typedefnode) - { - description = mxmlNewElement(typedefnode, "description"); -#ifdef DEBUG - fprintf(stderr, " adding comment to typedef %s...\n", - mxmlElementGetAttr(typedefnode, "name")); -#endif /* DEBUG */ - update_comment(typedefnode, - 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 - fputs(" adding comment to parent...\n", stderr); -#endif /* DEBUG */ - 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]))) - bufptr --; - *bufptr = '\0'; - - if (comment->child != comment->last_child) - { -#ifdef DEBUG - fprintf(stderr, " removing comment %p, last comment %p...\n", - comment->child, comment->last_child); -#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) - { - description = mxmlNewElement(variable, "description"); -#ifdef DEBUG - fputs(" adding comment to variable...\n", stderr); -#endif /* DEBUG */ - update_comment(variable, - mxmlNewText(description, 0, buffer)); - variable = NULL; - } - else if (constant) - { - description = mxmlNewElement(constant, "description"); -#ifdef DEBUG - fputs(" adding comment to constant...\n", stderr); -#endif /* DEBUG */ - update_comment(constant, - mxmlNewText(description, 0, buffer)); - constant = NULL; - } - else if (typedefnode) - { - description = mxmlNewElement(typedefnode, "description"); -#ifdef DEBUG - fprintf(stderr, " adding comment to typedef %s...\n", - mxmlElementGetAttr(typedefnode, "name")); -#endif /* DEBUG */ - update_comment(typedefnode, - 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 - fputs(" adding comment to parent...\n", stderr); -#endif /* DEBUG */ - 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, last comment %p...\n", - comment->child, comment->last_child); -#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) - { - description = mxmlNewElement(variable, "description"); -#ifdef DEBUG - fputs(" adding comment to variable...\n", stderr); -#endif /* DEBUG */ - update_comment(variable, - mxmlNewText(description, 0, buffer)); - variable = NULL; - } - else if (constant) - { - description = mxmlNewElement(constant, "description"); -#ifdef DEBUG - fputs(" adding comment to constant...\n", stderr); -#endif /* DEBUG */ - update_comment(constant, - mxmlNewText(description, 0, buffer)); - constant = NULL; - } - else if (typedefnode) - { - description = mxmlNewElement(typedefnode, "description"); -#ifdef DEBUG - fprintf(stderr, " adding comment to typedef %s...\n", - mxmlElementGetAttr(typedefnode, "name")); -#endif /* DEBUG */ - update_comment(typedefnode, - 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 - fputs(" adding comment to parent...\n", stderr); -#endif /* DEBUG */ - 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) || 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 - fputs(" adding comment to returnvalue...\n", stderr); -#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 - fputs(" adding comment to function...\n", stderr); -#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... - */ - - 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); - 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... - */ - - 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])) - { -#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 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)) - ptr ++; - - if (*ptr == '-') - ptr ++; - - while (isspace(*ptr)) - 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)) - ptr ++; - - if (*ptr == '-') - ptr ++; - - while (isspace(*ptr)) - ptr ++; - - safe_strcpy(comment->value.text.string, ptr); - } - - /* - * Eliminate leading and trailing *'s... - */ - - for (ptr = comment->value.text.string; *ptr == '*'; ptr ++); - for (; isspace(*ptr); 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); ptr --) - *ptr = '\0'; - -#ifdef DEBUG - fprintf(stderr, " updated comment = %s\n", comment->value.text.string); -#endif /* DEBUG */ -} - - -/* - * 'write_documentation()' - Write HTML documentation. - */ - -static void -write_documentation(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 */ - static const char * const scopes[] = /* Scope strings */ - { - "private", - "protected", - "public" - }; - - - /* - * Standard header... - */ - - puts(""); - puts(""); - puts(""); - puts("\tDocumentation"); - puts("\t"); - puts("\t"); - puts(""); - puts(""); - - - /* - * Table of contents... - */ - - puts("

    Contents

    "); - puts("
      "); - if (mxmlFindElement(doc, doc, "class", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Classes
    • "); - if (mxmlFindElement(doc, doc, "enumeration", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Enumerations
    • "); - if (mxmlFindElement(doc, doc, "function", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Functions
    • "); - if (mxmlFindElement(doc, doc, "struct", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Structures
    • "); - if (mxmlFindElement(doc, doc, "typedef", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Types
    • "); - if (mxmlFindElement(doc, doc, "union", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Unions
    • "); - if (mxmlFindElement(doc, doc, "variable", NULL, NULL, MXML_DESCEND_FIRST)) - puts("\t
    • Variables
    • "); - puts("
    "); - - /* - * List of classes... - */ - - if (mxmlFindElement(doc, doc, "class", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Classes

    "); - puts("
      "); - - for (scut = mxmlFindElement(doc, doc, "class", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "class", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (scut = mxmlFindElement(doc, doc, "class", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "class", NULL, NULL, - MXML_NO_DESCEND)) - { - cname = mxmlElementGetAttr(scut, "name"); - puts(""); - printf("

    %s

    \n", cname, cname); - puts("
    "); - - description = mxmlFindElement(scut, scut, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Definition

    "); - puts("
    ");
    -
    -      printf("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(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                             NULL, MXML_DESCEND_FIRST));
    -	  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(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                               NULL, MXML_DESCEND_FIRST));
    -	    putchar(' ');
    -	  }
    -	  else if (strcmp(cname, name) && strcmp(cname, name + 1))
    -	    fputs("void ", stdout);
    -
    -	  printf("%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);
    -
    -	    putchar(prefix);
    -	    if (prefix == ',')
    -	      putchar(' ');
    -
    -	    if (type->child)
    -	    {
    -	      write_element(doc, type);
    -	      putchar(' ');
    -	    }
    -	    fputs(mxmlElementGetAttr(arg, "name"), stdout);
    -            if ((defval = mxmlElementGetAttr(arg, "default")) != NULL)
    -	      printf(" %s", defval);
    -	  }
    -
    -	  if (prefix == '(')
    -	    puts("(void);");
    -	  else
    -	    puts(");");
    -	}
    -      }
    -
    -      puts("};\n
    "); - - puts("

    Members

    "); - - puts("

    "); - puts(""); - puts(""); - - for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, - MXML_NO_DESCEND)) - { - printf(""); - } - - 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(""); - } - - puts("
    NameDescription
    %s", mxmlElementGetAttr(arg, "name")); - - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - - puts("
    %s()", - cname, name, name); - - description = mxmlFindElement(function, function, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - write_element(NULL, description); - - arg = mxmlFindElement(function, function, "returnvalue", NULL, - NULL, MXML_DESCEND_FIRST); - - if (arg) - { - fputs("\nReturns: ", stdout); - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - } - - puts("

    "); - - } - } - - /* - * List of enumerations... - */ - - if (mxmlFindElement(doc, doc, "enumeration", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Enumerations

    "); - puts("
      "); - - for (scut = mxmlFindElement(doc, doc, "enumeration", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "enumeration", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (scut = mxmlFindElement(doc, doc, "enumeration", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "enumeration", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - puts(""); - printf("

    %s

    \n", name, name); - puts("
    "); - - description = mxmlFindElement(scut, scut, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Values

    "); - - puts("

    "); - puts(""); - puts(""); - - for (arg = mxmlFindElement(scut, scut, "constant", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, scut, "constant", NULL, NULL, - MXML_NO_DESCEND)) - { - printf(""); - } - - puts("
    NameDescription
    %s", mxmlElementGetAttr(arg, "name")); - - write_element(doc, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - - puts("

    "); - } - } - - /* - * List of functions... - */ - - if (mxmlFindElement(doc, doc, "function", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Functions

    "); - puts("
      "); - - for (function = mxmlFindElement(doc, doc, "function", NULL, NULL, - MXML_DESCEND_FIRST); - function; - function = mxmlFindElement(function, doc, "function", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(function, "name"); - printf("\t
    • %s()
    • \n", name, name); - } - - puts("
    "); - - for (function = mxmlFindElement(doc, doc, "function", NULL, NULL, - MXML_DESCEND_FIRST); - function; - function = mxmlFindElement(function, doc, "function", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(function, "name"); - puts(""); - printf("

    %s()

    \n", name, name); - puts("
    "); - - description = mxmlFindElement(function, function, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Syntax

    "); - puts("
    ");
    -
    -      arg = mxmlFindElement(function, function, "returnvalue", NULL,
    -                            NULL, MXML_DESCEND_FIRST);
    -
    -      if (arg)
    -	write_element(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                           NULL, MXML_DESCEND_FIRST));
    -      else
    -	fputs("void", stdout);
    -
    -      printf("\n%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(doc, type);
    -	  putchar(' ');
    -	}
    -	fputs(mxmlElementGetAttr(arg, "name"), stdout);
    -        if ((defval = mxmlElementGetAttr(arg, "default")) != NULL)
    -	  printf(" %s", defval);
    -      }
    -
    -      if (prefix == '(')
    -	puts("(void);\n
    "); - else - puts(");\n"); - - puts("

    Arguments

    "); - - if (prefix == '(') - puts("

    None.

    "); - else - { - puts("

    "); - puts(""); - puts(""); - - for (arg = mxmlFindElement(function, function, "argument", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, function, "argument", NULL, NULL, - MXML_NO_DESCEND)) - { - printf(""); - } - - puts("
    NameDescription
    %s", mxmlElementGetAttr(arg, "name")); - - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - - puts("

    "); - } - - puts("

    Returns

    "); - - arg = mxmlFindElement(function, function, "returnvalue", NULL, - NULL, MXML_DESCEND_FIRST); - - if (!arg) - puts("

    Nothing.

    "); - else - { - fputs("

    ", stdout); - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - puts("

    "); - } - } - } - - /* - * List of structures... - */ - - if (mxmlFindElement(doc, doc, "struct", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Structures

    "); - puts("
      "); - - for (scut = mxmlFindElement(doc, doc, "struct", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "struct", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (scut = mxmlFindElement(doc, doc, "struct", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "struct", NULL, NULL, - MXML_NO_DESCEND)) - { - cname = mxmlElementGetAttr(scut, "name"); - puts(""); - printf("

    %s

    \n", cname, cname); - puts("
    "); - - description = mxmlFindElement(scut, scut, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Definition

    "); - puts("
    ");
    -
    -      printf("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(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                           NULL, MXML_DESCEND_FIRST));
    -	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(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                             NULL, MXML_DESCEND_FIRST));
    -	  putchar(' ');
    -	}
    -	else if (strcmp(cname, name) && strcmp(cname, name + 1))
    -	  fputs("void ", stdout);
    -
    -	printf("%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);
    -
    -	  putchar(prefix);
    -	  if (prefix == ',')
    -	    putchar(' ');
    -
    -	  if (type->child)
    -	  {
    -	    write_element(doc, type);
    -	    putchar(' ');
    -	  }
    -	  fputs(mxmlElementGetAttr(arg, "name"), stdout);
    -          if ((defval = mxmlElementGetAttr(arg, "default")) != NULL)
    -	    printf(" %s", defval);
    -	}
    -
    -	if (prefix == '(')
    -	  puts("(void);");
    -	else
    -	  puts(");");
    -      }
    -
    -      puts("};\n
    "); - - puts("

    Members

    "); - - puts("

    "); - puts(""); - puts(""); - - for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, - MXML_NO_DESCEND)) - { - printf(""); - } - - 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(""); - } - - puts("
    NameDescription
    %s", mxmlElementGetAttr(arg, "name")); - - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - - puts("
    %s()", - cname, name, name); - - description = mxmlFindElement(function, function, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - write_element(NULL, description); - - arg = mxmlFindElement(function, function, "returnvalue", NULL, - NULL, MXML_DESCEND_FIRST); - - if (arg) - { - fputs("\nReturns: ", stdout); - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - } - - puts("

    "); - } - } - - /* - * List of types... - */ - - if (mxmlFindElement(doc, doc, "typedef", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Types

    "); - puts("
      "); - - for (scut = mxmlFindElement(doc, doc, "typedef", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "typedef", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (scut = mxmlFindElement(doc, doc, "typedef", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "typedef", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - puts(""); - printf("

    %s

    \n", name, name); - puts("
    "); - - description = mxmlFindElement(scut, scut, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Definition

    "); - puts("
    ");
    -
    -      printf("typedef ");
    -      write_element(doc, mxmlFindElement(scut, scut, "type", NULL,
    -                                         NULL, MXML_DESCEND_FIRST));
    -      printf(" %s;\n
    \n", name); - } - } - - /* - * List of unions... - */ - - if (mxmlFindElement(doc, doc, "union", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Unions

    "); - puts("
      "); - - for (scut = mxmlFindElement(doc, doc, "union", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "union", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (scut = mxmlFindElement(doc, doc, "union", NULL, NULL, - MXML_DESCEND_FIRST); - scut; - scut = mxmlFindElement(scut, doc, "union", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(scut, "name"); - puts(""); - printf("

    %s

    \n", name, name); - puts("
    "); - - description = mxmlFindElement(scut, scut, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Definition

    "); - puts("
    ");
    -
    -      printf("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(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                           NULL, MXML_DESCEND_FIRST));
    -	printf(" %s;\n", mxmlElementGetAttr(arg, "name"));
    -      }
    -
    -      puts("};\n
    "); - - puts("

    Members

    "); - - puts("

    "); - puts(""); - puts(""); - - for (arg = mxmlFindElement(scut, scut, "variable", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, scut, "variable", NULL, NULL, - MXML_NO_DESCEND)) - { - printf(""); - } - - puts("
    NameDescription
    %s", mxmlElementGetAttr(arg, "name")); - - write_element(NULL, mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST)); - - puts("

    "); - } - } - - /* - * Variables... - */ - - if (mxmlFindElement(doc, doc, "variable", NULL, NULL, MXML_DESCEND_FIRST)) - { - puts(""); - puts("

    Variables

    "); - puts("
      "); - - for (arg = mxmlFindElement(doc, doc, "variable", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, doc, "variable", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(arg, "name"); - printf("\t
    • %s
    • \n", name, name); - } - - puts("
    "); - - for (arg = mxmlFindElement(doc, doc, "variable", NULL, NULL, - MXML_DESCEND_FIRST); - arg; - arg = mxmlFindElement(arg, doc, "variable", NULL, NULL, - MXML_NO_DESCEND)) - { - name = mxmlElementGetAttr(arg, "name"); - puts(""); - printf("

    %s

    \n", name, name); - puts("
    "); - - description = mxmlFindElement(arg, arg, "description", NULL, - NULL, MXML_DESCEND_FIRST); - if (description) - { - puts("

    Description

    "); - fputs("

    ", stdout); - write_element(NULL, description); - puts("

    "); - } - - puts("

    Definition

    "); - puts("
    ");
    -
    -      write_element(doc, mxmlFindElement(arg, arg, "type", NULL,
    -                                         NULL, MXML_DESCEND_FIRST));
    -      printf(" %s", mxmlElementGetAttr(arg, "name"));
    -      if ((defval = mxmlElementGetAttr(arg, "default")) != NULL)
    -	printf(" %s", defval);
    -      puts(";\n
    "); - } - } - - /* - * Standard footer... - */ - - puts(""); - puts(""); -} - - -/* - * 'write_element()' - Write an element's text nodes. - */ - -static void -write_element(mxml_node_t *doc, /* I - Document tree */ - mxml_node_t *element) /* I - Element to write */ -{ - 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) - putchar(' '); - - if (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)) - { - printf(""); - write_string(node->value.text.string); - printf(""); - } - else - write_string(node->value.text.string); - } -} - - -/* - * 'write_string()' - Write a string, quoting XHTML special chars as needed... - */ - -static void -write_string(const char *s) /* I - String to write */ -{ - while (*s) - { - if (*s == '&') - fputs("&", stdout); - else if (*s == '<') - fputs("<", stdout); - else if (*s == '>') - fputs(">", stdout); - else if (*s == '\"') - fputs(""", stdout); - 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(" ", stdout); - } - else - printf("&#x%x;", ch); - } - else - putchar(*s); - - s ++; - } -} - - -/* - * '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")) - return (NULL); - else - return ("\n"); - } -} - - -/* - * End of "$Id: mxmldoc.c,v 1.36 2004/05/02 22:02:36 mike Exp $". - */ diff --git a/test.xml b/test.xml deleted file mode 100644 index a14baf0..0000000 --- a/test.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - -123 - -Now is the time for all good men to come to the aid of -their country. diff --git a/test/.cvsignore b/test/.cvsignore deleted file mode 100644 index 9c41553..0000000 --- a/test/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -test.html -test.log -test.valgrind -test.xml - diff --git a/test/class.cxx b/test/class.cxx deleted file mode 100644 index e686a87..0000000 --- a/test/class.cxx +++ /dev/null @@ -1,83 +0,0 @@ -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, int b) -{ - foo = f; - bar = b; -} - -// 'foo_c::~foo_c()' - Destroy a foo_c class. -foo_c::~foo_c() -{ -} diff --git a/test/dotest.sh b/test/dotest.sh deleted file mode 100755 index 2d94b15..0000000 --- a/test/dotest.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if test $# -gt 0; then - files=$* -else - files=*.cxx -fi - -rm -f test.xml -valgrind --logfile-fd=3 --leak-check=yes ../mxmldoc test.xml \ - $files >test.html 2>test.log 3>test.valgrind - diff --git a/test/enum.cxx b/test/enum.cxx deleted file mode 100644 index ce80148..0000000 --- a/test/enum.cxx +++ /dev/null @@ -1,7 +0,0 @@ -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_enum_t; diff --git a/test/function.cxx b/test/function.cxx deleted file mode 100644 index df5e8fb..0000000 --- a/test/function.cxx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 'foo_void_function()' - Do foo with bar. - */ - -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. - */ - -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); -} diff --git a/test/struct.cxx b/test/struct.cxx deleted file mode 100644 index f325d00..0000000 --- a/test/struct.cxx +++ /dev/null @@ -1,48 +0,0 @@ -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, int b) -{ - foo = f; - bar = b; -} - -// 'foo_s::~foo_s()' - Destroy a foo_s structure. -foo_s::~foo_s() -{ -} diff --git a/testmxml.c b/testmxml.c deleted file mode 100644 index 76c1b53..0000000 --- a/testmxml.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * "$Id: testmxml.c,v 1.17 2004/05/16 18:25:20 mike Exp $" - * - * Test program for Mini-XML, a small XML-like file parsing library. - * - * Copyright 2003-2004 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. - * 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" - - -/* - * Local functions... - */ - -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 */ - 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], "r")) == 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 ((node = mxmlFindElement(node, tree, "choice", NULL, NULL, - MXML_NO_DESCEND)) == NULL) - { - 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 and return... - */ - - mxmlDelete(tree); - - return (0); -} - - -/* - * '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? */ -{ - const char *name; /* Name of element */ - - /* - * 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

    !Uatnoy*DR4Cc&23pbm0#bCeac) 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�P*>#ODXXKyeX1AYBW-8ggHlETqW*9u?^YBvMtt789-@JyE!X^FqJ? za8!inhk@ez{CJR34*>^cuSJmAL4VL|QxRfu4u6n5!5_j5ia<7jcp_#;go9`b-w`lG zh(!=Q;a-pf1K$yjKK#MGK%#+{t&(J zLi}jiPbn@SA#G6}26D)#qdc^_5;>WaKnSf*26;4yfDdJmhr{Bhe+L5wskW|w;200E zFl65#s`O8oj0qVLJ|=_Q88r|*T}1GO!A4#(b?}8lM9L{*2?%5t(}iO%U@9RWNEv$( z1k%B>Kx(TiAUN~_-2)KH&WG?3I#0l}CM;T;q~qzmtGuv(&+E>eX- z@cGa14hBL*cNiQ77)a{q4hL(y&VfLdvrANn=nexSVGu*2jP7u-7NvqhC-WE=FpWTZ z4RBc?GYWy%PQyC@pPIiI#CnFFEJP5A0YVSVMj1rnV69Ju3!T(sTyPKxL!k^Jaj-R^ zf4Jku43JNV ziBJZSIM}LEL7|g;j0;4L(835UDA`;}R}WijDkxowK8{r})KI{kI#$KOUH}!8E@dA@ zj!?iINey+Zii5oi3MfP>nVv29`hO{Mw z_b4N8T)Gf4#BXV4jPS)7#2Sx*g2xbgr}Fx^0-?%3=+dR^lL0;mA<+f+xTi8%Fd|Xvx#Z94Mh$0nwC`5n{G2=D<5KwT$ge2>eZbNPutCKV9E?88;jNc4&1G^$SN zJif>65JK)SVO@$ogNW}jK$!uHQO5VU3_9WyflOLlU_}9v59>V!REko?_fWYk4OP07 zd?LQbfJzZ4rlpGSamj)*3jU&#dx9uLd=E0(V2ml_dt8+Bq>3dlSfte3U@Ip=M3qcM zur(4PA~Wzr^dLe+H{gkoZxIdjOL!tkA)m923luU~ z2wf^(C4`%-2ZIF)guW>2!33jH9a8oTC|0M2g42U!tWcc@NK(cMxp+D#v@Tzv>YtGo zTpGZ|(LxqlY*R-IxnwzE=VHNEgxU!hB6WvigrKa5$N_ap7#9pvaXdjmLCOvR zK7PvHzAgeo=~B2*xea7`z;EI}b`;_nosEQ$e7=$J2@~x|939=2eO!I`=7zSIk&t$j zKLZCI7VoH{5!~#~21Kx7`+)e17dsn}lf7SvAIy-qrwTzdA75|&St0_Cv?>USnSfHD z(tvA;gjFYl!Z{$mK_UG|L9gW@UiOZTegR9IgO&YYhl7KYGf>V6aT5Pz(eXK+EMl5K zEYV~^Ed39c1o#MNqxi-}^0f_v5Lb|D90iBJq$MI#To64+94G>gDEXJLTy4@$#5Sp> z4XyP-!U<_-A@7n#+R-*40Mw?11m%#vY!HJXgq{VC41ffN?mXnn?y&Ih0ESLfNNixX zp>%|Zn1J8%r_|!Y7yVPp{VDZs=zKewu-5~u2Qh4hZ1^Fg%VqS-9+Slsf3Ks0W8RI03C_c9po+)WeTN*j0~S9b@K5P7$}|mz*3Xg4G8~dLV^K(1_RxR62*ya zzJZeB0s}?;x4Rnj6>=ODW(E*QDjvS3n)ofj1PmP4EVpe=G^LCO}kvl3v~3^dK45-7nCoI!;)oim2!7Ir`q zV2}cV&(vUO6Cgw>1=XYx)=3Re0*4%6!6wemOf^=wv-pYiu1vBg`^Y&rok-&5rg``Kio!)4Q;}hzSIrO9|Ut?(Feu@^c+OOP)4^? z#;4C2($=~WiV0U$pkNEgFhr_4cOU3A1#PVx2o2H>NFSm6CwxXM_cyq-3o$`J5h(s9 zg_yKhWK9oD9QmGbl|>*`iJ!^39tKXev#hQ02E>=4iQcYC>(lR_|{{8cyhq2 zXsZOcJHWTZUIU~!JD)MyTr_Qo8xyLSku61FkQ;z@;ZuU?;A9J$AUJ5CZL#tPGAt-F zRwKc%!P`Q6-l@URX%^bDFoH5{P$@k6vq2gE4gG2B!XQ2cti^)hA!soWNhlKlkEC-j z^ko9Hm0<)jEJzapGB9OeEkS%JpmbQ52vUZ&Gz@}rsB6fo05YKS0WsKZLIp-}mDK?Z zA{(V-B5r2ld^F@EAd5%2cY;2TLt7ojBqHA!43kLb(1D>vrb`8YCJU4?p=OwrsbYFH zLxg{+rVQ|HU-Ttn1QcvpFfx>ur3+-}6aa|~0ft0|8Vp^!5FH9a z&1Nj%W+>1Gbw(V?g6u!&847Nut44w~1`QZOG+`-6=B2?+h%Y0!M2>G7$ zEC`bU?Z~tVxM%o#GI0WBe&jRRADKG=l9KPq{>bzRlsXXaF^iarU>c&oIQj&(4t>w_ zSU_38BbD?4+o0tGQKo~^LUevT{j|_(5(I@yEC3l83R>Gz7muSIUjhG$_3FZv+jD-#y7Az!WQV=Q~1cZXN zsto6!P{0qlz8bKoW>N39qAR~<5-CS2P9nho4RD4TZMmadAkx)FgFd5SSP~4etqYY( zKwuU?cD^W~E&G7nN0(r*JHh~e6b=fbt}dY~Fklk-So%q0;{9VdoKLC9X>)^2BHasM zY?x$%7*h*)h)fV;e9<$ZfZG%*ksqcS9}#KfLe(y)2Og(MGU_Jy_-9-_2e;zC$+ z5*O-44qYicv6H(Cx`2-h)CW04r^QjFc<7A=ZGjgtV<@YG3h$7LG`0;dQe!$as~4#d1DmV|Vr@KE2{B@{wZ&_Nd{jz+l; zoi2{X?7Er>_7%6uJ{urX$Ua@@kx5(4L~t@n6`_)AB>M;=h3wNso|v@7Oc)9j*g#nX zh5`^Ns83f4&!nwo!cf4kgDeA);AMj=NkM(OQg|le&eC!+Z2Ki-pO`U#NFn=lrSK3) z>War$5Z40DPecR}L<;KDmBK>;rb{U5xabyToDf6`>eH3NGx^J({)h+@bYT(y#~OwO z5GknNp&SCHs6F+`q^*_0P+-jnvQJ12DkPzxK3yq1I`Wlz<%^-f`Wmf@h^!Vs?40_v zrSNe4T9;5DSi`gXEP&WK^=U(>P_Kod*f7ZgPVCcyKTj5LV!seQttCmyrFz?idP$*V>?Nxd`sgR0wn7WfF*0^M>7iU$bpfSozJ@A}HYmuT|Aq9l z)n`FM8uK+-f5jB6zk;1$@HN%c6021XI^95q2orNqJmYUhLl>RG?1KzEk9{Z?lU>X# zopVe;L8Vk}P*kbhR@yxfa4Zs@FdIB|poGcuMwqyUr%h&v1s2uJ5|$LtEXlNgJGFFc zTT&SlQ;QYDUrsG;2^j%}oLUU!FQ=AQLIzVy+FkOv7D%KCXhYg6FwC^XZcu`0QPINR zFfHvdY5$qV=arDzK;;e=RD29g8ynFUe_=KvaK&u&*T~Yz&VOcKc%@%}Ea}kT)oweo zban<47Hu~nwGj%V{e?E7J)G=6GiJP!Ex?szW_)T;8?Lm)R{t4ciN!IM7W&T!OB{Lx zP;8iF(G-*;2uLh#(G(^uIu3{=EQ%@q1z~ARrZ8dA%A03qD5JdeW`6nUW3c zi5K9jt_zExFbO%PcorykQPGo}S6Bq#1=*VRoT&ed<9MY&0A6raK*S6FzY907cn81> zt_o<&Z7}vk?HFDaa4GXpT}*x(3*x{9kM&rz1v38?cowfd#srZ>K$-_WSR!=dm6O z7ZtRDr>&{@uWUDQV0RZB_P;OsS;Qu3Dn`PF1a^+YvWZlo5cU1{wwc8%x3FQ6^%xjC zQxOcmov~;OCjKMeo<&W|?FQEKB$cQy*t3DM0m1_PCL5UwJ?AdnQ{Dta(<0U{C`C<<=_10eqj44pud zU~nBe#)h&Ey$jZ)TL6$?aJ&+Op^jJ5Pa2&KMCApryOT)OK&l?N0iAL{p|}aJl1c#R z#2G`uQBjmlARtmfA+!+%6khR!4eXNwjzfHp7gsDYHNzs$)_}ri@_SNFaB8N_GSk*a z;NfDiASQ)IEIMrFg;BNV;#j=;2pc#e9}TA+Jn61=s$&Vq;Gb27(H@P%>bj%>sXLGs zB1uQ1VX?BIq6wW)VqCC-C92$L6f9lPpVf6q11gk)6&!{_tzYR*$APj+8a;+_A$$uG z3QcB=PFA`uX+VWiC}%~K%+X{JXl13%D<#j3!TbO+L!KLh=M+7YvVzl&ZA?mAtw8Q4 zgYsrxnLHP5UF=+Q(4F1|yR7h>+put&vmHL&%86Vo67W%R8I+Av!>6^Wyb=R|FSvA~ ztqS;e_!CNqLVkE<0RW$1ns)qY%@E-X!YN-!esK{y4gN$lgbF^%^8lY1vR zgpp52T|i5FCJ>7_O#~KJ0AG;*h}B4?uuxzTZHNKGXJ~^{Rqz?w z;9~>OXVeNOcof*gXAGH5`~pK}6TiTa*=Te)Hv;Wpba=0_0*Cl5hRh*;iy^~j^bM}J zgI2_7aVVa6g0bL$Jn;m5<68=dC+Hp5w!sr>hex1B^hf9o1^BEAUtr|n0YSoJP(x$D zyPKdD{2GU6;WNO%yPV)NK)`WR_zbg)cRRsnHTaBiSF=-x&pgN)@EJo^N29=J$0^u3 zc?Ebn`P%!td3*W6TRZ|g=KwDU-YYyAc5oYffP;U4ualo5x``TiNx=?Xn2a6?cTK@A zz>DYw&JZEKws#D)_i}J@ga()}ycd|W*!Unig(dcWZVspyJW~9~Yl27Y=H&;M*m^)4 zJYD27uMr+J9ERoV4NdTPi6^oFUW+QgEx1lzeol(S1sgDY@|o8N584wBLb0>=_xH7f zA>kbi3hnRw;T@h_;+>O+lc$rHza4swM^C)=@^*A0evU`q{tmUn7!dFLor3*|b{K*7 zcc>jk1HXf5wu5nFmk$pIO+A8(i?Hy!Kzok>0xl|@9|Aw} z0(GOv#w!59Z-_y|SM7vycJo4`L^Oc+?f7|k+dDeDd7ysU@k1|xiQyt{c-@Ysms3!C z7wxFRYhWQK7bm~~dwj%T;I+4pJ=}Q>Z`-K`Z+)HYfj@Bx8m}dyuOb`!Y5eb;;UyLs zL=0aiPwznJ5BpO@J3sqC=+492fj3@Uy4Lm`#tr)kZ7S8!{1?d$99 z>i{s8*gLob>~@;MZ`u&YE(Y&6JjC(UGrYGLaa`!ddxsInMPK~y0C8-!iI+k49`0Vm z6yYPn+FttjIt4;YOgdjDXL}zXlFhIg1QX@#@_ND|XRJ|hNciyza z^|9Cnw>1^0D(`R=BsS6QO$h;{8UPwy=S@3YlnST43pC{?LB|2`mCC@p3RI1ExJ?wh z2kiskCqaiRL9y@9-jsh{JKXEZ;;UPM0SJ^7|1nmCNL#OhO_93gV?w?%l#ac2xWN+p zEuHsDl=$)YiX?!dDN^42P5G%Mc%oZ}yBb-11s-}fg4YLjIL8`$OuPXIHtle0B8#tH zqhqffF80B`R_DETxW5oPV(m@&IqQ$H@>7fUCPD1PwfD-;S%373zHDoXEfy&-f1t%r zE!vx)uz%RzEB^pG+~dxzG>%830C4` zLS7*NEJT0@u*D`PtHZ@{*t6}t*ACaeVaK<r1hTZ12rr5Mo z5SA~I4`^ZQPN6i3qX*i16&NdWYuYCZyWYH}wEK#&Ti(``Zf`L5*xQ=Yo&Ae_d0taN zP1xbsMC{5QlM?D0z0{g zG%J6v0(PszHaP(W&*n>MBY%K@20Eg}x78omr9+^+L$9bG-dH&T;W{>2LGz83mmwx( zi#ElG7dE_JX+!0BvD4m^-*9%&glxWat)2~Sh6gW=+IppnZ^OBHd^13MMF3t%wf8DW z0zug#K=PW>hT-tCi`SI4wizxP5*RD(0Qh}E+LONV!mVupbRj#ursFlGy{HYZ_1c+i43Di$h~n13*@_4K2DW#_-a#y(#)3MJyN&G#BWV7A<~FNPA-!Ue~q_ z07u@a(BjvGw0CFWRd9Q+bZGHX9GC=jizvKiZtsD(F+J%a!4<<~JIv4UOt!! zF^0<_%NgJ{0|I|?LgD^nvOi1BR+WPjKm z!86$o2cO`X93M#!@;q3$a+z$0(;e_kwj=35YD~D3nQTYWgS=A@E@>v=lJp?;3%n=s zCFuc)EsQ@&4^m)7;Lr{7J%&rl5nT6-=Z{=Iz%y<~x@T|?H13bQ6$zg4_(-P^p2_}5 zdXRVMh>(5|{3ZLt3@$=u^hEgBn=ky<#@@i=5Y+RBW2O=Bn*y^#0M-kVTX4fA@nW`< zqnrJ7?_e7=JPu?w)HGm6gQ*j~!N3nhb*`_sgPD`Rjmlg-1C{v@TU@AO0KLFB25<}% z?$!Vu?nm@zfUdPfpQcV#v6{1Fsgnb=oJ#!X9Yr03)S zF@BXh?$>9H{PK79}lf9=%aMhH}MI!mC;(9G#H!hg4i>+p8bIQE&R@f4; z+_cJ^@<;>yA1lm;!C`Y(pFSF{vtGEG;}dLo&u@uFLH-`e#O%34PLA>({kZb>5F?}8y1S#Q)pK0zDt5DP0kY(< z+t5Y~g7wrtArGF;zakISytjM8)bkEWfU4ZA*c)8_@|7ESU$TU&eW6E8WMrCb@| zS;Spq{-M5D{lzS^rB4!#x@mO3ukTP~;G<D>)QV~6-GJbWwO zAa=0Ou~qeBC#q)FUNL1FPxq|eK47NZPHwjsJ;T=;tP^Gy3h7MA9-zhP?pV^`F|t?T z?Auz{$KW2zXj-hrl@ZMGGDgShgoF)*&ErgtU%t#8AwKN* z<%a1}{#%N(x^Es=#5p*>yUchQk*DpVNA=&MwRP};6|QWnCChY|K0et0Y3VZEF}j+uirwwS-(^b1%buAnJlWA?+M`KA zmkLsQJfA$&ig7A6^sV&pdnpmaV{eMuvzE5*&=}>?|6#?w)-h{~?+s1ZUO9WstUa=a zlYMHUhKSvs-D8L%BU9q}+{_*a;v~4rr*f_f>!>??bX84LmC3jzHYEJ&+NkZ4K@Drt zU5?-I-@4%AnxjjuKFceA^`iUQr%H3SuW{ei@6epYHD^rcn}~`_THT5b8!8!QQhHza zyVHo$uOmK*3t79bSIF))lvOAsTb+DIX{ysSA=b6Ez2u$adYc*u4Rl-FAQ>C!cysu9 ziPUS7MUr8=U%I)^*;}h1c74qk4P6VpzHzf~wIq@uUUiI=Qy8ivGh>XU0hD`_={9UNs+Z^z?u= z*PS*DiZYbjHrQdWcbzVyF8le22PrJo{nJXtKJ75}_RaHMlG;O?8TQi6^YGqXp2N$s zhd;~aoKW66ShtVD@gKW)NLrOu_l=LJv|XMck{_#6=U;Si>?SdpeMMqPLyZ@X8*4B{ zs!8&Si0Gtj#*W1c4sX0Sd}RE*+Omxe^7oeYI&yr*fIVA`d|tnP^m3Z$cmgyZyG zb>;5aCMpJ7U0h72eVkm#iM#r!_NJk*^RUdgp^~#5WEGgk))lsmWdW@$cl*IYQ!V-# zP213Yb4_vInMzSZq<32nKM`A@q&oAq?u-3b?}iPD6*@aO_1fW!x?i0wf_K#A7cu=O zUFc!3HEM`z)U4ENhN*k+`89qu-E>W6lc;pj%)~W@j$_7}j2U7)#zy(Ld`h$v=YWg~ zW4OMX=ZOmQy>m2-~oXL(i$jXl>CgJ*_MioW1gMU}8?f%TPxDgh6&W z{Sz~vhJ+mbEq-kNj2+p%PEVU?+kF04o{j95SD&g*jVn0hwmN9WoQAQvY}&hh?cDNv zhWfKt?b>wmdAD>ncTJ{|kq7r{xyE$Ya{-q#TCOhD*xaIB5S;0`xHjhe5u5ZeF2_vk zUAKGL#wG7>@p?9E^tpmd=T`(L)vh3hCf_0f0rirLY-#=cBv=NtX9`d91T&DI`!QOY&Pf2rcRw-qYu zrW_A?`gQgC`nAvcOE1WsGsAqv@g?sD=Fi@}yzZFVz$xa=c1I_ScoC2*C1IOTov2`v zF7)Bil(V}hzgIKDmy>w{x zDV?UO6QRpiDERGi7@^%#UsiX1yS;Lf4e6XY#bT5U?;;|a**4H zH{)uyPP?Bpr0}^--22dphiuQ>W1R9Uxfg1i8c=B6>?q}1GiPAJOJ%lfx^}HB`>0uz z<{6cmz{}N7f_s{MIUE1R_ukvUVfzlg4Q0H|{aNse(I_2yRwah{^IOhigHIK8`qCWN z1IN}qFMNM#eQimSqw?mWcwve3s`sz0uRrh~ZY8hzzC3#N=fp#Iyc(ByH|8BXpg4MZ z+U~d4Rpj(qxpt$f?kXO(FIeQi_k+UxodHQDO`9S^Ya)a!0(>8@I9#_sGsi@ta-U*) zyr=1_JNF8{mu@jx{eFG5=Z(h-PfjXEd`<`rzi1or>f!sTjoy}5$7HXpKhx*#q;Jda zM^$=-63%QM*$w`mNQzkbc)mU&X=q!wpuCW6Mv-wA5=a&@Fhp_D9)>H`~hQUfRE2 zXGXg5v6wW6`E$>I6mB-t&I#4N5NV-(X1!0zQ@yJAU%?ahlnGx>zWe*D$Q!eHP0x-R z+C`r;b^Ebxw4Ft>ns!D?ulfO!B~AqaYVXe9n^Q2XTiNa#`CgOWNi|>1OF1bt^~cM) z#?dang^W)}*LC7rqE*m8cP&wb&h-D%wZu1(w%_>2=AFucmQU1+A2#Igi2wK&Kew%C z`&DzrE`GOcdR;tU^uuiFq>2*%am&nXwta~mK2Yw?i4k!|l2y^aR}FhGbegHDU;X@< z%=l5G47Iv>2idFIm0DR`wu|rk_E&npvoh2cK?!nWLumT}#xAG~oGE8j$M zU*?0cmQ8;5(|VsYewMlAa`fWY%vcA}SA?8dTr=@U#%T2t9q-Dz2$;`9+I!3XA-4biH|e=c@S zN_afyR&?QknaoWm>?f#&kLmmE=X6CERlT*_Ey}i^la<*h-$&6cFGwNI`hbl5l#Qu_ z6=sT@={-;0o^es;gpN|mOy6~3;WiF>TOE4{8`f7W7cWeirn6YzSRporEx)0+xS^b3 z?5BPyGncLpi)~hjE8j13Wxtxju|J%#&H*HX}?-zdZJca6g4>Tc!4us+RQV^DH_}YoXPQTTzFS>MxACnHx4&UL#}= z!%7@R{ld*6Uucl<6bYsNQRUBCd~6Iu*AI>F)5GcJ?MLZxyLTcg>@7YsfRd{{Iwfsvr}{%7N|?uON4C%Z2A?!M9E>|{HOeS0QX*Scin z*31pMnmerMQpuu4S1MG4UM&e~2>Wy){NU%W6N7~1W$pLR>`@|dqI+Y0-^UfR7p^+C zaAHr!#Nnsyyd(FFQn~uP$Tn*5)Z}47cN(;hz3ZOQz;?qQsDswoG-lAUUO zUSl)ka)spihC?@%K3VF{S~__5@As?2eMU%3^*sE0<(gkhRIk@x&y{-mVB-F`t5#>L zU!6IbVs`w+jKq(DpN?dFbGiQ}r`Mxiy=(5Ts!6{PDKk>aX^vX4kdP&7nC^hR$3G}+ zm+3LzsH$cC$tIC?Uy9zHO#i<0frn;>-LS&?VO0(5KXS@zLcJ5tKmBUF>ecLRvG(B~ ze50e5WQ;m*zRSMQwoKk_(7fgKvH7hYM^!2tw!9i`*Lp-b@vE80oP8sQ9d=Lo=5lzJ z?#S>%&j&5o@2Gii#ls3E`8c)DJ`B;HCTbI}6^0wHH}5YmZMt03(mJuCI&NFllG4jN zYchxLwRg@qmSbX&(R#9Wp!ug=F^fayH{CmEvu$GFQu|M<-^?0+vMxC;sy4TJ>8jIi z`4xM{L^aBse6V)Ul+(Gom+D95zsTCwu*0f;TA^M;z|WvC1BETayTAC=<9lx8es!q?R7pG)h+RUbF}Zg>q8!DDNOP>>~bP_!RpcF zX2q-bw@#gDVc7U|sD)aFb4trWuiQCTE>_8(8f{@!JNJ&>N6*jm?bx>iIkWQ*J=&uf z5bR!;I?n1r#nb${igA|cZ?E$;A@;`8+(YKOKlc89-~8^%qZa!PILrx}mOM!#C()(n zT+L%wqF$&jlrFU2A8Zjm$6NSz%mRDcu+y{Z!e=-be%e?UcY~uow(!~Gv5&{c2cFj2 z6}UQMPwD;V3r)s6Js1<7aQAy&#y-=#oAhsQJh@20Wy`UrCvTXoR@|o5aM$YDnY|;A zSX?c89P-piK49?ilO>8LgG3&A-sc!qPD(yt7=3R5=XOcD>_^wQ0Mp1T>r2LduI<(O zt}sdW4*SrynEpF16rNxE^3$-*QdtY`fn8i#v7wy)}z`7m&JDPtj1cJai1=e^8Y6V#;cuRN>u{cYoD zs~eh+JF#yl3i!|M8;-vHABIlgnyn786Eq}@0JVKXb#i~&H?!H^`KqE9TP#~|rgB~! zFx=Bn_CPo_I^eF?;c3&7_E=0*_52+gs2DN((Ts`utKL8Su&H6CUJv!W9>;q+Egn9m zM4kDQxk9GbW{F8_yTzY+l|Zsw21h_Y!*jc+b@PJ=G>n88&3F`7QaVGtu>8 zQMY0hI48PqPP-b%XR5yAO^^(ide6iuoY7SA5er z@4TqlnKAw&wLiH(Ze3bGaBQ4I-@?QpR(<=;vuzc5`Gcj>5}J2lrrfT3kxCCPX>-RK zpA2|$B=?8u(13e^Cd{Mic?A68X=2wzw<+%!}&K3hs+ttO7Rz7 zrPfbaS2rS-Ev)O{Foh+jE9@s^91$y?*+VEI*0KNN;tR8C`q+(*Sd;RjIpx};M-?ec zgdbnKP<~B%WQ3~Bc$W5@D>F-{vE(-y4|Cq2d`&#Mm>HYt-p5jAShr(+<-Tx>F0W$X0KtDOv{Vs#zRFB$Ay$V>(jOCl+I*gOm8w|iE6c=>9=N+!=W6Z=a1hv%FoxYDLUG>Z{mZX$3c%*P2IbExaikyS3G(? zSKN@*V*gO;pl)c$w=AhMi;86vuKMQk$F%D|MpI83+q&*uUH;{m4+M_oa7v zm-pssC~hvdA1!7ZWu)`qaI9K$ukE%AvS&2eH2bhQeJbW^_VDhpO;$8(*@$^c_T3Nn zQ@5&D9M^Zw56!v0Gv@A}VP#yzZxMR%ABMHN%w^Zf0PpWkrOWtZ9^pBA5?{q$xUJ(^dpxHo6e0k_G02aR8P;nL1WLX~lgJ-0I> z=hmI8JbChPs&-z#D~&tNnu9DjiA?v_leVHC`wX{uC_b~F+1%}ChH^b7kFJ3IAmVq1 zJH^*siA(%w&rZ5xELCvZEL!{QS{2pb!^&=HphtMh^pn=q;$Jl zlA-i@fsU_Z%UYW<)v~A)RYptXHoX1N-}YU@QD&u|Tj1DL&02~R3|Ev{nfh#a6=r#Q zOG8=fyWw9BFO?W;wd-e9S+lL7;*@=>j-M5ObYT9?FPfjs4AV|#e0mr2W5@DWTZaT3 znc{i#%hw+J->f^*bYxsk$e6HMg;&jWAKmqS+~?I6bH9;8^v{^=()#|X{}^R!70oZX z!dKWSTYD&!$~?MOvdnB@lf~kuUdJ6}1GZj!RM`EVvPMm6ucR`=y~4LPxC|cA;(J%? zmuB=8g;$2(Zwaf2YOH#CRoZ^W&6MFDvkEe8JSTGHKFWx_cozKf=aUx?HV>Vg*E68t zec}VthqH^6uk7}do-_AO{51DEu{)`CRYe;fy$YQcd z=Sbd^-23+Jk4cLI8kMUwg7v4LsD4;;bZ73jrjsGH(we`Y?|E^RT{=EGdqMCgw};;= zzY9&zX5@FGEB;mL1RqZKzv&8eiyhJi^w~UWt-(v8Fz`Ntw%u}UzCvtjB?9-6|GCml zvYh8vHB&USG^4CKjrC-)P_L?;2i)R(ccx0my05r9%pt>Gs@nLXyTb2ZQ`7r%QA{)~Cf&Cb-xtM=1+eQt`2Ro~-FHz6Rkg zc2veH6-D`cLK9n)KGerhF0@AB}(*G36K z17p;+E0cFveGObz61`I2GFR@&^^N+XBfjdEE?Z@-XYn{$KR86iqI+P%m>4^yyhXM( zUv35z-Sf;$ZE$e+KWo)*dF*bF)yvNu(o_B<^LSf@_|e-_cOE+}n{l^3=fmqezFX3s zP8L%=KO|q>V`utTh4rT+qWeoNQ|{?DG+|-vCbeu!;Rqdrvl~*mXKf`6V%g%3cXr%T zG~c?pPfM#_OWNmKC#&@hpR}4dj+v2pcggOXVwYky?t>V?T;HNybwkIUGjAFyc_d3sUcOnwQ~!kQwjdvy1@41XL(hs9@AlT)v8^gI zS|vlQXm8x*iojnJX9P?b6Sq6yjD?h5-T={8OU7>tj}H@3dN#&wkVW~8!e>7t4+%$) z*1mh=g9kU%c4g?g9nR_dhuUmSvUfbjtdSpVA{I2t(Yf^Llt;xU9y_$OzI_pz)ml8L z)g&|PZjaubi*fnXJSt?KQ}XKkM{@2#hgo@2!{rM{UC$k((@UH(v0ZFC`r48s?Sxc~SD5`Qy~>hTC-G{8ErP);j6^ zqoiz`O`DyUD*A>WX8T25-DnPM1J6aL%oC^2*kdBfF6!2e zWq!PJ?8u;-+gmMWZqM9!>4n1p?Z$$@d}TT1TjOqWmh`+TWF2-Rrztb;iioDW+L9;9 z-DYp^V;uFRuh{j3hf5cH8FNzQa;@Rq+Uq-R&i8Ge{9;s(t3jI+dJilwGVGZxk-Nj- znEW6$iF4kY&iOb`ADaAQyT!H1ks5nV9_URw`QXlobwcYzN3rb3i+lf)U75C5v8MXk z;=q)T3-p<_-Qy+B&X4G&GRZDzW6I);;R9}t7;0}`wDHNyY5lft=~?l$`{)4+?}Q1j z`#ipN(KhXmNpfbsJG?}t53sI@OzCEM<6yq#y+-L?iJRto>igH7Ovx|O8Rl5ZjnNyv zNk(Ffb+4zVPN!|UZO~m$R4lu{$AG2QZ!Dr6qrXVl?C>~yf;rJf;-!U)x>$)tys+bm zh(5}L)a^akKc?spd9c8{yW`RskG2nz+}Lzk{PaWBO&8g_-I+3}AX>b|*6J{06C z^I4A-40$5b#+h~ z#taQP-R*mBe(i)O>-~;p;8u+JHHA2n4D=@_$^#tR(13f?fcDQj{0jh-F!U5I;gQiv(bCtWVscpAF4-% zE^U^n_Sm;@rnkhf)eC?0Q?0(YwG*57uVT7*gYkc5^WeTT93$qdWuYq}P%*HFS{iIG zsr=|Ri->n^^I639f>9cah&F^1|MA6s(=BIvSI-o^_{vgj%Gqg?jI$;cy;YojH)UF! z^N`#Jy2?Y`mXuo9jf~#oxccYRlAB*1%s$o6W6)(rf$Z1TnFC(FpD`$+b(8C;yX>?J zlSS5v&B+;kfAp3teX)5XO4o%?*m%%hb!2LsSIo-cRT{rrviFL<9n*ihT|?o}0>iz9clPV)-XUXK)yG(m6KP+&(-`bSLbH$ZF)VF0K7D+G4YYJ_Jyuy#}r{4wJ|VPsF? zfG-aIE$oO>OB_qhQ{L$twpOaEWyzQ)tS`1MUu715d)-mX?HT&+sqbc12uJ1Y2uSvQ zc+tLPSN*cYF-omk0k0G$AGCbG++0F+>cKeyE_w^9-Zwrmdhz($#-EE0TSx!CpuRd_ zR=QW{;pu_f)y$6>C6q8St?ufCF=j~1ZE+PT7du(=?b(5IrC%L;zh2&;sPFTT zSpDpim!j`#yglXkSvyT!E^SM>k#zTRwmO!MoIizOlI>ZAL|=N@?d z<#XtxLH$KfeKx8z?I$;IQyHhFPG?Qd5=oirkl!i=L)28Z_~$G6e~l=KG-!3z+3tVu z@s0^Mp4(O?HM^`G(o=JX)P)O27Dn5yZizo(KkkCGNQBPZpo<^IH>#yI4N$Z#G8M^O z{ZO)6d+alf!)M058M^qu)wG-UQzN&X*|F%_pu9dy*7^2(CN9I3UR1Q=h*J{F^T~}q zwnFlaV@-|Zy4#n%U)c9XbuWe2@7yj$XpM_>p8Wd2Z=;v*YDay_T2LmLArSg5a2yv|Cz|rS^m;vOfIB_Mh!TwAK_o- z?b@v|CuKzgcXxS`M&jpN^KKj}sMD&HscAV~Gp0CIojrmp>pd%XlxOcNS27K4PEJnE z+E%i##xlrsV2xbPq%-nbgU4xyPxWEcYfh=JRJbeuzS_&QkKDLjQ|~VIXxRUDk$l~{ z32Es8$?QzFq*Rfak5z1Uqp+P*dcU;(7^B);KV|&Nf-9+`o~JiH49=-lI~zYZ^~=Gx zx5Z??1!OrHKM%8hH9TO#Slt7sie5haoUtx(qJy^yTg7OeT)E8~>)jKzzK=V3(dhH+ zcQ?K~Sb6>H&60s4p}wIehsIl~Nql7mfB5COt>unwReqq?$JYE%c4f^vi|cDPg`T=U z;AoZ6<^Y}C15dtiRK^x~o1fWsd}oh`^B>LaZ}}kkHdo7FnPl<7A1v8^ar)E2h}X4KDR%>#qhTz=Jw z3Hn!ISA0J9|7L>PLo{%i6E4O42St?ariF~)04fk{g{tF!5_aXn9=$(IOZ5ENehI2# z7e7t>va8st=h`to-iFsp{71CN$p#F}>m#|bhUFBJ5w|SR;^t7I-P@AJ86ts6p&b0bRE(2a)-{AW$ zQu)ob4JF%FRYckJQT*i4JHSEj;n~uK6;Xp`KiGS;sQInt9+8rGzx}UT^{i7yYV}=p zOIB%|)*80<*_%wc)e{&BHJ=aF2fgLP&-KP3QE~c=+(Arob;O^`3_snG;O%gN6 ze^At8ebwueM?b4SG5uV&(M$aHc_pRQ$pwM2u?PGeFP3~Uw%%;u8e1@bY}PBCFRZd& zu3|G72Mlj6u6p!JUb+72pz?u7?Om7Oto7Bw>=J; za6clvV#5iQ({AI>+iRpd$Hva;Z??e8a>kqV1IMnKS5~owj}MiwE)qSFnOr5h)MJZS zs7;OZINKj19Pb}HzBO}jo&CyisXOKe4!_{KsKv?;SgV@&EUNkLTw|f!tnCJYUu}dA zeOz(3b!lmh%(>~imh`eqt54T09_Z{dPyFcpkqe6QwwAJjR|kC^)MIeO_PLFw(_cTe z%xsRBWPWJejew}<7bfnypTA+{w38R5pB%9W>95{+ci0-w9{xA9m(<#?UhI%mlh~tR zo!hzz+Z7kjn>B`e=*G(>W16=xEz@r0`k9WXF*!FdP}2R0>jma`mEy#2TB(;6-Xsm! zv~B1J9gnr829^fdO5ZkDz0JMIn$j#(v@Rt@ao@EokH)di7v*=e8TM>znC9w{8k;J< zKl|D1^{+6cKP8PQzy8Mw4tz4q|0Zee0gld`Jzf-ArLAze-NmDhO!IBAruO8}?U;Xv zTiW*7TR_~_zyGmO!#Qp7RNa}!7UkSB+HuY^_gUH1MbZwJr7l-+jX%BDTpydd_1s2l zSy|SIOYd3F8QMwRR<7(}6)86M@`zVc{Z>A6Xlgbc8$3{|4>xwGSjNmmz1ZVsSr5Zw zUpmAL9B$L|N&YI8H@4X?2Twg+Rd#OF{p{OMrJPn+KO3*L(c+BuDDB5iDlsi$x?)!L zEr%Nomg$AfTfWtNy3jFKmos6B?gy{MxF3Ge%^<&IxsuK-gKfrY=bEB8|s=ISlK&GYHI z!*v=D(iBz{T*(Tmn{uJKYK?}!^sIv9*Z`&8?orHWrEU!qG@R#4R#c8&xNgJdw+dr> zJ)S+cyN5^S8dbgHyN<`5o-JGZ(D(b;>d;F|KkiBr)82USm#>Gr&iATf&v26u(|`0x zK9tma#;^OLj2)K71`XPrVaAdZu1r{L^*d(W%9ln_TCbFvtKyyeB_(gMu?@;PYue-C zaM|i=^-<7c4dq-Rc}%ZsKScNiQwG2x5K?;Yx&4fk9RcA2-> zNv^s$#5YuE;7{*^oyg9=N+jTulm2_zVaedF9$f_tc?+eEQq*q4I+R`W?q;A(_h`WG zfj@*Q-NG1^#^g0vHoh3V{CZextlPu0W0#eiysg}^W7fcPYvdJVWxEgUR-kYxuV0h> zo_Mx~|M9Jpd`3SG{r-0PZ<8KPA5_*TQd>A9IBYLcON{juD<(K+-y3X@Cxwf}*YxBOy@0;%B z7B=3M4%`1>&-(lF8yR|atL}&v$Llye%N@7K@Y1QBi$UVP&wn`1InrXk`%&Qj@@^a27U7q@+ zX5X>%P7c3jl~hdDo4UYuM&;9WODaSS*Us1zdPwSEX(nsh9trd7>|NH=OZt6(96w^_ zku~8uX@fK^c2&uX4pu%q`SOX`(-udV*V(!~U%56{!)=b~*8`I_)SmP&UUczgeNMnM zR~^T~n_4?nHKg5>s&*I_Z1Q-kR5|Rqk9FO_gB$x_R%VoYTNxSm)|$I^v`A%b!prAZ z6F%$P&FI&wW`^r=W~#z~{sT=fPZ@S^V2?R7s|{CXOi0UjjWmweEQ(7{zp+V2V`}{A zGvVuwOMlQD+oGjA`F5W<8D)8^74p|F-~2x7{0&e0S34@7MjS~#G3V}etvAINr zHTlqaZ;cp*h$#hY*}Y@GZg_2bG;WW@lZ;b)jW+ny@BJ7y&dTG2WBuG$SqhGxGn$J& z{>s@Dm_6RcAu#vUf`#|P=dCK^=-eq*ecm{!^!M{DP1BlBDeey+89LcUabqvPJvCZv zQ^f+=iPKuw@3@rtR`sRI(j#-0*c@4wl)|=^3)tZ=^<~Wlqxk5E_>p(41`Zv1&LxbM z_~zitRS~PM-)ai`Ev?cgX+qxB52y9~4;+rP%nz=7+Y(>8eqT^jvt694Pet9DCn6OoRl+?y@`R;` zr1`WFMiNS6b;P%-i!L7ZEbU!rv)1F%Ew`N&mkp`zcRZzF>`Ko{=94*-q+F}M&dK;G z)gWDc_w_iLK_)TYb4-5tpR<|$YwwTV>tsH-bfW40RT>1J1oz)-x^^G^PcMN|tKs}@ zd(ej%Tvr7VYOp)?53LqGf8m_!X<{o&Gpz3HlqrZT4a}Q+uebcP9U`Vz2CkYmednji zc}u<**X)j6{dkJz0NMRHdSjx3yqyCBeM{vA$X--0mfPSWb8Ozt>C3Zz2L(;B_Q?r% z%a@qj{ZNbB@3ipm^Td~3kF?%iJkWg^^MG~!!_7-StkhWf;q<2FT{n(DZCu)SWnZ@e ziRWDUMm}75CBCRn`Ehp<*&WaO^f+ViYW~IbE5>iWD$2bz)aSs`p+C-jUAE`fsHBBs zFQ1JR>2+MjWXW~S%w^UJ{j$WOb%lmoyH$uNi7yv2xq4k8vP|+KHzn(d$kY9&&x~)H zGTkU!g88)P;SqZM^J0$;UQjycz^uYPrecFRF7wKV$l3NembxkVdeCMCLuEzOhaTPeZm0&yUj=Qt))=w(Os_+Ac7<>Gbk+ zBa4;a6_#AjS0A!GoXuJHAjG86*=M8HN6lsanKxc)K3X<+d0va7Ls_)h zxv8U<2c;Z%J@>Pa`BPqvj>AizupY{`k(de&nst`1c_$X0nT#rY%xeaNAqC zwj$s}j6YWQJFd0Gsr( z2a#r@CpBazTir<(nfUgq#Z|+%59dfWnoFy{wv4kkiFe7Y3eB<7esLf&*nf2Vn^_YV zy2t8#`>?;78@w`Xe)_rUd{$LViSD}hs}ek?XN^2@XI4zb8w0Ie_3rCZ61#a;+f3Wm za_QNs<&E#IY*MgkT#_>=U|6PU!}$FP8$7-`R-E{4<2l83dM$JhNTbejB4xDx)oJG1 z1x@KrE8-as=8i079alQ~yn6ll)l2l%pe9}kh>G79^BIo*AG%0RBJJWe? zu|{Ig-#I2K|BtwLjLvk;wm>URDzJm+qP}nX2rIhRBWTdif+31IJbM8z0c{r zPxl@7{r!#cKI8qKrMcFcbFwLXYWI;qq)cuCm5ZDtYc$Nb)Y9=gt(Yb;NRHhzFOfCl zL&g3#!1h;?JF4MY`dW$G=!Vu=ILTsKG{~o`VpBYdgjzVWcud=j0hu1BZH!uW4FW?4 zcp2vKwJ&+fg=uR9PV4VUZv1ow=jw8(c{FN~>Fc;N3C(rMJpmU91EE0fsKOsqrvU6cFXVvhx)%{;*s ztcU3vTcr@aO8x>JdD!vc4z1RW&(6K#wIC{i8v%Rsp(Yi(whlZpg4sMo46j<}nE{@u zeK`$nWay|spwUDjjEh%+UID87@M3J1~M75RuZJ4&*td&gLMg8?^DSIkly>V)uO z0Xl96wOp)%?O8*oM4=NQbVnA_J>p1$t{>RH&n#&Re9;HX4Gz%dS!!9n?~%<;q?hB2 z4W=VRg)4I%>W=|ZRa5oxMRg;G>JL2jUqVoS+qnJDd+h%UmdfxOgTg=g?mvU2(*KRL z>%aT%EEOw<3=z2ZYMr`%($xTXS_FUNU%k$S(j?(oBIXIwi#M4&v8C{(U;}nOUM^Q( z@QI#_rl1lQyRLX1ZC~dbdIo$@BCTvS!CAQH>26XEZw^wj58Q^pHHYafS9~whf_20p zCOn$0Qt57ogCiuSMI?#O9WP~1Iz;fY4h&LvW*CD@8_wZ5D8wnSA)_p+E`A+1&aZVD zL}FI$y#&uM$;*Q^FoTf$IaZ7Bni4rBGg=pB5%P$K@mu&gni}e#b=hM*AD0#uBd^O@ zsV7Grkcl_#Zhx3pS+ygT&W>d!Utwr#RU#ysXqY`~6JBr)_a~Pisb?qE-&!`ZurPu` zf{CaPV;kH{tPM7W*soGlBdOa_7Fj_*HrlrmN`BKjo@uTspR5o@RnZ3tIDsnxi2w&U zb~jKBlsD=lI0mBqYbO#g>-vG>$Ec3G!Ks zKb$8M)!)I)kzcu43oNwxno)?Y-Enof)Koph?=l@`t)Q8U6QQkIGg$k9yfNC(k$Ey> zz5Q%__5Aeqm%)KookI$F0MU5eg{j8LdTrrqdbD8k^8MYJ*}iINF8RD-+O|Du3#SllI-6Idia{4E47v76-hC3@%T_KsP`HyQap7DyOVk zDl@i>8!q|dN}4+_C;%_Rg7B+PVkJ%A+2uERQJij`}O#4E>Hz3zY$Q1&U z`$)yw-X5SEqKR+~v0vHu?LL|17*S=8SBg%xdxzuFBoIMn+ZE(Xw`Sj&W0wF&oJxhX zO6Dg-fALp0#7q;m*ANZcQwW&Q*)P+b1pbjCH!zr!eX#D+S@BcdgXCyk;MInP5o!;Q zVwIp@eEN-B@m#ocu3}D_A=Qm&5})*PP^nUNcyiCj4TbteLOYv#I%&EkkkH&^p?6gK z7os?*LWd7qyOLXQ6`2c0Ngk2Pk0-EwO66F`fd1(i_@+m!-R}DRordkL82)Qu>(PVY z53=aib3Vz(&=>5-;d-g>z@e3zRm7c3Y}|dPT7_eFtg_q#>46>=YfdVQsR8of`|jB4 zKfQU=bY!eIUGjc@Us-ssFt|D_(4Ft#;4KvLp@){Tq0y0(qQ!FC`g)eKz_)aL&K*QY zFSlgVR^H)MTgBu7rz{gyUQ7wG0nGe1QnkzMlkQn%PCH?Lgpk~yqmX^$Cx2`V|l8e4`dY%{A?4MeHAkB5mf_8uGR!3?PF zO4e$d*VY7y4~ysZ^>E0guXlgpP8-f;V$2IJCeZXnzb=!bXsqwn*>~-_@SQxk2M?t@ zwN41H8VaTg`4wE{$u(q%0N>=^8E9FyuVV95Vk{VO6K9xdyiCRuzhkL}Z}tkkV9FDrXmBT$Ya0Fz=yQS zrjZc#R6(jjU?YR_OX^-fzk^D11|e_hXt?>LY7{?oWQv^~xRo@hS7}bwFIyf2Gn~98 zgpzLJr(hp(k6IIr^^7VWf0lE+d#KC zDhJyS7F&k_tu_%`e-%80t4C7J6o*TvEN+8Ny&X~YAKf=A4U(F!N{fF@b>}>8d+Uvb zlB6^fD{WJxGxH|?DIZxFxC@8JEP%nfrI|_?q6i}*fH5q}z`lC> za~Wp3`m9e%fCRCcFpkF5K=R@WXeJ6imzhZUMrbv_U_7eBBuCR7m{Ln6iUJXVnKuV2?IWL>NEm{CGTu=cuZpI z6ci)H-j8+rO%ghO!(284wxgMU2v^8PELfiYTAoM%WtPuXo*;Tfc4awvJmn2B^Fywi6g5zhXuKBN_U^oZDR zVIa-sEL-;F-gFt1D7;A;=usH`HjRDtHDtMa1bbGKJqI~S5t@BUbZ|pk zFDjmQWdY2RYjedi{@c3Sh5~Z94+tra%Iiq;&hsCelB~e=em!1~8&@=s=-{^B0fqgU zhVvk;D|{KHcdz!MRjb$~l5@*DDO2J{nS_f>fJB`_`Hl+J+e$ZqqE*4irt&YEo=M{y z?smnZzai0;GO4L%o0P*GQ_ z<${m(H`;8lvPA5*ysC3}n=Pv*Bx@d%F4x)(^Dk}@L(5qu_;$40x?M!8&APmF*F9;P ziQ#p}SAp5VOUac7JI|8f!j z40Y7sRwaIS5xAp!Ke^4|gsz^$*_CVQ*L5{&{6Tud1>kD(!ie=1q|QDv$i}FEexe0? zG5CiPj4)`i)>i5JM}U8zxL2lQ2+6X>CU#JPC#~?M$?)?zshxF<*IWRU&^_?O20$aK zU+Da*8z2T{bw|>qTF5%+j(cs7my4^_M69V`=t7j+>#*wzc>sM`1?4Vr#EQz2cPUv( z>je1ePmlcvAO0_)v%jh0{CigUS1{RsvdTXL!ZQ39)dJo>gRru4pH_+Hc~#Ro{5(Tt z*52gh#0JMA2eoUlG{CY(qOsO?v6bN{h~v1gT^?cWCIoRm zezjvRl|rlv@gD3ca$GsUMJuL8vTeUFdu<+1Fto-I)WpK!tyOb$nqW<`i*j!6yEIfld{^M!HDnj7Ja*^M^VsfOL32xCvB9#sPdkcM}I)pw42`X3ie$j57e{j2D`wrensAt*21Aj0O4wsSGZfsINZ;< z6?9ai^fQXigxKJ~lY+sV6)>>oN$w}T`aRE96FU@Idncxk-+lMr7(xH6A7uVbSnA(1 z$G-vg%Zw@>m1hSsJL z+%PaBx-E%Way{FZsGkz-aL8M(W_hvFs!j1Q6b&FYxlRn*&U|vPOqcy!(R;%UduRrx z?K8(i+~D(gE6UGbFO!rLavpUcl3O;Jeo*$FaS);R5=pCxnNl}3{*dhXVnx^_%2|-d zgz`|_R9k0k<+i7aipKt3-{ET%n%P8rWrai^w2MUR-rWpITAd>YZlpHtc~yGm_F6Bs ztya&)Gdr7<*hp;^5p8U*{Guuywr;jCWglp%<#%-O%L9(G4rR*m3!Fp|YKcvtgqI`F zFMJCoO0m2l{uu;my{be1QJc^6>c`{E1ym3>+@JF&*G@n%1W)R371_VSGhbl~{z_C?r(xlWL zd`{)o1`3m8s_IL@;|kbOOvVVEN{wwQxoSh?;n4Gdcz4O8CFly{_%}PbiW2%7GyJW6 zIoTBZedoA=1$-LtWlw!9FTS&A+^Js3Evn~zO;x2;Tb4~kM;P8#5O5>08d?z7>{s?Z*CeR6j*j2E?8+v`58KD1yFpSv80np)KG=Qf>YL+zeyGA#@~3i z=@;^FZR@nNhyTi~l^|4N*2ZmI_d=ISONPQ7yMl_|o<2o(dkxOwA)wb9aOSP$_JgYX zU>sMl`34iGF*FUl8v?OiOSP!d9q8;h4O$DMh+NNyoIk@rtrZ&-{n=Hiz;;d@>xeE6 z#|N7^$Y)g;81Zn%xg#4KuJBA}^f~9zCcD1k^5o-4N0eoJ1!`+7v~rJ<<8xQxs$lD! z5-so#%>S?C$bVb6{I@BQ{$c+Ar?~vv8UB^gv;R?&RHeLSL%{mEUS5NCa3BT)1sT{= z^f*(DNCf{n zOouh^liA{(+VZP1CZwIU-GB29Dc^#{&n@}ez8 zq(5uc;?*B_fsWu0! zRs_pO5Mob#R?-eWZyTargCQ~w5A3xol`a@s8(rR5>MlJ#!1YEQL;N}@>sXL z0ckcclAyaU#5J<%Jk^E4QFrLq*bP$Gz)E6)5mlP`OSPk|B^Eekb6*7Y1J8i5zwTvf z>N^zDNW@T&5lb|gjw40bpr&N??BLBMW(zE9ChamI@%mE=Q9awq6pE4l{V^G#hQ3nt`zi6+V03*r-Rx6N$}2l zasN7PB<0x82j?A@Yf9GdD@3e34ukUx2Yg+h$IdsVsqcs&uBJLi)_%Ari@uHl4=EBDds1gt%@;A;;DXiDfT$PW!W$72yy3DeXAXc96+$LU zMXA|C7K68c6oE8;GFzUn^MS>@H|H~zUEx57SaOAKyL0KkoiGzm7bb6P8RPCWFjJ1- z)Gzf$p2b(dcn;F;?*N=3%C?MNZQhk6Vnv;}qJ3L673lW4KEB_g#XYRb(eME>RcihH z*57Zu<$peF`43cY|F+xuGqoMdCvW-ha>+?0IhplOR*cVbg7vHU91*k?x(rlrD$@W< zy;%ZWNVzU z8T)wi;eaVbO+nFfOcyW0;=G%}sd@nz#actqvyQ=_;@3d_V z(9j0TIe&Aadll?9^0S$ zR;BQ2p@Oe{pu#LX!`MKKw2X9n2CbYOTN3fq3-!W_R8@V;({b6lO~KheKEglb9pm~v2eGY zYEQR;>1j5UBX8=m^y?PEkBR7AnA!IxH;gG5dDP~iGZCwb>LRt@D<+hHlL0LAG^R&X zsnc+J_^?m&;CkVHxx9FusK6CE? zWNV7IM|6=2Nzg7S*g?6a5~D}O6Q4Ssjvzm`A1vY6w@2gEp*VplGqR+VcWoGPjbqe3 z$KB@(rU4!DA0!cfrKD&6O)~aBRYUwEiTK~z_kUt7F2LM@}#ogdj{UKx0-$n-cIYq8v=O>Xx@8<6Jm!)^}oK2 zc|oV@3#=Y3*_Khf@;^czn{?hfc``-Uno6CEtjS%!<0ICu;3GwfEF1fVZ%j^oE^g)n zan|C55jNwdFiU<%Y>9|M(t|{YQ>-RLxWbUt!@XA-Rtf_QA>Gw4BBBij6znO`rzeiD zU|I$e=-(}0_E;DhJ4+a9Tj6hb_Su)7x42iZoV&c0-8iZwjroaGEl z$Y=}dy-e3OxTuvP1fN)8frZA5P{q1jwdCCH)Ql}UqEvD5T^n)~xz764TxA~}$rmfc zmWF9o>iTiM2+)3NDG`-pXv<0B$$TNV!_FGu#Z>?ka(`iINLeg{6fSMkaILK8nSh0J zR5@(uzCDY?`#VYLW2%sVf~w^wp+M6*SUXolYH$*fMZ$%u{8xzqcS)j7zpRlSL-{%I zGs$|RVsbj@Kv8OZO4mx^&q+DCQP)6mhUX>4YUEHh)Gi*b{zz)#IL;>t_9UX963evu zT0pBIfiYwdf2^oziEwp#KE!@UIfkGxJ|DLq*1il1xX8Aueq%z-ULa@-xG6#zAQEtx z22Xp4G!|gw{9VdT(jzc&VYOTi)?q8#^@sz*e3okI$yIPBCrTi+jX_uQ+v|G{U-m*! zpLnvThhclizim3CI_B0i@)@6f8wYU*4J4L3PAOjK$!$l|7$&1MWuf#~EVr*OE&z?I$m9dMvvwc?BV$%) z{?eC7W>n>n*F|2xu)n=N)&xLME--q_(1i9}9UL^Q(ga5~yeMHGY0IRTA(nY_jn@D9 zld-CawG@3Tho4HA2=b7%xTVneWm7~x#AeN4>=@!9OW`ggl3ijt;VnPP>f|F(6Gd}&avwEw$k5Uz^C3k zTJ?`!Q=RS1W*?55+r_2o6;<}Pu;dFw>~P{6=k$j$h=&A(45DwQ` zM^DEFtt>&&pf^~_LscqPfNsu|P>y?h5f9slSsdN1#^%6;!;ACGeCI`8Nl1#!&050ZV*P;9VI^nKNu$!!w@qs@b0dsujBX@LJ9`hI zUuYw<;MB{}pt9okYTy-$1BWU^iARWf;`;?zNr9E(MgtXItQR~c8n~E%qbGAC)O3)fM zm5+6xwBK4P$To}KWT$dp*^EZ5rVQ|+{K_+WFYAI0RI~TC*434vDdiokB?=^_gCU0ygta62w&zY1I&==+m6Ow}Vi$!R zqM%0L_?W`>`h^Bo)5>#M6UQ2E9)+G5!pX~L?2|W`Yrjp={yeYi*genfpo7(RD(T<= z-qQi`2vrK=p3VRzm?)b8jnwfl>PqW+mn=*Sp?z~RVr7EXYfJ>SKqr}?*8lhB_D@2T z|C%z9`R`hk|0dr3j|%3mnA<<8VE)e-E6aZ+MgQCexlq=!nWsbY`m9@?g1)J1a*8J) zRdM0TnavgZhr+>n*ddlMN@PyemE2y{%_pL)B?1br0b3c3K4yD(@@j3tlEJ+c!3kZa zC;|B+Qa(4Af&>EK^oH)j2?)>ykww}9hYRZU4(zaugJMM?N~t^QBi~@O7un^LMcU1f z|6<gc~G!GrpV+m!p$sve0IhFgOS)KlhOzSpS)C@HU%&eX! zRj_mR^X{jwuV@)Fm;bU(GS|`I38+Z8dNz!Yu0*ZdD6EDiOcuYhN<`$<+45TO7A6hs zX;!*f)xZx^n0O^m{~zH!LCpLFE#9F5wn05i%DGf2vRqq_#Xk$HlZkbTmfV4^-(ao- zx;UlntP(wSi*}^L-8;@<^J~b!Dez6yj1?LA7cN)K+cC3;5`K~>=$B~?I-iV8pF|(M zyEHUiP7O;g-~zYa)LnFXYY-ka#kEP~t7p zLD5WsQOq&_~`qIXOiCZ1KM>HNBFGD7K$@z^up~-vW4`^;6+Z7DL$Ra z)Ohmn*goL>k!pH4<&t_+j6cM84&`{Sr}O1)m4DHt@{J zCey|!NP!sbo{|iUr`U~~@Lt74EZM(V?o{o8kgZ4Z;%!kEw+Hae$EWU;0>E& zBCEjHX}L~?dx5$!j?EtEgy1C9>sf0}I3AMdp#pwi!W@6pggV9t4ZCARuIP)OD`Cyr z?2GG;*WTC2k3`Oye_&333CH}q2CbY z#FCJoc!hQcgCIn5O+Sv&o^lr*yija!dT(17r8+F zBf>oy*|dHjg4^BiTX+NT)!qcB)u?4#MM0Mw!E9)n(1ghlz; zRQcU$3~j7BWf{A}@-b>bUvaXZmvwpkT)V>J2Zs0QSk+6TgcDD5+sL}_1aFcSA7xT$6;PsMKzJ>kw6_;`$HOe za)JQ|XE9Nps}4~n5qe89<|4(kdgt#z;&Tvr3pvWLV2+iaN4~l*V^7D=qn34&^QoHPg6@5-Pxg=O(d?X!AWj-bl19#$hGWZ(&vr{{>Y!vQ zX&SiS)x?gWl9GpOo7- z0mLRBzdrvdg2X|GQhPKwnX~Aw`ljM>&w1~1;tEuj{~VH5#F{AIj_iWGiiAooSAoTz z8h^Uw0K+6HNWGa<%z>(TJ(5|nbi0pLnr~N^$O`2dm#U>KhrAmWCaxh~8QSpEop{f% zUxS5vs3FvuZdqrhfJiX5FT& zXL6`xFN6$=QM*NTCZd8VP5olJU^BnXae6>!-OSudPv@$y4>5<*i5{AE*PK4Bj4eY} z5Vu<~6ZKUq$H081Kzkbx04!;G?1M4~Ze6G=MKI=I_D9#Umag(z0S(w;d4lpB<2x(k zl~!FRGEX|3uGDaCA9T!!zkvlU>^YF7t-BAp4;4^EwORM4U@+h1p*@dvL2qR2-v@Y6UCyfWcn|PKQ|}6b zgGs)@Ut>o71fyx4b37Ru=a-m9=A(}3SEYrrx3iOa9Awo$!NGbnsObITnWgCgei7&B zw+2?M-S+E%CB2jyr8F99ZPmZ5^dNA+s(L15++>0XcYaTpVmR`!vvEJ^3*erc9LS(7 zkf8a@3hW|QWm%==hD-qCW{*zO$uw1w9_TO^Q+)55OU&7cxoR;1t~Tk%M^)npDnZE$ z(P1OgUeV+F>QzGxldfRNA9$C)R7KPOoy6kbtD^q_fc}?v`Coj>pQ)Yc**;kk|Ni_F z#2KZkW%HvI+3T?e?-qepSH_amw&P-+X2uedXdNk)g*p~BS}3ZuSd3cSjp3u~NK+ym zebP{aC=~H#&pXTE(#X5}yNb(`Q_UvNt;?d;TSwP-jg6hXSJ5Bkthk$HFCI!ItHf4|<^#YgQTaQETW2QDvV(b@S6A!U^_`O3l5bNg7#7h`U2e z5-(oY!7t`}j~&3{BxyG!$OOxd?uT=*XIs^m3m0$ei$EQ%LjoB3OkFH-B}0sqO*E{T zE0JrYB@L^y@w1ha$bJ;avx?~x|>+Pk3@2`xh`Y8a+X^ytV+lqmnlc}QtR7@saah_ zkh{?(4RYf=&rfMxyGm6f0T!*9V+}A<-shaqlws6cjFDjZW3mTgYFnFv!ziv*RK+PJ z$-ajJEEpHPD+4+#@zPdW?1JbynwvOyU>sn9H+QV0r_jrYNv^z#gfcJTvy*KTj3B{i zhbzo#(nT#wDmx{_sSQ}XDJxYytOrEdA*F4*&xH0Y0&eGY z`3%ew{F}k<2*a1r)v+f=7niCkb$$g3BPNXt#TYzG3Ec!)@MP=gI7m#JFJbUcqK7H7 zZ~F+cLa!Lmj6ad_yQCdzdn1C+8>btBr7Dx;Gf)wQ*+J`hjZ$S8!F|<%kNO#Cu=4=j zXora3Nzwyygf8r6>u6?Gk5`OiZk>Wbqa+ckPMsuFIh+^s>A*Cz#}`%I>#c_@ByYpo zi_8H)8gU>*1H}>Odok5VfvqwD(krLw7X+0uAtN~eHl}X!gAPnFMBi&2hf(gn#17tJ z@H`4G4`xa8HPSw(gIlIuo933`NGq~MP#Ct*j+!&fMNMiJllbt5Tbc_`>HsF@ zWG@(MBp##CBv`B|K$`f*0_^s9wgp;vS>>Ssbq30U3xzL2Y#xiYVW%<}`T7tEdcJIyfYiy%@OL z_Y`=(Ovn{Nq%P??QQ}(WFfQ-)we>Yc=YzdH3}%m#bs;kT8avM_4PLS4E1lA{g05dw zWW36&f4&Ic{?A%JrTaQnV^V*X%$u)D45QXw5Mp`Crll_sjL z`!Dr&Yxf}`&^a2@Fy{7LZXZ}uc*z-PK|V=KMZZ&9v?fm#BbIXDOH>%TW3#v45%Vip zPTZSmMJ$S|vsjY_z_SCB#cp>vi}fW7QxVi-Cb$ee$ql1JgGH(137t-zn~1~<`)uxg zFC+C9T0Yo9)zY4>G7ZD348~7s=Cr?=X|6Q<1}KGa71r4R6LNu}j@+yVH!{%svO5tv zd{vtXfMA*gzP{$&pf5)*Q%m=VIg@{%nIIfOs<_n z;_8P{%nWC4b#S&qZg>X)o(ujew)zWyyFx^Pw+GMw@-RoaN>pU~Ohd{y7yAoY3;ZY4 z=-_-yPyIxEl2;ReJ(mfq-D%e1n#%YdA0xO`fWwUHdy_lH)*{Hx$z z{3OsQeXQOcC#<8V*l6cn$WpNJO(y3uk_NgYmXK&Js!hQBU^K=AJKBbYx4K9a45P02 zeQpv5O&-KK_A6AN0rsUGQ|)*Xf9vg5NJ1OWG*ZROa`-S3uvG9(aVc#Q-B}m(4%lAY z5J{^8v7-vO7dYX|h)n+?oto}Q4)Izd^OT9*ney@`kuiRT;)XQS3PR%{v)$n!YDL_s zF-o9TtXqEnai#l_8c36q)@mXA^xl}5Df#a~J9X-mQhP`*C~Ca&R-7<)pNc5_OdL0E z3`->jFMU-dJ@}T?adhHfa@>4`6}zA3 z2C6?-!*lmo@W^OKk#o%RA9)wj}e z;?bmH91Em$odNvCet_mC-5m)DjJ`b7z=nq_>VwkZJ?RC&B<6k1ZLutD1*f(>XI7_|&m$o$Z^zzINC~cr%++QEr&~?g`iFt)UR`%( z&AZ*bjyQs7%I}khzpHou>8S>W|ELBxE8cHnJhcBWk>vlJM*RKF|Ee_k)ZqU8c3G6l z=iH^p-%1mxJ9*4lbn&hc>Fi7nX^;VD3`#4YCnI5+!KzU$XBYCIw_j5e@d(1=d~rRs zqX(K(ne2=&)1zo2Pc~5V5Sp5Tnwg%NIg$DBJU?D*C0!qFA@(YcK@Z6zX$vZ5(W-4o zW}h$)A#gEzxp=aCemy(^y2w0UpZ%PFv*hvccJ~W8vUxgM#%(B>7HrMwoamn9@h(wu zytaIQ9ChUgw?X@JSJfG^6bjtp78E0FmT-8=tmkdu=nQaY73{K9kS&~6G2_} zbVmweOqonmNHrPjMMajpAo@XFl^C>uBcygH!Ep^5SlyepP!p6CTM>lZ9PCuQ3#DJs zDZA$P#fl5Vj{&t#N>?smny8D`q9Qqsw1zP9m>^viEo~Ihtasao%a~u0hf(=0LMOS; z{f^YUC?%H*DL*(UP>9`TG5^-JaPE$N^>GdbMk?IL76rd~T3(XU{z;wM9{EwTrK~GE z{0DldaCX6{-&GHtD|f_pLeJ~%H6LIXlDK}6gR3eV+CnjgP}Iq&lcRX?mF`Rrqp!f% zU}6?i-iI;MuMR*4>So@dqK>yPc4C33vg%{@h7RR8@S2+A@M!6jCc`0-&XlXCOVBI@2S1=9U1rC6Sc0C~b~!SVy71ask}w z2A=F2aQu_X8a3(_kL_dVQ}@?aT7ucp4_jj8acL?OI?r2Y;PLt_4e(20Qpw}C$7v4b z>5DjQMwkbKh8DlVtB=Bo+qUeG?d!jFU9lo&hsUJh6NjkEzSr+?%QaqsNf@l#Q}SB& ztBJSsEray?#^ln4No4ppQ5|!(q{`5MqYsG5MylcfGxL*>O`3+hj|OQg>yr~!KH1Dk z6bXmNLgz8_1L$E$47(*U0W%;MSAIRnSazpqs3N8dwm53FW7j z%EL1(F${)lO4F6Q z`Gke7BxXIAqTClurj=xn4Spn5iRSXj^^8PZb;KG+o}6PRiL7qkW$aU@ROGVY0CB(v zQ#tAR;62_Pa10@s zhS_HL2AI9(PjaF_1#w=bpf~`d}PdtmMxg$K&%3DeOLNE_Wk3T zZ($3PRpkDPmR4jfDqC=kvqEmCWW&Ds7`L=jlreL&2$!)mx{_p;ck;Wi7aE1)@EJO+ zI|RyaD0Hf91e0q7uUxUFEU#&!%~1TL6Ns75oGP$9V?V8mF=0nM%Ra;3z4eg6VcbVEs!S0ONbgs_rWbK!C0IX~Fce%()RMPxIwU~` zyerQVE(p=$_h>IL;nmQjn{^-)$w!O%Tu2t(U}v8gMJ3@Bitnorn^23r+{u5+h@_g1 zgWucf&HIB3AV4syXRd+MZVmaM$Nzb*hhBsrm*k#o^XIqNpU!Gx=uapNjvbT4T&zD{ zw4iQ8>Hy>d;oIAb$4OMvH@P$^kHle(vggvt9$2dPgw@a2k0{~>Rb!dtFS%BlrOguY zHO$AbEcn#doMQ`+{Rg`*oDU`Ek`FopzSWLJ1@R!9S^$TfV)Jm|IK6h~Ywv9cTvDOw zMOiC92ma#AXf81g(Px)s(c}(|)_f-%k3D<5y>U%=b2TBqj|o+(=7PoAqP7_Sm}2Q% zo$t3EiUOyCs zJRIwo&3$xiwjK|7!KQaKgQD^EHozs7GgqifeOXv zaCY1`s0-~9FH}r%I)rc)lHJU*i~r7FzbjB@ovyzjU2q1WwIMo7ytN^NYq!Vwadrdg z3C)M1SSXrD83(%q`x@{noevMj-PO8%HCyANy`$fWvH8-LDs4SJN1BW1;i64l@XBR>-T)R9cYEs@)N51K@0K*UhFPA zk8rp%sRxPQHNwx3-*T2sY?e(@A|$b3c%2EgyV~K$i&RtY=1wn_DasOe$q#>a8i6 z5#|4N? zjGql6v#(c_r=ylHL{aE=%U1Qt^y|G;A=Fz@W=Yz2!<|*tmouTrd7Utn2q>z6#JeBs zZi2Yfv)eH;FuGvB0k{Zii!F~=%I7<#6@zQ04`n?7eU0-VsCs z?PVH*bav(gG0vOg4bYq-lIHT$?30aYZ4J z1iJsI9_o~(yt?};ITPtx;s*OE)k;NHx%1d0LW}EMV7%u-n|bEf_tJ{a`lbv3Yfukh zfcwqZwQMLXDblYO9gFDrQkUSVW_S?;_v=%gfucw}ple9pkX@w6A zlStp^MKE4%ZGzdsQ9`7lSlC{!htM*)O}2LPoTCH!C%^+RQRc^K^Eej^M7e#J$k*N) zK}!HEyDzZtD~ROtfe2Cs#a7Fs8ik9nhW#b=ZJ_z)c#4vlD<^EFb7gx+QmkL;uGWP4 z(zGecEcEV;BP0lc8WU8$d}*q^L93x}_Nd@KhvE`ch$5yp4e7v1nrwnh zGFtcB#<2M|7-FX6ibi+AiL75i5$=h~$$|0$;rKFFvhDe$9VLk5g>i=QIwb>I50iV0 zWFZ!juH5j#E8W6jOrAUGk5Pp(41qJ4LQXr>JX}^jcBV?b*l<`C$&Iz_At?}W3nJOj$Ap@Pk)OJ`B za(=IkDUmPm{9AP&523CUL*G>3u@qV^yC%x$7%n(cF}6)tHkTIE3h)S8kZaxz_ilW$TD4GViaAI^#Cs z$=+MG>;jvm-bJkdSB^itE$oruLQ(O;4fFiR*pu0AlbV(792=R#WZ5@Av9@V*qA(#< zRYo#nJabsl^20nrb$>l~K1ELb^d4#~&cy2&S%tEy_S@zJc-i2>8o=aUVL<5TRtC;C}%sIM59N^7YOk|;`ks$D|l zp~Za9QV+;rUNk5Bz9&CvMz|I0aOCFs&~3R-n$>Z>(w!9vYCej3hF?LjE*4>N{dAjN zWIs<=SBI`P9F@E{mpXYYd@-e6qeCR6Eay@SFsR%EHX4Z7rW!+pi=zwe9MYnc6Dwhj zDhyncI4my-bfu(5H@uWquEZ`mbS=R0xLZr&GFlHaCZU{Pl6;kx$ak(3 z_|}p~VWDyT<2n+wZo+B!2#R^c%(b3@&)_%?-f}u-sv=?5jWJ7Lj`WpzIn|J*lr*H5 zyd)fPRlZCBTA-0%@V+<8RtZg1ky$}eeoR3jJ^0S>XA}?PF~ua|Y?&ccp=+-)yR2gx zCfJR>A8jia1;UzSs~JTyN7*ZGDalT6LWjTf1uwjC7#$r>R*6h(!5y4TSQPwWcPjVn zYb4_y==(C4^nr48*u%sReIe#Jrh`W5=?cMGonrgdI0kg&?=@wT@!j32VYyar2E2%l z%)Z?`Ww&I?7b0|rc(9zmC~)=#_J1HJ;*(-Ml}g>?13D?5762``+-q$ujh~$jo|=;@ z*Jx8KBaM@896#&i@Ptq2t>On~JrQL{D>L4hB;rO$zEefF9JQp>oZK#kN7r0x(_UIz z(|==gCp_$kCv23lK>Ggh^Vj)fgU=VJm=lFRsH6W@M0-%6?2<5QAop*c#gQt_5IP~l57ki z%TdseDQ=+sD7)R`^6CCuU2|uvNp&N1y@+hRAqQu=8b!sG?bTMp?)gw!Qzv2=x=U-b zX24*urh34@?cJm*GIn=y^E)lU0z>F$`oERvS_4VCv7_WUHzAIE^Sd_VP zEHdb@7Ln!1zcTrB7x_^;XrdGxF+6ReqVMh1-U<->b52>pvT~1h#fK6$UzQGL{FgZB z+d_Bh8qz65uAo)B)#P;Ng=QHrCNPvizW^TH|HIrjMpwFSSyyb^wr#s&Cl%YaZ95fJ zl8SBHW(5`7w)5ql#<|_6dYpT1-!Z=alOKERo&Ajcyi0SN|pR#x1 zXW=>Qzy*!(Y%PhP)t1rO7ry)~OP=ycixyW{1q6h_mk{>oZRV_@d133+eFo+B(DjNP z4bpQ7z6Ra#rNFRup_xFui=4g*QLOxO*uq5j5o?R%_I6?eYgU2hBVRsQ5_1^`E1JMW zr&oX!lOTpt533NQdy`UPOx>pW{wYYcg%w_ z6BK7s1T+jp+`93X9ORHCW2*IuJ*-;_wRdbB(T`!r7BI&EeS*mZkOf!_C^7CSE_X!1 z7?In!=$LHYGq=1TA-T)TK=r+S!c%q@_>hZlVGuC?KF(^Kb3eITXTkZS-iaZ@49ED> z9VYYxKOdX0s7a9kFGYbMHQI3mwMi%9B2Nw1=%@)GhYfjNC|CYW-{)x%7UR>pQo?B4 zFFqsn*fR*ZuJi{LDMbPawE{m~pDjac34ktS=OWg-J4bo$+m+0aUHF5Gib-K`mqRRG zuEx#bEB%^{-YE~4nq9MVL2eXI(V;lQpzo$GYN}+9hHygUmYl^{M1vrN-$?=>j8LU| zpkug9K3Ed~5hHfQ=RuI+PDssIDlhrlo zs~dbdDVk7-OU#5r-MYZRK80Z;%(0hK-@i7UZZb7SCi5o*N}_BzO@7mV#NfJa7JZf8 z>HWH>pbq5xp--xz1PK`SLJ2{YzluXD7cvwKco|qrNFxvm%=W&65hbYHe}Fv>DU3Fk z=<&t_k6wwY|LL%GHF|D4)c9q!6``%ffLDJT|7wiwsx_d-yDwCB9IJ5pt_UNb(Px8SLmb7%y2H%t+#wE&Mw!3(B5wGaxbZvnq>NTxn1q zb`Ff9?|^!o!$Y`10{PSspFg@Dzapg?O0`ruv|Fw3^gK0SQv1l`ko*rA**{DW2JA-RmU}bHhtbK z;FW@k<%0dbOp!bh_8@}5zG)@gWms0U$E1+Wtp_OwBRg$P)wTOMGi$p zb}r4i7p?;NZ6-^9vsrp}gnY?0Z&q4U2!aAoX#XZ)>qlImD6v(4VW#S=ujm9?F-g`} zlm2%bv@z5|AS-3(fU~SHvY!V{g8tt`C1j~N^7{lNzN~$UxJ^bgqV{%Ud2YgnhU!3T zLt^rzzb&TnOgpzv-Xm}Q4%}1@=mNfYdBNz#<fQko4V(cLceCAP6?7!iTm`4yxD))6s56;3=%E)+#q?Tdp zc!+>YB2f%XJ@Q&UcFru;rwg8Kwdu$L@i924*k@#?9hgM-vB4Vg-Z;1nmm7}K-1G9E^Umf#I_?SHV^+>6f6fX`6#L? zs%B_nNiLCVlzRfPAu+8~`vA&?Nh{f=2}WXW=OK8a1dAuYOq4@eU)V>u^O*v}bFA zm)mXrOuT%&DH+wuQEokH1uo(0?M#E^S8igD{W{1#jWz`_!keUhCBhjg1kzmd-gDi|BqeS;OBq|GG1e|ITu z?KgLW>+Y*gN8xdQb-i2u*;y5YX7`Km{+Ad$jQ>&w&tIyz|B($M3~U^K94N~F=(hh` z#l5lo5#6`*#4~P-ftIZKxg6D4E%~*{!)g{4az88By_~z8k&ukWXQt$cAW81Lvfr;b zR6cL((^OoV&{&@z*l6p#T)En{w+!@d;x(e!@OGda*Sk{N-B~-(;X-*k(coT>PI5ZT zoQhOwpiu4xS_fJNy34zv85$>oCqe7maLJqEWlXeWtEk4T)2?~8;g!+aoT=F8-Cyyx zAK_?+``FbcdrV_~rP7OURoGiP$WDs6%U2W(&vaTBA#JA&w7L)sSU$ zlBi_~5V#7bpKmP1f;1R1E)*i6es}M2G6)ztt+lsJ1qk@;;X0(~{0h?A zLBph_`_a&v;c|uZITAf06*YfDnJP0ds5@2EzF{Y2pNaJTaO&qn{WsVB1g_I0)1*=- z@RHCl?2!JsIzue7-e_;2w73238h?2qt=-wVx~g*r-RTkINd_6aupuPv(~imB(Wj)y zLUHGDU8W`fLI?4(KBBpbGf()R;AShQX@IIjvY&`~`x!593rC76wTGY`*=5fyVSCA5 z%fQz#<5>O3K>+(hWw+w1_)iE>flk10l)!#m7eN&C^8`m6muOF^wg}wz!A{{zP<>uS z_Efk-$z32~mpneQlP2{h_k{o+Wk6#!@!-Bwj94_+I6&m{O8MH66KUPSL=UC6+EhPK zr%Kmso&%Pp;4tD*i#NnYBwlusW2U;rBTgvrjL8Z+{z>l5M6FiFqk*%2UIvTE5Y3WC z-rWqIo`wloa8wr6(z*S$P$&DMH=%}7XvIynpP;{ z&USJZS7^7q`XVXg%n#m|3A`Taz{Vc6D&VHtseD_~iOdoK)|vI104@EL>6&4k!_<%j zLxSeQqKv0$GX)(baLfD=ya;+FUK3=457nq+nmDx(1b0^%NYX@s2@Nu=t|&=Gs{+q< zvd5s#p&(WBXf{k|-(qi3vv1#>tLI~_N3 z!}9b9LB%Mdw!cqqgMXvFOm?&*EkW8p?3tbOuMXt*E#~1dU{@L-ha`IXMA~;^Wysky z9x6W1IY!^^Lq|;S0Ys3SW zhTbiVH|>wP3aZR!ey*-)`#s*Va3UOMI01_%9G2-21{+SnG1Qt^0L(GE@f+=PfvNW5 zVHOhELzsJ6w6OX@Imrm&ag77Fa8CKfH};GxJj6S`Y0v|E#K{C8CJD?&%nPEkBV(3B ztM#6S0-X4v9L$$=#W}c^xCUBP=qI!jJDm)&E_YGi^$`#VbQ+wdr|*hkGdG{qBW$#) z%ZoFFKNMmD2+2S!_buB$c*H%4uueG zwQtZ0oyg24G;2o+CgzQ<_sOMG;N{xH>@Q1Dr0ov-mYw zn?+=aeQ7?A$K5lWA~3D%u^6iEO;{!R`$cV=TPB%v>}i8TS=a219x})&qU@t$Vs;|K z^duZ0zXxc25AT^b;ozCh_3=+bd=cLsC{bmww>1G$x7LXJHJlIy`AJ0R#0PTi2WUs) zD2pD0<9LxbQlJLe3=fT9oUl~{*_Sl~2Cy1T0{EIAro^^(7Uphbc*ds3rrm_P{b&P% z>ew+Bx-=2RqvhtvE!|MbJv)q1NM8b=9P@}Z5pKD;-}JH5!#Wf4<>bw5d1WYx`D^^K z954vArvzExJ?SrLy~>Z5c#+ExlbmcIm;0=;yTkH-^B`Q<|-9h`Sy-cm4>`}C5RqA-8nnC)S|k$q|XIodv>di?egjHMpRDd z?=95ZXN}BA)WZ900~vYOwvaN7zTI8DJ^9hDTOM4F@9EXMdBh+@i=Fo?cs{*W3c&Ko z-&T=&MPWa9PA$X5p!sONfK6DN=>8(;|0QA_f97 zKeQV@dgG3}6dFM&w9%(Ocp=bFib2A}dtjBH3G=#5RZZ0-Qg_eqZ@}#kWEvDu0t@I0 zWxt(uzppqJMfu>kA1It><=#s3HJNExwQ;|tbWW#C<2Z35Q|o!WKky4!MlT@?e+y7n zkju$soW|H>82+5pPg$Ta%lV=q-#pX2)=@sgBT@|MuvFd?PlHA&{lmkkSq@ntuU7E2 zR#`nyoNlv-TvbG!hpgYGTZhf6<@BbE7Tyz=EY82Z|AR7u8~w?q^?n`)%dsV-7W2g< zUik+*#R#{$CCnauMCU<9LqEeIyZVk^he>1xpKLB7c|s&%QVN03kyY?Q34T%+L1BLu zE5Q*h)XYmc0Lx6eS5{kj34Q)Zie6rLvP6MhtfAg#F`_Sr%qn9E1=1tQXhjVec#H&& z*`K)2DIyILXT;0iR`Vnh6K@J`G;pm|Bm$+-b_<6&DTJq>Js3@BHR@+&~Z47%k7H$BdCUF%WEf%rlE=Zf-1iYH?|Gdd|b9*}T+r zH~J>?GySlf^}!XF_601c4uF@0Ud>y~ZThYzMed?KG&=I4SN-c#{MuIax%5%!n;!Bm zMTi)EULDg^TWLzKd9_h1d`!=o&Z*|@D%_7EPI3A=CDO{20XyndnCh!mG7Q9ePa1S! zk=mX|HqEm)1-(D2tmlQ^w5isrv~*jo$IZZfR#=9)@Y|`bKiiaMF<;?AY?(3G-F``N zTGU6`dl?I9=G3ecOKCL6DtJz??)VZ@mNBuNId?p5RcYW9)qtI%Z8ce&sq0lj@0_I@QQO9B z-!6J-vbnLHcCjUfpW$23lRkvcfAW@ba)?}f@`k>5R|=BumkN6GM4e%b#c^E>5ABxCdckp^&>M zY+=4TR+T#dkk_zmNe70Iviq&37(lR-$A~i8#%5vhJ1cMNvNp({jitAAR8ejrAV^>5 zy@Ta6b-iY*ubbR4P;v(PA}wR2&a>rpw@s~NZk~bgZErq4g55x3hR2};Ux6I?VZlGt zhOys_!9kaAGjQnper6A$YeVCp_jJ=Ympo5f_B(dNo^|rBc08|4spzdip`-5o%4EF9 zedz^i&kIk)@Bwb~H6ChORoZh~Z|G?;gDf%v*xDj)VD~tG2%ej5!S0%R$C?tMPl@wg z5ck;^OWm9?b33mai9UN;;sX)Sjw+xpAw5exlot?M5MZjw_8?^OSjX|901d;j57P7N z83gm%R)6Z4RO5EF1D9Y`3IreD%mArZaQ)h)!C5ckSK6%m#vNeKgE)@IR53aG3D{4% zfZg*BdMF`#>_S6dhA?vs*FurxttNu$&_n8s)KUU!yM=joy3?XNER9>|;i z9x}Q&K1ZeJ(SVWV57&*Pt7S~_L>uVbc+3K5&!#eyre-=_W4ImSwIU^TsaiU?4-Tc^ zQ5zxNn(J_xV5Q5)8CvigLxDl|V=_Afuq2bwIvjksdq6<5&!YD_9xBfhnrI2clGZ*_ z1I*>#mSvYjVWfHuFte!b*xn3I<*Xq9Raqak+*ZgP8xx|Vr0m2A8Q;ZmC)eWb+2(|M z7s#A(;~ASbiGTVz+dDv*WhMO|BR3QM2fqFfv)VpLWB+S3{?Cc}-dB@{97ct&53{ckFu#gX7CWZClF*QSQwzQNEen1q3Zy?=OHK%&`QW z)*V6&&yS^A5j40NxF``c$l3ZBik}Y()e>hmB#McCIS2a*?=6G=7P%D|gnI>;<6iW+ z7^F@nX~Zk!O9){N%8v}2&y5vkIF?W(knkGyOkg^ZQ_S-qgK`Q%%6cB zUrH~s3aDUVQ8Q6$zkJaM(e&2_0+S>)mqlK&6<{Far?^Qj*jy`qsoF`N&c8Wj2jvls#-1i_V_i5%g8WBVqwsLTRV5Et?LtXXZin)cDEu>5FlL zgSwzMj827(4ZblPeft}Gz+*F8*J=C~-QJ_+qZuQ~{jk0r>({q-&$tyHm&*9`NcFp= zcyg>e;fvtPP&z@0_Xd=CfSa3F4|tMB)KiGE%k-&-- zis@Dp5U_8V1X)KcQlt_~8|--(@#}`utI`q8e5RigMH}I@(7c#e(C-o5IP|rI`rK%) zj4_3mcM;=+56A&{AJ(HEX&pDAR%k zz}#I6xBx~=X-mvwVL|3{_phVXzK-s^hQFM(%JZ7?PkgM zy!YOpR_ukxf8kF4Qh$}{U)o>&C*8?E)M;hp`1kc|e^-^&|BbOM{=Oo!R#k9j=_0HBwD8%fk)|FEGm)HVRBz8DVrV)u1r#gz0<=W#uHv}33Ocfk=rgLI z+Y~;dS35C}!}K^adhflo9|DY&#kSkfkF^po4Q1Y^5qZaSz7q8~fbl-=E&^C8=K z+Pxs^Aw*zjARGPNgD@c(38AJ$$?&7J(KR4XH@~?o#6r>GA7Imf!?;#vkj^Us6sEhYVm&eK8OS&uv1wf}-|M*2cIp zIhYzn0at@6owDho#L%v^`${3OVotwkYx9ZT6N0yhg#Ln)kAd4y;LVz)?e%UeP~K%ZWVlmU5X`{RZC+xfW0kUVNn_`yvv zM0?-~ccw_fH1#+w!B?pniLoOK|CT=S8kf(dfnUGne}AQxiy-+P;mDnNI=dev^bYv> zhAN>|9ONdhlwnp18B+)hIHe&)c4m!h#m)PGD?&}n4&>&MV zc^Vb^l0XO6Mt3#2k`iX8c*eRM1=jf)JETp3U6w9n`hEKXJS%(Pmq+FGi!yzUc$~OF zS(HPJ{b<@Zhlwj=LtT~dip`{Ck)gOmnM7rQ#O$kTCz^0NtI2a+03=V8m+2&F#OV7- zpQ)&@DH#z0l~LU=fsgGeq8=9Ep`mG{aC6@KqbMVEotROxFks%1MJy)}O>10-a*V!) zAyx=C*G`vkPfbWamS-9C@|wYt)a=_c-&Tc8A$sd96DFiDshZGR6MocUOfm?edR4XT znpnY1?#Qi8GZUbWpg?5Zn8r9gsqZ|RbkICObJ5tLp+ecKV3c6IT8mi&5l=Lbxp}MQ zFwAXCLmKgwz)zb>)9Zn~^IkiM#Ot^C*ViM?lNrZh2P#)0k30Uf6!7mC#XeY{u>KLc z(fb95um4`Kr2Oik*%|CqszyAYASmwAZ)SpM7_K^}dv}|Mo4N6LRK_(#kEOe(He_Ka z^x)h}WHfYTlOt>ZvtE#DVTlwSj)j0JfDFksVn|TPq-|E5^f;hB+{T+1z%AVK zBJ_yuq+L4F{tSP8D))PnXu1`8W*YO0rLj&U$))xVXox~{CtGuOH{)D|v#o($xs>fr zBzlb>rbKOi5oJYqh$UxM6c{}xpABs`--h+Jh7Z>nbqgd#JPYdjT3xHZPYS~JsAJ10 zc-GVNImt7`HnL+S5u938RY4vXF2((%R5MK~5Q;Y=kq-o77bEiclYmt_(+}lZS9(=Q z6`jdZG#cuI+$s6xO64_jt&j(|9k&PMw`(p8fiGX=Md#UCJC{in7mZfxLhFzXW0?7p|G7Xyf7t&*<^Vq&;6?hKzC~UU>hmCb zW;A(d#3qT4D>hrkrDLjgMhsSAOxtu@=C>E8D?XU4?Ur9egTK^{`&i8Mzs~P}XWRUf z(cm9y%+b>`{(*N>ud-~7#Rl)S@VEIDu&VhbNk=!!2yhx*EQwNPw+kqdXqB?&oisGb zw`bU9Ds_46!6GE|*p!sr3=We$+jCHk$V0jiGk{%SSEdIm4s;WPH13y0Oj=Zw9S-UR zyIDilpnP!)1GTGKogjVynAxcsOdNWegRu3QFGra33OS=|)bBW&)UG~5rfK8)8~N<5 z6r_p=D*LgW&=%4@vb@VR-R#4;f<$15r$_q zW3^4RCvi?meX{kuX`yC6x}rX=G@-SE&GGNivpRFpNI~BAN2Ry;-x&k)S zJSD<$dZ;S56!cVN)WRoqVRaGKWdq84wu)y31g4`uc*$|tkSobKzoFf+^OVld#xaMF zWGTXC+_u~Tt-moHmnZsx7G5b_h6EbB=?zRV#` z@RvOM1c!a2mY26vy4PgG_gR=)L@pvLzW6Bi*NpaX2M=}x0`|*q=r0wZY0!u(1YSd+ zmiB^v7Ff?tHHxE1R1#=h2NYnFIBk=xyhSLaU(|i-fFd&AUf*l}n_i5oVLa*+!AvLd zt2*KY+1Rlrs^)+T;nHeU<0|+*L#c!cH_H8&jD9eQ7~1$h{^ZPm2{>Z@7XU~9TwtLS zu(q~wbiik1_}eq0@H>d{+mZh4ei%Q*2LBLe^5b}9KZKov?_a{PMmKu#!uV85l7oWg zEvfsPib9)o<8$7#9O4!H0t1mnYHpw0&f6bezxFLiR)#@R)p%Oh}lQw&D|eC3M;OCsA3U%*8Uzv3lA zRTBMb?gH9^GY94ceBtVurc~ylI+`ryqvceW)y-5=om9_AYqz2+OqhImZqeahtN|4kLIoK9#zYAH&vYhBcd}E9^I&S*5Hjn3zwo`DylbS94ys zAdRvGT)%i&{u0FXvA5`dorV0qPwzi0^&f$_{_|n^ZP@qkAC|uz=}#Y)53=$f9u_TG zNsC^3=#FRAgT?OL&(68*3j(d9fF7yUz1e}xR2X(G`81aA-u76|WGOR#K9V%@RFw|N0~HeRV>x30L$fxAPZPW&bw;^*Odgc_F4aexbz{o6ckO5@_oL znb6pW6^|FLYKbf{Kz46nbcncM5ss~~t)b%_ZNHi^{xX(r_@9AhvHt2sIMmgt&n?>k z5tnFnVO5{i1NIR+t;}q@8K49`(4rS`@^9}A6l&PP70}DRC(4Y5{md!M6eBF+OdxL^ zsxgJ%>^rjx&L;0CJ{2X;MCF7RnKD2Fgu##XBM;8b4$EBy&z}_p%LR8o5zGbvW`ysD zN1lK)FtHAtG0Opx2j+1mnEC{W5vp&BVnluBJ`$zCN#lqgo;_Fr!yL#DLWtpyn9lYV zmpEfa02KFc@9qg(-M73sv;ZXR8PBA-94;yEk*FQK0~jXI&`hM;bzgh=+0y(R`wG2F zh#W(LNLkkLu;m=lvdG$B04Y+Un5V9hz{BC1DwDm$&3O@gvT`ox{;l%f8g1tRA1aQ% zA0(1UbHDGQ=D5xBYaj}B_~o=f?nOYi8fC9k*`+XjLLHJcf@zk_jG24pD-iyJv z4NlZ0`X?#d4QpjbZPZ%r0cP5#*SBI#gHW2z?}+!J1_+xGT7+?%VK%%!M@Gnv>tN91 zE``ikTd-b1mKZkhe_>32seEJp7nE{^SN;QbXTxqtO>F^r*woLj0Lbl?;PoKdvj%J=LmdI|bi52_;WNDff@ zc7a`jNmJ!6l3drEf?O+K}H{{hf4~9;5me+gcIR( z9{M=iPE+9}hrHX+fOJ%Brj>bCAsLRK(dOXR`s3mKj`3F{<5nH+?ji}-AgTCV`;7S9 zwlBC#_C>9Cw=EAWt?E7OjIF49cCg!o#7Ziv;~EC2%Jr>FTH7`Dnyew^HihW(Crwhr z&0zr!q}deThfS<*vgz)dSz4w~Z3{#C>2JDU8oFPWa&X@S+v?37`CG+|U;$o|oiw6i zJez-d6_yxTIieSyPA#0i*;m%TA)P>UA4_r_w4VjIdcBrw3$}?=EtwkmqoX`ofg9gA zHqVN(tupY(G#nM74LBMVc^Sd|8#w=^>yDVR%-q*XJPQ&X+(5{Jc9%zKoK)TyNFA)?5H8@U2QcXq+|KM z#LV&ivq}jM`L!Rnzpn%MCPKYvtblO5P-@~{gPP%;J@u7%74W&cvvV_z@w)MO1J}iu zUs&N^Dlh)c1paq>!+y8Ie=el`XClM$TQ2o?S?@o>fMRF;h0;loik3s}$Hw4$)fKVT zX=-AA-MeAy(}@YC<@%Gs04CU^q7(8a-`9tGkA!T(s2LfGVV?U8kN9-xcTQHd2MeIW zu8%!@T&S0Jdk;gZ8xMg226kHj*Fc^M=?}3`YJ`jNO}#+f4|v=Y@VgJ#>lANavuAB^ zC=Dt^;w+(fNvv5GyAq-~I-J4}yD9cS>Qga?QY(@``v4~U38}FuAJZT>#EjA)7g-aa zgT-lfGfF?pQ%1HttU-TWOqEr$0D)8(QPW z;EVIoPg8FytIW7)P?!&_dnWc2t7tAX2+zEa6$ts0403G=aM zdLFsnJkC4D`eaCB<8}JnF$EAOl4Q9(X1HJET!`X;)L8VDYsl{ zNz}J*>}|kadlnU9D5@fCO_WMek~FhMCF>>kyWLUSyv!{McROzB^&`c*9n|;A^+}wh zuI8l)s;V5$7Ns-8uV3L81QU9_kO!lr>#d^c(RA4DZi1ynnkQ$swourHM_6!oj?f=a zx{M!+#jIY?dr+q{S!8AmeN{FXCRN<(R>RwT?Gn$vOXGQOesaET$w2V2L z#17c1Vvs=%w1TyVg1tSeB$|01>H!hLpqZ1#>0wgjwZXL|?t=Q99bpOFc+VE{`2 zMugJk1;|Ui(Wez=c~AmKkb)d_o%U((M>{MmNm77dh32ejQn@Rrzj9~I)>t%(5y5pX zGk7`c!44OD0625bFc4(5Q1Z>8)iInBf#hX~;!2!viv!@TsokdcxB47|2@8O5Lx9}2OkWDW*08=YCB`CMq;G#XS-Z1e)1R?W=zYZK4v8Hk?4ssT)IDZ5fbw*|!29iFIe1RoNoI)m`Hoqho1){kKq8WYDVajE1)^UG(Q+agNP9+wLn}*0J zuqBMyms_y}i<;i%mma{%0-}=+?ORQ-)t~2DT_I{~z_gl{Z~+YD38Pv)y|*31JBzR% z%xE^xRcm`pZx@rpOp=ige-%nxT>tL-1ymS?gnN&Cd%3y@t!pKom~sFwap*_GkeYXU zC3Cj`>WtYfjW5y(xpNmxzdM&|U!+EnYN3_aYQPk9Ewbq(bQ9FW0qOqHj&wBA72En* z9R?ngA#5cqDLd~d2FS$4x$jTZ$?y_zpRt0A`r-v??c^3Sy=2u^PYFuKn6Q9r!Z2|{y9)Y}Dzfnmu$}!uM#Be*$eFDYr6*f)6rg_- zM5hpbvjn{kA@i6ClPJX%cLme5Pv1b|2djn z)iAk6jCC*7DKGT01ciyGCnXneQks!sN$Z=qb0>Z-)Px1V99~d}^ zR%=@ecYt?bwr9l;d&X0qZ*EQ`-(nS-&7B=D_{`bP!#Vk_;cL%cIq}s~YSTmBa~l<2 zNR1Ws&^JFpV|sC5bs&uRr2Az7riYf`O#z{Vxfa*2A!SF7D%=6yl+QUjm}Bc@OXj9l zJy3Ng(=!H1yW+O*mOpR!4j9%f#UUzeyilQpy75IKqhj)g;u>Q}7!${*Fk!9Ag=SGn zfe4PR5)ydGzpNVQy5a}hJNmM3b(_^SHJ*tNtf|;gjyW(H%Ce3Te04S=@j?xZi(5%I{E!-9Flyy_-eBxY z%FVd8t|hT+?*}Fl)m0Sb_D|ZPmWr&W(v0CJM3n+@9cC*)m$ue8U0L!W49MJ> zJ50J)>ajGGEb&A#t)MWXGVs>!A}xZSYa=EQ4a9~p9U$gqB8O{WBW7ILTV#-QgY-ubHZFz zdO%j4U>M@f2?u|Q5|UAT4;Dpv38BUOn9cxMP1nD=@`9Dp&DReqB%DRW()uCfK!H40 z=Vi&(IM3$&-u=*8!!mkk&r0PzAdEVTSP_<-%I0PAG{T~>?#SxD13^v%1RB=Ghh8-l zoG>Fa$6@khWpa$`$p%~+GLw|V2J4-Yo=I?Fhhi+}QUJE>RyFVgz|&@G6m>T0w#mLT z#9p_e8@k5EAGQovdVaRm=9+_E!#uucK-na}}%w=LeRELM1mU^n?`6gV{{MDp%tcPegQ^qz= zKzaKyS>*9bW@21}Fc(=Pux|>1`OErOZdbso@nYn^u#~@qCw=J6{C|&se`hKG2!O=$ zE2-QdrBUY(OIf`}sSV8fGS>_D=r{*#z*KG-M9v^*OP6bfD zxy*Lr5-le#KU;6y5S^kTCb$J=Ks7k3V=3FGm~o#A+$0g^ZlPMP)N9H+g3^fgjBZ$L_kK76DH3z*Y-`;yxw zfn~13ko2{R$W`BS0YBwTZNKOo2xf5EYg1npb-Cr7kZ+v2E}6~+BA8sRMm&Czei;6r zpwnkGq%-fhOyYi&89ay^f>yPMtT()y4A0ixg?Fy2S6U~074%}Sh}_R3FZHFL$Lp!C z!sTid`_v`-11knVTbN_?=P?6}Qs~CjfEB&`aY!J=9r^&20^?BCgb_}^r)Y_+3bCwtN52CeZ9{Ks z2m8vWKmwC`Fuxo=;FlF6PgO z6}Em5A(9mEMquw{JxWs?lf4aH@0k6gvDzh?M-OgHkDSe5ioUY7f3z9azXXM_{$GMZ zSpORa``h9EEN5h(XaD7fX8XU1$1JFxXzWG?U3p{hvAK>5a#o0AOSjuPIV{B-c`S9r47@(<{w?ZbUQFx>6agIN37SwsR15z!sPgX;S& zj~Z~&2!b2{3YZJC(c>d^3?aWmKp|%6xW9<;=Y6j@=Rarxry;OcThv0nV7zqvq8pwR z>xy2B7NVAMqrWFOSoVWi7dH?=$i~&IF=%m(nYg<-kNL;0P>9 zHz?uzm_Qz3JMsvu`a58HJyWi4osf7HzzLk>UI-AtfBFB=2j1zj-tDs8w|1L*P@aGy z623URljF19er~KZK8gM9Wmm0&iMi%Fg_WwR*FKhM774~rYQU*1?I_X(J1t30MgjtG z$P59~hEo;5N^Qs-;G?6u(T$kh$_;=&`BhYc+%5IZoEsXSFZ0pu2yEXFmU_4Vqvh0%B7N&m0j`j~Vi}cy@Sq`WCaF(p+6gVML-a91-m}> zc{I?qqDdK7&!yhF%is}NQnuNkonG3$El}(gz&zy;-p^jvY;M#*(ZmSd$vn?^M#*Kh zT0y1LpgiicSOs)=#y!^N8zf(b@PyxH*1<+(1c~PyzM}PTka1A7f7|SO41Nk6 z)upcmLfMG1i)onJ0`q{64wb=gNf*W6bIi~;tY0r$D8({=#a>_7h*{-jK}B*-9Ws#L z=@}c81uRw{B1obAi;K-o$*(;!RSOJ%8rj{8uJ|yAHqSG4!TwwHCB6skH z%jQWExec{-n!Flo1;ySj;^ZQhSb%vZvKdJDiah5WsdoNTeJdt_VR66W$Xu!Z=jk`y zMy<<)nM(-6pRK_;4@58gi>HlQCdP!D%&7ESX`Bna9JwseqFslHoYs?Hk2jbm!!D)A z0GB-{b61N>IG!DsY*KM~GA*EFIIE7g7bqwDD)}-iU{|q!KJf<5>2PBE=K1vnj-oo^7la(vzl4AN zn*;klf`768H~j0j!~K~z<@g96f5g93mhIC&X8IRYZ@!<@80(?i6|XMQ^hYRG;FDBe zs^BW^_GnVGYS#JMKR%yk0YJr7TdIpQ6+SzDGj5soVM2oT{Hpu&1}}vvptU?b$7JSkO@N*SR!wDM5 z$|QR;#9(sjC`3X8Q3EoO6fJl{F{GlLZo;+;&^qIbIPj_6Rl=vnDAm}w(LkxkBKCr9 zMhi%@Luy7(svwBfV-E5@2D#>B>3~ShI{!M1j2uP(HE{td@st3;3-jZj%tJ#WbmA%9 z7@Q;rQOI@vjvw!@b7!^S80P=@#Erk>zkfnc@SZl~)p;905W5FDB;XYCy8n z11d-HkG_IyJsriJyF+#)800|1?cPmrn-oFkX7bcEEfjG#9&4xcyR4O2)A})+r81Yu zj|<3e4^U7yWZ4Yz(t^2WGC`u&B-GL2TNL4)g3d+yCCFnFQ$u8%McI>V%FWpgq&s7%i#E*)&Tk8O&bfx^SY=MaK z$eFD886W&Q@7M@_L`C!6bOs86Dky5zYbiOE+jp!6zInW#k%Umyzh2HBT?hEA%rUG# zmg?@HDMPdgbDQS^#pbDN-;z*VNNtXD$Sa$qwK9|dC#Sx;$3F|Xzt+ls>>;IE94DEkL}rV1Tum>EHVMx@easn9WIX8Q%9@#`mi$&pqc>cS zKA3q_<2dw^cx~OV?s-Z2asAE zT`BWo2Zo<(KHkJxX5<~XzDhD3V;TR5o%PUzBJQL73X4=S;bM;4#wlQPRdBiwm-RX> z1kXeN_%p)VNpF$A&9{+qtwcceZ|EmN(k2(2dddUEqtt6b_Q zU3^_)%6XOKw#1du^>b(nj_^@-2+Ph-4EZADqOlU+|lFhTz{!M~D%4-(46vw7ZFMb!~^*EedQ@xpfw8 zIDfEg;DD?mxN8pk6Ral0SljW_3r4hL!nEM{xE^K>#RyF&zq4Ci0Pcf~lJ5YI^`&xK zqci+J=H40#~%2O zEaUl>4V=Xz7R{X#6lu^y-ifyfK7Y~q&Pa_GJ8s>zqzs>ZcD!Hou`lbJSaW&S{xE1Oq=`)m}jjH@Hx&jwy>#5jDtb(sDjz1N}*u%8enWC?qnIy@3y*@b(K> z3a)}W)UCvZddrentERZR4`xqV@dYS`pQ@-0u+x<(kb_Ns}cZa+_%#HhkL1)8& z)tXoHioperX-BWWI<;Oz23;w3^H|pQUHT2UeYA#u@&i2420dVt-JEFoWF^$3iw2G; zIMpe{4NB1+=4PFlg3RV&eDy!rQlRT-Nl*^G9$0HIH z7S+jmeO_fT;NmqN$n#I1Vk83Nk$ioxhFsUDiu{4-)XQ$Yg5228ZA*G z{o!tQ)i;&|ByKNIn8qm{*i1yI$RI-B(qR_C{{nx8Ml3NFQ`hM^IQx^{2`tHH0$?l& zO38t4_zJX@8RTvq8Aog<5bP^g$6&|-QaL4@Rutwu*J!Owm?|1kZ3?D5oX{woPa#D( zFkG-fJBE^5YP2{*yyxBGB5V`5pTUTjrJAy11JHN81uNAd(NHcoh^M1U&9RMw2*Vso6&M?oD-{d?&N~; z9gGGJYOXBU>hkF&gYMWSs+xO_a8njx*QUKxU+pd+p_Y!Jv9eM#sr(QkXrwf&v@-3c zalC(V_o2mC3G=?dVEu_j_YTRaxSN!V$)(h@4P!QbJ2X%QupeI1-LOFS!HT)fB?;{^h^L;G|Ae~xghSWGXg4FR*r!J5)+ zb$o5_gqIAHk&}*foG_eH(n+lwtAHk0Qfv$K9KJhBK%6gi1X3DImmz+)LVE3L7OodD zX?mWdl{Ez&F@tt{V;8MlliFOO>5o&n9ou|s3Z>!$_o=uRL7Py?+N!Te`~Kp zce)xvtnvg#7A{VfI1WDl%8k298ds0uMy{0|*BndBu|dI@?y1}+1bo%|Th47&r!8^J zTl`_6rNf1_fwza$Q229Kh8OPvPHc}>`CkC`Zwb3>{{Uh4e=3kaAFKX1IxpL=mazP= z70d!`1?QDbcFyLE4cp#fML-~g(@G7H7Yv`7!j{2UCnS^_UY>N8hle!ntmeL4Z~``? z+Esk)WClm+ghhrofEDG z{@!>vJ;XQ&m8lRZf%h<%obG}XsMp~^Ak7F5C#(CgS4PK|aG9StP~AZb{^^4sCcnU1kQ|qr$6@*yE!CVeT*xA+kIPJS&wvfg=6Skh&J?z*k%10J=duL1AfbSw*2#@$y zOR?7xSOvqv!s%x0p0dF3=ISqi( zIZjh-Vr!qARmTjnSsW~>rR`ax_IV_R1JT5rj%F46v}Rrx-Q zeS!Zfx?0{b5&=2&VW1~NG7d7n?{lfNvFR~S)=M()n+eO7hrgng{clOif0XF|ko3y& zBlLeuuRnwPU3z6__*MT>MOOKT4PhUUUULFeq+jEU$d_hxQw6$b5B*XiEvdUR)ZrVL z5lB}RdbGpBIK3nFm#^;ObjYS zt_Q6ldit> zbQ)o}Lnyq{h>My|UW z526H=PQomIwS)8=b`p2E2bLyClin3(HhJUtE%qJdZ_oe_UT`4hYLVf^rWHI(k5oU} zr1Xf<3Yw_Nog<`Zv-K<6Q+-<}M`&wao5ostI?4xaWEV=H@O{QTn$96WehsM5+7-9} zHD)2$b0QB)A`lq%GN+}yZYiCM7I2_0nk^|O`NA7o5|4U-#xhV)lD)b#`bseBsbzFR z!1ejM6>ntOQ?I+@tlor~s;Z$@jdoP^Mw0@rRIl_r?WTY4^5n={M}QLLIm!M+2XpYr zmo=~?WPwJi49j`KSq@4sa8S0R$D|0qE+-({AC_ErI%c5Wf`~e-;zJaNWTJq?{{|NKa~{V z%LQ-+1AJjNFNHB6E+@nYa7-oBjT+!7Y3m{Dq-k0Q+yLn}8cU z{y9PbV7BZ(f&Js>-vOJA{lAtW5d7P2oS;7eJIThwGne+X0E)$(i#&Th?0;1i-q~B zb^{G}?8)j$4CsY!z0uI_<1oEN zBnn{ii{P7(4Np;QA8<|wGRGmD3>p(cGc<}E?j;Haqb2;LO(5~DFeqqc6pyB7+u<}N z6(l973C5ArU33ENIvC7MkPZROU~|Z)a8JOL@XTKuUN^25tlhwX@QzaF{e9{ixGI-J zpmS*w4qZPMcC*D07A>_qm1Y$;Zqm`wo84)}$K_xJ?2R0kZbriwQ5OxZm0M9|E#$1Y zI*=W2+m9!x62)`4T(P8Igk1_Wi_^4`B{Eqw_~A*GOyqDT8@QF$Y$*`9 zQfsN)opTM@hBM9MG1Su1>U|QOUk24sc55&5T6kXaUbmaP-6wCIwSi74+mz~_T4YhZ z0|F#s5=X4oI9&LFFFPJi11sCuxYw}=IP(CYQ zQ4DM$nPSnd(Klb7^sV{)pxiA|Btqg3D$GlG-d9b!-@xMQ4$(Ba5 z2GiihAPG}p_T3cdqlZJH4pj8<*y7cH`& zIae(}J`LU%7KPpVs34?-EBv}DMbH{pzagqY??r>s9+z7%z!N4KkXG;>$1{JmPD)9$ z-iFdLTib5_?U(WqEN*8}woV0k#eoB}Z=)%8VIi9+S1K;#?a(L4uf;F2u zSQ^vNqP<>}uhqOVb5Ku4c4C-(%q2Lcztt+2cm!?M6oS%+ymwEChw;_JjT`tnYBCUg z6Bz%PoM3qtcp^FBAkZ*carOxKl-Lb<}7 z8Q1oOR3O&`QC2p3zlZC*0KNJ;M{y&5JEpM>@s)|>YwcBRb!NOz|sdLbN4PUc#>#o%#L5D3Xr{n+gLeBMw7pldH|l!$2J0< zPfP_Nw*`9xo=d8qs9g~xAa)Y!ftl^3=fIEx3V%y`2@!~e(mg>kLLcD{=!qdtVRWhF z;rBG?oi7^tKGr(T1K70VM(I~I4UMvpCiN$ot*!-`Qa9FL5k^BwOE3A+dv!zz9Fqny zYMzDRKHAv*PwAKdG+13C;Gh23alPW!M2qwN@Vn5% zucy21qtWfv@t1uSsE;R`t^U0mGaRevV}wz%&YIJz@J$#_H5yVLnEOeIs10?78_MDXCIlfE5Si}?iV zL4*?!7A{yEEG%1j!s>?k@~dCx%g>WbLN;o_&Z$}^I_R#)V;CW*bv~^GD~jY}w{uRt zgO5&##K8-uncx6b9GdBQ)ZM&A4%<%`g<4Bk6Gn;#HU~$DmT>S3>8xsZ(UnI)ScNm_ z%UH@FZCYGDTs)b$j`4f@GH;tP+`SoK23v{rEKtig&+%!J^(7rYU8xox{Ay;)g(YQW zbg9X~EYR+#B`0$fEq`sJ-EaRLWgEAg8`p;WdJxf|=zw8k)ZGY`Q27Ay7UaX^ ziF-RVJR>@d+qTQ{wX82UsGDbFckMbQZ&&#VLQQ+{hi^c~c^|G%%<;DaXlT|lk=;%Q zG{$OJ+~5;Jb>GvW>!I_%ArH#Q{sjg7E!mI#pCtQn{;Bc!Gq~ST5Gz2r{HvSdoovjH z(q&(545?(`Mw}1l=1X|PCx1=05>Elmf<6JNc3J{A^LJn1^`Q%FbcH@7}tPVSSRJd zV+8pyI(R&of`1at3A=dHRZBV{d0;4M;daxxyO`w=8D)i&M3_H0Z(b}66Z-b0M9$NY zma`PIi!#9fe2kS&{zd(PWI50bg-K&7-~anmv%jrGQ}$D`=Q$ra0SeYE?u0@2YUYpxPjdh6Z=@h!)3eeb8|A5C@)EL6!aF zwXdWoHXsNotSY1WifQ0Fw4RZE$lbTFMFTtEj$u!`n;5cW1ZvRs%$MZQPAnrrVI^mT zr(@s99FL5cwJO(>>crkb!Hd?17~aKP#m2oybks4f{C=igznI|UBoQopWzy9{LDpxa zvm@*(7<_RNCp=QUpINisxRczSCO2yO`fB2nC8PkP7T&|R@bX#YW0Y_ZuhhoVm>ynDL=FaY8wl(PY|x@osSVvkevoQEU(-vPlW+bjntp0qf4qY4 zJnT*A6%5RNd~r0fbtYi>FEg~Toh@Ju7+|dvE5IfB&pEww{^|7oGq~TOiTzgzJxT>| z-^kCgf?K5I?4|h1S@L*YJSp?EsZkK-NJAL=2pg)=pl3kOOU{=(nC~MA5T$;YzWjCzjQ<6{2&3@3*gkjp zi(~&a?-NBE7z-(i#8?GnJUll0COVRp>?xsq1uVMQvd@()m1FKRn_0# z`Hed6Y{>y;hrqZJrmT=B4(QC<+3}UWVWyf&Ylr_R_D!2H)e%fJI#)iWX}zjNvZryi zs?-##UcGuVB)`;DbhzM52a*7J-mZs{CG@MJ0*sg4NEAfic~E|8->y7?RWe`{lr{>! znrTC9N$pG}n}eDj=lYpwnWVlADpgg5vtRfsS`f(M1HoYIQsAz5s8uf}Rjo$5Zcd1? zwwH2Oupl)JDS|cNX;DRP==^Rvj_tT*b;mx0R9G3_X7=LPOeb30qqV+xqr=wEDCnvM z*{s?vNK-fmQl?Xu%r|V&JGQ=xDKanvs_CQ4nrWd@?n=p%oIEYJ{U_GS5={#~ggIh) z?k}j{@!qa$)k0XzKO(_NVDw|fl{W_(kgv>(PcTkFO2rVul>6k=!!t^Cq*1d8JGG`En++=AqV+aZp29QNY)%!J8$HoLQl>4LqJ316w+M3xzNE%l46s%acB}Cu-M4#d$s36yzXo{8`8UDzq9mq*GT+!IB)V5|4rQN+jz8|0P#S~G zxAl;=`<~xtyFu#3o0@ZdS3D`0gwLT>@XZL%>tiE?y_tT}IJY{-XQY9F`UO4wEphJ; zJ?$T&+5;{V{12VrXK=rx2M)k>2!BboQ2^`WG6yVR8OO%-#6p>b4)0TT}L$vwo(4j-9Vec0EWPhXAyaqSl~|oZ4%<;*@tKd?FzI~YX~$VCIY-e zMtdyTJrEMJq|arNSxI;j^x+0P&av--hWOLlnml>@5OPW_KE{WGp2#2oLF51kqSl@& z{nNM+X7l~qOGQWE=hNz_;Q-BQj6}sZ;o&q=MmQ;%m8UwmGPjdJG|1ELMk}o*%1}pN*hU&jd`Ic0DV5;s!Ybt`^*4a>9IY9WjGe8qdj{hv$9x6-=(!Y&c}dgLTvOxL;EGALN%BDQf417UK1ok zt51_=nor*s+J7ZyFY4c7hyAvH**gc8TDtm-#GMkZ>ejH%0a{jQ*1u}mfaTPyF&X}# z#o=t8{<0~}04bcy!|y7$&v1d%n-^$s*GmMeUUQ<{-d%zmYL*_v7#-CZ5kTB6l&?;L zv;}8&SVK>K=(%zXj1Vs&5`7Fl{$&#)VA*TL6*PLGWEDpH-FFDOHjgCu7$EVx4^oE+ z$s4WkP#sYNmdT^!$}U`#F>c@yXvC!A-Xlb6x0ANES-ix+IOGSnqB$+L(b0A92I}?} zzAjef5q2cRacSqGtSRfwx9CnSUQX9p5jSd?a5W`)(x-8H_k-c$-SdmCX9s*If=k-L zA-_&uBZiXKo_-&)F3R`7@_=9+FU0i=PWfBfBga2Ud*u96-~MNCzvUFhU)Z64aLT_* z4yJ0$(My}h#QaYo!F6z%4G3cl14A2M(W#bYXDZL7dZK{9guo#l(s{jH+mWB~IQ6%) zK!CvJL+WrAN&2|I(;LFkkN`2DA?5=L4?ivv&~8HE8d{GRK;It!xl0rc2IN`h!X|g^ z1CC;tMI`Vcm)VHyiOP0L%!L2?gLi`aG|A9Ro>P!lZk82p8(qGzLXlvYxaqO8U>Vi+ z1a7!7Yu=$<4h~J*uraj!#zWz1M-tV9a)Y}@8e{SN-e1GpG$#kIhDlyO=i%TQO~(ep z1`M3LCxm-1@3|C6S_@o;ZAs8dP~9`O2bJhLn1c;U!$Gl7f%&;7u*bTnPz6nyFNc-* zxe{C0C<)Acl%~s`(0};i7)CJ||5zd@hVKKI~E0T8O25ZBb58?F|^x@+od0 zhX3MxCwDOZNa?wkF`a+EW4@96gS@n~=Mm3eT`Z=LjuppQVZPxhVXY=<}W$;VO)1ActE%pHn- zvHMvGgngDuN9jxqJ&|@aNsW>BoU$c!lysZebUT86{61fN4z|m?qGhzC-2yjZ!F-Ba z&%rLgKDl4JTqDeT=s^5}KK_;j$?;E;AUXdeLH-Qxcl5!^@hb`Poz9Paeed_xRtAls zGx_fsj+BdByfjM6MQ8DdR6;o@l^L)(H1E#cY(k=yiX?#-I`(n0jJThpF%+Je5K~^} zY(&EP;`X&VLqy_n?9xdHi~%b~A|(z`PY`8jZQBSjvSN3E6~o4=$1k7-&-uhxzRs|S zTEkFeWpY6@#jK=L%0faUDO)d(9?GmNFxq-lbS*ZI1Tww7!r@2QPYm^-q#!2&rq@Uw z&bZs4#_Zn_tQRm5f&z!;au=R}XwfIcpxEhFQ&0|`1O5m_iUV-v!Exdr_y?t|gfMx2 z|NMsR8%-kjv$8Rh;JaoQh$JBm`lX^<`^vF#!Fs8*al=~eB!1oq54kZ#PQjV2JglRR z2a{AeF9jwblRg6ln6W%yoqFgN+;>=s^WdvCsD3kO)nMbk@*p=x1$UM(RkV(L<$Md2_&8QT=jnbQPy4p8(i&=0@VjBFT4r6o}1Xu02rQgU=NU%m-m*T zf}&TlW{5|(RV>^7gx$xKPMV;5{I#OvP+!5ckhP~!lbn6O?hAhBT)-iA`-c>K^hjbB z;mvdszSRt-L0ts1NrWJ|Ui&gDR##=c`Q_KTPs z^!p{Zrw&W4IfSZ;>uRpD4Q^Nao0H{bo4uhJCrx!ns?#b8rg*Yu1oT(CmBi`B1AK|l zpwwRg>~9Hdf5__pw>AI&i26UH`7NRtevyy?1Jm&U=WE*&^qV7o3vjjM)O>RDzcCTgcDEQJpy1w2tujfP_G#ZFrjG_ouT ziC8RXAR7tTL@2nKL5Tj5LlIc_J;G|A+TL38hatULNKg$=I-aWG)KMw?P+ zvJIXOYj55{4!OEhD`n{OEJybi#C}w~n!@Q=*!@g6}NEtzp% zgj^zOZL!1oW-{k&>5UYf03{}4F=X$W|4q%*LI*t+%x=E?D=PoRYn|`~Vh_sLuPqw)UMqtoxzRn~Rk?F4orE z*FePNu)Tf^Mg(Yy`KH&dYAjy^l1)V<{Ft0ha}(YaN`xgM<6|hAmVM~nnB{W{U!CC^ zigC%}hG{j@;wxm@e>Xz_rpzcBuYX&M8(ndVF76JP1#BrV)HrmSyC>R!ZR&~Wdr=8z zbI}@HXT#sfJEl@&iE`n!4!>2$(d|-O$;SOY^G)a?44>LEsR*4)jv+*kAy_RarScZ-?fPtx+w;C>4Pj$c_>-f8_vEk65d z>44NyLGK&&SZ9GQt65V2->JnnYV^y?6Yg@A;t^T%n_IUFw`e~-Adql9a3aReTxbeK zj;r%2JVGUrEx!cFKq*P!bR@9yV37FFo3aoj+nC6dv8a?`^Elu6j#i6&v1y`>c2s?D zFE}{5-|NpuT8MBkXe(z+aAj#=F%L#f0BcJaKgFgP8|<;z;>yWtzzkWDqj+kES5MrUtqQMDcNW)CR z(Ibbx-1Y{(@8Fc7MBa{=@?1?GxPx5c2;-LD*Gw!CAb@oDq!6p&Wf2H7g9 zR$Z&cj|us0Hn0J9?Y%i0cE_2J_(HMtg~L$Ccp05LehmDY4Yqrjo%tZyUqI_`2}yrQ zyZ;nu{Yhv38QgE71^BJM2uVMdD*|%NkM%W-pZ$+v(DV4}k9G@MZQK;+LL{g~(gUfI zbr|Mu&$%0fN0rXWD8RiYIQf|I+(R)G+Awx-M8I9J6^R^n&!_MS;z$Pl5= zpxXU;{Xh51g7{y+YtSKn9Ky-sd=;KblSgW-W|2i&1|BKeABM6eZZwm6+v6wcx2%}X zosojwIzT%K)>PFX6o+X-xX0;(FXx1Vo|By(E23Rj73;MY5MzwOj8O7ppn@SM`^P|q z5IPO$TWF7ONM8~S>IIC&pvX}i0k&;ixL4K2ElwuMc8rBK&{LQZ7cMc~SUW78-+pg;gw=aGn^LnWeFUnY;#Dnz^B#m! zo%Cs6^^kk!C=$(PevXLUff{B$WFAk}c~lTv&*j(Z4hsAQ%KnzL@`pnDPeIwAzgJ;L0ZHj{79;_9i7313z5?QBn%UUJUtw+J>ec#JvYhNvbpBIBD^OY+IzY-}`3nq^1_i&gFwa(_t z23~m_bdTNXQ^L5LnCYd+-6MeCFV}Ay6_ih(UPevgq4xN$yM|PM9iQTsaqeS4OJIpd zgkFLA%}>i#Q3rQzqy?#=b;g`s>qWP z3HglU^xQX#p{2FsvY5DecVl)xQy)TCX|;M&HIc?xsrn6$Tb=LfumOhiqBprPxU2~? z$vxgZz2%w*Vp|x^8}1bt6*YkU7ZCef^1~m3;Xegpe^M`h2KPINvHj|1;UE?1ANGTe zANB((`xmLL;w9lyK01>*I>kAV87gRSrQK>-nbwy(+`%r>Zcqi}!F40klj=)uz?9%5 z!5#t8P^m9+5Oa}ME7)fVSSC{ue+8&8z#_Knxhg@X`nGMj;rl=ew4r#a0mi{m@%Q)0 z_7On_p)1fR*6nboG270zCN zN?;&Qb`nh#>EFpayKHc05>@7o$B8AHahif0lk3eYTd^`{i}e#UDo(2>izPA?S8%>( zi9N6JES*=d&Sn@K&e>v0F-reXKb(mxL&&Mhz8@c`XpJdqLlfzw+UBEED9V8^6vMV= zM4!@?#`ieZF{Wqk%kLc2+1hh(MmdTb0DsZ;xwWGLO_pmG?Z%ZAP;3N18;G7SpLWdD zAL5Yn*kcrc$}^0Ckt)uhJ7=jZ#U~qz1mf6udkGh}#I}yo&YI<0@y`n!wcwVh;V@2dbHq+*(i_B*GX-!syCE%!c zeaqZ3aYkD_;H=n&?TSCaHAbo-XX{UPaZilfc;h$>Mu{9#P(^;{1CJ&+zEHj=fJSI5 zTmh@PQfA4G{pUAyTY79z-Lw60D6` zHiRiWsAP}nxTlZgE!C_w?nfh(9-Iz%t|2V0w2<(W?uFlJ(!?j^5j3cp9<1Kq#sb(R z-nLLDZ{tL*LYMW^M3nn(#~UQAcgQyfigDza6tc7#H33OOoY zS12!x4WJjTm-Y$6wnUhZuD*jkpB3_fP5BlpB9RbRw9i>6umQA5$# z9y|(#w4tvi5i-+Y(Lm40hF5FjV|_){#k<{@qvp6-SD96JZ5%fX(T6q~D;@o5-()u! z(1xnS0-E)+^2u)o`8@q;fq|~uw)snNtM_MDqB-aKE2u#@gUYa9dZoUM+a@2ycNhnK zr{Jg^^gpeRXeoUG`1&?14;ll^wKyZ~30pGEhJKs1yExC1?X%55$}I5*0BAdkNiV`&iJ1v%0GhpEzp0Rh?gDzSl54o zO{oks8gJs^?yrksn))WHna7#T$dHw_k8Nn8?wOZ**dkrTV#&htFrBy6tlsf8nj-LC znlQ{4O8s44ti+1P>y-3HJV}?4WGs;~5kanqzp8!A&eS(He2IbY1jxZObZ@<*zfFp_ zzv#OXprzXv3j~s!p;ISE5xqsb8Zu;JO4hMv6oW|C!5I5UmBA!v*HpI%fj6dW+(RQE z9L5&b6zuDs;9$YsQMqlDRwY8?Tbgmez~aMUC6heg$+Sk$8z{!foj} zI_HNX>a?Y}dtc*da85C(7Vs7bFjlIb5{;w?Z!i~S3JNP2XH80AOg>bK&qu(H?b>Q3 zXZq7$GHg|8dH5*uEk`@)T_UE0o2jy`;fiQs3RDb6x^^aX83)?<=h*5c4`-am@zuH* z&Ej;*j;X##a%2j;?ex{suT0d#6ZRC?CGzxyMI9E94aF|3wLh={t z5+YJMwn`j$xU>?)uFt|b!e-%*v=05d@U822JG;EsTQw1&-s6mtQk5)@ zmJru{q94G>)pgRPU-9lR5z4bSXPobw{vOd=Qy?tIorhS#p$1ia!&(Nw6*&+OUy?~q z%)z)FA*Ai!yft5@-V^*6oH@D0slF{;ByPMJahP}i4{DJ3Newhz@pb4%7p_2j#)w<> z+oRw8Q|q0|{BfJ_77xZlP$+ue$F6S53Q9!p^H87o!4am#lonY&@anyGd_6ipy}#Wd zdD=BBj({YRBpHmoXtvyM@je(SbS2>nIdxPrl>BoYzN0Iw2o;3}M-8(c8jWmw4jYA&Rte@R2`_v%w8^jkMFYnZ|3w3J z-lo^4UwbfgD>J58+cc0sM5hs#;p>Ak&Y(_Wr%HA~u_?R6!!n;<*E8F0G@vn=cii5G zXby&XMTdqWq5z{I$7$Lnv?&D(lakU5JmtFW2fp_fP?i#+Vn8L8w0tsyUSHF5kl}EV zGNUdZ7qXF^8zbv|ybXKiBS#tLeGvwh^~>chy} znw*~1GQD$Unmf(S?KYJ4{@$5+yx|j3b`A-T%r_#!71l>F7iyhG2>GoW`%WXNWbgJi zXY0jU%HH+sp=WtS5v5X3m9Hkgb6xeeXk3+41zJrb$0{8>L3SKnq%57^UFplW14v|K zs}N07L;M-&bh6&NeTuNYHo3;ndd8Xf1r7Wi*^3QuKfwQwH1PlB;yz}kAH4NHGmL+P z^gHk~0UV5fk(3MKU> z+k;BBhl_U!Bd277tdy(+6p}bW1{ulv0onBgN?sgbu@H zWZ>teZ1(A#3h|ZZ3pUqYfnt6MeviejLSyNxS!cV|!1U@V-BG0?T`q@sZzR#p(ZHGJ z{Cn)yBEs-5GCOMI<2P@z=FhurZR|pjcxqbLW6*q9mfKA}^cJ;Yw;l$c1@0-}uIv@7 zD_T}AMcJ-LSJ_J=PkO1pc(MVTce23ic28a3QsF{ZWDff1705VJzPGn|@;WZWLroCM zHeP}pA~iEXjr7STZI{64HueLRyor(b#ep#vvh+lfQOhCh72$BvFdrWg68U;lT}{4; zKf8odsHNcJ}0YvY~%7sDS(2MsAZmL-V1#NXIlt^2&OkrC7hD985DuMUs zC#Rejtk%{_qO$Foi^Gw2lMX)7pndnq`Xt3Dd%G0TG?|N?b9dP`#sU#6GuhT?1q7nT zIdmKF!`0iTYq62v30a{vmauq|?gtg^_@kZCNMlK$9HkL^TplgKva}SA5%WtxK0*tY za4C%Z_%;YqummR*LVbYIPmF^M)k{X%yKk(6K(R$&L=0IZw~BTkRS4qKM20YS7=-c3 z4kw8@C!&?tfm1#cY~L`U4xA=OEcclo;>YHojV~M|=9?f6@SZyqQ?X!lh{xT;Vp}4$ zmaxcmRetIaypDWRzF=&K``yH0*lMa#g8pcHi2K>%6A)NcUEo_h?joifH)U7>ptRlu z6M`}62rT-3aD5)%B&?%PB;cVm?*-BW@Hp|!yMVDnuLMHthU0LD2?b&BL!G9G#r=Y5 z?ETac@FeH{c#0kBGDW-(0;kRq>&1`T-aaHiksfr2>r-B&N^I4VUAcl$c;)c$uEKQA zQ*n%~vXGxg$Nf@dX~@zzW-?;DO_z^l)MZzai=a7;)p1Sb+szSj`n&5&C221Dv!uD2 z*)YOojWh{d($5ZMvdVV*a5(D1;j>ziANWh(Xtr>BVE`r>4PM_jYo=#>tsP+>KOv1$ zx%iU4a2Y!<>f)%Z!=nUqxr}GX+KCsgv8{1--%O*3cQxland2{!Aa^*4+2~uX1m8wA zVkf!^FFnHq$_Gc8(JivMttb}Zp799`vksEfJ8ecYR&DC?jCtb3+w)M*?g;5a-zN#Z8#R2yTOvES-nj$ z?xlJoyU4wKk*%d?`Wiu-wjDdY>oHly;BkGzDaU&`3%Zbe;P_RG&4e%sR$i1M4JnWa zxAd@9*3~b^Ph9lU>AFoLr8XU&AbM3@2F{&Q&t&$USR`klZ_S=?XKi?GoQ-F09Sc&p zZw$B|Ssr0(CL#YiQppA|DE|#9h4CLS1ol6f@niB|=#b9e#&sHn~)x2u=tN+^3PTxATHT+SNiW5CwefF31Q$Zl43l zjJaU_Jb{pwSYC-}VUbE(VEs7hT|oe^b@B$^ZtW;GOixyjx9A`bbNIW58vb&eOGjP) z`Lw4AUbnmDh-b6d2m-k&hCB)0PS@p{^30Z_YA7OBWRtRaZ|jYxEi@izAM~^gqe_o} z>!tFNLeCtBDz5-2swC5;(gvMYYVKqVlCXW+{SPsjZ$?6LgWLo(RBAg?K}!n*_z_h0 z8{|a~qw~I37>YF~@-^AtAk4#;OF{&7B~mh_NK7y-r@bhBnTU8UHjyF@ZHPkf1yvq~ zC89krR%cC=9*9{!w!nc{lGQ4+5)X>}2(hKhMbv@f?eBRUPC6~N`hfUlPhc-y(h8{F z5No!Bnx&&p{>kd8$u^>;5Uo4c+_is?cV!wx;cYEV$)p^e{06Q@w z15RMD>_-Jdhh29IJONEZ0ZS*Xr4X@{pb3*vUIZJ$PYeYG(*dl>?Gp*5jhGC6A>8X*S{3DexexE%K`3|9 zL~mM`%0HmCPLw0iU!L=3-JB$98IsPRv!7L2jNsceS9-;#$9jA0XwQFhxxrhRP^qvb zG>`vI3UM2?oaEwxoF5xSrc4($Gf)c{WVF#tP7{enZ_|6eK;nZp*g&;eF4IDw*&w|? zsJd44+yb)hK!wY7QEc8N7WG9QpVz79Gr{Zb998Fk2Z>Oj?XsV05NfHd;n(vRC z5tPZNKd!&bM3g8Hx8Qq75bM|vm4JqiK^3$JW)^ejhbdea*S^5IwW~AV(ko+SEL(Tf zJ^of{jpn3ryMj;HE`5b_dP06=6pgva_1(m`(HsExq{_XE9b=QMC9ACBAd)QLL{*`PR zhf&O3&T1=$F_u{}wnDmQ?u=nJckVE@vV@F%%^F!B%Y!zAWJ`r8AsG~jlzk~7e(&!& z=iYnH_jAVN_v-17=W#xB?)UTkEZ_HM`F_tiIbFA=)NVC9dG)YgKP~b6u)K29_wQW1 z|AQmvcip@=_k#~x#5YSTwdv}fO*7kGE#K#bn@Y^%9WT^Oj+vA;aQ)~-JxbM`wr9wL z<3}!gvBM>0+dm^>5-Lw0+iPUA#O&qg4wmV^ZAY1bV$`V*;@5Pl&~{w4Cr?HkEK_&O zv$uXPeZJVCf=3eGE_SQ+x(?CKRa+`GZn@@r0hp4@xPmS-=mi=DbT1<6Z{uCe=Ate-?C4@22-l&wDf?_9~qtQ4fvY-lCqM0 zk!^jMsezsjx7{H@-^AGX9S-==}&tl7l9Vs7O<@oLTuT|)m&|q=tMPKJtQa&DWy5iss zHKV^O>wO!T5-)Hs%@ymw1w{`ih7`z%O{%o0D15Rx2x^8*1ODnQF zZr-QNJJGyyuV?m;S^RXb?=Ljlcs@0zTGRZvJsloh{b}RFdm9uy_~zvE1(ly0)bUu) zv#(zse0;x@@%^1vp3fi6tWYCuNnp{o-}kP{cp&Oh($kIwEf0-~7`gD1u6ui=bf2*F zaNDhYQro}R>fJ5NTLo_au-!}b`k?-{`w(#!ph&8|Zwl6+^s$pu}nYr1o z-pGzg&U?0HWnX9Y&TVO>qeHV=rT&{;{l_!)4&42EX~P9cvzjfh_+HudUwxMN@V-+= zCXOj6lh-WCDfXTAa>64io-eA*==D>RZe0!^YEbaVr`ajTQ%cPHqt2oB4_91yXzl7j z?^mDIO^!PG#4~4ibj`gq>-+5|OIG(ae0e~xkG|^NMecSr>2pWJ9bZ3mO%i`Mc*^^zLO?z?czrU^8uw{*3hku_j`0SkP zjZgXH>F3o=KNL$GvFyQxKhK{~ardy!qZ2B%-T%hY8I{^BP2A)J)^|D#&xemuo`FjCT{RHUci)iO4oVuvj2M_1pGS0K~_vh-bitohxKqc*Pi^2y@c zw|FjYni;=s=!ui_ODrngI=-^+#+89@bQ?QA(E9P1g_rARKltEv_2!iq#?G&j{Bq4- zhwiTUh1&bXw4*QkbLRnB{?R3=lkXYv)fLO;46WDc&hB*ut5zTFyJ<~z&)!s}{KzLq zU+Z;#q+7W4?%9o1CO;hW_2`ez{xJAzsTcF_bZXG7cPBW>((R7tUuyHlqM7?AJ^9J+ ztNdb_BxP#N=7AGAGyI(^fAaRHd)}=c-^V{JDH&MOXLz?MJugOF+nA7daoay;FKAft ze63C1VdGCuU6|ls9xv=py8PXni>9}KcKGzm@u`>3?wy=^<$>GB`#)#nA@@}gxc^6+ ziudCo+*YDCr6N7V?%5CDr0?U0vy%8$r=vf%U9@&_?>2+>w;eobNA+=+Git1SuJWtz zSM=N+xOz>*%!r@X?>@8n_b)HEQk;#dwtIZud$q>8SKi)yTZ-0W&y9MQ20VCB_mDQ7 zdyPwfxa*RbxR)MSed^HU6}QUdwJveE^wPRDmlfMsrJ%}T|JT)yq&$7J#>(v@{+yBB zWb0_>ftW>4Jp1iin~#qg@NMkGIZgA&?}>fz;vY4eN8G48YwOo{2eb_Qw0y&gy9X*K z*B(B4Vqh5yIma`)mKb~~s)}QQXWgGOw(q%f{h5^USM&03Rj68X;pB1oYFzAsFKT~M zaC1S%+>13LH@wrc{)tB_1Sdc@?!*B880Y4(Ttz6jyqbz z*}Fe&{PM=fIkPWsdu>lJKUwi%L8o_)jXVFEK-mS3KUeo_ z{_U!?TffDRYx~!JILLivuvYQhH(6$S$4_zC0b5Fyp(^FUiyQA)&U5`aqiH@87{m2UKpG+*#ZfV{V z>o*OBd-Qjt-H6Zb^y<*vH?IBi!?dH7PW{s4foh4xS`68t7m>Z@_ws#`vF?w$ z8^2B;Ip$>2=|9@GY?fHBeE0u;x%tZZ%$@_~D1Wht1}?em@vAMf2WPzc*rL1F%l>>s z_-}89AT38tnkc-OHh<*2xyxc7SQu5V_(y?;am6~{{N(L}*WPhVcz5`)AHVod@|5K9 zzJ)(r`QrC3-Cyo~yV{lgj5xJCAn^KVuf?z}vk#2Eq+H8NJ z+~$j`Z;XF@PaswP?pW6nzkWJoLWcq6TF3Mrot)Tq^o^@?7d35KvSiBUGfR8)tTIww zQ#Q8UtPcjg_U$)w-y1J<^+q^`e&l$+>(g%^jJ>_O^7zhKtxH8ZHjnw};gN@HTuAL& zQ(E!X=Em30thn*cp{H7%8C~b{%*)AhKmTpTwYeLPbvia~)Umu1;=_?wD=s;`3XTaP+1cKLe9PJUmdAZ^yj@0w@qKYV7-zi}pdu}T}v)oTxYr6ZVv}_j>`9|EEe&@f=RG78KIdS0Zy{~-I z=7l;{BaWS@@^o64N@owvomX}LmzxIF9drHS%AR{R^q+L+%Agb9J-lpY*@;a)aeWp$ z_xU+jqJC=CbV5bfXZ;hmPB_@|KV`c-5I6D9)!(+u+Eah^l`&6_I(06)#sih2-}Q-) zKlWCer=hd zc~xt#Ntn}O^z7;JFQpwl%wB%jf6BumlI_REPG~>&R{m=zTW%WM_n*q!zic`Z-|&Op;)1@T zF3ni?Y`u+3YQ7w?ZOw}J|MXo5EZuqe_T)QND|Fph;&Cy@DHC_J&hOu2_=mr)y;yJj@w`sMKA!8Jy?688JH?dJuD5KK zZnzeR%F4w%5!J}(G=EOOA$jz?zpa;Dz~L>iQ~RU7OpJFaN_w+CvVB@0-B+i*w@13q zk(J^IzFILNvbirO&_$3~TG=kL^Gh$||7Cn~(Ah0A&X>pdX@3dtdui9UEcA)ilR`7q zlTUr71_tQUXq6f8XC>z*1=6xIgEPR_4NNm&FI(>xnc(;J4N0s|hwpcJ7!z(fx-2@Y zw!Tzvx+5`=o01aZWRX?pWXQ^+4!gd`;4x`Afh>Q2+kquEvyce7Dhw`M+2jeg>_SE} zixBTm^=76G@G@;N+qLhRmg8uim6V%-mt%%_Yf}#z(4s#5F9vVkVZzCPE$_IjfX){V z(--V8g&bR!qV6+>#q_MwV96B#TF3hyN^RPs2h5(Pu?_Rm=4~sU{uiB>?qy+T)voWs zD?ZTE=XbR8rTFmT(IlTeJAu8PA!JET8qFU$4!S2B%fS;|4uVcLmV?>AE=N5_v)r`w ztNb6_<|Kw9K@6onzYu4WNG?$W|%(@P<+}=QAlK zj4eT%>#NEDiKwiM>@>#z-V6nHm@tSE0+*v{*H*Pyc!Y(dOmsaNP-OOGLxYA?nusQ; z*!4X)M)`ekDU(o!V#7v9W5R?$tdSlxI+4x>bo3t+qw9;$FuLxlIxx9m^p?JWHl@UX z*B|gDJNl)eIZv#t+tN-Sdd8;fL)4NilRhYR2|5ZHp`fSF(af8ZmK1V&#mvZRT@JAX ziddGhl30=Kz_8yRFAwfv%Z6ejrC>p@cHeT3oI~%{9IS1F%zzFDA|CL zc_yp}V$Z`PKzBhNnn3N0g)4Euq+Q=bT1`G*&U2_Z3=#2f7Jf8A!`wAn*=25;5Fzdy zQc3Lk9^6}Gq9$N*C!D2=PBSaPWl|=QjorzOZeA@cbS5VC^ksMrq!69@pKVeTezllB zbsx+*Ern@QmJP*qaI{V9;rIIcBQwf`AnA^T+#cy^NgyZrGIM-EzOKUg>VGjDM7s#X zfyAz@0$Sn970M}$&ur^!*7%%|zGj1yH+?fZ zs2OdZL5$L(4^~eamWh%7JKXi1K~-3|8f(RnUh{pE^z7OyeUXe@^*y$X+^ks`S}+zA z(pIR6D@CEdz||e%YW7}I>=WSG3Z1bENRV?`?jq;R}VX>5aOy~Y>+DlN7^?v@0)Ab zb8xatwlu&s8RNyikXiu5RFeKqXJ7Vuy)gxG5G1%>6ZDD7K>_bDvchCRy6 zR?t#^BU6-hJs8q*m?cxp`YY0gO>1FmhJWMZiUwP44V#oqGpE18Hsr=;t{xUqLptW= zqo`!XdxqFh=HUS>r=DdfYKCbRq3xyU`G_kw5jL(iuGN)|R+7$&CE?uz z$dd@qqwZ}h#aW0gOhSY2JAxmj$OjZ+4 z)}IP7O@`)3Mq?)|T+`&_u64RbggEJ;#G*z+a~$?)EfTAwWbo!l4gx;&_(qLl8DDRd z8tO2ZafoAj$$!vm2(uRHKGp?BBdKX1;I}Z=%})et*F{KZFio^!O5MZ& zIZc>gUaP+x-DES0HdNBg0183~8t2WhYPWDd(f?v-S2MDSCk39ud1^(!MY}dGW0=&O z4RPOoluWOQF4Ux~jbv!p%+V-I?Chz}MHiEGJ(;QIn1x;8?qg1XxG&2| zrq}-#Dj;Kr@(3lrg<+wtql;vOWmTJ3*o@kB5%R_P`q?S8P`@!=uxu!lOL|OiVJ%cb zFvJ#@FV$yRky4>PqYD+3ki#52T+O2^aa1sj&-S9RXV$2ZG1_>HCPQ#B>TlyTX_UcG z(Hd>%^QK$473wgW03mK1-e^6oqPej)n1x&6-lCysP?uazg)BPtQuC>(2`eF~bFUZIum1u&8~F>{mJNQgZ55b0LLAF+uk+n8a(QIvC&46cW zNnI3U;mi8lPfUva3owHWgTk5tmUjGf6B~|d1sYlFRTV8D4{HW^*>N)gjjX@5!zA5b z$Y>xP4{MeVzd7gCrytU#W@8gKc3re=1lDxCvUO1t(#ZPj8BFYGp+q85CvSRhW(bpO z>Tk}o>*C8!GsNg+L71KCDe*#qjj?0-mxWzn5s3(7dX_uL!CJrwM*SjdPwfVaP~-7I zy{-s1e2ua~vUFa}#*_?g>5i&5Gfmf}bWZ3i)2yG66C~jqH%)3l0#PT%O;TQW{4s-IAlUGxVQB5=ERFObOFijA8#dGD9>s>q1#+E`{}& zEHoVH^g#6-O=9cCN|PnFId7q$Zy8S&6{d7E&FxVI1~eQ^3yl_<;FQ>D3=2&WRJP`3BODQvks+u@iB6HiaBEeNB{#K^iM4Z2|9zY>J1qEV$nad|VK)0&Qqok;MI0Wf`)SraE~%6=c=L@>}jcH%r1fnum{h z_$`SQpotW7D7NE1g4v)c6iZZQvVaK6&gyY| zC3digqseS*grg}0OB9z%umtW*utagY2$m>rH^CBEoWw1~EwIge>s;I-+r#H*+LJpR zP3ChhWIhUs-N=Uc{7=9VWZg#VcyN1uEhq@_JeDXP58LnHev5>N&_o-WL}`MPU?(CO z!A^J@l@}>1k0lCr)`@I3aa9p)d>rN=zQI;7FPorHoeDIU0)+AT8q!^g_loFZ$GWUK z6>ZkE=ph)Uh#qQlQJ_94iX=Z!M2W6dQRZ`M%$d{+ps6IrD|kUP(LHit;zNkZ#9#2F z8XspANnkx5t6n65bv-$n$O>$pMq;fZNqk)aXOT#3R3w@DDK=xtTE!*`nKRnhWPY-X zLr9+JzeqCou~xd71t zQe~n8QKV~Hq_I(jOH$b=hN+@T;yI!WouA~Q>r!%)JPaD8c!d;>$RQy$;dPHPfap}x zTFq8JkYv7hh-5=yhu69LkeLvgN^Oa4Sb{k?#z@AK-RvBJl?NJKga?{hL=IUXxrK_R z4CR5uj_{Bu4$1hB+^3K{455tlxzM5|wK!-be?hyG%lAKz_BBXPn`5Lkp8bhH#;#U}u(-oembMn3hnv2J5&`@|= zbqX2+7ollSj+*7geF7h+K_lw}G>Kmeppm*8G=;|@&>%2B7Z+|MG-5Z=>2mWn2hGFl zl+k#bgGOp`&_up=0ZroTDA3TEBJ)G$$KBe*YMfL0A`yhlgQ_)RrD>D)GNXY0s?> z5nC)&_fQLw%>zOB@kA$IZ-GK$52Nut07m2EC1|7{!DxJL3mWNBFdE+j08OAiBx;W^ zS#>X>*+OIk6H4Rb2Y6`jH|EBZ_`NUxdE zD4t5BkB<9DehM1dn`JaUk6<)D=7A>DwF+n_eg!xnekGAy596UKCi+wPo(#K>ubD(A z?GG^;#U`8`BYs8q)bU$4zyHf<6cdr!62GGPBz}t`jF%0Yn#8ZLJV<<#MLzezcp~33 zVl)~9WYUkteWca}O*=|rU8}N8u~W9eY_u|{914wt*ajo(gKgUIdcnpE!EtP!5Wm7^ z2k|TP(uh5<=|KDnn*_ujX!H{~07JwciihS`Xs%N^1U?5wml`QAk(bmJxKHGBV9+G? zR!*ypkp59Q&=@86k)9>SBWD9ZBYRJb#@BwJseB#4Xf*%Bo*}UZS`S1HG_{BvXiO0~ z0QbZmXa*6#Lf?_t135ZB7jPw5=VA#Kr$4sUMt_T9oZN>)JA{UADNjS2fuA$BW2rK4H?%BCUgB{%N$%qT3m$io zQuBKgB90G{oEp35ByY!3;QK0~2YZ!7Ho-&i1?DCBfd?&kehs3^BfjB5PD6Ac!#Q}J zqVL1o2+^G6T-Y%ram#~^Q{I*yMf>EM1;^3xC2PwAIOXLK(AwmE2(J?%YY-hv!WY}R zqz8ZqMSNTUmJlB7un?ygWSwMfp|MB&1rd+$Er|df61&kECiRTyQVE`-gF5OK7J&p}`zlIMsB$-G{GIK)OG`klN#qdX!QA%{z8`2nJI*)I(I@#D$|JIVB{$9Q@tR>$ z@8h%{Ssy5mNX;Yx$NAWU@`&Vh5<)k>wj?|hz~h>P=LvW}K-oiLl!RU>84v56jED9; z?+5HyDepsY4U)^_=`gYuP|gr}WgG$GdEm4Z@o{AQq{c?+Lh=n%c_g>R_BmPmtaRc1 zKxPY*^9__P#Gg^7klqctoy3P^9HStzA)FKaVGo?}#eO&Wttt@A#YOAZr>Y2#9Yez%_m?pqoQ{4Q+mcB{+RWd|bgsHXoyq4UzgtQPKS8{0}7w z$sGZcBp*_p6q~@7;5f8La2#a{$<2`J5xZf3n)IMlH#s{E$fi9HlrwZZn;HV?Bj5X7tjp`mwPV|C91VmoM zP)Z}`Zg60N?8Aaa&OD)8O!i_xLp5&2642ay>;{eaDQIN>2sG{Uv*uh6Gyo;xLCy){ zK9XNafHi(igNDkR9}mlo^FQ1t@MoPtBkKq>WKLu}H0&si@9QDO#DQx5KEymSKjbQ8 zekdgg4;1ZWE;!pme@lATmXf8f(u_tP% zJ+R+H=7PN)G8e=$f;rfqG1(~K_u{QV{?d&a;aSN6KK3wUWV@`a0RDlMfQKntWu{~~ zFbMl+^Dd3hAn)PB=~9+~iteN&I6ZQCl(wpzoSc#(H!1oKye_*mUXSk&XwOeVKs1s| M*Q(VbKDzY(0b3Q#8UO$Q diff --git a/doc/mxmldoc.html b/doc/mxmldoc.html deleted file mode 100644 index a1b015c..0000000 --- a/doc/mxmldoc.html +++ /dev/null @@ -1,378 +0,0 @@ - - - -

  • '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"); - } - - /* - * Return NULL for no added whitespace... - */ - - return (NULL); -} - - -/* - * End of "$Id: testmxml.c,v 1.17 2004/05/16 18:25:20 mike Exp $". - */