menuselect: Remove mxml from menuselect (Patch 2)
This is the second patch that adds menuselect to Asterisk trunk. The previous commit (r418832) added menuselect along with mxml; this patch removes mxml completely from Menuselect. A subsequent patch will switch menuselect over to using libxml2, and make libxml2 a required dependency for Asterisk. ASTERISK-20703 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418833 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
c7d3570248
commit
62f5e26d35
|
@ -1,5 +0,0 @@
|
||||||
Mini-XML 2.2.2 is now available for download from:
|
|
||||||
|
|
||||||
http://www.easysw.com/~mike/mxml/software.php
|
|
||||||
|
|
||||||
Mini-XML 2.2.2 fixes a bug in the reading of custom data nodes.
|
|
|
@ -1,213 +0,0 @@
|
||||||
CHANGES - 05/19/2005
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 2.2.2
|
|
||||||
|
|
||||||
- mxmlLoad*() did not treat custom data as opaque, so
|
|
||||||
whitespace characters would be lost.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 2.2.1
|
|
||||||
|
|
||||||
- mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now
|
|
||||||
correctly return NULL on error (STR #21)
|
|
||||||
- mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(),
|
|
||||||
mxmlNewText(), and mxmlNewTextf() incorrectly required
|
|
||||||
a parent node (STR #22)
|
|
||||||
- Fixed an XML output bug in mxmldoc.
|
|
||||||
- The "make install" target now uses the install command
|
|
||||||
to set the proper permissions on UNIX/Linux/OSX.
|
|
||||||
- Fixed a MingW/Cygwin compilation problem (STR #18)
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 2.2
|
|
||||||
|
|
||||||
- Added shared library support (STR #17)
|
|
||||||
- mxmlLoad*() now returns an error when an XML stream
|
|
||||||
contains illegal control characters (STR #10)
|
|
||||||
- mxmlLoad*() now returns an error when an element
|
|
||||||
contains two attributes with the same name in
|
|
||||||
conformance with the XML spec (STR #16)
|
|
||||||
- Added support for CDATA (STR #14, STR #15)
|
|
||||||
- Updated comment and processing instruction handling -
|
|
||||||
no entity support per XML specification.
|
|
||||||
- Added checking for invalid comment termination ("--->"
|
|
||||||
is not allowed)
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 2.1
|
|
||||||
|
|
||||||
- Added support for custom data nodes (STR #6)
|
|
||||||
- Now treat UTF-8 sequences which are longer than
|
|
||||||
necessary as an error (STR #4)
|
|
||||||
- Fixed entity number support (STR #8)
|
|
||||||
- Fixed mxmlLoadString() bug with UTF-8 (STR #7)
|
|
||||||
- Fixed entity lookup bug (STR #5)
|
|
||||||
- Added mxmlLoadFd() and mxmlSaveFd() functions.
|
|
||||||
- Fixed multi-word UTF-16 handling.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 2.0
|
|
||||||
|
|
||||||
- New programmers manual.
|
|
||||||
- Added Visual C++ project files for Microsoft Windows
|
|
||||||
users.
|
|
||||||
- Added optimizations to mxmldoc, mxmlSaveFile(), and
|
|
||||||
mxmlIndexNew() (STR #2)
|
|
||||||
- mxmlEntityAddCallback() now returns an integer status
|
|
||||||
(STR #2)
|
|
||||||
- Added UTF-16 support (input only; all output is UTF-8)
|
|
||||||
- Added index functions to build a searchable index of
|
|
||||||
XML nodes.
|
|
||||||
- Added character entity callback interface to support
|
|
||||||
additional character entities beyond those defined in
|
|
||||||
the XHTML specification.
|
|
||||||
- Added support for XHTML character entities.
|
|
||||||
- The mxmldoc utility now produces XML output which
|
|
||||||
conforms to an updated XML schema, described in the file
|
|
||||||
"doc/mxmldoc.xsd".
|
|
||||||
- Changed the whitespace callback interface to return
|
|
||||||
strings instead of a single character, allowing for
|
|
||||||
greater control over the formatting of XML files
|
|
||||||
written using Mini-XML. THIS CHANGE WILL REQUIRE
|
|
||||||
CHANGES TO YOUR 1.x CODE IF YOU USE WHITESPACE
|
|
||||||
CALLBACKS.
|
|
||||||
- The mxmldoc utility is now capable of documenting C++
|
|
||||||
classes, functions, and structures, and correctly
|
|
||||||
handles C++ comments.
|
|
||||||
- Added new modular tests for mxmldoc.
|
|
||||||
- Updated the mxmldoc output to be more compatible with
|
|
||||||
embedding in manuals produced with HTMLDOC.
|
|
||||||
- The makefile incorrectly included a "/" separator
|
|
||||||
between the destination path and install path. This
|
|
||||||
caused problems when building and installing with
|
|
||||||
MingW.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.3
|
|
||||||
|
|
||||||
- Fixes for mxmldoc.
|
|
||||||
- Added support for reading standard HTML entity names.
|
|
||||||
- mxmlLoadString/File() did not decode character
|
|
||||||
entities in element names, attribute names, or
|
|
||||||
attribute values.
|
|
||||||
- mxmlLoadString/File() would crash when loading non-
|
|
||||||
conformant XML data under an existing parent (top)
|
|
||||||
node.
|
|
||||||
- Fixed several bugs in the mxmldoc utility.
|
|
||||||
- Added new error callback function to catch a variety
|
|
||||||
of errors and log them to someplace other than stderr.
|
|
||||||
- The mxmlElementSetAttr() function now allows for NULL
|
|
||||||
attribute values.
|
|
||||||
- The load and save functions now properly handle quoted
|
|
||||||
element and attribute name strings properly, e.g. for
|
|
||||||
!DOCTYPE declarations.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.2
|
|
||||||
|
|
||||||
- Added new "set" methods to set the value of a node.
|
|
||||||
- Added new formatted text methods mxmlNewTextf() and
|
|
||||||
mxmlSetTextf() to create/set a text node value using
|
|
||||||
printf-style formats.
|
|
||||||
- Added new standard callbacks for use with the mxmlLoad
|
|
||||||
functions.
|
|
||||||
- Updated the HTML documentation to include examples of
|
|
||||||
the walk and load function output.
|
|
||||||
- Added --with/without-ansi configure option to control
|
|
||||||
the strdup() function check.
|
|
||||||
- Added --with/without-snprintf configure option to
|
|
||||||
control the snprintf() and vsnprintf() function
|
|
||||||
checks.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.1.2
|
|
||||||
|
|
||||||
- The mxml(3) man page wasn't updated for the string
|
|
||||||
functions.
|
|
||||||
- mxmlSaveString() returned the wrong number of
|
|
||||||
characters.
|
|
||||||
- mxml_add_char() updated the buffer pointer in the
|
|
||||||
wrong place.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.1.1
|
|
||||||
|
|
||||||
- The private mxml_add_ch() function did not update the
|
|
||||||
start-of-buffer pointer which could cause a crash when
|
|
||||||
using mxmlSaveString().
|
|
||||||
- The private mxml_write_ws() function called putc()
|
|
||||||
instead of using the proper callback which could cause
|
|
||||||
a crash when using mxmlSaveString().
|
|
||||||
- Added a mxmlSaveAllocString() convenience function for
|
|
||||||
saving an XML node tree to an allocated string.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.1
|
|
||||||
|
|
||||||
- The mxmlLoadFile() function now uses dynamically
|
|
||||||
allocated string buffers for element names, attribute
|
|
||||||
names, and attribute values. Previously they were
|
|
||||||
capped at 16383, 255, and 255 bytes, respectively.
|
|
||||||
- Added a new mxmlLoadString() function for loading an
|
|
||||||
XML node tree from a string.
|
|
||||||
- Added a new mxmlSaveString() function for saving an
|
|
||||||
XML node tree to a string.
|
|
||||||
- Add emulation of strdup() if the local platform does
|
|
||||||
not provide the function.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 1.0
|
|
||||||
|
|
||||||
- The mxmldoc program now handles function arguments,
|
|
||||||
structures, unions, enumerations, classes, and
|
|
||||||
typedefs properly.
|
|
||||||
- Documentation provided via mxmldoc and more in-line
|
|
||||||
comments in the code.
|
|
||||||
- Added man pages and packaging files.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 0.93
|
|
||||||
|
|
||||||
- New mxmldoc example program that is also used to
|
|
||||||
create and update code documentation using XML and
|
|
||||||
produce HTML reference pages.
|
|
||||||
- Added mxmlAdd() and mxmlRemove() functions to add and
|
|
||||||
remove nodes from a tree. This provides more
|
|
||||||
flexibility over where the nodes are inserted and
|
|
||||||
allows nodes to be moved within the tree as needed.
|
|
||||||
- mxmlLoadFile() now correctly handles comments.
|
|
||||||
- mxmlLoadFile() now supports the required "gt", "quot",
|
|
||||||
and "nbsp" character entities.
|
|
||||||
- mxmlSaveFile() now uses newlines as whitespace
|
|
||||||
when valid to do so.
|
|
||||||
- mxmlFindElement() now also takes attribute name and
|
|
||||||
attribute value string arguments to limit the search
|
|
||||||
to specific elements with attributes and/or values.
|
|
||||||
NULL pointers can be used as "wildcards".
|
|
||||||
- Added uninstall target to makefile, and auto-reconfig
|
|
||||||
if Makefile.in or configure.in are changed.
|
|
||||||
- mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev()
|
|
||||||
now all provide "descend" arguments to control whether
|
|
||||||
they descend into child nodes in the tree.
|
|
||||||
- Fixed some whitespace issues in mxmlLoadFile().
|
|
||||||
- Fixed Unicode output and whitespace issues in
|
|
||||||
mxmlSaveFile().
|
|
||||||
- mxmlSaveFile() now supports a whitespace callback to
|
|
||||||
provide more human-readable XML output under program
|
|
||||||
control.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 0.92
|
|
||||||
|
|
||||||
- mxmlSaveFile() didn't return a value on success.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 0.91
|
|
||||||
|
|
||||||
- mxmlWalkNext() would go into an infinite loop.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES IN Mini-XML 0.9
|
|
||||||
|
|
||||||
- Initial public release.
|
|
|
@ -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.
|
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU 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.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
That's all there is to it!
|
|
|
@ -1,342 +0,0 @@
|
||||||
#
|
|
||||||
# "$Id$"
|
|
||||||
#
|
|
||||||
# Makefile for Mini-XML, a small XML-like file parsing library.
|
|
||||||
#
|
|
||||||
# Copyright 2003-2005 by Michael Sweet.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU Library General Public
|
|
||||||
# License as published by the Free Software Foundation; either
|
|
||||||
# version 2, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Compiler tools definitions...
|
|
||||||
#
|
|
||||||
|
|
||||||
AR = @AR@
|
|
||||||
ARFLAGS = @ARFLAGS@
|
|
||||||
CC = @CC@
|
|
||||||
CFLAGS = $(OPTIM) @CFLAGS@ @CPPFLAGS@
|
|
||||||
CP = @CP@
|
|
||||||
DSO = @DSO@
|
|
||||||
DSOFLAGS = @DSOFLAGS@
|
|
||||||
LDFLAGS = $(OPTIM) @LDFLAGS@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
LIBMXML = @LIBMXML@
|
|
||||||
LN = @LN@ -s
|
|
||||||
MKDIR = @MKDIR@
|
|
||||||
OPTIM = @OPTIM@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
RM = @RM@ -f
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Configured directories...
|
|
||||||
#
|
|
||||||
|
|
||||||
prefix = @prefix@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
bindir = @bindir@
|
|
||||||
includedir = @includedir@
|
|
||||||
libdir = @libdir@
|
|
||||||
mandir = @mandir@
|
|
||||||
docdir = @docdir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
BUILDROOT = $(DSTROOT)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Install commands...
|
|
||||||
#
|
|
||||||
|
|
||||||
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -m 755 -s
|
|
||||||
INSTALL_DATA = $(INSTALL) -m 644
|
|
||||||
INSTALL_DIR = $(INSTALL) -d
|
|
||||||
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -m 755
|
|
||||||
INSTALL_MAN = $(INSTALL) -m 644
|
|
||||||
INSTALL_SCRIPT = $(INSTALL) -m 755
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Rules...
|
|
||||||
#
|
|
||||||
|
|
||||||
.SUFFIXES: .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/mxmldoc.xsd \
|
|
||||||
README COPYING CHANGES
|
|
||||||
PUBLIBOBJS = mxml-attr.o mxml-entity.o mxml-file.o mxml-index.o \
|
|
||||||
mxml-node.o mxml-search.o mxml-set.o
|
|
||||||
LIBOBJS = $(PUBLIBOBJS) mxml-private.o mxml-string.o
|
|
||||||
OBJS = mxmldoc.o testmxml.o $(LIBOBJS)
|
|
||||||
TARGETS = $(LIBMXML) mxmldoc testmxml mxml.xml
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Make everything...
|
|
||||||
#
|
|
||||||
|
|
||||||
all: Makefile configure config.h $(TARGETS)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Clean everything...
|
|
||||||
#
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS) $(TARGETS)
|
|
||||||
$(RM) mxmldoc-static libmxml.a
|
|
||||||
$(RM) *.bck *.bak
|
|
||||||
$(RM) config.cache config.log config.status config.h
|
|
||||||
$(RM) -r autom4te*.cache
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
$(RM) mxml.list Makefile
|
|
||||||
|
|
||||||
#
|
|
||||||
# Install everything...
|
|
||||||
#
|
|
||||||
|
|
||||||
install: $(TARGETS) install-$(LIBMXML) install-libmxml.a
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(bindir)
|
|
||||||
$(INSTALL_BIN) mxmldoc $(BUILDROOT)$(bindir)
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(docdir)
|
|
||||||
for file in $(DOCFILES); do \
|
|
||||||
$(INSTALL_MAN) $$file $(BUILDROOT)$(docdir); \
|
|
||||||
done
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(includedir)
|
|
||||||
$(INSTALL_DATA) mxml.h $(BUILDROOT)$(includedir)
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig
|
|
||||||
$(INSTALL_DATA) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/cat1
|
|
||||||
$(INSTALL_MAN) doc/mxmldoc.$(CAT1EXT) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT)
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/cat3
|
|
||||||
$(INSTALL_MAN) doc/mxml.$(CAT3EXT) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT)
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/man1
|
|
||||||
$(INSTALL_MAN) doc/mxmldoc.man $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT)
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/man3
|
|
||||||
$(INSTALL_MAN) doc/mxml.man $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT)
|
|
||||||
|
|
||||||
install-libmxml.a:
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
|
||||||
$(INSTALL_LIB) libmxml.a $(BUILDROOT)$(libdir)
|
|
||||||
|
|
||||||
install-libmxml.so.1.0:
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
|
||||||
$(INSTALL_LIB) libmxml.so.1.0 $(BUILDROOT)$(libdir)
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
|
||||||
$(LN) libmxml.so.1.0 $(BUILDROOT)$(libdir)/libmxml.so
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
|
|
||||||
$(LN) libmxml.so.1.0 $(BUILDROOT)$(libdir)/libmxml.so.1
|
|
||||||
|
|
||||||
install-libmxml.sl.1:
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
|
||||||
$(INSTALL_LIB) libmxml.sl.1 $(BUILDROOT)$(libdir)
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
|
||||||
$(LN) libmxml.sl.1 $(BUILDROOT)$(libdir)/libmxml.sl
|
|
||||||
|
|
||||||
install-libmxml.1.dylib:
|
|
||||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
|
||||||
$(INSTALL_LIB) libmxml.1.dylib $(BUILDROOT)$(libdir)
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
|
|
||||||
$(LN) libmxml.1.dylib $(BUILDROOT)$(libdir)/libmxml.dylib
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Uninstall everything...
|
|
||||||
#
|
|
||||||
|
|
||||||
uninstall: uninstall-$(LIBMXML) uninstall-libmxml.a
|
|
||||||
$(RM) $(BUILDROOT)$(bindir)/mxmldoc
|
|
||||||
$(RM) -r $(BUILDROOT)$(docdir)
|
|
||||||
$(RM) $(BUILDROOT)$(includedir)/mxml.h
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc
|
|
||||||
$(RM) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT)
|
|
||||||
$(RM) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT)
|
|
||||||
$(RM) $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT)
|
|
||||||
$(RM) $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT)
|
|
||||||
|
|
||||||
uninstall-libmxml.a:
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.a
|
|
||||||
|
|
||||||
uninstall-libmxml.so.1.0:
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1.0
|
|
||||||
|
|
||||||
uninstall-libmxml.sl.1:
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.sl
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.sl.1
|
|
||||||
|
|
||||||
uninstall-libmxml.1.dylib:
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
|
|
||||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.1.dylib
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Make packages using EPM (http://www.easysw.com/epm/)
|
|
||||||
#
|
|
||||||
|
|
||||||
epm: all
|
|
||||||
epm --output-dir dist -v -f native mxml
|
|
||||||
epm --output-dir dist -v -f portable mxml
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# autoconf stuff...
|
|
||||||
#
|
|
||||||
|
|
||||||
Makefile: Makefile.in
|
|
||||||
if test -f config.status; then \
|
|
||||||
./config.status --recheck; \
|
|
||||||
./config.status; \
|
|
||||||
else \
|
|
||||||
./configure; \
|
|
||||||
fi
|
|
||||||
touch config.h
|
|
||||||
|
|
||||||
|
|
||||||
config.h: configure config.h.in
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# libmxml.so.1.0
|
|
||||||
#
|
|
||||||
|
|
||||||
libmxml.so.1.0: $(LIBOBJS)
|
|
||||||
$(DSO) $(DSOFLAGS) -o libmxml.so.1.0 $(LIBOBJS)
|
|
||||||
$(RM) libmxml.so libmxml.so.1
|
|
||||||
$(LN) libmxml.so.1.0 libmxml.so
|
|
||||||
$(LN) libmxml.so.1.0 libmxml.so.1
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# libmxml.sl.1
|
|
||||||
#
|
|
||||||
|
|
||||||
libmxml.sl.1: $(LIBOBJS)
|
|
||||||
$(DSO) $(DSOFLAGS) -o libmxml.sl.1 $(LIBOBJS)
|
|
||||||
$(RM) libmxml.sl libmxml.sl.1
|
|
||||||
$(LN) libmxml.sl.1 libmxml.sl
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# libmxml.1.dylib
|
|
||||||
#
|
|
||||||
|
|
||||||
libmxml.1.dylib: $(LIBOBJS)
|
|
||||||
$(DSO) $(DSOFLAGS) -o libmxml.1.dylib \
|
|
||||||
-install_name $(libdir)/libmxml.dylib \
|
|
||||||
-current_version 1.0.0 \
|
|
||||||
-compatibility_version 1.0.0 \
|
|
||||||
$(LIBOBJS)
|
|
||||||
$(RM) libmxml.dylib libmxml.1.dylib
|
|
||||||
$(LN) libmxml.1.dylib libmxml.dylib
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# mxmldoc
|
|
||||||
#
|
|
||||||
|
|
||||||
mxmldoc: $(LIBMXML) mxmldoc.o
|
|
||||||
$(CC) $(LDFLAGS) -o $@ mxmldoc.o -L. -lmxml
|
|
||||||
|
|
||||||
mxmldoc-static: 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 Stdio file test passed!; \
|
|
||||||
$(RM) temp2.xml temp2s.xml; \
|
|
||||||
else \
|
|
||||||
echo Stdio file test failed!; \
|
|
||||||
fi
|
|
||||||
@if cmp temp1.xml temp1s.xml; then \
|
|
||||||
echo String test passed!; \
|
|
||||||
$(RM) temp1.xml temp1s.xml; \
|
|
||||||
else \
|
|
||||||
echo String test failed!; \
|
|
||||||
fi
|
|
||||||
@if cmp test.xml test.xmlfd; then \
|
|
||||||
echo File descriptor test passed!; \
|
|
||||||
$(RM) test.xmlfd; \
|
|
||||||
else \
|
|
||||||
echo File descriptor test failed!; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
testmxml.o: mxml.h
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# mxml.xml
|
|
||||||
#
|
|
||||||
|
|
||||||
mxml.xml: mxmldoc-static mxml.h $(PUBLIBOBJS:.o=.c)
|
|
||||||
$(RM) mxml.xml
|
|
||||||
./mxmldoc-static mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/reference.html
|
|
||||||
|
|
||||||
valgrind: mxmldoc-static
|
|
||||||
$(RM) valgrind.xml
|
|
||||||
valgrind --tool=memcheck --leak-check=yes ./mxmldoc-static \
|
|
||||||
valgrind.xml mxml.h $(PUBLIBOBJS:.o=.c) \
|
|
||||||
>valgrind.html 2>valgrind.out
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# All object files depend on the makefile...
|
|
||||||
#
|
|
||||||
|
|
||||||
$(OBJS): Makefile config.h
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# End of "$Id$".
|
|
||||||
#
|
|
|
@ -1,204 +0,0 @@
|
||||||
README - 05/19/2005
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
This README file describes the Mini-XML library version
|
|
||||||
2.2.2.
|
|
||||||
|
|
||||||
Mini-XML is a small XML parsing library that you can use to
|
|
||||||
read XML and XML-like data files in your application without
|
|
||||||
requiring large non-standard libraries. Mini-XML only
|
|
||||||
requires an ANSI C compatible compiler (GCC works, as do
|
|
||||||
most vendors' ANSI C compilers) and a "make" program.
|
|
||||||
|
|
||||||
Mini-XML provides the following functionality:
|
|
||||||
|
|
||||||
- Reading of UTF-8 and UTF-16 and writing of UTF-8
|
|
||||||
encoded XML files and strings.
|
|
||||||
- Data is stored in a linked-list tree structure,
|
|
||||||
preserving the XML data hierarchy.
|
|
||||||
- Supports arbitrary element names, attributes, and
|
|
||||||
attribute values with no preset limits, just available
|
|
||||||
memory.
|
|
||||||
- Supports integer, real, opaque ("cdata"), and text
|
|
||||||
data types in "leaf" nodes.
|
|
||||||
- Functions for creating and managing trees of data.
|
|
||||||
- "Find" and "walk" functions for easily locating and
|
|
||||||
navigating trees of data.
|
|
||||||
|
|
||||||
Mini-XML doesn't do validation or other types of processing
|
|
||||||
on the data based upon schema files or other sources of
|
|
||||||
definition information.
|
|
||||||
|
|
||||||
|
|
||||||
BUILDING Mini-XML
|
|
||||||
|
|
||||||
Mini-XML comes with an autoconf-based configure script; just
|
|
||||||
type the following command to get things going:
|
|
||||||
|
|
||||||
./configure
|
|
||||||
|
|
||||||
The default install prefix is /usr/local, which can be
|
|
||||||
overridden using the --prefix option:
|
|
||||||
|
|
||||||
./configure --prefix=/foo
|
|
||||||
|
|
||||||
Other configure options can be found using the --help
|
|
||||||
option:
|
|
||||||
|
|
||||||
./configure --help
|
|
||||||
|
|
||||||
Once you have configured the software, type "make" to do the
|
|
||||||
build and run the test program to verify that things are
|
|
||||||
working, as follows:
|
|
||||||
|
|
||||||
make
|
|
||||||
|
|
||||||
If you are using Mini-XML under Microsoft Windows with
|
|
||||||
Visual C++, use the included project files in the "vcnet"
|
|
||||||
subdirectory to build the library instead.
|
|
||||||
|
|
||||||
|
|
||||||
INSTALLING Mini-XML
|
|
||||||
|
|
||||||
The "install" target will install Mini-XML in the lib and
|
|
||||||
include directories:
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
Once you have installed it, use the "-lmxml" option to link
|
|
||||||
your application against it.
|
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION
|
|
||||||
|
|
||||||
The documentation is available in the "doc" subdirectory in
|
|
||||||
the files "mxml.html" (HTML) and "mxml.pdf" (PDF). You can
|
|
||||||
also look at the "testmxml.c" and "mxmldoc.c" source files
|
|
||||||
for examples of using Mini-XML.
|
|
||||||
|
|
||||||
Mini-XML provides a single header file which you include:
|
|
||||||
|
|
||||||
#include <mxml.h>
|
|
||||||
|
|
||||||
Nodes are defined by the "mxml_node_t" structure; the "type"
|
|
||||||
member defines the node type (element, integer, opaque,
|
|
||||||
real, or text) which determines which value you want to look
|
|
||||||
at in the "value" union. New nodes can be created using the
|
|
||||||
"mxmlNewElement()", "mxmlNewInteger()", "mxmlNewOpaque()",
|
|
||||||
"mxmlNewReal()", and "mxmlNewText()" functions. Only
|
|
||||||
elements can have child nodes, and the top node must be an
|
|
||||||
element, usually "?xml".
|
|
||||||
|
|
||||||
You load an XML file using the "mxmlLoadFile()" function:
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "r");
|
|
||||||
tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
Similarly, you save an XML file using the "mxmlSaveFile()"
|
|
||||||
function:
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
fp = fopen("filename.xml", "w");
|
|
||||||
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
The "mxmlLoadString()", "mxmlSaveAllocString()", and
|
|
||||||
"mxmlSaveString()" functions load XML node trees from and
|
|
||||||
save XML node trees to strings:
|
|
||||||
|
|
||||||
char buffer[8192];
|
|
||||||
char *ptr;
|
|
||||||
mxml_node_t *tree;
|
|
||||||
|
|
||||||
...
|
|
||||||
tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK);
|
|
||||||
|
|
||||||
...
|
|
||||||
mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);
|
|
||||||
|
|
||||||
...
|
|
||||||
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
|
||||||
|
|
||||||
You can find a named element/node using the
|
|
||||||
"mxmlFindElement()" function:
|
|
||||||
|
|
||||||
mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr",
|
|
||||||
"value", MXML_DESCEND);
|
|
||||||
|
|
||||||
The "name", "attr", and "value" arguments can be passed as
|
|
||||||
NULL to act as wildcards, e.g.:
|
|
||||||
|
|
||||||
/* Find the first "a" element */
|
|
||||||
node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND);
|
|
||||||
|
|
||||||
/* Find the first "a" element with "href" attribute */
|
|
||||||
node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND);
|
|
||||||
|
|
||||||
/* Find the first "a" element with "href" to a URL */
|
|
||||||
node = mxmlFindElement(tree, tree, "a", "href",
|
|
||||||
"http://www.easysw.com/~mike/mxml/",
|
|
||||||
MXML_DESCEND);
|
|
||||||
|
|
||||||
/* Find the first element with a "src" attribute*/
|
|
||||||
node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND);
|
|
||||||
|
|
||||||
/* Find the first element with a "src" = "foo.jpg" */
|
|
||||||
node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg",
|
|
||||||
MXML_DESCEND);
|
|
||||||
|
|
||||||
You can also iterate with the same function:
|
|
||||||
|
|
||||||
mxml_node_t *node;
|
|
||||||
|
|
||||||
for (node = mxmlFindElement(tree, tree, "name", NULL, NULL,
|
|
||||||
MXML_DESCEND);
|
|
||||||
node != NULL;
|
|
||||||
node = mxmlFindElement(node, tree, "name", NULL, NULL,
|
|
||||||
MXML_DESCEND))
|
|
||||||
{
|
|
||||||
... do something ...
|
|
||||||
}
|
|
||||||
|
|
||||||
Finally, once you are done with the XML data, use the
|
|
||||||
"mxmlDelete()" function to recursively free the memory that
|
|
||||||
is used for a particular node or the entire tree:
|
|
||||||
|
|
||||||
mxmlDelete(tree);
|
|
||||||
|
|
||||||
|
|
||||||
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-2005 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.
|
|
|
@ -1,69 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Configuration file for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include necessary headers...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Version number...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MXML_VERSION ""
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do we have the vsnprintf() function?
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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$".
|
|
||||||
*/
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,343 +0,0 @@
|
||||||
dnl
|
|
||||||
dnl "$Id$"
|
|
||||||
dnl
|
|
||||||
dnl Configuration script for Mini-XML, a small XML-like file parsing library.
|
|
||||||
dnl
|
|
||||||
dnl Copyright 2003-2009 by Michael Sweet.
|
|
||||||
dnl
|
|
||||||
dnl This program is free software; you can redistribute it and/or
|
|
||||||
dnl modify it under the terms of the GNU Library General Public
|
|
||||||
dnl License as published by the Free Software Foundation; either
|
|
||||||
dnl version 2, or (at your option) any later version.
|
|
||||||
dnl
|
|
||||||
dnl This program is distributed in the hope that it will be useful,
|
|
||||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
dnl GNU General Public License for more details.
|
|
||||||
dnl
|
|
||||||
|
|
||||||
dnl Specify a source file from the distribution...
|
|
||||||
AC_INIT(mxml.h)
|
|
||||||
|
|
||||||
dnl Set the name of the config header file...
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
|
||||||
|
|
||||||
dnl Version number...
|
|
||||||
VERSION=2.2.2
|
|
||||||
AC_SUBST(VERSION)
|
|
||||||
AC_DEFINE_UNQUOTED(MXML_VERSION, "Mini-XML v$VERSION")
|
|
||||||
|
|
||||||
dnl Clear default debugging options and set normal optimization by
|
|
||||||
dnl default unless the user asks for debugging specifically.
|
|
||||||
CFLAGS="${CFLAGS:=}"
|
|
||||||
CXXFLAGS="${CXXFLAGS:=}"
|
|
||||||
LDFLAGS="${LDFLAGS:=}"
|
|
||||||
AC_SUBST(LDFLAGS)
|
|
||||||
OPTIM=""
|
|
||||||
AC_SUBST(OPTIM)
|
|
||||||
|
|
||||||
AC_ARG_WITH(ansi, [ --with-ansi set full ANSI C mode, default=no],
|
|
||||||
use_ansi="$withval",
|
|
||||||
use_ansi="no")
|
|
||||||
|
|
||||||
AC_ARG_WITH(archflags, [ --with-archflags set additional architecture flags, default=none],
|
|
||||||
ARCHFLAGS="$withval",
|
|
||||||
ARCHFLAGS="")
|
|
||||||
AC_SUBST(ARCHFLAGS)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no],
|
|
||||||
if eval "test x$enable_debug = xyes"; then
|
|
||||||
OPTIM="-g"
|
|
||||||
fi)
|
|
||||||
|
|
||||||
AC_ARG_WITH(docdir, [ --with-docdir set directory for documentation, default=${prefix}/share/doc/mxml],
|
|
||||||
docdir="$withval",
|
|
||||||
docdir="NONE")
|
|
||||||
|
|
||||||
AC_SUBST(docdir)
|
|
||||||
|
|
||||||
AC_ARG_WITH(vsnprintf, [ --with-vsnprintf use vsnprintf emulation functions, default=auto],
|
|
||||||
use_vsnprintf="$withval",
|
|
||||||
use_vsnprintf="no")
|
|
||||||
|
|
||||||
dnl Get the operating system and version number...
|
|
||||||
uname=`uname`
|
|
||||||
uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'`
|
|
||||||
if test x$uname = xIRIX64; then
|
|
||||||
uname="IRIX"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Checks for programs...
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CXX
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
if test "$INSTALL" = "$ac_install_sh"; then
|
|
||||||
# Use full path to install-sh script...
|
|
||||||
INSTALL="`pwd`/install-sh -c"
|
|
||||||
fi
|
|
||||||
AC_PROG_RANLIB
|
|
||||||
AC_PATH_PROGS(AR,ar gar)
|
|
||||||
AC_PATH_PROG(CP,cp)
|
|
||||||
AC_PATH_PROG(LN,ln)
|
|
||||||
AC_PATH_PROG(MKDIR,mkdir)
|
|
||||||
AC_PATH_PROG(RM,rm)
|
|
||||||
if test -z $AR ; then
|
|
||||||
AC_MSG_ERROR('ar' binary is mandatory. Please either install the 'ar' binary or provide the path to configure with --with-ar=/path/to/ar)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Flags for "ar" command...
|
|
||||||
case "$uname" in
|
|
||||||
Darwin* | *BSD*)
|
|
||||||
ARFLAGS="-rcv"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ARFLAGS="crvs"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_SUBST(ARFLAGS)
|
|
||||||
|
|
||||||
dnl Inline functions...
|
|
||||||
AC_C_INLINE
|
|
||||||
|
|
||||||
dnl Checks for string functions.
|
|
||||||
if test "x$use_ansi" != xyes; then
|
|
||||||
AC_CHECK_FUNCS(strdup)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$use_vsnprintf" != xyes; then
|
|
||||||
AC_CHECK_FUNCS(snprintf vsnprintf)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Check for "long long" support...
|
|
||||||
AC_CACHE_CHECK(for long long int, ac_cv_c_long_long,
|
|
||||||
[if test "$GCC" = yes; then
|
|
||||||
ac_cv_c_long_long=yes
|
|
||||||
else
|
|
||||||
AC_TRY_COMPILE(,[long long int i;],
|
|
||||||
ac_cv_c_long_long=yes,
|
|
||||||
ac_cv_c_long_long=no)
|
|
||||||
fi])
|
|
||||||
|
|
||||||
if test $ac_cv_c_long_long = yes; then
|
|
||||||
AC_DEFINE(HAVE_LONG_LONG)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Threading support
|
|
||||||
AC_ARG_ENABLE(threads, [ --enable-threads enable multi-threading support])
|
|
||||||
|
|
||||||
have_pthread=no
|
|
||||||
PTHREAD_FLAGS=""
|
|
||||||
PTHREAD_LIBS=""
|
|
||||||
|
|
||||||
if test "x$enable_threads" != xno; then
|
|
||||||
AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H))
|
|
||||||
|
|
||||||
if test x$ac_cv_header_pthread_h = xyes; then
|
|
||||||
dnl Check various threading options for the platforms we support
|
|
||||||
for flag in -lpthreads -lpthread -pthread; do
|
|
||||||
AC_MSG_CHECKING([for pthread_create using $flag])
|
|
||||||
SAVELIBS="$LIBS"
|
|
||||||
LIBS="$flag $LIBS"
|
|
||||||
AC_TRY_LINK([#include <pthread.h>],
|
|
||||||
[pthread_create(0, 0, 0, 0);],
|
|
||||||
have_pthread=yes)
|
|
||||||
AC_MSG_RESULT([$have_pthread])
|
|
||||||
LIBS="$SAVELIBS"
|
|
||||||
|
|
||||||
if test $have_pthread = yes; then
|
|
||||||
PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT"
|
|
||||||
PTHREAD_LIBS="$flag"
|
|
||||||
|
|
||||||
# Solaris requires -D_POSIX_PTHREAD_SEMANTICS to
|
|
||||||
# be POSIX-compliant... :(
|
|
||||||
if test $uname = SunOS; then
|
|
||||||
PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
|
||||||
fi
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(PTHREAD_FLAGS)
|
|
||||||
AC_SUBST(PTHREAD_LIBS)
|
|
||||||
|
|
||||||
dnl Shared library support...
|
|
||||||
DSO="${DSO:=:}"
|
|
||||||
DSOFLAGS="${DSOFLAGS:=}"
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries, default=no])
|
|
||||||
|
|
||||||
if test x$enable_shared = xyes; then
|
|
||||||
AC_MSG_CHECKING(for shared library support)
|
|
||||||
PICFLAG=1
|
|
||||||
|
|
||||||
case "$uname" in
|
|
||||||
SunOS* | UNIX_S*)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.so.1.4"
|
|
||||||
DSO="\$(CC)"
|
|
||||||
DSOFLAGS="$DSOFLAGS -Wl,-h,libmxml.so.1 -G -R\$(libdir) \$(OPTIM)"
|
|
||||||
LDFLAGS="$LDFLAGS -R\$(libdir)"
|
|
||||||
;;
|
|
||||||
|
|
||||||
HP-UX*)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.sl.1"
|
|
||||||
DSO="ld"
|
|
||||||
DSOFLAGS="$DSOFLAGS -b -z +h libmxml.sl.1 +s +b \$(libdir)"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)"
|
|
||||||
;;
|
|
||||||
|
|
||||||
IRIX)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.so.1.4"
|
|
||||||
DSO="\$(CC)"
|
|
||||||
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi1.0,-soname,libmxml.so.1 -shared \$(OPTIM)"
|
|
||||||
;;
|
|
||||||
|
|
||||||
OSF1* | Linux | GNU)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.so.1.4"
|
|
||||||
DSO="\$(CC)"
|
|
||||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*BSD*)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.so.1.4"
|
|
||||||
DSO="\$(CC)"
|
|
||||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-R\$(libdir) -shared \$(OPTIM)"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)"
|
|
||||||
;;
|
|
||||||
|
|
||||||
Darwin*)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
LIBMXML="libmxml.1.dylib"
|
|
||||||
DSO="\$(CC)"
|
|
||||||
DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
AC_MSG_WARN(shared libraries not supported on this platform.)
|
|
||||||
PICFLAG=0
|
|
||||||
LIBMXML="libmxml.a"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
PICFLAG=0
|
|
||||||
LIBMXML="libmxml.a"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(DSO)
|
|
||||||
AC_SUBST(DSOFLAGS)
|
|
||||||
AC_SUBST(LIBMXML)
|
|
||||||
AC_SUBST(PICFLAG)
|
|
||||||
|
|
||||||
dnl Add -Wall for GCC...
|
|
||||||
if test -n "$GCC"; then
|
|
||||||
CFLAGS="-Wall $CFLAGS"
|
|
||||||
|
|
||||||
if test "x$OPTIM" = x; then
|
|
||||||
OPTIM="-Os -g"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$use_ansi" = xyes; then
|
|
||||||
CFLAGS="-ansi -pedantic $CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $PICFLAG = 1 -a $uname != AIX; then
|
|
||||||
OPTIM="-fPIC $OPTIM"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
case $uname in
|
|
||||||
HP-UX*)
|
|
||||||
CFLAGS="-Ae $CFLAGS"
|
|
||||||
|
|
||||||
if test "x$OPTIM" = x; then
|
|
||||||
OPTIM="-O"
|
|
||||||
fi
|
|
||||||
|
|
||||||
OPTIM="+DAportable $OPTIM"
|
|
||||||
|
|
||||||
if test $PICFLAG = 1; then
|
|
||||||
OPTIM="+z $OPTIM"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
UNIX_SVR* | SunOS*)
|
|
||||||
if test "x$OPTIM" = x; then
|
|
||||||
OPTIM="-O"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $PICFLAG = 1; then
|
|
||||||
OPTIM="-KPIC $OPTIM"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test "x$OPTIM" = x; then
|
|
||||||
OPTIM="-O"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Fix "prefix" variable if it hasn't been specified...
|
|
||||||
if test "$prefix" = "NONE"; then
|
|
||||||
prefix="/usr/local"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Fix "exec_prefix" variable if it hasn't been specified...
|
|
||||||
if test "$exec_prefix" = "NONE"; then
|
|
||||||
exec_prefix="$prefix"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Fix "docdir" variable if it hasn't been specified...
|
|
||||||
if test "$docdir" = "NONE"; then
|
|
||||||
docdir="$datadir/doc/mxml"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Fix "mandir" variable if it hasn't been specified...
|
|
||||||
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then
|
|
||||||
case "$uname" in
|
|
||||||
*BSD* | Darwin* | Linux*)
|
|
||||||
# BSD, Darwin (MacOS X), and Linux
|
|
||||||
mandir="/usr/share/man"
|
|
||||||
;;
|
|
||||||
IRIX*)
|
|
||||||
# SGI IRIX
|
|
||||||
mandir="/usr/share/catman/u_man"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# All others
|
|
||||||
mandir="/usr/man"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl pkg-config stuff...
|
|
||||||
if test "$includedir" != /usr/include; then
|
|
||||||
PC_CFLAGS="-I$includedir"
|
|
||||||
else
|
|
||||||
PC_CFLAGS=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$libdir" != /usr/lib; then
|
|
||||||
PC_LIBS="-L$libdir -lmxml"
|
|
||||||
else
|
|
||||||
PC_LIBS="-lmxml"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(PC_CFLAGS)
|
|
||||||
AC_SUBST(PC_LIBS)
|
|
||||||
|
|
||||||
dnl Output the makefile, etc...
|
|
||||||
AC_OUTPUT(Makefile mxml.list mxml.pc)
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl End of "$Id$".
|
|
||||||
dnl
|
|
|
@ -1,251 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
|
||||||
#
|
|
||||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
|
||||||
#
|
|
||||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
# documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
# the above copyright notice appear in all copies and that both that
|
|
||||||
# copyright notice and this permission notice appear in supporting
|
|
||||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
|
||||||
# publicity pertaining to distribution of the software without specific,
|
|
||||||
# written prior permission. M.I.T. makes no representations about the
|
|
||||||
# suitability of this software for any purpose. It is provided "as is"
|
|
||||||
# without express or implied warranty.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch. It can only install one file at a time, a restriction
|
|
||||||
# shared with many OS's install programs.
|
|
||||||
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit="${DOITPROG-}"
|
|
||||||
|
|
||||||
|
|
||||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
|
||||||
|
|
||||||
mvprog="${MVPROG-mv}"
|
|
||||||
cpprog="${CPPROG-cp}"
|
|
||||||
chmodprog="${CHMODPROG-chmod}"
|
|
||||||
chownprog="${CHOWNPROG-chown}"
|
|
||||||
chgrpprog="${CHGRPPROG-chgrp}"
|
|
||||||
stripprog="${STRIPPROG-strip}"
|
|
||||||
rmprog="${RMPROG-rm}"
|
|
||||||
mkdirprog="${MKDIRPROG-mkdir}"
|
|
||||||
|
|
||||||
transformbasename=""
|
|
||||||
transform_arg=""
|
|
||||||
instcmd="$mvprog"
|
|
||||||
chmodcmd="$chmodprog 0755"
|
|
||||||
chowncmd=""
|
|
||||||
chgrpcmd=""
|
|
||||||
stripcmd=""
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
mvcmd="$mvprog"
|
|
||||||
src=""
|
|
||||||
dst=""
|
|
||||||
dir_arg=""
|
|
||||||
|
|
||||||
while [ x"$1" != x ]; do
|
|
||||||
case $1 in
|
|
||||||
-c) instcmd="$cpprog"
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-d) dir_arg=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-m) chmodcmd="$chmodprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-s) stripcmd="$stripprog"
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
*) if [ x"$src" = x ]
|
|
||||||
then
|
|
||||||
src=$1
|
|
||||||
else
|
|
||||||
# this colon is to work around a 386BSD /bin/sh bug
|
|
||||||
:
|
|
||||||
dst=$1
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ x"$src" = x ]
|
|
||||||
then
|
|
||||||
echo "install: no input file specified"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dir_arg" != x ]; then
|
|
||||||
dst=$src
|
|
||||||
src=""
|
|
||||||
|
|
||||||
if [ -d $dst ]; then
|
|
||||||
instcmd=:
|
|
||||||
chmodcmd=""
|
|
||||||
else
|
|
||||||
instcmd=$mkdirprog
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
|
|
||||||
if [ -f $src -o -d $src ]
|
|
||||||
then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "install: $src does not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dst" = x ]
|
|
||||||
then
|
|
||||||
echo "install: no destination specified"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; if your system
|
|
||||||
# does not like double slashes in filenames, you may need to add some logic
|
|
||||||
|
|
||||||
if [ -d $dst ]
|
|
||||||
then
|
|
||||||
dst="$dst"/`basename $src`
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
## this sed command emulates the dirname command
|
|
||||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
|
||||||
|
|
||||||
# Make sure that the destination directory exists.
|
|
||||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
|
||||||
|
|
||||||
# Skip lots of stat calls in the usual case.
|
|
||||||
if [ ! -d "$dstdir" ]; then
|
|
||||||
defaultIFS='
|
|
||||||
'
|
|
||||||
IFS="${IFS-${defaultIFS}}"
|
|
||||||
|
|
||||||
oIFS="${IFS}"
|
|
||||||
# Some sh's can't handle IFS=/ for some reason.
|
|
||||||
IFS='%'
|
|
||||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
|
||||||
IFS="${oIFS}"
|
|
||||||
|
|
||||||
pathcomp=''
|
|
||||||
|
|
||||||
while [ $# -ne 0 ] ; do
|
|
||||||
pathcomp="${pathcomp}${1}"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ ! -d "${pathcomp}" ] ;
|
|
||||||
then
|
|
||||||
$mkdirprog "${pathcomp}"
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
|
|
||||||
pathcomp="${pathcomp}/"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dir_arg" != x ]
|
|
||||||
then
|
|
||||||
$doit $instcmd $dst &&
|
|
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
|
|
||||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
|
|
||||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
|
|
||||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
|
|
||||||
else
|
|
||||||
|
|
||||||
# If we're going to rename the final executable, determine the name now.
|
|
||||||
|
|
||||||
if [ x"$transformarg" = x ]
|
|
||||||
then
|
|
||||||
dstfile=`basename $dst`
|
|
||||||
else
|
|
||||||
dstfile=`basename $dst $transformbasename |
|
|
||||||
sed $transformarg`$transformbasename
|
|
||||||
fi
|
|
||||||
|
|
||||||
# don't allow the sed command to completely eliminate the filename
|
|
||||||
|
|
||||||
if [ x"$dstfile" = x ]
|
|
||||||
then
|
|
||||||
dstfile=`basename $dst`
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make a temp file name in the proper directory.
|
|
||||||
|
|
||||||
dsttmp=$dstdir/#inst.$$#
|
|
||||||
|
|
||||||
# Move or copy the file name to the temp name
|
|
||||||
|
|
||||||
$doit $instcmd $src $dsttmp &&
|
|
||||||
|
|
||||||
trap "rm -f ${dsttmp}" 0 &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits
|
|
||||||
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
|
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
|
|
||||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
|
|
||||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
|
|
||||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
|
|
||||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
|
||||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
|
||||||
|
|
||||||
fi &&
|
|
||||||
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,181 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Attribute support code for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (attr->value)
|
|
||||||
free(attr->value);
|
|
||||||
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
if ((attr->value = strdup(value)) == NULL)
|
|
||||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
|
||||||
name, node->value.element.name);
|
|
||||||
}
|
|
||||||
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$".
|
|
||||||
*/
|
|
|
@ -1,472 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Character entity support code for Mini-XML, a small XML-like
|
|
||||||
* file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int /* O - 0 on success, -1 on failure */
|
|
||||||
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 ++;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mxml_error("Unable to add entity callback!");
|
|
||||||
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlEntityGetName()' - Get the name that corresponds to the character value.
|
|
||||||
*
|
|
||||||
* If val does not need to be represented by a named entity, NULL is returned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const char * /* O - Entity name or NULL */
|
|
||||||
mxmlEntityGetName(int val) /* I - Character value */
|
|
||||||
{
|
|
||||||
switch (val)
|
|
||||||
{
|
|
||||||
case '&' :
|
|
||||||
return ("amp");
|
|
||||||
|
|
||||||
case '<' :
|
|
||||||
return ("lt");
|
|
||||||
|
|
||||||
case '>' :
|
|
||||||
return ("gt");
|
|
||||||
|
|
||||||
case '\"' :
|
|
||||||
return ("quot");
|
|
||||||
|
|
||||||
default :
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlEntityGetValue()' - Get the character corresponding to a named entity.
|
|
||||||
*
|
|
||||||
* The entity name can also be a numeric constant. -1 is returned if the
|
|
||||||
* name is not known.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int /* O - Character value or -1 on error */
|
|
||||||
mxmlEntityGetValue(const char *name) /* I - Entity name */
|
|
||||||
{
|
|
||||||
int i; /* Looping var */
|
|
||||||
int ch; /* Character value */
|
|
||||||
|
|
||||||
|
|
||||||
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 }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do a binary search for the named entity...
|
|
||||||
*/
|
|
||||||
|
|
||||||
first = 0;
|
|
||||||
last = (int)(sizeof(entities) / sizeof(entities[0]) - 1);
|
|
||||||
|
|
||||||
while ((last - first) > 1)
|
|
||||||
{
|
|
||||||
current = (first + last) / 2;
|
|
||||||
|
|
||||||
if ((diff = strcmp(name, entities[current].name)) == 0)
|
|
||||||
return (entities[current].val);
|
|
||||||
else if (diff < 0)
|
|
||||||
last = current;
|
|
||||||
else
|
|
||||||
first = current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we get here, there is a small chance that there is still
|
|
||||||
* a match; check first and last...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!strcmp(name, entities[first].name))
|
|
||||||
return (entities[first].val);
|
|
||||||
else if (!strcmp(name, entities[last].name))
|
|
||||||
return (entities[last].val);
|
|
||||||
else
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* End of "$Id$".
|
|
||||||
*/
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,649 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Index support code for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* mxmlIndexDelete() - Delete an index.
|
|
||||||
* mxmlIndexEnum() - Return the next node in the index.
|
|
||||||
* mxmlIndexFind() - Find the next matching node.
|
|
||||||
* mxmlIndexNew() - Create a new index.
|
|
||||||
* mxmlIndexReset() - Reset the enumeration/find pointer in the index and
|
|
||||||
* return the first node in the index.
|
|
||||||
* index_compare() - Compare two nodes.
|
|
||||||
* index_find() - Compare a node with index values.
|
|
||||||
* index_sort() - Sort the nodes in the index...
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include necessary headers...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "mxml.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sort functions...
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int index_compare(mxml_index_t *ind, mxml_node_t *first,
|
|
||||||
mxml_node_t *second);
|
|
||||||
static int index_find(mxml_index_t *ind, const char *element,
|
|
||||||
const char *value, mxml_node_t *node);
|
|
||||||
static void index_sort(mxml_index_t *ind, int left, int right);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlIndexDelete()' - Delete an index.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
mxmlIndexDelete(mxml_index_t *ind) /* I - Index to delete */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Range check input..
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!ind)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free memory...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ind->attr)
|
|
||||||
free(ind->attr);
|
|
||||||
|
|
||||||
if (ind->alloc_nodes)
|
|
||||||
free(ind->nodes);
|
|
||||||
|
|
||||||
free(ind);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlIndexEnum()' - Return the next node in the index.
|
|
||||||
*
|
|
||||||
* Nodes are returned in the sorted order of the index.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - Next node or NULL if there is none */
|
|
||||||
mxmlIndexEnum(mxml_index_t *ind) /* I - Index to enumerate */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!ind)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the next node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ind->cur_node < ind->num_nodes)
|
|
||||||
return (ind->nodes[ind->cur_node ++]);
|
|
||||||
else
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlIndexFind()' - Find the next matching node.
|
|
||||||
*
|
|
||||||
* You should call mxmlIndexReset() prior to using this function for
|
|
||||||
* the first time with a particular set of "element" and "value"
|
|
||||||
* strings. Passing NULL for both "element" and "value" is equivalent
|
|
||||||
* to calling mxmlIndexEnum().
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - Node or NULL if none found */
|
|
||||||
mxmlIndexFind(mxml_index_t *ind, /* I - Index to search */
|
|
||||||
const char *element, /* I - Element name to find, if any */
|
|
||||||
const char *value) /* I - Attribute value, if any */
|
|
||||||
{
|
|
||||||
int diff, /* Difference between names */
|
|
||||||
current, /* Current entity in search */
|
|
||||||
first, /* First entity in search */
|
|
||||||
last; /* Last entity in search */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("mxmlIndexFind(ind=%p, element=\"%s\", value=\"%s\")\n",
|
|
||||||
ind, element ? element : "(null)", value ? value : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!ind || (!ind->attr && value))
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
puts(" returning NULL...");
|
|
||||||
printf(" ind->attr=\"%s\"\n", ind->attr ? ind->attr : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If both element and value are NULL, just enumerate the nodes in the
|
|
||||||
* index...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!element && !value)
|
|
||||||
return (mxmlIndexEnum(ind));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If there are no nodes in the index, return NULL...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!ind->num_nodes)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
puts(" returning NULL...");
|
|
||||||
puts(" no nodes!");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If cur_node == 0, then find the first matching node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ind->cur_node == 0)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Find the first node using a modified binary search algorithm...
|
|
||||||
*/
|
|
||||||
|
|
||||||
first = 0;
|
|
||||||
last = ind->num_nodes - 1;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" find first time, num_nodes=%d...\n", ind->num_nodes);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
while ((last - first) > 1)
|
|
||||||
{
|
|
||||||
current = (first + last) / 2;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" first=%d, last=%d, current=%d\n", first, last, current);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
if ((diff = index_find(ind, element, value, ind->nodes[current])) == 0)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Found a match, move back to find the first...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
puts(" match!");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
while (current > 0 &&
|
|
||||||
!index_find(ind, element, value, ind->nodes[current - 1]))
|
|
||||||
current --;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" returning first match=%d\n", current);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the first match and save the index to the next...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ind->cur_node = current + 1;
|
|
||||||
|
|
||||||
return (ind->nodes[current]);
|
|
||||||
}
|
|
||||||
else if (diff < 0)
|
|
||||||
last = current;
|
|
||||||
else
|
|
||||||
first = current;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" diff=%d\n", diff);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we get this far, then we found exactly 0 or 1 matches...
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (current = first; current <= last; current ++)
|
|
||||||
if (!index_find(ind, element, value, ind->nodes[current]))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Found exactly one (or possibly two) match...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" returning only match %d...\n", current);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
ind->cur_node = current + 1;
|
|
||||||
|
|
||||||
return (ind->nodes[current]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No matches...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ind->cur_node = ind->num_nodes;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
puts(" returning NULL...");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
else if (ind->cur_node < ind->num_nodes &&
|
|
||||||
!index_find(ind, element, value, ind->nodes[ind->cur_node]))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Return the next matching node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" returning next match %d...\n", ind->cur_node);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
return (ind->nodes[ind->cur_node ++]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we get this far, then we have no matches...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ind->cur_node = ind->num_nodes;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
puts(" returning NULL...");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlIndexNew()' - Create a new index.
|
|
||||||
*
|
|
||||||
* The index will contain all nodes that contain the named element and/or
|
|
||||||
* attribute. If both "element" and "attr" are NULL, then the index will
|
|
||||||
* contain a sorted list of the elements in the node tree. Nodes are
|
|
||||||
* sorted by element name and optionally by attribute value if the "attr"
|
|
||||||
* argument is not NULL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_index_t * /* O - New index */
|
|
||||||
mxmlIndexNew(mxml_node_t *node, /* I - XML node tree */
|
|
||||||
const char *element, /* I - Element to index or NULL for all */
|
|
||||||
const char *attr) /* I - Attribute to index or NULL for none */
|
|
||||||
{
|
|
||||||
mxml_index_t *ind; /* New index */
|
|
||||||
mxml_node_t *current, /* Current node in index */
|
|
||||||
**temp; /* Temporary node pointer array */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("mxmlIndexNew(node=%p, element=\"%s\", attr=\"%s\")\n",
|
|
||||||
node, element ? element : "(null)", attr ? attr : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
if (!node)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a new index...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((ind = calloc(1, sizeof(mxml_index_t))) == NULL)
|
|
||||||
{
|
|
||||||
mxml_error("Unable to allocate %d bytes for index - %s",
|
|
||||||
sizeof(mxml_index_t), strerror(errno));
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attr)
|
|
||||||
ind->attr = strdup(attr);
|
|
||||||
|
|
||||||
if (!element && !attr)
|
|
||||||
current = node;
|
|
||||||
else
|
|
||||||
current = mxmlFindElement(node, node, element, attr, NULL, MXML_DESCEND);
|
|
||||||
|
|
||||||
while (current)
|
|
||||||
{
|
|
||||||
if (ind->num_nodes >= ind->alloc_nodes)
|
|
||||||
{
|
|
||||||
if (!ind->alloc_nodes)
|
|
||||||
temp = malloc(64 * sizeof(mxml_node_t *));
|
|
||||||
else
|
|
||||||
temp = realloc(ind->nodes, (ind->alloc_nodes + 64) * sizeof(mxml_node_t *));
|
|
||||||
|
|
||||||
if (!temp)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Unable to allocate memory for the index, so abort...
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_error("Unable to allocate %d bytes for index: %s",
|
|
||||||
(ind->alloc_nodes + 64) * sizeof(mxml_node_t *),
|
|
||||||
strerror(errno));
|
|
||||||
|
|
||||||
mxmlIndexDelete(ind);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ind->nodes = temp;
|
|
||||||
ind->alloc_nodes += 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
ind->nodes[ind->num_nodes ++] = current;
|
|
||||||
|
|
||||||
current = mxmlFindElement(current, node, element, attr, NULL, MXML_DESCEND);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sort nodes based upon the search criteria...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
{
|
|
||||||
int i; /* Looping var */
|
|
||||||
|
|
||||||
|
|
||||||
printf("%d node(s) in index.\n\n", ind->num_nodes);
|
|
||||||
|
|
||||||
if (attr)
|
|
||||||
{
|
|
||||||
printf("Node Address Element %s\n", attr);
|
|
||||||
puts("-------- -------- -------------- ------------------------------");
|
|
||||||
|
|
||||||
for (i = 0; i < ind->num_nodes; i ++)
|
|
||||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
|
||||||
ind->nodes[i]->value.element.name,
|
|
||||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
puts("Node Address Element");
|
|
||||||
puts("-------- -------- --------------");
|
|
||||||
|
|
||||||
for (i = 0; i < ind->num_nodes; i ++)
|
|
||||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
|
||||||
ind->nodes[i]->value.element.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
if (ind->num_nodes > 1)
|
|
||||||
index_sort(ind, 0, ind->num_nodes - 1);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
{
|
|
||||||
int i; /* Looping var */
|
|
||||||
|
|
||||||
|
|
||||||
puts("After sorting:\n");
|
|
||||||
|
|
||||||
if (attr)
|
|
||||||
{
|
|
||||||
printf("Node Address Element %s\n", attr);
|
|
||||||
puts("-------- -------- -------------- ------------------------------");
|
|
||||||
|
|
||||||
for (i = 0; i < ind->num_nodes; i ++)
|
|
||||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
|
||||||
ind->nodes[i]->value.element.name,
|
|
||||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
puts("Node Address Element");
|
|
||||||
puts("-------- -------- --------------");
|
|
||||||
|
|
||||||
for (i = 0; i < ind->num_nodes; i ++)
|
|
||||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
|
||||||
ind->nodes[i]->value.element.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the new index...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (ind);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlIndexReset()' - Reset the enumeration/find pointer in the index and
|
|
||||||
* return the first node in the index.
|
|
||||||
*
|
|
||||||
* This function should be called prior to using mxmlIndexEnum() or
|
|
||||||
* mxmlIndexFind() for the first time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - First node or NULL if there is none */
|
|
||||||
mxmlIndexReset(mxml_index_t *ind) /* I - Index to reset */
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("mxmlIndexReset(ind=%p)\n", ind);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!ind)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the index to the first element...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ind->cur_node = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the first node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ind->num_nodes)
|
|
||||||
return (ind->nodes[0]);
|
|
||||||
else
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'index_compare()' - Compare two nodes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int /* O - Result of comparison */
|
|
||||||
index_compare(mxml_index_t *ind, /* I - Index */
|
|
||||||
mxml_node_t *first, /* I - First node */
|
|
||||||
mxml_node_t *second) /* I - Second node */
|
|
||||||
{
|
|
||||||
int diff; /* Difference */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((diff = strcmp(first->value.element.name,
|
|
||||||
second->value.element.name)) != 0)
|
|
||||||
return (diff);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the attribute value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (ind->attr)
|
|
||||||
{
|
|
||||||
if ((diff = strcmp(mxmlElementGetAttr(first, ind->attr),
|
|
||||||
mxmlElementGetAttr(second, ind->attr))) != 0)
|
|
||||||
return (diff);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No difference, return 0...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'index_find()' - Compare a node with index values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int /* O - Result of comparison */
|
|
||||||
index_find(mxml_index_t *ind, /* I - Index */
|
|
||||||
const char *element, /* I - Element name or NULL */
|
|
||||||
const char *value, /* I - Attribute value or NULL */
|
|
||||||
mxml_node_t *node) /* I - Node */
|
|
||||||
{
|
|
||||||
int diff; /* Difference */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (element)
|
|
||||||
{
|
|
||||||
if ((diff = strcmp(element, node->value.element.name)) != 0)
|
|
||||||
return (diff);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the attribute value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
if ((diff = strcmp(value, mxmlElementGetAttr(node, ind->attr))) != 0)
|
|
||||||
return (diff);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No difference, return 0...
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'index_sort()' - Sort the nodes in the index...
|
|
||||||
*
|
|
||||||
* This function implements the classic quicksort algorithm...
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
index_sort(mxml_index_t *ind, /* I - Index to sort */
|
|
||||||
int left, /* I - Left node in partition */
|
|
||||||
int right) /* I - Right node in partition */
|
|
||||||
{
|
|
||||||
mxml_node_t *pivot, /* Pivot node */
|
|
||||||
*temp; /* Swap node */
|
|
||||||
int templ, /* Temporary left node */
|
|
||||||
tempr; /* Temporary right node */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Loop until we have sorted all the way to the right...
|
|
||||||
*/
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Sort the pivot in the current partition...
|
|
||||||
*/
|
|
||||||
|
|
||||||
pivot = ind->nodes[left];
|
|
||||||
|
|
||||||
for (templ = left, tempr = right; templ < tempr;)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Move left while left node <= pivot node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
while ((templ < right) &&
|
|
||||||
index_compare(ind, ind->nodes[templ], pivot) <= 0)
|
|
||||||
templ ++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Move right while right node > pivot node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
while ((tempr > left) &&
|
|
||||||
index_compare(ind, ind->nodes[tempr], pivot) > 0)
|
|
||||||
tempr --;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Swap nodes if needed...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (templ < tempr)
|
|
||||||
{
|
|
||||||
temp = ind->nodes[templ];
|
|
||||||
ind->nodes[templ] = ind->nodes[tempr];
|
|
||||||
ind->nodes[tempr] = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When we get here, the right (tempr) node is the new position for the
|
|
||||||
* pivot node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (index_compare(ind, pivot, ind->nodes[tempr]) > 0)
|
|
||||||
{
|
|
||||||
ind->nodes[left] = ind->nodes[tempr];
|
|
||||||
ind->nodes[tempr] = pivot;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Recursively sort the left partition as needed...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (left < (tempr - 1))
|
|
||||||
index_sort(ind, left, tempr - 1);
|
|
||||||
}
|
|
||||||
while (right > (left = tempr + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* End of "$Id$".
|
|
||||||
*/
|
|
|
@ -1,664 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Node support code for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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;
|
|
||||||
case MXML_CUSTOM :
|
|
||||||
if (node->value.custom.data &&
|
|
||||||
node->value.custom.destroy)
|
|
||||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free this node...
|
|
||||||
*/
|
|
||||||
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewCustom()' - Create a new custom data node.
|
|
||||||
*
|
|
||||||
* The new custom node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* element node has no parent. NULL can be passed when the data in the
|
|
||||||
* node is not dynamically allocated or is separately managed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewCustom(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
void *data, /* I - Pointer to data */
|
|
||||||
void (*destroy)(void *))
|
|
||||||
/* I - Function to destroy data */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewCustom(parent=%p, data=%p, destroy=%p)\n", parent,
|
|
||||||
data, destroy);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_CUSTOM)) != NULL)
|
|
||||||
{
|
|
||||||
node->value.custom.data = data;
|
|
||||||
node->value.custom.destroy = destroy;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewElement()' - Create a new element node.
|
|
||||||
*
|
|
||||||
* The new element node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* element node has no parent.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewElement(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
const char *name) /* I - Name of element */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewElement(parent=%p, name=\"%s\")\n", parent,
|
|
||||||
name ? name : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!name)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL)
|
|
||||||
node->value.element.name = strdup(name);
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewInteger()' - Create a new integer node.
|
|
||||||
*
|
|
||||||
* The new integer node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* integer node has no parent.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewInteger(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
int integer) /* I - Integer value */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewInteger(parent=%p, integer=%d)\n", parent, integer);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_INTEGER)) != NULL)
|
|
||||||
node->value.integer = integer;
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewOpaque()' - Create a new opaque string.
|
|
||||||
*
|
|
||||||
* The new opaque node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* opaque node has no parent. The opaque string must be nul-terminated and
|
|
||||||
* is copied into the new node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewOpaque(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
const char *opaque) /* I - Opaque string */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewOpaque(parent=%p, opaque=\"%s\")\n", parent,
|
|
||||||
opaque ? opaque : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!opaque)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_OPAQUE)) != NULL)
|
|
||||||
node->value.opaque = strdup(opaque);
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewReal()' - Create a new real number node.
|
|
||||||
*
|
|
||||||
* The new real number node is added to the end of the specified parent's
|
|
||||||
* child list. The constant MXML_NO_PARENT can be used to specify that
|
|
||||||
* the new real number node has no parent.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewReal(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
double real) /* I - Real number value */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewReal(parent=%p, real=%g)\n", parent, real);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the element name...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_REAL)) != NULL)
|
|
||||||
node->value.real = real;
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewText()' - Create a new text fragment node.
|
|
||||||
*
|
|
||||||
* The new text node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* text node has no parent. The whitespace parameter is used to specify
|
|
||||||
* whether leading whitespace is present before the node. The text
|
|
||||||
* string must be nul-terminated and is copied into the new node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewText(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
|
||||||
const char *string) /* I - String */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewText(parent=%p, whitespace=%d, string=\"%s\")\n",
|
|
||||||
parent, whitespace, string ? string : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!string)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the text value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
|
||||||
{
|
|
||||||
node->value.text.whitespace = whitespace;
|
|
||||||
node->value.text.string = strdup(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlNewTextf()' - Create a new formatted text fragment node.
|
|
||||||
*
|
|
||||||
* The new text node is added to the end of the specified parent's child
|
|
||||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
|
||||||
* text node has no parent. The whitespace parameter is used to specify
|
|
||||||
* whether leading whitespace is present before the node. The format
|
|
||||||
* string must be nul-terminated and is formatted into the new node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mxml_node_t * /* O - New node */
|
|
||||||
mxmlNewTextf(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
|
||||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
|
||||||
const char *format, /* I - Printf-style frmat string */
|
|
||||||
...) /* I - Additional args as needed */
|
|
||||||
{
|
|
||||||
mxml_node_t *node; /* New node */
|
|
||||||
va_list ap; /* Pointer to arguments */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "mxmlNewTextf(parent=%p, whitespace=%d, format=\"%s\", ...)\n",
|
|
||||||
parent, whitespace, format ? format : "(null)");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!format)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the node and set the text value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
|
||||||
{
|
|
||||||
va_start(ap, format);
|
|
||||||
|
|
||||||
node->value.text.whitespace = whitespace;
|
|
||||||
node->value.text.string = mxml_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$".
|
|
||||||
*/
|
|
|
@ -1,128 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Private functions for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
fprintf(stderr, "mxml: %s\n", s);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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$".
|
|
||||||
*/
|
|
|
@ -1,199 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Search/navigation functions for Mini-XML, a small XML-like file
|
|
||||||
* parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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$".
|
|
||||||
*/
|
|
|
@ -1,257 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Node set functions for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* mxmlSetElement() - Set the name of an element node.
|
|
||||||
* mxmlSetInteger() - Set the value of an integer node.
|
|
||||||
* mxmlSetOpaque() - Set the value of an opaque node.
|
|
||||||
* mxmlSetReal() - Set the value of a real number node.
|
|
||||||
* mxmlSetText() - Set the value of a text node.
|
|
||||||
* mxmlSetTextf() - Set the value of a text node to a formatted string.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include necessary headers...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "mxml.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'mxmlSetCustom()' - Set the data and destructor of a custom data node.
|
|
||||||
*
|
|
||||||
* The node is not changed if it is not a custom node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int /* O - 0 on success, -1 on failure */
|
|
||||||
mxmlSetCustom(mxml_node_t *node, /* I - Node to set */
|
|
||||||
void *data, /* I - New data pointer */
|
|
||||||
void (*destroy)(void *))
|
|
||||||
/* I - New destructor function */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Range check input...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!node || node->type != MXML_CUSTOM)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free any old element value and set the new value...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (node->value.custom.data && node->value.custom.destroy)
|
|
||||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
|
||||||
|
|
||||||
node->value.custom.data = data;
|
|
||||||
node->value.custom.destroy = destroy;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* '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$".
|
|
||||||
*/
|
|
|
@ -1,377 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* String functions for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Contents:
|
|
||||||
*
|
|
||||||
* 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$".
|
|
||||||
*/
|
|
|
@ -1,254 +0,0 @@
|
||||||
/*
|
|
||||||
* "$Id$"
|
|
||||||
*
|
|
||||||
* Header file for Mini-XML, a small XML-like file parsing library.
|
|
||||||
*
|
|
||||||
* Copyright 2003-2005 by Michael Sweet.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prevent multiple inclusion...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _mxml_h_
|
|
||||||
# define _mxml_h_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include necessary headers...
|
|
||||||
*/
|
|
||||||
|
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <string.h>
|
|
||||||
# include <ctype.h>
|
|
||||||
# include <errno.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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_CUSTOM /* Custom data */
|
|
||||||
} 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 struct mxml_custom_s /**** An XML custom value. ****/
|
|
||||||
{
|
|
||||||
void *data; /* Pointer to (allocated) custom data */
|
|
||||||
void (*destroy)(void *);
|
|
||||||
/* Pointer to destructor function */
|
|
||||||
} mxml_custom_t;
|
|
||||||
|
|
||||||
typedef union mxml_value_u /**** An XML node value. ****/
|
|
||||||
{
|
|
||||||
mxml_element_t element; /* Element */
|
|
||||||
int integer; /* Integer number */
|
|
||||||
char *opaque; /* Opaque string */
|
|
||||||
double real; /* Real number */
|
|
||||||
mxml_text_t text; /* Text fragment */
|
|
||||||
mxml_custom_t custom; /* Custom data */
|
|
||||||
} 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;
|
|
||||||
|
|
||||||
typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *);
|
|
||||||
/**** Custom data load callback function ****/
|
|
||||||
|
|
||||||
typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *);
|
|
||||||
/**** Custom data save callback function ****/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 int 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 *mxmlLoadFd(mxml_node_t *top, int fd,
|
|
||||||
mxml_type_t (*cb)(mxml_node_t *));
|
|
||||||
extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp,
|
|
||||||
mxml_type_t (*cb)(mxml_node_t *));
|
|
||||||
extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s,
|
|
||||||
mxml_type_t (*cb)(mxml_node_t *));
|
|
||||||
extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data,
|
|
||||||
void (*destroy)(void *));
|
|
||||||
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 mxmlSaveFd(mxml_node_t *node, int fd,
|
|
||||||
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 mxmlSetCustom(mxml_node_t *node, void *data,
|
|
||||||
void (*destroy)(void *));
|
|
||||||
extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load,
|
|
||||||
mxml_custom_save_cb_t save);
|
|
||||||
extern int mxmlSetElement(mxml_node_t *node, const char *name);
|
|
||||||
extern void mxmlSetErrorCallback(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$".
|
|
||||||
*/
|
|
|
@ -1,115 +0,0 @@
|
||||||
#
|
|
||||||
# "$Id$"
|
|
||||||
#
|
|
||||||
# EPM software list file for Mini-XML, a small XML library.
|
|
||||||
#
|
|
||||||
# Copyright 2003-2005 by Michael Sweet.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU Library General Public
|
|
||||||
# License as published by the Free Software Foundation; either
|
|
||||||
# version 2, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Directories...
|
|
||||||
$prefix=@prefix@
|
|
||||||
$exec_prefix=@exec_prefix@
|
|
||||||
$bindir=@bindir@
|
|
||||||
$docdir=@docdir@
|
|
||||||
$includedir=@includedir@
|
|
||||||
$libdir=@libdir@
|
|
||||||
$mandir=@mandir@
|
|
||||||
$srcdir=@srcdir@
|
|
||||||
$datarootdir=@datarootdir@
|
|
||||||
|
|
||||||
$PICFLAG=@PICFLAG@
|
|
||||||
|
|
||||||
# Product information
|
|
||||||
%product mxml
|
|
||||||
%copyright 2003-2005 by Michael Sweet
|
|
||||||
%vendor Michael Sweet
|
|
||||||
%license ${srcdir}/COPYING
|
|
||||||
%readme ${srcdir}/README
|
|
||||||
%version @VERSION@
|
|
||||||
|
|
||||||
%description <<EOF
|
|
||||||
Mini-XML is a small XML parsing library that you can use to read
|
|
||||||
XML and XML-like data files in your application without
|
|
||||||
requiring large non-standard libraries. Mini-XML provides the
|
|
||||||
following functionality:
|
|
||||||
|
|
||||||
- Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded
|
|
||||||
XML files and strings.
|
|
||||||
- Data is stored in a linked-list tree structure, preserving
|
|
||||||
the XML data hierarchy.
|
|
||||||
- Supports arbitrary element names, attributes, and
|
|
||||||
attribute values with no preset limits, just available
|
|
||||||
memory.
|
|
||||||
- Supports integer, real, opaque ("cdata"), and text data
|
|
||||||
types in "leaf" nodes.
|
|
||||||
- Functions for creating and managing trees of data.
|
|
||||||
- "Find" and "walk" functions for easily locating and
|
|
||||||
navigating trees of data.
|
|
||||||
|
|
||||||
Mini-XML doesn't do validation or other types of processing on
|
|
||||||
the data based upon schema files or other sources of definition
|
|
||||||
information, nor does it support character entities other than
|
|
||||||
those required by the XML specification.
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Manpage extensions...
|
|
||||||
$CAT1EXT=@CAT1EXT@
|
|
||||||
$CAT3EXT=@CAT3EXT@
|
|
||||||
$MAN1EXT=@MAN1EXT@
|
|
||||||
$MAN3EXT=@MAN3EXT@
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
f 0555 root sys ${bindir}/mxmldoc mxmldoc
|
|
||||||
|
|
||||||
# Header files
|
|
||||||
f 0444 root sys ${includedir}/mxml.h mxml.h
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
%if $PICFLAG
|
|
||||||
%system hpux
|
|
||||||
f 0555 root sys ${libdir}/libmxml.sl.1 libmxml.sl.1
|
|
||||||
l 0555 root sys ${libdir}/libmxml.sl libmxml.sl.1
|
|
||||||
|
|
||||||
%system dylib
|
|
||||||
f 0555 root sys ${libdir}/libmxml.1.dylib libmxml.1.dylib
|
|
||||||
l 0555 root sys ${libdir}/libmxml.dylib libmxml.1.dylib
|
|
||||||
|
|
||||||
%system freebsd irix linux netbsd openbsd solaris tru64
|
|
||||||
f 0555 root sys ${libdir}/libmxml.so.1.0 libmxml.so.1.0
|
|
||||||
l 0555 root sys ${libdir}/libmxml.sl.1 libmxml.sl.1.0
|
|
||||||
l 0555 root sys ${libdir}/libmxml.sl libmxml.sl.1.0
|
|
||||||
|
|
||||||
%system all
|
|
||||||
%endif
|
|
||||||
|
|
||||||
f 0444 root sys ${libdir}/libmxml.a libmxml.a
|
|
||||||
|
|
||||||
# pkg-config info
|
|
||||||
f 0444 root sys $(libdir)/pkgconfig/mxml.pc mxml.pc
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
f 0444 root sys ${docdir}/README $srcdir/README
|
|
||||||
f 0444 root sys ${docdir}/COPYING $srcdir/COPYING
|
|
||||||
f 0444 root sys ${docdir}/CHANGES $srcdir/CHANGES
|
|
||||||
f 0444 root sys ${docdir}/mxml.html $srcdir/doc/mxml.html
|
|
||||||
f 0444 root sys ${docdir}/mxml.pdf $srcdir/doc/mxml.pdf
|
|
||||||
|
|
||||||
# Man pages
|
|
||||||
f 0444 root sys ${mandir}/cat1/mxmldoc.$CAT1EXT $srcdir/mxmldoc.$CAT1EXT
|
|
||||||
f 0444 root sys ${mandir}/man1/mxmldoc.$MAN1EXT $srcdir/mxmldoc.man
|
|
||||||
f 0444 root sys ${mandir}/cat3/mxml.$CAT3EXT $srcdir/mxml.$CAT3EXT
|
|
||||||
f 0444 root sys ${mandir}/man3/mxml.$MAN3EXT $srcdir/mxml.man
|
|
||||||
|
|
||||||
#
|
|
||||||
# End of "$Id$".
|
|
||||||
#
|
|
|
@ -1,10 +0,0 @@
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
libdir=@libdir@
|
|
||||||
includedir=@includedir@
|
|
||||||
|
|
||||||
Name: Mini-XML
|
|
||||||
Description: Lightweight XML support library
|
|
||||||
Version: @VERSION@
|
|
||||||
Libs: @PC_LIBS@
|
|
||||||
Cflags: @PC_CFLAGS@
|
|
Loading…
Reference in New Issue