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 a3bb527..0000000 Binary files a/doc/mxml.pdf and /dev/null differ 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 @@ - - - -

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
  • '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 $". - */