Imported Upstream version 3.0.4 upstream upstream/3.0.4
authorAnas Nashif <anas.nashif@intel.com>
Wed, 7 Nov 2012 21:42:59 +0000 (13:42 -0800)
committerAnas Nashif <anas.nashif@intel.com>
Wed, 7 Nov 2012 21:42:59 +0000 (13:42 -0800)
144 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.devel [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Makefile.msvc [new file with mode: 0644]
Makefile.vms [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
README.vms [new file with mode: 0644]
README.woe32 [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
configure [new file with mode: 0755]
configure.ac [new file with mode: 0644]
doc/Makefile.in [new file with mode: 0644]
doc/configure [new file with mode: 0755]
doc/configure.ac [new file with mode: 0644]
doc/gperf.1 [new file with mode: 0644]
doc/gperf.dvi [new file with mode: 0644]
doc/gperf.html [new file with mode: 0644]
doc/gperf.info [new file with mode: 0644]
doc/gperf.pdf [new file with mode: 0644]
doc/gperf.ps [new file with mode: 0644]
doc/gperf.texi [new file with mode: 0644]
doc/gperf_1.html [new file with mode: 0644]
doc/gperf_10.html [new file with mode: 0644]
doc/gperf_2.html [new file with mode: 0644]
doc/gperf_3.html [new file with mode: 0644]
doc/gperf_4.html [new file with mode: 0644]
doc/gperf_5.html [new file with mode: 0644]
doc/gperf_6.html [new file with mode: 0644]
doc/gperf_7.html [new file with mode: 0644]
doc/gperf_8.html [new file with mode: 0644]
doc/gperf_9.html [new file with mode: 0644]
doc/gperf_toc.html [new file with mode: 0644]
doc/gpl-3.0.texi [new file with mode: 0644]
doc/help2man [new file with mode: 0755]
doc/texi2html [new file with mode: 0755]
doc/texinfo.tex [new file with mode: 0644]
lib/Makefile.in [new file with mode: 0644]
lib/configure [new file with mode: 0755]
lib/configure.ac [new file with mode: 0644]
lib/getline.cc [new file with mode: 0644]
lib/getline.h [new file with mode: 0644]
lib/getopt.c [new file with mode: 0644]
lib/getopt.c.patch [new file with mode: 0644]
lib/getopt.h [new file with mode: 0644]
lib/getopt.h.patch [new file with mode: 0644]
lib/getopt1.c [new file with mode: 0644]
lib/hash.cc [new file with mode: 0644]
lib/hash.h [new file with mode: 0644]
mkinstalldirs [new file with mode: 0755]
src/Makefile.in [new file with mode: 0644]
src/bool-array.cc [new file with mode: 0644]
src/bool-array.h [new file with mode: 0644]
src/bool-array.icc [new file with mode: 0644]
src/config.h.in [new file with mode: 0644]
src/config.h.msvc [new file with mode: 0644]
src/config.h_vms [new file with mode: 0644]
src/configure [new file with mode: 0755]
src/configure.ac [new file with mode: 0644]
src/hash-table.cc [new file with mode: 0644]
src/hash-table.h [new file with mode: 0644]
src/input.cc [new file with mode: 0644]
src/input.h [new file with mode: 0644]
src/keyword-list.cc [new file with mode: 0644]
src/keyword-list.h [new file with mode: 0644]
src/keyword-list.icc [new file with mode: 0644]
src/keyword.cc [new file with mode: 0644]
src/keyword.h [new file with mode: 0644]
src/keyword.icc [new file with mode: 0644]
src/main.cc [new file with mode: 0644]
src/options.cc [new file with mode: 0644]
src/options.h [new file with mode: 0644]
src/options.icc [new file with mode: 0644]
src/output.cc [new file with mode: 0644]
src/output.h [new file with mode: 0644]
src/positions.cc [new file with mode: 0644]
src/positions.h [new file with mode: 0644]
src/positions.icc [new file with mode: 0644]
src/search.cc [new file with mode: 0644]
src/search.h [new file with mode: 0644]
src/version.cc [new file with mode: 0644]
src/version.h [new file with mode: 0644]
tests/Makefile.in [new file with mode: 0644]
tests/ada-pred.exp [new file with mode: 0644]
tests/ada-res.exp [new file with mode: 0644]
tests/ada.gperf [new file with mode: 0644]
tests/adadefs.gperf [new file with mode: 0644]
tests/c++.gperf [new file with mode: 0644]
tests/c-parse.exp [new file with mode: 0644]
tests/c-parse.gperf [new file with mode: 0644]
tests/c.exp [new file with mode: 0644]
tests/c.gperf [new file with mode: 0644]
tests/charsets.exp [new file with mode: 0644]
tests/charsets.gperf [new file with mode: 0644]
tests/chill.exp [new file with mode: 0644]
tests/chill.gperf [new file with mode: 0644]
tests/configure [new file with mode: 0755]
tests/configure.ac [new file with mode: 0644]
tests/cplusplus.exp [new file with mode: 0644]
tests/cplusplus.gperf [new file with mode: 0644]
tests/gpc.exp [new file with mode: 0644]
tests/gpc.gperf [new file with mode: 0644]
tests/incomplete.exp [new file with mode: 0644]
tests/incomplete.gperf [new file with mode: 0644]
tests/irc.gperf [new file with mode: 0644]
tests/java.exp [new file with mode: 0644]
tests/java.gperf [new file with mode: 0644]
tests/jscript.gperf [new file with mode: 0644]
tests/jstest1.gperf [new file with mode: 0644]
tests/jstest2.gperf [new file with mode: 0644]
tests/jstest3.gperf [new file with mode: 0644]
tests/jstest4.gperf [new file with mode: 0644]
tests/lang-ucs2.exp [new file with mode: 0644]
tests/lang-ucs2.gperf [new file with mode: 0644]
tests/lang-ucs2.in [new file with mode: 0644]
tests/lang-utf8.exp [new file with mode: 0644]
tests/lang-utf8.gperf [new file with mode: 0644]
tests/languages.exp [new file with mode: 0644]
tests/languages.gperf [new file with mode: 0644]
tests/makeinfo.gperf [new file with mode: 0644]
tests/modula.exp [new file with mode: 0644]
tests/modula2.exp [new file with mode: 0644]
tests/modula2.gperf [new file with mode: 0644]
tests/modula3.gperf [new file with mode: 0644]
tests/objc.exp [new file with mode: 0644]
tests/objc.gperf [new file with mode: 0644]
tests/pascal.exp [new file with mode: 0644]
tests/pascal.gperf [new file with mode: 0644]
tests/permut2.exp [new file with mode: 0644]
tests/permut2.gperf [new file with mode: 0644]
tests/permut3.exp [new file with mode: 0644]
tests/permut3.gperf [new file with mode: 0644]
tests/permutc2.exp [new file with mode: 0644]
tests/permutc2.gperf [new file with mode: 0644]
tests/smtp.gperf [new file with mode: 0644]
tests/test-4.exp [new file with mode: 0644]
tests/test-6.exp [new file with mode: 0644]
tests/test-7.exp [new file with mode: 0644]
tests/test.c [new file with mode: 0644]
tests/test2.c [new file with mode: 0644]
tests/validate [new file with mode: 0755]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..184c7ce
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Douglas C. Schmidt  <schmidt@ics.uci.edu>
+Bruno Haible        <bruno@clisp.org>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state 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 program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, 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.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..d77a1e8
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,3479 @@
+2009-02-01  Brendan Kehoe  <brendan@zen.org>
+
+       * gperf-3.0.4 released.
+       * src/version.cc: Bump to 3.0.4.
+       * tests/*.exp: Bump to 3.0.4 in header.
+       * doc/gperf.1: Regenerate with gperf 3.0.4.
+       * doc/gperf.texi: Adjust version.
+
+       * doc/texinfo.tex: Update to copy from texinfo-4.13.
+
+2009-02-01  Bruno Haible  <bruno@clisp.org>
+
+       * tests/Makefile.in (LDFLAGS, OBJEXT, EXEEXT): New variables.
+       (check-link-c, check-ada, check-modula3, check-pascal, check-lang-utf8,
+       check-lang-ucs2): Use OBJEXT and LDFLAGS.
+       (check-smtp): Use LDFLAGS.
+       (clean): Use EXEEXT as suffix of programs to be removed.
+
+       * aclocal.m4 (CL_PROG_INSTALL): Fix detection of broken AIX installbsd
+       program.
+
+       * tests/Makefile.in (clean): Remove *.dSYM directories left over by gcc
+       on MacOS X 10.5.
+
+       * src/options.cc (Options::parse_options): Bump copyright year.
+
+2009-01-19  Bruno Haible  <bruno@clisp.org>
+
+       Don't include the length in the hash function if all keywords have the
+       same length.
+       * src/search.h (Search): Add _hash_includes_len field.
+       * src/search.cc (Search::prepare): Initialize it.
+       (Search::count_duplicates_tuple, Search::count_duplicates_multiset,
+       Search::prepare_asso_values, Search::find_asso_values,
+       Search::compute_hash): Use it instead of !option[NOLENGTH].
+       * src/output.h (Output): New field _hash_includes_len. Add it as
+       constructor argument.
+       * src/output.cc (Output::Output): Add hash_includes_len argument.
+       (Output::output_hash_function): Use _hash_includes_len instead of
+       !option[NOLENGTH].
+       * src/main.cc (main): Pass _hash_includes_len from Search to Output.
+       * tests/permut2.exp: Updated expected test result.
+       * tests/permut3.exp: Likewise.
+       * tests/permutc2.exp: Likewise.
+       Reported by Behdad Esfahbod <behdad@behdad.org>.
+
+2009-01-14  Bruno Haible  <bruno@clisp.org>
+
+       * configure.ac: More consistent m4 quoting.
+       * src/configure.ac: Likewise.
+       * lib/configure.ac: Likewise.
+       * tests/configure.ac: Likewise.
+       * doc/configure.ac: Likewise.
+
+2009-01-01  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi (Gperf Declarations): Mention the C99 standard.
+
+2008-08-23  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi (Output Copyright): Reword more carefully.
+       Suggested by Paul Jarc <prj@po.cwru.edu>.
+
+2008-08-23  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi (Output Copyright): Adjust for GPLv3.
+
+2008-08-23  Bruno Haible  <bruno@clisp.org>
+
+       All source files are now under GPLv3+.
+       * COPYING: Replace with GPLv3.
+       * **/configure.ac, **/Makefile.*, **/*.h, **/*.c, **/*.cc, **/*.icc:
+       Change copyright notice to GPLv3+.
+       * src/options.cc (Options::parse_options): Update --version output
+       accordingly.
+       * doc/gperf.texi: Reference the GPLv3.
+       * doc/gpl-3.0.texi: New file, copied from the gnulib git repository.
+       * doc/gpl.texinfo: Remove file.
+       * doc/Makefile.in: Update.
+
+2008-05-06  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi: Set @firstparagraphindent.
+       (Bibliography): Don't indent the entries.
+
+2008-05-06  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi (Output Copyright): New section.
+       Reported by Mike Ingrassia <michael.ingrassia@motorola.com> and
+       Karice McIntyre <Karice_McIntyre@ca.ibm.com>.
+
+2008-04-06  Bruno Haible  <bruno@clisp.org>
+
+       * tests/Makefile.in: Use "LC_ALL=C tr" instead of "tr".
+
+2007-09-08  Bruno Haible  <bruno@clisp.org>
+
+       Change generated code to avoid a warning by GCC 4.2 that the meaning
+       of __inline will be changed (!).
+       * src/output.cc (Output::output_lookup_function): Emit the inline
+       marker also for gcc-4.2 in c99 mode.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
+       tests/java.exp, tests/languages.exp, tests/modula2.exp,
+       tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
+       tests/permutc2.exp, tests/test-4.exp: Update.
+       Reported by Jim Meyering <jim@meyering.net>.
+
+2007-09-08  Bruno Haible  <bruno@clisp.org>
+
+       Allow creating the HTML documentation with texi2html or makeinfo.
+       * doc/texi2html: New file, from GNU gettext.
+       * doc/Makefile.in (TEXI2HTML): Invoke it.
+       (gperf.html, gperf_toc.html): Don't pass option -expandinfo.
+       * doc/gperf.texi (makeinfo): New variable.
+       (dircategory, direntry): Enclose in @ifinfo.
+       (Table of Contents): Move to the beginning except in TeX mode.
+
+2007-04-30  Brendan Kehoe  <brendan@zen.org>
+
+       * gperf-3.0.3 released.
+       * src/version.cc: Bump to 3.0.3.
+       * tests/*.exp: Bump to 3.0.3 in header.
+       * doc/gperf.1: Regenerate with gperf 3.0.3.
+
+2007-04-06  Bruno Haible  <bruno@clisp.org>
+
+       Improve support for mingw.
+       * tests/Makefile.in (check-c, check-ada, check-modula3, check-pascal,
+       check-lang-utf8, check-lang-ucs2): Remove '\r' from output before diff.
+       (POSTPROCESS_FOR_MINGW): New variable.
+       (check-test): Use it to postprocess output before diff.
+
+2007-04-04  Bruno Haible  <bruno@clisp.org>
+
+       Support for newer GNU standards.
+       * doc/configure.ac (mandir): Remove assignment.
+       * doc/Makefile.in (datarootdir): New variable.
+       (docdir, dvidir, psdir, pdfdir, htmldir): Use value determined by
+       autoconf.
+       * configure.ac: Require autoconf >= 2.60.
+       * doc/configure.ac: Likewise.
+       * lib/configure.ac: Likewise.
+       * src/configure.ac: Likewise.
+       * tests/configure.ac: Likewise.
+       * configure: Regenerated with autoconf-2.61.
+       * doc/configure: Likewise.
+       * lib/configure: Likewise.
+       * src/configure: Likewise.
+       * tests/configure: Likewise.
+       * src/config.h.in: Likewise.
+       * src/config.h.msvc: Likewise.
+       * src/config.h_vms: Likewise.
+
+2007-04-04  Bruno Haible  <bruno@clisp.org>
+
+       * doc/Makefile.in (MAKEINFO): Disable also the LC_MESSAGES and LC_ALL
+       environment variables.
+
+2007-04-04  Bruno Haible  <bruno@clisp.org>
+
+       * configure.ac: Renamed from configure.in.
+       * doc/configure.ac: Renamed from doc/configure.in.
+       * lib/configure.ac: Renamed from lib/configure.in.
+       * src/configure.ac: Renamed from src/configure.in.
+       * tests/configure.ac: Renamed from tests/configure.in.
+       * Makefile.devel: Update.
+       * INSTALL: Update.
+
+2007-03-31  Bruno Haible  <bruno@clisp.org>
+
+       * tests/test.c (in_word_set): New declaration.
+       * tests/test2.c (in_word_set): Likewise.
+
+2007-03-31  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.cc (Options::parse_options): Bump copyright year.
+
+2007-03-31  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi: Fix typo.
+
+2007-03-31  Bruno Haible  <bruno@clisp.org>
+
+       Change generated code after the meaning of __inline is changed in
+       GCC 4.3.
+       * src/output.cc (Output::output_lookup_function): Emit an inline
+       marker that also works with gcc-4.3 in c99 or gnu99 mode.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
+       tests/java.exp, tests/languages.exp, tests/modula2.exp,
+       tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
+       tests/permutc2.exp, tests/test-4.exp: Update.
+       Reported by Bruce Korb <Bruce.Korb@gmail.com>.
+
+2006-06-29  Brendan Kehoe  <brendan@zen.org>
+
+       * gperf-3.0.2 released.
+
+       * doc/Makefile.in (all): No longer depend on dvi.
+
+2006-01-22  Brendan Kehoe  <brendan@zen.org>
+
+       * doc/gperf.texi: Update copyright to be 1989-2006.
+       (UPDATED): Change to 22 January 2006.
+       * doc/gperf.1 (TH): Fix date.
+       * configure.in: Update copyright years.
+       * configure: Regenerate.
+       * src/Makefile.in: Update copyright years.
+
+       * doc/gperf.{dvi,ps,pdf}: Regenerated by manually invoking tex
+       instead of trying to use texi2dvi, whose run of etex ends up
+       actually always running pdfetex, thus always recreating gperf.pdf.
+
+2006-01-13  Brendan Kehoe  <brendan@zen.org>
+
+       * NEWS: Add note about #line directive fix.
+       * doc/gperf.1: Regenerate with Makefile.devel.
+
+       * doc/gperf.texi (UPDATED): Correct to be today.
+       * doc: Regenerated by doing make in a configured tree.
+       Requires makeinfo, texi2dvi, texi2pdf, and texi2html.
+
+       * configure.in: Add AC_OBJEXT and AC_EXEEXT.
+       * lib/Makefile.in (OBJEXT): Define for subst.
+       (OBJECTS): Use $(OBJEXT) instead of '.o'.
+       * src/Makefile.in: Make dependencies use $(OBJEXT).
+       (OBJEXT, EXEEXT): Define for subst.
+       (TARGETPROG): Add $(EXEEXT).
+       (OBJECTS): Use $(OBJEXT) instead of '.o'.
+       (clean): Remove *.$(OBJEXT) instead of *.o.
+
+2006-01-13  Bruno Haible  <bruno@clisp.org>
+
+       Fix #line directives for filenames containing backslashes.
+       * src/output.cc (output_line_directive): New function.
+       (output_keyword_entry, Output::output): Use it.
+       Reported by Alexander <alexander.me@gmail.com>.
+
+       * src/options.cc (Options::parse_options): Update years in --version
+       output.
+
+2005-08-29  Brendan Kehoe  <brendan@zen.org>
+
+       * src/keyword.cc: Tweak comment to avoid nesting.
+
+2005-08-27  Bruno Haible  <bruno@clisp.org>
+
+       Fix missing ranlib detection when cross-compiling.
+       * aclocal.m4 (CL_PROG_RANLIB): Remove macro.
+       * lib/configure.in: Use AC_PROG_RANLIB instead of CL_PROG_RANLIB.
+
+2005-07-30  Bruno Haible  <bruno@clisp.org>
+
+       * src/version.cc: Bump version number to 3.0.2.
+       * doc/gperf.texi: Likewise.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
+       tests/java.exp, tests/languages.exp, tests/modula2.exp,
+       tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
+       tests/permutc2.exp, tests/test-4.exp: Update.
+
+2005-07-30  Bruno Haible  <bruno@clisp.org>
+
+       * src/positions.h: Add forward declarations of friend classes.
+       Needed for compilation with g++ 4.0.
+
+2004-08-22  Bruno Haible  <bruno@clisp.org>
+
+       * tests/Makefile.in (check-lang-syntax): Add test for the
+       --length-table-name option.
+       * tests/test-6.exp: Update.
+
+2004-08-21  Bruce Lilly <blilly@erols.com>
+
+       * src/input.cc (Input::read_input): Accept length-table-name
+       declaration.
+       * src/options.h (Options::get_lengthtable_name,
+       Options::set_lengthtable_name): New declarations.
+       (Options): Add field _lengthtable_name.
+       * src/options.icc (Options::get_lengthtable_name): New inline method.
+       * src/options.cc (DEFAULT_LENGTHTABLE_NAME): New constant.
+       (Options::long_usage): Document --length-table-name option.
+       (Options::Options): Initialize _lengthtable_name field.
+       (Options::~Options): Update.
+       (Options::set_lengthtable_name): New method.
+       (long_options): Add option --length-table-name.
+       (Options::parse_options): Implement --length-table-name option.
+       * src/output.cc (Output::output_keylength_table, output_switch_case,
+       Output::output_lookup_function_body): Use option.get_lengthtable_name.
+       * doc/gperf.texi (Gperf Declarations): Document %define
+       length-table-name.
+       (Output Details): Document --length-table-name option.
+
+2003-06-12  Bruno Haible  <bruno@clisp.org>
+
+       * gperf-3.0.1 released.
+
+       * src/version.cc: Bump version number to 3.0.1.
+       * doc/gperf.texi: Likewise.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
+       tests/java.exp, tests/languages.exp, tests/modula2.exp,
+       tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
+       tests/permutc2.exp, tests/test-4.exp: Update.
+
+2003-05-31  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi (User-supplied Struct): Mention the possibility of an
+       abbreviated struct declaration.
+       * src/input.cc (Input::read_input): Support struct declarations of the
+       form "struct foo;".
+       * tests/incomplete.gperf: New file.
+       * tests/incomplete.exp: New file.
+       * tests/Makefile.in (check-test): Check incomplete.gperf too.
+       Reported by Rob Leslie <rob@mars.org>.
+
+2003-05-20  Bruno Haible  <bruno@clisp.org>
+
+       * doc/Makefile.in (gperf.ps): Don't use $< in a target rule.
+
+2003-05-27  Bruno Haible  <bruno@clisp.org>
+
+       * Makefile.vms (CC): Correct value.
+       (getopt.obj, getopt1.obj, getline.obj, hash.obj): Don't set
+       HAVE_CONFIG_H.
+
+2003-05-17  Bruno Haible  <bruno@clisp.org>
+
+       * Makefile.msvc (DEBUGFLAGS): New variable.
+       (gperf.exe): Use it, and MFLAGS too.
+
+2003-05-08  Bruno Haible  <bruno@clisp.org>
+
+       * gperf-3.0 released.
+
+2003-05-07  Bruno Haible  <bruno@clisp.org>
+
+       * src/version.cc: Bump version number to 3.0.
+       * doc/gperf.texi: Likewise.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
+       tests/languages.exp, tests/modula2.exp, tests/objc.exp,
+       tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
+       tests/test-4.exp: Update.
+
+       * src/configure.in: Fix AC_INIT argument.
+
+       * Makefile.devel (configure, lib/configure, src/configure,
+       tests/configure, doc/configure): Use the newest autoconf.
+       (src/config.h.in): Use the newest autoheader.
+
+2003-05-03  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi: Use two spaces as sentence separator, as recommended
+       by the texinfo manual.
+
+2003-04-12  Bruno Haible  <bruno@clisp.org>
+
+       * doc/configure.in (mandir): Change default value.
+       * doc/Makefile.in (docdir): Use datadir instead of prefix.
+       * Makefile.msvc (datadir): New variable.
+       (mandir, docdir): Use it instead of prefix.
+       (install, installdirs): Update.
+       * Makefile.vms (datadir): New variable.
+       (mandir, docdir): Use it instead of prefix.
+       (install, installdirs): Update.
+
+2003-04-12  Bruno Haible  <bruno@clisp.org>
+
+       * README.vms: New file.
+       * Makefile.vms: New file.
+       * Makefile.devel (src/config.h_vms): New rule.
+       (all): Depend on it.
+
+2003-03-19  Bruno Haible  <bruno@clisp.org>
+
+       * src/input.cc (Input::read_input): Ignore comments at the beginning
+       of the declarations section.
+       * doc/gperf.texi (Controls for GNU indent): New section.
+       Reported by Bruce Lilly <blilly@erols.com>.
+
+2003-03-19  Bruno Haible  <bruno@clisp.org>
+
+       * src/output.cc (Output::output_hash_function): Avoid lint warning if
+       not all arguments of the hash function are used. Avoid lint warning
+       for fallthrough in switch.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/java.exp, tests/languages.exp,
+       tests/modula2.exp, tests/objc.exp: All /*FALLTHROUGH*/ to expected
+       output.
+       Reported by Bruce Lilly <blilly@erols.com>.
+
+2003-03-01  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h (Options::set_initializer_suffix): New declaration.
+       * src/options.cc (Options::set_initializer_suffix): New method.
+       * src/input.cc (Input::read_input): Recognize %define
+       initializer-suffix.
+       * doc/gperf.texi (Gperf Declarations): Document %define
+       initializer-suffix.
+       * NEWS: Update.
+
+2003-02-26  Bruno Haible  <bruno@clisp.org>
+
+       * Makefile.msvc: New file.
+       * README.woe32: New file.
+       * Makefile.devel (all): Depend on src/config.h.msvc.
+       (src/config.h.msvc): New rule.
+
+2003-01-07  Bruno Haible  <bruno@clisp.org>
+
+       * src/input.h (Input::_charset_dependent): New field.
+       * src/input.cc (Input::read_input): Also set _charset_dependent.
+       * src/main.cc (main): Pass _charset_dependent from Input to Output.
+       * src/output.h (Output::Output): Add charset_dependent argument.
+       (Output::_charset_dependent): New field.
+       * src/output.cc (Output::Output): Add charset_dependent argument.
+       (Output::output): Provoke a compilation error if the execution
+       character set doesn't match the expectations.
+       * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
+       tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
+       tests/languages.exp, tests/modula2.exp, tests/objc.exp,
+       tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
+       tests/test-4.exp: Update.
+
+       * src/options.cc (Options::long_usage): Change bug report address to
+       <bug-gnu-gperf@gnu.org>.
+       * tests/test-6.exp: Update.
+
+       * src/output.cc (USE_DOWNCASE_TABLE): New macro.
+       (output_upperlower_table): New function.
+       (output_upperlower_strcmp, output_upperlower_strncmp,
+       output_upperlower_memcmp): Emit gperf_downcase array accesses.
+       (Output::output): Call output_upperlower_table.
+       * tests/permutc2.exp: Update.
+
+       * src/keyword-list.icc (KeywordExt_List::rest): Use a portable cast.
+       (Only in GCC a cast of an lvalue is an lvalue.)
+
+2003-01-01  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.cc (Options::parse_options): Update copyright year.
+
+       * doc/gperf.texi (@author): Add me.
+
+       * src/options.h (NULLSTRINGS): New enum value.
+       (Options::get_stringpool_name, Options::set_stringpool_name): New
+       method declarations.
+       (Options::_stringpool_name): New field.
+       * src/options.icc (Options::get_stringpool_name): New method.
+       * src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable.
+       (Options::long_usage): Document -Q and --null-strings.
+       (Options::Options): Initialize _stringpool_name.
+       (Options::~Options): Output _stringpool_name, NULLSTRINGS values too.
+       (Options::set_stringpool_name): New method.
+       (long_options): Add options --string-pool-name, --null-strings.
+       (Options::parse_options): Implement options -P, -Q and --null-strings.
+       * src/input.cc (Input::read_input): Recognize declarations %pic,
+       %define string-pool-name, %null-strings.
+       * src/output.h (Output::output_string_pool,
+       Output::output_lookup_pools): New method declarations.
+       (Output::_wordlist_eltype): New field.
+       * src/output.cc (Output::output_keylength_table): Trivial
+       simplification.
+       (Output::output_string_pool): New method.
+       (output_keyword_entry): Add stringpool_index argument. For SHAREDLIB,
+       use struct offsets.
+       (output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "".
+       (Output::output_keyword_table): Use _wordlist_eltype instead of
+       _struct_tag. Compute stringpool_index for output_keyword_entry.
+       (Output::output_lookup_pools): New method.
+       (Output::output_lookup_function_body): Use _wordlist_eltype instead of
+       _struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to
+       strings. Use "o >= 0" to test for nonempty table entry.
+       (Output::output_lookup_function): Call output_lookup_pools.
+       (Output::output): Initialize _wordlist_eltype. Call
+       output_lookup_pools.
+       * tests/jstest4.gperf: New file.
+       * tests/test-6.exp: Update.
+       * tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of
+       -P and -Q.
+       * doc/gperf.texi (User-supplied Struct): Mention that first field has
+       to be of type 'int' if -P is given.
+       (Gperf Declarations): Document %pic, %define string-pool-name,
+       %null-strings.
+       (Output Details): Update description of option -P. Document options -Q
+       and --null-strings.
+
+       * tests/Makefile.in (check-link-c, check-ada, check-pascal,
+       check-test): Omit option -p.
+       * tests/c-parse.exp: Regenerated.
+       * tests/chill.exp: Regenerated.
+       * tests/cplusplus.exp: Regenerated.
+       * tests/gpc.exp: Regenerated.
+       * tests/java.exp: Regenerated.
+       * tests/objc.exp: Regenerated.
+       * tests/test-4.exp: Regenerated.
+
+       * src/output.cc (Output::output_lookup_function_body): Omit the
+       multicompare code section and its variables when it is not used.
+       * tests/chill.exp: Regenerated.
+
+       * src/output.c (Output_Compare::output_firstchar_comparison): New
+       method.
+       (Output_Compare_Strcmp::output_comparison,
+       Output_Compare_Strncmp::output_comparison,
+       Output_Compare_Memcmp::output_comparison): Use it.
+       * tests/permutc2.exp: Update.
+
+       * tests/smtp.gperf: New file, based on a contribution by Bruce Lilly.
+       * tests/Makefile.in (check-smtp): New rule.
+       (check): Depend on it.
+       (clean): Update.
+
+2002-12-12  Bruno Haible  <bruno@clisp.org>
+
+       * src/search.h (Search::init_selchars_tuple,
+       Search::count_duplicates_tuple): Add alpha_unify argument.
+       (Search::count_duplicates_tuple): New method declaration.
+       * src/search.cc (Search::init_selchars_tuple,
+       Search::count_duplicates_tuple): Add alpha_unify argument.
+       (Search::find_positions): Update.
+       (Search::count_duplicates_tuple): New method.
+       (Search::count_duplicates_multiset): Free temp alpha_unify vector.
+       (Search::find_alpha_inc): Call count_duplicates_tuple.
+
+       * src/configure.in: Add test for stack-allocated variable-size arrays.
+       * src/config.h.in: Regenerated.
+       * src/search.cc: Include config.h.
+       (DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros.
+       (Search::find_alpha_inc, Search::count_possible_collisions,
+       Search::find_asso_values): Use them.
+       * src/Makefile.in (search.o): Depend on config.h.
+
+       * src/search.h (Search::keyword_list_length, Search::max_key_length,
+       Search::get_max_keysig_size, Search::prepare): Remove declarations.
+       (Search::prepare): Renamed from Search::preprepare.
+       (Search::_max_selchars_length): New field.
+       * src/search.cc (Search::prepare): Renamed from Search::preprepare.
+       (Search::prepare_asso_values): Merged with old Search::prepare.
+       Initialize _max_selchars_length.
+       (Search::keyword_list_length): Remove function. Use _list_len instead.
+       (Search::max_key_length): Remove function. Use _max_key_len instead.
+       (Search::get_max_keysig_size): Remove function. Use
+       _max_selchars_length instead.
+       (Search::count_possible_collisions, Search::find_asso_values): Update.
+       (Search::find_good_asso_values): Call just prepare_asso_values.
+       (Search::~Search): Update.
+
+       * src/output.h (Output::output_asso_values_ref): New declaration.
+       * src/output.cc (char_to_index): Remove variable.
+       (Output::output_asso_values_ref): New function.
+       (Output::output_hash_function): Use it.
+       (Output::output): Update.
+
+       * src/positions.h (Positions::is_useall, Positions::set_useall,
+       Positions::iterator, Positions::reviterator): New method declarations.
+       (Positions::_useall): New field.
+       (PositionIterator): Make constructor private. Add a constructor and a
+       copy constructor.
+       (PositionIterator::remaining): New declaration.
+       (PositionReverseIterator): Make constructor private. Add a constructor
+       and a copy constructor.
+       (PositionReverseIterator::remaining): New declaration.
+       (PositionReverseIterator::_minindex): New field.
+       * src/positions.icc (Positions::Positions): Initialize _useall.
+       (Positions::operator=): Likewise.
+       (Positions::is_useall, Positions::set_useall): New methods.
+       (Positions::sort): Do nothing if _useall is set.
+       (Positions::iterator, Positions::reviterator): New methods.
+       (PositionIterator::PositionIterator): New constructor.
+       (PositionIterator::remaining): New method.
+       (PositionReverseIterator::PositionReverseIterator): New constructor.
+       (PositionReverseIterator::next): Use _minindex as bound.
+       (PositionReverseIterator::remaining): New method.
+       * src/positions.cc (Positions::add, Positions::remove): Reset the
+       useall flag.
+       (Positions::print): Handle the useall case.
+       * src/options.h (ALLCHARS): Remove.
+       * src/options.cc (Options::~Options): Update.
+       (Options::parse_options): Use Positions::set_useall().
+       * src/keyword.h (KeywordExt::init_selchars_tuple,
+       KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
+       Remove use_all_chars argument.
+       * src/keyword.cc (KeywordExt::init_selchars_low): Remove use_all_chars
+       argument. Tell the position iterator to stop at _allchars_length.
+       Remove special case code for -k'*'.
+       (KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset):
+       Remove use_all_chars argument.
+       * src/search.h (Search::init_selchars_tuple): Remove use_all_chars
+       argument.
+       (Search::init_selchars_multiset): Likewise.
+       * src/search.cc (Search::init_selchars_tuple): Remove use_all_chars
+       argument.
+       (Search::count_duplicates_tuple, Search::find_positions): Update.
+       (Search::compute_alpha_unify): Remove special case code for -k'*'.
+       (Search::init_selchars_multiset): Remove use_all_chars argument.
+       (Search::count_duplicates_multiset): Update.
+       (Search::find_alpha_inc): Remove special case code for -k'*'.
+       (Search::prepare): Update.
+       (Search::get_max_keysig_size): Update.
+       * src/output.cc (Output::output_hash_function): Remove special case
+       code for -k'*'.
+       * tests/chill.exp: Regenerated.
+
+2002-12-11  Bruno Haible  <bruno@clisp.org>
+
+       Change the positions to be 0-based, instead of 1-based.
+       * src/positions.h (Positions::LASTCHAR): Set to -1.
+       (Positions::MAX_SIZE): New constant.
+       (Positions::pointer): Change return type.
+       (Positions::_positions): Change element type.
+       (PositionIterator::EOS, PositionReverseIterator::EOS): Set to -2.
+       * src/positions.icc (Positions::pointer): Change return type.
+       (Positions::sort): Update.
+       * src/positions.cc (Positions::contains, Positions::add,
+       Positions::remove): Update.
+       (Positions::print): Update. Fix off-by-one bug.
+       * src/options.cc (Options::~Options): Update.
+       (Options::parse_options): Set BAD_VALUE to -3. Update.
+       * src/keyword.cc (KeywordExt::init_selchars_low): Update.
+       * src/search.cc (Search::find_positions, Search::compute_alpha_unify,
+       Search::find_alpha_inc): Update.
+       * src/output.cc (Output::output_hash_function): Update. Don't emit
+       a 'case' statement right after 'default:'.
+       * tests/c-parse.exp: Regenerated.
+       * tests/charsets.exp: Regenerated.
+       * tests/cplusplus.exp: Regenerated.
+       * tests/java.exp: Regenerated.
+       * tests/languages.exp: Regenerated.
+       * tests/modula2.exp: Regenerated.
+       * tests/objc.exp: Regenerated.
+
+2002-12-10  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h: Reorder enum values.
+       (Options::short_usage, Options::long_usage): Make static.
+       * src/options.cc (Options::short_usage); No longer print a monster
+       usage line.
+       (Options::print_options): Improve output of options like
+       --key-positions=1,2,$.
+       (Options::~Options): Update.
+
+       * src/options.h (UPPERLOWER): New enum value.
+       * src/options.cc (Options::long_usage): Document option --ignore-case.
+       (Options::~Options): Update.
+       (long_options): Add option --ignore-case.
+       (Options::parse_options): Handle option --ignore-case.
+       * src/input.cc (Input::read_input): Recognize option %ignore-case.
+       * src/keyword.h (KeywordExt::init_selchars_tuple,
+       KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
+       Add alpha_unify argument.
+       * src/keyword.cc (KeywordExt::init_selchars_low): Add alpha_unify
+       argument.
+       (KeywordExt::init_selchars_tuple): Add alpha_unify argument.
+       (KeywordExt::init_selchars_multiset): Add alpha_unify argument.
+       * src/search.h (Search::compute_alpha_size,
+       Search::compute_alpha_unify): New declarations.
+       (Search::init_selchars_multiset): Add alpha_unify argument.
+       (Search::_alpha_unify): New field.
+       * src/search.cc (Search::compute_alpha_size,
+       Search::compute_alpha_unify): New functions.
+       (Search::init_selchars_tuple): Update.
+       (Search::find_positions): Temporarily set _alpha_unify. Perform a
+       case insensitive comparison if needed.
+       (Search::init_selchars_multiset): Add alpha_unify argument.
+       (Search::count_duplicates_multiset): Call compute_alpha_unify.
+       (Search::find_alpha_inc): Temporarily set _alpha_unify. At the end,
+       set _alpha_size and _alpha_unify.
+       (Search::prepare): Update. Don't compute _alpga_size here.
+       (Search::optimize): Propagate unified asso_values.
+       (Search::~Search) Delete _alpha_unify.
+       * src/output.cc (output_upperlower_strcmp, output_upperlower_strncmp,
+       output_upperlower_memcmp): New functions.
+       (Output_Compare_Strcmp::output_comparison,
+       Output_Compare_Strncmp::output_comparison,
+       Output_Compare_Memcmp::output_comparison): Use the case-insensitive
+       comparison function if --ignore-case was given.
+       (Output::output): Emit the auxiliary case-insensitive comparison
+       function if needed.
+       * tests/permutc2.gperf, tests/permutc2.exp: New files.
+       * tests/Makefile.in (check-test): Also check permutc2.gperf.
+       * tests/test-6.exp: Update.
+       * doc/gperf.texi (Gperf Declarations): Document %ignore-case.
+       (Input Details): Document option --ignore-case.
+       * NEWS: Update.
+
+       * src/search.cc (Search::optimize): Fill unused asso_values[] entries
+       with a large value.
+       * src/output.h (Output::Output): Remove occurrences argument.
+       (Output::_occurrences): Remove field.
+       * src/output.cc (Output::Output): Remove occurrences argument.
+       (Output::output_hash_function): Ignore _occurrences.
+       * src/main.cc (main): Don't pass the _occurrences to Output.
+
+       * src/search.cc (Search::preprepare): Exit if keywords contain
+       out-of-range characters.
+
+       * src/search.cc (for): Define so as to avoid errors with old compilers.
+
+       * src/options.h (SHAREDLIB): New enum value.
+       * src/options.cc (Options::short_usage): Mention option -P.
+       (Options::long_usage): Document option -P.
+       (long_options): Add option --pic.
+       (Options::parse_options): Handle option -P/--pic.
+       * src/output.cc (output_keyword_blank_entries): When SHAREDLIB is
+       specified, emit NULL pointers instead of "".
+       (Output::output_lookup_function_body): When SHAREDLIB is specified
+       and SWITCH and DUP and not specified, test the table entry against
+       NULL before the string comparison.
+       * tests/test-6.exp: Update.
+       * doc/gperf.texi (Output Details): Document option -P.
+       * NEWS: Update.
+       Suggested by Ulrich Drepper.
+
+2002-12-08  Bruno Haible  <bruno@clisp.org>
+
+       * tests/permut2.gperf, tests/permut2.exp: New files.
+       * tests/permut3.gperf, tests/permut3.exp: New files.
+       * tests/charsets.gperf: New file, from Bruce Lilly.
+       * tests/charsets.exp: New file.
+       * tests/languages.gperf: New file, from Bruce Lilly.
+       * tests/languages.exp: New file.
+       * Makefile.in (check-test): Test them all.
+
+       Completely new asso_values search algorithm.
+       * src/search.h (Search::compute_occurrence, Search::clear_determined,
+       Search::set_determined, Search::already_determined, Search::reorder):
+       Remove functions.
+       (Search::init_asso_values, Search::sort_by_occurrence,
+       Search::compute_occurrence, Search::sort_by_occurrence,
+       Search::has_collisions, Search::collision_prior_to): Remove functions.
+       (Search::compute_partition, Search::count_possible_collisions,
+       Search::unchanged_partition): New method declarations.
+       (Search::_determined): Remove field.
+       * src/search.cc (Search::prepare): Don't initialize _determined.
+       (Search::compute_occurrence, greater_by_occurrence,
+       Search::clear_determined, Search::set_determined,
+       Search::already_determined, Search::reorder): Remove functions.
+       (Search::init_asso_values, compute_disjoint_union,
+       Search::sort_by_occurrence, Search::compute_occurrence,
+       Search::sort_by_occurrence, Search::has_collisions,
+       Search::collision_prior_to): Remove functions.
+       (StackEntry): Remove class.
+       (EquivalenceClass, Step): New classes.
+       (equals, Search::compute_partition, delete_partition,
+       Search::count_possible_collisions, Search::unchanged_partition): New
+       functions.
+       (Search::find_asso_values): Completely rewritten.
+       (Search::find_good_asso_values): Don't call reorder().
+       (Search::~Search): Don't free _determined.
+       * src/keyword.h (KeywordExt::_occurrence): Remove field.
+       * src/options.h (ORDER, FAST, OPT_CHOICE): Remove enum values.
+       (Options::_iterations): Remove field.
+       * src/options.icc (Options::get_iterations): Remove method.
+       * src/options.cc (Options::long_usage): Remove mention of -f and -o.
+       (Options::Options): Don't initialize _iterations.
+       (Options::~Options): Update.
+       (Options::parse_options): Do nothing for options -f, -o, -O.
+       * doc/gperf.texi: (Contributors): Update.
+       (Algorithmic Details): Remove options -f and -o. Update description
+       of option -s.
+       * tests/c-parse.exp, tests/chill.exp, tests/cplusplus.exp,
+       tests/gpc.exp, tests/java.exp, tests/modula2.exp, tests/objc.exp,
+       tests/test-4.exp): Regenerated, smaller than before.
+       * tests/test-6.exp: Update.
+       * NEWS: Update.
+
+2002-12-08  Bruno Haible  <bruno@clisp.org>
+
+       * src/search.h (Search::_alpha_size): Change type to 'unsigned int'.
+       (Search::_asso_value_max): Likewise.
+       * src/search.cc (Search::prepare_asso_values): Update.
+       (Search::init_asso_values): Update.
+       (Search::~Search): Update.
+       * src/output.h (Output::Output): Change alpha_size type to
+       'unsigned int'.
+       (Output::_alpha_size): Change type to 'unsigned int'.
+       * src/output.cc (Output::Output): Change alpha_size type to
+       'unsigned int'.
+       (Output::output_hash_function): Update.
+
+2002-12-07  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h (OPT_CHOICE): New enum value.
+       * src/options.cc (Options::~Options): Update.
+       (long_options): New option --optimized-collision-resolution.
+       (Options::parse_options): Accept option -O.
+       * src/search.h (Search::sort_by_occurrence): Change argument to
+       'unsigned int'.
+       (Search::compute_occurrence, Search::sort_by_occurrence): New method
+       declarations.
+       * src/search.cc (Search::sort_by_occurrence): Change argument to
+       'unsigned int'.
+       (Search::compute_occurrence, Search::sort_by_occurrence): New methods.
+       (Search::find_asso_values): Implement OPT_CHOICE. More debugging
+       output.
+
+       * src/search.cc (Search::prepare_asso_values) [DEBUG]: Also print
+       the keyword list in order.
+       (Search::find_asso_values) [DEBUG]: Upon failure, print the union_set.
+
+       * src/options.h (Options::get_size_multiple): Change return type to
+       float.
+       (Options::_size_multiple): Change type to float.
+       * src/options.icc (Options::get_size_multiple): Change return type to
+       float.
+       * src/options.cc (Options::long_usage): Update description of option
+       -s.
+       (Options::~Options): Update.
+       (Options::parse_options): For option -s, accept a fraction.
+       * src/search.cc (Search::prepare_asso_values): Use get_size_multiple
+       as it is.
+       * tests/test-6.exp: Update.
+       * doc/gperf.texi (Algorithmic Details): Update description of option
+       -s.
+
+2002-12-04  Bruno Haible  <bruno@clisp.org>
+
+       Improve debugging output.
+       * src/hash-table.h (Hash_Table::dump): New method.
+       * src/hash-table.cc (Hash_Table::dump): New method, extracted from
+       destructor.
+       (Hash_Table::~Hash_Table): No longer print the contents.
+       * src/positions.h (PositionReverseIterator): New class.
+       * src/positions.icc (PositionReverseIterator::PositionReverseIterator,
+       PositionReverseIterator::next): New methods.
+       * src/search.cc (Search::find_positions): If debugging, print the
+       result.
+       (Search::find_alpha_inc): If debugging, print the result.
+       (Search::prepare): Explicitly dump the hash table's contents here.
+
+       Portability fixes.
+       * src/positions.h (Positions::LASTCHAR, Positions::MAX_KEY_POS,
+       PositionIterator::EOS): Define as compile-time constants using enum.
+       * src/bool-array.cc (Bool_Array::~Bool_Array): Remove const qualifier
+       of pointer to be deleted.
+       * src/input.cc (Input::~Input): Likewise.
+       * src/keyword.cc (KeywordExt::delete_selchars): Likewise.
+       * src/main.cc (main): Likewise.
+       * src/hash-table.cc (Hash_Table::~Hash_Table): Limit scope of 'for'
+       variables.
+       * src/search.cc (Search::prepare_asso_values): Use a static_cast to
+       convert from time_t to long. This is possible because ISO C 99 says
+       time_t is a numeric type.
+
+2002-11-20  Bruno Haible  <bruno@clisp.org>
+
+       * src/search.cc (Search::find_asso_values): Avoid gcc warnings about
+       uninitialized variables.
+
+       Implement backtracking.
+       * src/search.h (Search::has_collisions): Renamed from
+       Search::less_collisions. Return a boolean.
+       * src/search.cc (Search::has_collisions): Renamed from
+       Search::less_collisions. Return a boolean.
+       (StackEntry): Remove field _collisions_so_far.
+       (Search::find_asso_values): Backtrack when encountering an unresolved
+       collision. Assume collisions_so_far is always zero.
+       (Search::optimize): Exit if there are accidental duplicates at the end.
+       * src/output.cc (Output::num_hash_values): Simply return the list
+       length.
+       (Output::output_keylength_table): Remove handling of accidental
+       duplicates.
+       (Output::output_keyword_table, Output::output_lookup_array): Likewise.
+       (output_switch_case, output_switches): Likewise.
+       * doc/gperf.texi (Algorithmic Details): Adjust description of options
+       -D, -f, -o, -r.
+       (Bugs): Remove note about missing backtracking.
+       (Projects): Likewise.
+
+2002-11-19  Bruno Haible  <bruno@clisp.org>
+
+       Prepare for backtracking.
+       * src/search.h (Search::try_asso_value, Search::change_some_asso_value):
+       Remove declarations.
+       (Search::less_collisions, Search::collision_prior_to): New declarations.
+       (Search::_fewest_collisions, Search::_union_set, Search::_num_done):
+       Remove fields.
+       * src/search.cc (Search::prepare_asso_values): Don't initialize
+       _union_set.
+       (Search::try_asso_value, Search::change_some_asso_value): Remove
+       methods.
+       (Search::less_collisions, Search::collision_prior_to): New methods.
+       (StackEntry): New class.
+       (Search::find_asso_values): Reorganized to use pseudo-recursion.
+       (Search::~Search): Don't free _union_set.
+
+       * src/search.h (Search::find_good_asso_values): New declaration.
+       * src/search.cc: Add comments about the basic structure of the
+       algorithm.
+       (Search::find_positions): Move the option[POSITIONS] test to here.
+       (Search::find_good_asso_values): New method, extracted from
+       Search::optimize.
+       (Search::optimize): Remove option[POSITIONS] test. Call
+       find_good_asso_values.
+
+2002-11-17  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.cc (Options::parse_options): Include copyright notice
+       and authors in --version output.
+
+       Avoid artificial duplicates.
+       * src/keyword.h (KeywordExt::init_selchars_tuple): New declaration.
+       (KeywordExt::init_selchars_multiset): Renamed from
+       KeywordExt::init_selchars.
+       (KeywordExt::init_selchars_low): New declaration.
+       * src/keyword.cc (KeywordExt::init_selchars_low): Renamed from
+       KeywordExt::init_selchars. Add alpha_inc argument. Remove sorting.
+       (KeywordExt::init_selchars_tuple): New method.
+       (KeywordExt::init_selchars_multiset): New method, replaces
+       KeywordExt::init_selchars.
+       * src/search.h (Search::init_selchars_tuple): Renamed from
+       Search::init_selchars.
+       (Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
+       (Search::init_selchars_multiset, Search::count_duplicates_multiset,
+       Search::find_alpha_inc): New declarations.
+       (Search::_alpha_inc): New field.
+       (Search::_alpha_size, Search::_occurrences, Search::_asso_values,
+       Search::_determined): Make non-const.
+       * src/search.cc (Search::Search): Don't initialize _key_positions,
+       _alpha_size, _occurrences, _asso_values, _determined here.
+       (Search::init_selchars_tuple): Renamed from Search::init_selchars.
+       (Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
+       (Search::find_positions): Update.
+       (Search::init_selchars_multiset, Search::count_duplicates_multiset,
+       Search::find_alpha_inc): New methods.
+       (Search::prepare): Move preprepare, find_positions calls away.
+       Initialize _alpha_size, _occurrences, _asso_values, _determined here.
+       (Search::optimize): Call preprepare, find_positions here. Initialize
+       _key_positions here.
+       (Search::~Search): Deallocate _alpha_inc.
+       * src/output.cc (Output::Output): Add alpha_inc argument.
+       (Output::output_hash_function): Use _alpha_inc.
+       * src/output.h (Output::Output): Add alpha_inc argument.
+       (Output::_alpha_inc): New field.
+       * src/main.cc (main): Pass _alpha_inc from Search to Output.
+       * tests/chill.exp: Update.
+       * doc/gperf.texi (Algorithmic Details): Remove description of
+       artificial duplicates.
+
+       * src/keyword.h (KeywordExt::_selchars): Change type to
+       'const unsigned int *'.
+       * src/keyword.cc (sort_char_set): Change argument type to
+       'unsigned int *'.
+       (KeywordExt::init_selchars): Update.
+       * src/search.h (Search::sort_by_occurrence): Change argument type to
+       'unsigned int *'.
+       (Search::try_asso_value): Change argument type to 'unsigned int'.
+       (Search::_union_set): Change type to 'unsigned int *'.
+       * src/search.cc (Search::prepare, Search::compute_occurrence,
+       Search::set_determined, Search::already_determined,
+       Search::prepare_asso_values, Search::compute_hash): Update.
+       (compute_disjoint_union): Change argument types to 'unsigned int *'.
+       (Search::sort_by_occurrence): Likewise.
+       (Search::try_asso_value): Change argument type to 'unsigned int'.
+       (Search::change_some_asso_value, Search::~Search): Update.
+       * src/hash-table.cc (Hash_Table::~Hash_Table, Hash_Table::equal,
+       Hash_Table::insert): Update.
+
+       * src/positions.h: New file, extracted from options.h.
+       * src/positions.icc: New file, extracted from options.icc.
+       * src/positions.cc: New file, extracted from options.cc.
+       * src/options.h: Include positions.h. Move classes Positions and
+       PositionsIterator away.
+       * src/options.icc: Move classes Positions and PositionsIterator away.
+       * src/options.cc: Move class Positions away.
+       * src/keyword.cc: Include positions.h instead of options.h.
+       * src/output.h: Include positions.h instead of options.h.
+       * src/search.h: Include positions.h instead of options.h.
+       * src/Makefile.in (OBJECTS): Add positions.o.
+       (POSITIONS_H): New variable.
+       (OPTIONS_H, SEARCH_H, OUTPUT_H, keyword.o): Use it.
+       (positions.o): New rule.
+
+       * src/options.h (POSITIONS): New enum value.
+       (Positions::Positions): New copy constructor.
+       (Positions::operator=, Positions::contains, Position::add,
+       Positions::remove, Positions::print): New method declaration.
+       (Options::get_max_keysig_size): Remove method.
+       * src/options.icc (Positions::Positions): New copy constructor.
+       (Positions::operator=): New method.
+       (Options::get_max_keysig_size): Remove method.
+       * src/options.cc (Options::Options): Initialize _key_positions
+       trivially.
+       (Options::parse_options): Option -k sets POSITIONS.
+       (Positions::contains, Positions::add, Positions::remove,
+       Positions::print): New methods.
+       * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
+       width explicitly, instead of using Options::get_max_keysig_size.
+       * src/keyword.h (KeywordExt::init_selchars): Add arguments
+       use_all_chars, positions.
+       (KeywordExt::delete_selchars): New declaration.
+       * src/keyword.cc (KeywordExt::init_selchars): Add arguments
+       use_all_chars, positions. Remove error message if there are no key
+       positions.
+       (KeywordExt::delete_selchars): New method.
+       * src/search.h: Include options.h.
+       (Search::preprepare, Search::init_selchars, Search::delete_selchars,
+       Search::count_duplicates, Search::find_positions): New declarations.
+       (Search::_key_positions): New field.
+       * src/search.cc (Search::Search): Initialize _key_positions.
+       (Search::preprepare, Search::init_selchars, Search::delete_selchars,
+       Search::count_duplicates, Search::find_positions): New functions.
+       (Search::prepare): Call preprepare and find_positions. Tweak error
+       message.
+       (Search::get_max_keysig_size): Use _key_positions instead of
+       option.get_key_positions().
+       (Search::optimize): Tweak error message.
+       * src/output.h: Include options.h.
+       (Output::Output): Add Positions argument.
+       (Output::_key_positions): New field.
+       * src/output.cc (Output::Output): Add Positions argument.
+       (Output::output_hash_function): Omit the table if there are no
+       positions at all. Use _key_positions instead of
+       option.get_key_positions().
+       (Output::output): Output the computed positions as a comment.
+       * src/main.cc (main): Pass the Positions from Searcher to Output.
+       * src/Makefile.in (SEARCH_H, OUTPUT_H): Include OPTIONS_H.
+       * tests/Makefile.in (check-test): Pass key positions explicitly.
+       * tests/gpc.exp: Update.
+       * tests/test-4.exp: Update.
+       * doc/gperf.texi (Algorithmic Details): Mention that -k is not needed
+       usually.
+
+2002-11-16  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h (Options::get_slot_name): Renamed from
+       Options::get_key_name.
+       (Options::set, Options::set_language, Options::set_total_switches,
+       Options::set_function_name, Options::set_slot_name,
+       Options::set_class_name, Options::set_hash_name,
+       Options::set_wordlist_name, Options::set_delimiters): New method
+       declarations.
+       (Options::_language): New field.
+       (Options::_slot_name): Renamed from Options::_key_name.
+       * src/options.icc (Options::set): New method.
+       (Options::get_slot_name): Renamed from Options::get_key_name.
+       * src/options.cc (DEFAULT_FUNCTION_NAME): Renamed from DEFAULT_NAME.
+       (DEFAULT_SLOT_NAME): Renamed from DEFAULT_NAME.
+       (Options::Options): Initialize _language. Update.
+       (Options::~Options): Update.
+       (Options::set_language, Options::set_total_switches,
+       Options::set_function_name, Options::set_slot_name,
+       Options::set_class_name, Options::set_hash_name,
+       Options::set_wordlist_name, Options::set_delimiters): New methods.
+       (Options::parse_options): Call set_language. Update.
+       * src/input.cc (is_declaration, is_declaration_with_arg,
+       is_define_declaration): New functions.
+       (Input::read_input): Accept %DECL declarations.
+       * src/output.cc (Output::output_lookup_function_body): Update.
+       * doc/gperf.texi (Declarations): Add new subnodes.
+       (User-supplied Struct, Gperf Declarations, C Code Inclusion): New
+       nodes.
+       (Keywords, Output Format, Binary Strings, Options): Mention %
+       declarations as being equivalent to the command line options.
+
+       * src/options.cc (Options::long_usage): Rename options -H, -N, -l, -G.
+       (long_options): Add --hash-function-name, --lookup-function-name,
+       --compare-lengths.
+       * doc/gperf.texi (Output Details): Rename options -H, -N, -l, -G.
+       * tests/test-6.exp: Update.
+
+       * src/options.cc (DEFAULT_DELIMITERS): Remove newline.
+       * src/options.cc (Options::long_usage): Change default --delimiters.
+       * doc/gperf.texi (Input Details): Likewise.
+       * tests/test-6.exp: Update.
+
+       * doc/gperf.texi: Move description of option -l from section
+       Algorithmic Details to section Output Details.
+       * src/options.cc (Options::long_usage): Likewise.
+       * tests/test-6.exp: Update.
+
+2002-11-12  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h (Output::get_output_file_name): New method.
+       (Output::_output_file_name): New field.
+       * src/options.icc (Options::get_output_file_name): New method.
+       * src/options.cc (Options::long_usage): Document option --output-file.
+       (Options::Options): Initialize _output_file_name.
+       (long_options): Add --output-file.
+       (Options::parse_options): Handle it.
+       * src/main.cc (main): Open the output file if given by name.
+       * doc/gperf.texi (Output File): New section.
+       * tests/test-6.exp: Update.
+
+2002-11-10  Bruno Haible  <bruno@clisp.org>
+
+       * src/input.cc (pretty_input_file_name): New function.
+       (read_input): Use it in all error and warning messages.
+
+       * src/keyword.h (Keyword::_lineno): New field.
+       * src/input.h (Input::_struct_decl_lineno): New field.
+       * src/input.cc (Input::read_input): Set _struct_decl_lineno. Fill
+       each keyword's _lineno field.
+       * src/main.cc (main): Pass _struct_decl_lineno from Input to Output.
+       * src/output.h (Output::Output) Add struct_decl_lineno argument.
+       (Output::_struct_decl_lineno): New field.
+       * src/output.cc (Output::Output) Add struct_decl_lineno argument.
+       (output_keyword_entry): Emit #line directive before table entry.
+       (Output::output): Emit #line directive before _struct_decl.
+
+       Fix memory leaks.
+       * src/keyword.h (empty_string): New declaration.
+       * src/keyword.cc (empty_string): New variable.
+       * src/input.h (Input::_input): Make public.
+       (Input::_input_end): New field.
+       * src/input.cc (read_input): When removing leading whitespace from
+       struct_decl, reallocate it. For rest, use empty_string instead of "".
+       Set _input_end.
+       (Input::~Input): Delete _struct_decl, _struct_tag, _return_type.
+       * src/search.cc (Search::prepare): When removing an element from
+       the keyword list, delete the list node.
+       (Search::~Search): Delete _occurrences, _asso_values.
+       * src/main.cc (main): Between Search::~Search and Input::~Input,
+       destroy the keyword list.
+
+       Rewrite the input routines.
+       * src/input.h: Don't include read-line.h.
+       (Input): Don't inherit from class Read_Line.
+       (Input::read_keys, Input::strcspn, Input::set_output_types,
+       Input::get_array_type, Input::save_include_src,
+       Input::get_special_input): Remove declarations.
+       (Input::read_input): New declaration.
+       (Input::_struct_decl): Renamed from Input::_array_type.
+       (Input::_verbatim_declarations): Renamed from Input::_include_src.
+       (Input::_verbatim_code): Replaces Input::_additional_code.
+       * src/input.cc: Completely rewritten.
+       * src/output.h (Output::Output): Update the verbatim_* arguments.
+       (Output::_struct_decl): Renamed from Output::_array_type.
+       (Output::_verbatim_declarations): Renamed from Output::_include_src.
+       (Output::_verbatim_code): Replaces Output::_additional_code.
+       * src/output.cc (Output::Output): Update the verbatim_* arguments.
+       (Output::output): Output the verbatim_* code pieces with #line.
+       * src/main.cc (main): Call Input::read_input instead of
+       Input::read_keys. Update Output::Output arguments.
+       * src/read-line.h: Remove file.
+       * src/read-line.cc, src/read-line.icc: Remove files.
+       * src/Makefile.in (OBJECTS): Remove read-line.o.
+       (READ_LINE_H): Remove variable.
+       (INPUT_H): Update.
+       (read-line.o): Remove rule.
+       * doc/gperf.texi (Declarations): Correct the example.
+       (Keywords): Mention that lines starting with % are forbidden here.
+       * tests/c-parse.exp: Update.
+       * tests/cplusplus.exp: Update.
+       * tests/gpc.exp: Update.
+       * tests/java.exp: Update.
+       * tests/objc.exp: Update.
+       * tests/test-4.exp: Update.
+
+       * src/options.h (Options::get_input_file_name): New declaration.
+       (Options::_input_file_name): New field.
+       * src/options.icc (Options::get_input_file_name): New method.
+       * src/options.cc (Options::Options): Initialize _input_file_name.
+       (Options::parse_options): Don't open input file, only store it in
+       _input_file_name.
+       * src/main.cc (main): Open input file here.
+       Print an error message upon write error on the output file.
+
+       Upgrade to autoconf-2.52.
+       * configure.in: Use AC_CONFIG_SUBDIRS instead of AC_OUTPUT_SUBDIRS.
+       * Makefile.devel (configure, lib/configure, src/configure,
+       tests/configure, doc/configure): Use autoconf-2.52.
+
+2002-11-09  Bruno Haible  <bruno@clisp.org>
+
+       * doc/gperf.texi: Talk about "bytes" instead of "characters". Talk
+       about "keywords", not "keys". Talk about "input file", not "keyfile".
+       (@menu): Fix a menu entry.
+       (Contributors): Don't mention cperf.
+       (Motivation): Fix an off-by-one error in the definition of "minimal".
+       Mention GNU Java. Recommend http URL instead of anonymous ftp.
+       (Search Structures): Mention GNU Java.
+       (Output Format): Drop reference to node 'Implementation'.
+       (Output Details): Talk about "slot-name" instead of "key name".
+       (Algorithmic Details): Talk about "selected byte positons", not
+       "key positions". Upper limit is now 255. Explain a third reason
+       why duplicates can occur. Describe negative effects of
+       --occurrence-sort.
+       (Implementation): Remove chapter.
+
+2002-11-07  Bruno Haible  <bruno@clisp.org>
+
+       * src/bool-array.cc (Bool_Array::~Bool_Array): Free _storage_array.
+       * src/search.cc (Search::~Search): Free _union_set, _determined.
+
+       * tests/Makefile.in (check-test): Don't redirect stderr.
+
+2002-11-05  Bruno Haible  <bruno@clisp.org>
+
+       * src/keyword-list.h (mergesort_list): New declarations.
+       * src/keyword-list.cc (Keyword_Comparison): New type.
+       (merge, mergesort_list): New functions, moved here from search.cc.
+       * src/search.h (Search::merge, Search::merge_sort): Remove methods.
+       (Search::_occurrence_sort, Search::_hash_sort): Remove fields.
+       * src/search.cc (Search::merge, Search::merge_sort): Remove methods.
+       (greater_by_occurrence, less_by_hash_value): New functions.
+       (Search::reorder, Search::sort): Use mergesort_list.
+
+2002-11-04  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.h (Options::_asso_iterations): New field.
+       (Options::get_asso_iterations): New method declaration.
+       * src/options.icc (Options::get_asso_iterations): New method.
+       * src/options.cc (Options::short_usage): Mention j<jump> and m<num>.
+       (Options::long_usage): Document option -m.
+       (Options::Options): Initialize _asso_iterations.
+       (Options::~Options): Print _asso_iterations too.
+       (long_options): Add --multiple-iterations.
+       (Options::parse_options): Handle option -m.
+       * src/keyword-list.h (copy_list, delete_list): New declarations.
+       * src/keyword-list.cc (copy_list, delete_list): New functions.
+       * src/search.h (Search::_initial_asso_value, Search::_jump): New fields.
+       * src/search.cc (Search::prepare_asso_values): Initialize
+       _initial_asso_value and _jump here.
+       (Search::init_asso_values): Use _initial_asso_value.
+       (Search::try_asso_value): Use _jump.
+       (Search::optimize): If option -m was given, iterate over different
+       values for _initial_asso_value and _jump.
+       * doc/gperf.texi (Algorithmic Details): Document option -m.
+       * tests/test-6.exp: Update.
+
+2002-11-03  Bruno Haible  <bruno@clisp.org>
+
+       Bug fix: When option -j 0 was used without option -r, the output was
+       not random.
+       * src/search.h (Search::prepare_asso_values): New method declaration.
+       * src/search.cc (Search::prepare_asso_values): New method, extracted
+       from Search::init_asso_values. Call srand also when "-j 0" was given.
+       (Search::optimize): Call prepare_asso_values().
+
+       * src/hash-table.h (Hash_Table::_ignore_length, Hash_Table::equal):
+       Declare as const.
+       * src/hash-table.cc (Hash_Table::equal): Declare as const.
+       * src/input.h (Input::_factory): Declare as const.
+       * src/keyword-list.h (Keyword_List::first, KeywordExt_List::first):
+       Declare as const.
+       * src/keyword-list.icc (Keyword_List::first, KeywordExt_List::first):
+       Declare as const.
+       * src/output.h (Output::num_hash_values, Output::output_constants,
+       Output::output_hash_function, Output::output_keylength_table,
+       Output::output_keyword_table, Output::output_lookup_array,
+       Output::output_lookup_tables, Output::output_lookup_function_body,
+       Output::output_lookup_function, Output::_array_type,
+       Output::_additional_code, Output::_include_src, Output::_total_keys,
+       Output::_total_duplicates, Output::_max_key_len, Output::_min_key_len):
+       Declare as const.
+       * src/output.cc (Output::num_hash_values, Output::output_constants,
+       Output::output_hash_function, Output::output_keylength_table,
+       Output::output_keyword_table, Output::output_lookup_array,
+       Output::output_lookup_tables, Output::output_lookup_function_body,
+       Output::output_lookup_function): Declare as const.
+       * src/search.h (Search::merge, Search::merge_sort,
+       Search::compute_occurrence, Search::already_determined,
+       Search::keyword_list_length, Search::max_key_length,
+       Search::get_max_keysig_size, Search::compute_hash,
+       Search::sort_by_occurrence): Declare as const.
+       * src/search.cc (Search::merge, Search::merge_sort,
+       Search::compute_occurrence, Search::already_determined,
+       Search::keyword_list_length, Search::max_key_length,
+       Search::get_max_keysig_size, Search::compute_hash,
+       Search::sort_by_occurrence): Declare as const.
+
+       * src/output.cc (Output::output): Set char_to_index to a cast in all
+       cases. Avoids gcc warnings on the generated code.
+
+       * src/output.cc (Output_Enum): Prepend an underscore to field names.
+       (Output_Expr1): Likewise.
+       (Output::output_hash_function): Simplify the special case for "-k 1,$".
+
+       * src/search.h (Search::init_asso_values, Search::find_asso_values):
+       New declarations.
+       (Search::try_asso_value): Renamed from Search::affects_prev.
+       (Search::change_some_asso_value): Renamed from Search::change.
+       (Search::set_asso_max, Search::get_asso_max): Remove methods.
+       (Search::_union_set): New field.
+       * src/search.cc (Search::init_asso_values): New method, extracted
+       from Search::optimize.
+       (Search::try_asso_value): Renamed from Search::affects_prev. Take the
+       iteration count as argument.
+       (Search::change_some_asso_value): Renamed from Search::change. Don't
+       make union_set static. Don't increment _fewest_collisions here.
+       (Search::find_asso_values): New method, extracted from
+       Search::optimize.
+       (Search::optimize); Update.
+
+       * src/search.h (Search::compute_hash): Renamed from Search::hash.
+       (Search::compute_disjoint_union): Remove declaration.
+       (Search::sort_by_occurrence): Renamed from Search::sort_set.
+       * src/search.cc (Search::compute_hash): Renamed from Search::hash.
+       (compute_disjoint_union): Renamed from Search::compute_disjoint_union.
+       (Search::sort_by_occurrence): Renamed from Search::sort_set.
+       (Search::change): Simplify loop.
+
+       * src/search.h (Search::clear_determined): New declaration.
+       * src/search.cc (Search::clear_determined): New method.
+       (Search::already_determined): Optimize.
+       (Search::reorder): Even when the next keyword after the current one
+       is completely determined, move all determined keywords after the
+       current one.
+
+       Compute the occurrences after removal of duplicates, not before.
+       * src/keyword.h (KeywordExt::init_selchars): Remove occurrences
+       argument.
+       * src/keyword.cc (KeywordExt::init_selchars): Likewise.
+       * src/search.cc (Search::prepare): Reorder the code. Compute the
+       occurrences after removal of duplicates.
+       (Search::merge_sort): Optimize the loop.
+       (Search::compute_occurrence): Renamed from Search::get_occurrence.
+       * src/search.h (Search::compute_occurrence): Renamed from
+       Search::get_occurrence.
+       * tests/chill.exp: Regenerated.
+
+       Bug fix: The hash table could fail to detect duplicates, between
+       keywords of different length, when option -n (option[NOLENGTH]) was
+       given.
+       * src/hash-table.h (Hash_Table::Hash_Table): Pass table size, not
+       vector and vector size as arguments.
+       (Hash_Table::_log_size): New field.
+       (Hash_Table::equal): New declaration.
+       * src/hash-table.cc (size_factor): New variable.
+       (Hash_Table::Hash_Table): Pass table size, not vector and vector size
+       as arguments. Allocate the vector here.
+       (Hash_Table::~Hash_Table): Deallocate the vector here.
+       (Hash_Table::equal): New function.
+       (Hash_Table::insert): Use it. Don't use item->_allchars_length for the
+       increment if _ignore_length is true.
+       * src/search.cc (TABLE_MULTIPLE): Remove variable.
+       (Search::prepare): Update.
+
+2002-11-02  Bruno Haible  <bruno@clisp.org>
+
+       Provide documentation also in PDF format.
+       * doc/Makefile.in (pdfdir, TEXI2PDF): New variables.
+       (all): Depend on pdf.
+       (pdf, gperf.pdf): New rules.
+       (maintainer-clean): Remove the PDF file.
+
+       * src/keyword-list.icc: New file, extracted from keyword-list.h.
+       * src/keyword-list.h: Include keyword-list.icc. Move inline methods
+       to there.
+       * src/keyword-list.cc: Include keyword-list.icc.
+       * src/Makefile.in (KEYWORD_LIST_H): Add keyword-list.icc.
+
+       * lib/hashpjw.h (hashpjw): Change argument type to 'unsigned char *'.
+       * lib/hash.cc (hashpjw): Likewise.
+       * src/keyword.icc: New file.
+       * src/keyword.h: Include keyword.icc.
+       (KeywordExt::_selchars): Change type to 'unsigned char *'.
+       * src/keyword.cc: Include keyword.icc.
+       (Keyword::Keyword, KeywordExt::KeywordExt): Move to keyword.icc.
+       (sort_char_set): Change argument type to 'unsigned char *'.
+       (KeywordExt::init_selchars): Update.
+       * src/search.h (Search::compute_disjoint_union): Change argument types
+       to 'unsigned char *'.
+       (Search::sort_set): Likewise.
+       (Search::affects_prev): Change argument type to 'unsigned char'.
+       * src/search.cc (Search::prepare): Initialize _duplicate_link here.
+       (Search::get_occurrence, Search::set_determined,
+       Search::already_determined, Search::hash): Update.
+       (Search::compute_disjoint_union): Change argument types to
+       'unsigned char *'.
+       (Search::sort_set): Likewise.
+       (Search::affects_prev): Change argument type to 'unsigned char'.
+       (Search::change): Update.
+       * src/Makefile.in (KEYWORD_H): Add keyword.icc.
+
+       * src/options.cc (Options::parse_options): Fix error message.
+
+       * src/read-line.h (Read_Line::Read_Line): Make FILE* argument
+       mandatory. Move body to read-line.icc.
+       * src/read-line.icc (Read_Line::Read_Line): New constructor.
+       * src/input.h (Input::Input): Add FILE* argument.
+       * src/input.cc (Input::Input): Likewise.
+       * src/main.cc (main): Pass stdin to Input constructor.
+
+       * src/options.h (DEFAULTCHARS): Remove.
+       (Positions::MAX_KEY_POS): Set to 255.
+       (Positions::_positions): Increase array size.
+       (PositionIterator::EOS): Set to -1.
+       (PositionIterator::_index): Change type to 'unsigned int'.
+       * src/options.icc (Positions::Positions): Don't store
+       PositionIterator::EOS.
+       (PositionIterator::next): Produce PositionIterator::EOS here.
+       * src/options.cc (Options::long_usage): Use MAX_KEY_POS, not
+       MAX_KEY_POS-1.
+       (PositionStringParser): Rename field _size to _in_range. Rename
+       field _curr_value to _range_curr_value. Rename field _upper_bound
+       to _range_upper_bound.
+       (PositionStringParser::nextPosition): Comments.
+       (Options::Options): Update.
+       (Options::~Options): Update.
+       (long_options): Use NULL, not 0.
+       (Options::parse_options): Set BAD_VALUE to -2; -1 is now EOS. Bug fix:
+       Check against array overflow when more than MAX_KEY_POS positions are
+       given. Don't store PositionIterator::EOS.
+       Check against extra arguments before opening the input file.
+       * src/output.cc (Output::output_hash_function): Change test which
+       was for option[DEFAULTCHARS].
+       * tests/test-6.exp: Update.
+
+       * src/options.h (Options::get_delimiters): Renamed from
+       Options::get_delimiter.
+       * src/options.icc (Options::get_delimiters): Renamed from
+       Options::get_delimiter.
+       * src/input.cc (Input::read_keys): Update.
+
+       Bug fix.
+       * src/options.cc (Options::print_options): Escape backquote inside
+       double-quoted strings.
+
+       Bug fix.
+       * src/keyword.cc (KeywordExt::init_selchars): Avoid comparison with
+       uninitialized member variable. Found with 'valgrind'.
+
+       * src/version.cc: Include version.h.
+       * src/Makefile.in (OBJECTS): Reorder.
+       (KEYWORD_H, KEYWORD_LIST_H, INPUT_H, SEARCH_H, OUTPUT_H): New
+       variables.
+       (HASH_TABLE_H): Update.
+       (options.o, read-line.o, keyword.o, keyword-list.o, input.o, search.o,
+       output.o, main.o): Update dependencies.
+
+       * src/vectors.h: Remove file.
+       * src/vectors.cc: Remove file.
+       * src/search.h: Don't include vectors.h.
+       (Search): Don't inherit from Vectors. New fields _alpha_size,
+       _occurrences, _asso_values.
+       (Search::_determined, Search::get_occurrence, Search::set_determined,
+       Search::already_determined, Search::hash, Search::sort_set): Make
+       nonstatic.
+       * src/search.cc (Search::Search): Initialize _alpha_size, _occurrences,
+       _asso_values, _determined.
+       (Search::optimize, Search::~Search): Update.
+       * src/output.h: Don't include vectors.h.
+       (Output): Remove field _v. New fields _alpha_size, _occurrences,
+       _asso_values.
+       (Output::Output): Replace Vectors* argument with alpha_size,
+       occurrences, asso_values.
+       * src/output.cc (Output::Output): Replace Vectors* argument with
+       alpha_size, occurrences, asso_values.
+       (Output::output_hash_function): Update.
+       * src/main.cc (main): Don't set Vectors::ALPHA_SIZE.
+       Pass _alpha_size, _occurrences, _asso_values from Search to Output.
+       * src/keyword.h: Don't include vectors.h.
+       * src/Makefile.in (OBJECTS): Remove vectors.o.
+       (VECTORS_H): Remove variable.
+       (vectors.o): Remove rule.
+
+       * src/search.h: New file, combines src/key-list.h, src/gen-perf.h.
+       * src/search,cc: New file, combines src/key-list.cc, src/gen-perf.cc.
+       * src/key-list.h: Remove file.
+       * src/key-list.cc: Remove file.
+       * src/gen-perf.h: Remove file.
+       * src/gen-perf.cc: Remove file.
+       * src/main.cc (KeywordExt_Factory): Moved here from gen-perf.cc.
+       (main): Inline some code from gen-perf.cc.
+       * src/keyword.h (KeywordExt::init_selchars): Take the occurrences
+       vector as argument.
+       * src/keyword.cc (KeywordExt::init_selchars): Take the occurrences
+       vector as argument.
+       * src/input.cc (Input::set_output_types): Initialize _array_type,
+       _return_type, _struct_tag.
+       (Input::read_keys): Initialize _additional_code.
+       * src/Makefile.in (OBJECTS): Add search.o.
+       Remove key-list.o, gen-perf.o.
+       (KEY_LIST_H, GEN_PERF_H): Remove variables.
+       (gen-perf.o, key-list.o): Remove rules.
+       (search.o): New rule.
+
+       * *, */*: Update copyright notice to GPL version 2.
+
+       * src/keyword-list.h (Keyword_List): New class.
+       (KeywordExt_List): Inherit from it.
+       * src/keyword-list.cc (Keyword_List::Keyword_List): New constructor.
+       (KeywordExt_List::KeywordExt_List): Update.
+       * src/input.h (Input::Input): Add Keyword_Factory argument.
+       (Input::_factory): New field.
+       (Input::_head): Change type to Keyword_List*.
+       (Input::parse_line): New declaration.
+       * src/input.cc (Input::Input): New constructor.
+       (Input::parse_line): Renamed from parse_line. Use the _factory.
+       (Input::read_keys): Update.
+       * src/key-list.cc (KeywordExt_Factory): New class.
+       (Key_List::read_keys): Pass a KeywordExt_Factory as Input constructor
+       argument.
+
+       Avoid g++ -Wold-style-cast warnings.
+       * src/bool-array.icc: Use new-style casts.
+       * src/gen-perf.cc: Likewise.
+       * src/input.cc: Likewise.
+       * src/key-list.cc: Likewise.
+       * src/keyword.cc: Likewise.
+       * src/options.cc: Likewise.
+       * src/output.cc: Likewise.
+       * src/hash-table.cc: Likewise. Remove (char *) cast in memset argument.
+
+       * src/keyword-list.h (KeywordExt_List): Don't inherit from KeywordExt.
+       (KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument.
+       (KeywordExt_List::_car): New field.
+       (KeywordExt_List::first): Use it.
+       * src/keyword-list.cc (KeywordExt_List::KeywordExt_List): Take a
+       KeywordExt* as argument.
+       * src/input.cc (parse_line): Create the KeywordExt separately.
+
+       Start using bool.
+       * src/bool-array.h (Bool_Array::set_bit): Change return type to bool.
+       * src/bool-array.icc (Bool_Array::set_bit): Likewise.
+       * src/gen-perf.h (Gen_Perf::affects_prev): Likewise.
+       * src/gen-perf.cc (Gen_Perf::affects_prev): Likewise.
+       * src/hash-table.h (Hash_Table::_ignore_length): Change type to bool.
+       (Hash_Table::Hash_Table): Change 3rd argument type to bool.
+       * src/hash-table.cc (Hash_Table::Hash_Table): Likewise.
+       * src/input.h (Input::_additional_code): Change type to bool.
+       * src/input.cc (Input::read_keys): Update.
+       * src/key-list.h (Key_List::_occurrence_sort, Key_List::_hash_sort,
+       Key_List::_additional_code): Change type to bool.
+       (Key_List::_determined): Change element type to bool.
+       (Key_List::already_determined): Change return type to bool.
+       * src/key-list.cc (Key_List::_determined): Change element type to bool.
+       (Key_List::set_determined): Update.
+       (Key_List::already_determined): Change return type to bool.
+       (Key_List::reorder, Key_List::sort, Key_List::Key_List): Update.
+       * src/options.h (Positions::sort): Change return type to bool.
+       (Options::operator[]): Likewise.
+       * src/options.icc (Positions::sort): Change return type to bool.
+       (Options::operator[]): Likewise.
+       * src/output.h (Output::Output): Change 5th argument type to bool.
+       (Output::_additional_code): Change type to bool.
+       * src/output.cc (Output::Output): Change 5th argument type to bool.
+
+2002-10-16  Bruno Haible  <bruno@clisp.org>
+
+       * src/*.h: Align all member names at column 24.
+
+2002-10-15  Bruno Haible  <bruno@clisp.org>
+
+       * src/input.h: New file.
+       * src/input.cc: New file, extracted from key-list.cc.
+       * src/key-list.h (Key_List): Don't inherit from Read_Line.
+       (Key_List::get_special_input,
+       Key_List::save_include_src, Key_List::get_array_type,
+       Key_List::strcspn, Key_List::set_output_types): Remove methods.
+       * src/key-list.cc (Key_List::get_special_input,
+       Key_List::save_include_src, Key_List::get_array_type,
+       Key_List::strcspn, Key_List::set_output_types, parse_line): Move to
+       src/input.cc.
+       (Key_List::read_keys): Use Input::read_keys.
+       (Key_List::Key_List): Update.
+       * src/gen-perf.cc: Update.
+       * src/Makefile.in (OBJECTS): Add input.o.
+       (input.o): New rule.
+
+2002-10-14  Bruno Haible  <bruno@clisp.org>
+
+       * src/options.cc: Don't include "vector.h".
+       (Options::parse_options): Don't initialize Vectors::ALPHA_SIZE here.
+       * src/vectors.cc (Vectors::ALPHA_SIZE): Don't initialize here.
+       * src/gen-perf.cc (Gen_Perf::Gen_Perf): Initialize Vectors::ALPHA_SIZE.
+
+       * src/options.h (Positions): New class.
+       (PositionIterator): New class.
+       (Options::parse_options): Renamed from Options::operator().
+       (Options::get_asso_max, Options::set_asso_max): Move to class Key_List.
+       (Options::reset, Options::get): Remove, replaced by class
+       PositionIterator.
+       (Options::get_initial_asso_value): Renamed from Options::initial_value.
+       (Options::key_sort): Remove, replaced by Positions::sort.
+       (Options): Make all fields and methods non-static.
+       * src/options.icc (Positions::Positions, Positions::operator[],
+       Positions::get_size, Positions::pointer, Positions::set_size,
+       Positions::sort, PositionIterator::PositionIterator,
+       PositionIterator::next): New methods.
+       (Options::get_initial_asso_value): Renamed from Options::initial_value.
+       (Options::get_size_multiple): New method.
+       (Options::get_key_positions): New method.
+       (Options::get_max_keysig_size): Implement using _key_positions.
+       * src/options.cc (Options::long_usage): Split big string into small
+       pieces.
+       (PositionStringParser): Prefix field names with _.
+       (Options::Options): Update.
+       (Options::~Options): Fix explanation of of _size_multiple. Don't print
+       _key_positions if it is effectively ignored.
+       (Options::parse_options): Renamed from Options::operator(). Update.
+       * src/key-list.h (Key_List): New field _size. New methods get_asso_max,
+       set_asso_max, get_max_keysig_size.
+       * src/key-list.cc (Key_List::read_keys): Don't make side effects on
+       options.
+       (Key_List::dump): Use Key_List::get_max_keysig_size() instead of
+       Options::get_max_keysig_size().
+       (Key_List::get_max_keysig_size): New function.
+       * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
+       width on the fly if option[ALLCHARS].
+       * src/gen-perf.cc (Gen_Perf::Gen_Perf): Update,
+       Use Options::get_size_multiple() instead of Options::get_asso_max().
+       Use Key_List::get_asso_max() instead of Options::get_asso_max(). Use
+       Key_List::get_max_keysig_size() instead of
+       Options::get_max_keysig_size().
+       (Gen_Perf::affects_prev): Likewise.
+       (Gen_Perf::change): Likewise.
+       * src/keyword.cc: Update.
+       * src/main.cc: Update.
+       * src/output.cc: Update.
+       * tests/test-6.exp: Update.
+
+2002-10-13  Bruno Haible  <bruno@clisp.org>
+
+       * src/bool-array.*: Some polishing.
+
+       * src/options.h (Options::operator=, Options::operator!=): Remove
+       unused methods.
+       * src/options.icc (Options::operator=, Options::operator!=): Remove.
+
+       * src/*.h: Prefix all field names with _.
+       * src/*.cc, src/*.icc: Update.
+
+       * src/*: Simplify declarations of functions without arguments.
+
+2002-10-04  Bruno Haible  <bruno@clisp.org>
+
+       * src/output.h: New file, extracted from key-list.h.
+       * src/output.cc: New file, extracted from key-list.cc.
+       * src/key-list.h (Key_List): Make some fields protected. Move output
+       routines to src/output.h.
+       * src/key-list.cc: Move output routines to src/output.cc.
+       * src/gen-perf.cc (Gen_Perf::doit_all): Use class Output.
+       * src/Makefile.in (OBJECTS): Add output.o.
+       (output.o): New rule.
+
+2002-10-03  Bruno Haible  <bruno@clisp.org>
+
+       * src/iterator.h: Remove file.
+       * src/iterator.cc: Remove file.
+       * src/options.cc: (PositionStringParser): New class, taken from old
+       iterator.cc.
+       * src/Makefile.in (OBJECTS): Remove iterator.o.
+       (ITERATOR_H): Remove variable.
+       (iterator.o): Remove rule.
+
+       * src/keyword-list.h: New file.
+       * src/keyword-list.cc: New file.
+       * src/list-node.h: Remove file.
+       * src/list-node.cc: Remove file.
+       * src/keyword.h (KeywordExt::init_selchars): New declaration.
+       * src/keyword.cc (sort_char_set, KeywordExt::init_selchars): New, from
+       old list-node.cc.
+       * src/gen-perf.cc: Replace List_Node by KeywordExt or KeywordExt_List,
+       as appropriate.
+       * src/hash-table.h: Likewise.
+       * src/key-list.h: Likewise.
+       * src/key-list.cc: Likewise.
+       * src/Makefile.in (OBJECTS): Remove list-node.o, add keyword-list.o.
+       (LIST_NODE_H): Remove macro.
+       (list-node.o): Remove rule.
+       (keyword-list.o): New rule.
+
+       * src/keyword.h (KeywordExt): New class.
+       * src/keyword.cc (KeywordExt): New constructor.
+       * src/list-node.h (List_Node): Inherit from KeywordExt.
+       * src/list-node.cc: Update.
+       * src/gen-perf.cc: Update.
+       * src/hash-table.cc: Update.
+       * src/key-list.cc: Update.
+       (output_keyword_entry): Change argument type to KeywordExt*.
+
+       * src/keyword.h: New file.
+       * src/keyword.cc: New file.
+       * src/list-node.h (List_Node): Extend Keyword.
+       * src/list-node.cc: Update.
+       * src/gen-perf.cc: Update.
+       * src/hash-table.cc: Update.
+       * src/key-list.cc: Update.
+       * src/Makefile.in (OBJECTS): Add keyword.o.
+       (keyword.o): New rule.
+
+       * src/key-list.cc (Key_List::read_keys): Allocate the memory for the
+       hash table using 'new'.
+       (Key_List::output_lookup_array): Allocate the memory for the duplicates
+       array using 'new'.
+       * src/options.h (LARGE_STACK_ARRAYS): Remove definition.
+       * src/main.cc (main): Remove setrlimit call.
+       * src/configure.in: Don't test for unistd.h, sys/time.h,
+       sys/resource.h, getrlimit, setrlimit.
+
+       * src/bool-array.h (Bool_Array): Make all members non-static.
+       Add an argument to the constructor. Remove init(), rename reset() to
+       clear(), rename find() to set_bit().
+       * src/bool-array.icc: Move init() code into the constructor.
+       Rename reset() to clear(), rename find() to set_bit().
+       * src/gen-perf.h (Gen_Perf): Add collision_detector member.
+       * src/gen-perf.cc: Update.
+
+       * src/gen-perf.h (Gen_Perf::doit_all): Renamed from
+       Gen_Perf::operator ().
+       * src/gen-perf.cc (Gen_Perf::doit_all): Renamed from
+       Gen_Perf::operator ().
+       * src/main.cc: Update.
+
+       * src/read-line.h (Read_Line::read_next_line): Renamed from
+       Read_Line::get_line.
+       * src/read-line.icc: Likewise.
+       * src/read-line.cc: Update.
+       * src/key-list.cc: Update.
+
+       * lib/getline.h: New file.
+       * lib/getline.cc: New file.
+       * lib/Makefile.in (OBJECTS): Add getline.o.
+       (getline.o): New rule.
+       * src/read-line.h (Read_Line::readln_aux): Remove declaration.
+       * src/read-line.cc (Read_Line::readln_aux): Remove function.
+       * src/read-line.icc (Read_Line::get_line): Use ::get_line.
+       * src/options.h (LARGE_STACK): Remove macro.
+
+       * src/bool-array.h (STORAGE_TYPE): Remove type.
+       Use 'unsigned int' instead of STORAGE_TYPE.
+       * src/bool-array.cc: Likewise.
+       * src/bool-array.icc: Likewise.
+       * src/gen-perf.cc: Likewise.
+
+       * src/new.cc: Remove file.
+       * src/Makefile.in (OBJECTS): Remove new.o.
+       (new.o): Remove rule.
+       * src/configure.in: Remove test for HAVE_THROW_DECL.
+       * acconfig.h: Remove file.
+
+       * src/trace.h: Remove file.
+       * src/trace.cc: Remove file.
+       * src/Makefile.in (OBJECTS): Remove trace.o.
+       (TRACE_H): Remove variable.
+       (trace.o): Remove rule.
+       Update all dependencies.
+       * src/bool-array.h, src/bool-array.cc, src/bool-array.icc: Don't use T.
+       * src/gen-perf.cc: Likewise.
+       * src/hash-table.cc: Likewise.
+       * src/iterator.cc: Likewise.
+       * src/key-list.cc: Likewise.
+       * src/list-node.cc: Likewise.
+       * src/main.cc: Likewise.
+       * src/new.cc: Likewise.
+       * src/options.h, src/options.cc, src/options.icc: Likewise.
+       * src/read-line.h, src/read-line.cc, src/read-line.icc: Likewise.
+
+       * tests/Makefile.in: Use gperf option -I, to avoid gcc-3.x warnings.
+       * tests/test.c: Don't use gets(), to avoid warnings.
+
+2001-08-02  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+       * doc/gperf.texi: Change bug report address to <bug-gnu-gperf@gnu.org>.
+       * README: Updated.
+
+2000-12-18  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * src/configure.in: Add check for rand() in libm. Needed for BeOS.
+        * src/Makefile.in (LIBS): Use @GPERF_LIBM@ instead of hardwiring -lm.
+
+2000-11-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * doc/help2man: Update to version 1.23.
+
+2000-09-26  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * gperf-2.7.2 released.
+
+        * doc/gperf.texi: Add a second bug report address
+          <gperf-bugs@lists.sourceforge.net>.
+        * README: Updated.
+
+2000-08-28  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * lib/getopt.h (struct option): Use "const" also when compiling in
+          C++ mode. Avoids warnings from Sun CC and HP-UX aCC.
+
+        * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to
+          $(prefix)/doc/@PACKAGE@, following the newest GNU standards.
+
+2000-08-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * src/version.cc: Bump version number to 2.7.2.
+        * doc/gperf.texi: Likewise.
+
+        * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the
+          title page now chooses a larger font. The overall layout of the
+          text is denser.
+
+        * AUTHORS: New file.
+
+        * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2.
+          (check-lang-utf8, check-lang-ucs2): New targets.
+          (clean): Remove lu8out and lu2out.
+        * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files.
+        * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in,
+          tests/lang-ucs2.exp: New files.
+
+        Allow the use of embedded NULs in keys.
+        * lib/hash.h (hashpjw): Add a length argument.
+        * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL
+          character.
+        * src/hash-table.h (Hash_Table constructor): Add ignore_len argument.
+          (Hash_Table::ignore_length): New field.
+          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
+          ignore_length argument.
+        * src/hash-table.cc (NIL): Remove macro.
+          (Hash_Table constructor): Add ignore_len argument. Use it to
+          initialize ignore_length.
+          (Hash_Table destructor): Specify explicit length of char_set and
+          key.
+          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
+          ignore_length argument. Pass explicit length to hashpjw. Compare
+          char_set using memcmp, not strcmp.
+        * src/list-node.h (List_Node): Rename field length to key_length.
+          New field char_set_length.
+          (List_Node constructor): Accept key and rest, not the entire line.
+        * src/list-node.cc (List_Node constructor): Accept key and rest, not
+          the entire line. Don't NUL terminate key and char_set. Specify
+          explicit length of key. Initialize char_set_length field.
+        * src/key-list.cc: Include <ctype.h>.
+          (parse_line): New function.
+          (Key_List::read_keys): Call parse_line instead of new List_Node.
+          Pass option[NOLENGTH] to Hash_Table constructor, not
+          Hash_Table::insert. Specify explicit length of key and char_set.
+          (Key_List::get_occurrence): Use explicit length of char_set.
+          (Key_List::set_determined): Likewise.
+          (Key_List::already_determined): Likewise.
+          (output_string): Add length argument. Output unprintable characters
+          using octal escape sequence.
+          (output_keyword_entry): Use explicit length of key.
+          (Key_List::output_lookup_array): Specify explicit length of key.
+          (output_switch_case): Likewise.
+          (Key_List::dump): Likewise.
+        * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length
+          arguments.
+        * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't
+          stop when encountering NUL characters. Don't NUL terminate the
+          result.
+          (Gen_Perf::hash): Use explicit length of char_set.
+          (Gen_Perf::change): Specify explicit length of key.
+        * doc/gperf.texi: Document it.
+
+        * doc/help2man: New file, help2man version 1.022.
+        * Makefile.devel (all): Add doc/gperf.1.
+          (doc/gperf.1): New target.
+        * doc/gperf.1: Automatically generated.
+
+        * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4,
+          libtool-1.3.3, make-3.79.1, tar-1.13.
+        * src/Makefile.in (MKINSTALLDIRS): New variable.
+          (install, installdirs): Use it instead of mkdir.
+        * doc/Makefile.in (MKINSTALLDIRS): New variable.
+          (install, installdirs): Use it instead of mkdir.
+
+        * INSTALL: Update.
+
+2000-08-19  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
+
+        * src/key-list.cc (Output_Compare_Memcmp): New class.
+          (Key_List::output_lookup_function): When option -l is given, use
+          memcmp instead of strcmp or strncmp.
+
+        * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>.
+          The download address is ftp.gnu.org. Remove mention of -a and -g
+          options (now nops). Explain effect of -c option.
+
+        * doc/configure.in (PACKAGE): New variable.
+        * doc/Makefile.in (datadir, docdir): New variables.
+          (dvidir, htmldir): Change values.
+          (install, installdirs): Update.
+
+        * src/configure.in: Rename cache variable gp_cxx_throw_decl to
+          gp_cv_cxx_throw_decl.
+
+        * src/key-list.cc (Key_List::output_hash_function): When outputting
+          __inline, take advantage of C++ compilers which have inline.
+
+        * src/key-list.cc (Output_Compare_Strncmp::output_comparison):
+          After the call to strncmp, verify that expr2 is not longer than
+          `len'.
+          Reported by Carlo Wood <carlo@runaway.xs4all.nl>.
+
+        * src/key-list.cc (Key_List::output_lookup_function_body): Avoid
+          emitting the loop for dealing with duplicates if
+          total_duplicates == 0.
+
+        * src/key-list.cc (Key_List::read_keys): Don't accept an empty key.
+
+        * src/Makefile.in (install, installdirs, uninstall): Respect
+          $(DESTDIR).
+        * doc/Makefile.in (install, installdirs, uninstall): Likewise.
+
+        * src/options.cc (Options::print_options): Escape the arguments which
+          contain special characters.
+
+        * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf.
+        * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf.
+        * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf.
+        * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf.
+        * tests/gplus.gperf: Remove file.
+        * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf.
+        * tests/Makefile: Check them all.
+        * tests/c-parse.exp: Renamed from tests/test-1.exp.
+        * tests/modula2.exp: Renamed from tests/test-2.exp.
+        * tests/cplusplus.exp: Renamed from tests/test-3.exp.
+        * tests/gpc.exp: Renamed from tests/test-5.exp.
+
+        * src/key-list.cc (output_switch_case): Add trailing semicolon to
+          lengthptr assignment line. Fixes bug with -D and -S.
+          From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by
+          David Hunter.
+        * tests/Makefile.in (check-lang-syntax): Perform each test with -D
+          once without and once with duplicates.
+
+        * src/key-list.cc (output_keyword_entry): Avoid outputting a struct
+          initializer of the form {"key",}.
+
+        * src/iterator.cc: Don't include <stream.h>.
+          From Michael Deutschmann <ldeutsch@mail.netshop.net>.
+
+        * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where
+          appropriate.
+          Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
+
+        * tests/validate: Don't run -traditional tests by default.
+
+        * src/main.cc (main): Check for write error on stdout before returning.
+
+        * src/Makefile.in (LDFLAGS): New definition, to catch the value given
+          at configure time.
+
+        Make the structure initializers customizable. Based on a patch by
+        Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
+        * src/options.h (Options::get_initializer_suffix,
+          Options::initializer_suffix): New declarations.
+        * src/options.icc (Options::get_initializer_suffix): New function.
+        * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
+          (Options::initializer_suffix): New variable.
+          (Options::short_usage): Document option "-F".
+          (Options::long_usage): Document option "-F".
+          (Options constructor): Initialize initializer_suffix.
+          (Options destructor): Dump initializer_suffix.
+          (long_options): Add option "-F".
+          (Options::operator()): Accept option "-F". Sets initializer_suffix.
+        * src/key-list.cc (output_keyword_blank_entries): Output
+          initializer_suffix.
+        * doc/gperf.texi: Document option "-F".
+
+        * COPYING: Replace with GPL version 2 (with new FSF address and Y2K
+          safe year format).
+
+        * doc/gpl.texinfo: New file.
+        * doc/gperf.texi: Document it.
+        * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html):
+          Update dependencies.
+
+        * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo.
+
+1998-05-20  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps.
+          (install, installdirs, uninstall): Don't install gperf.dvi. The
+          info and HTML documentations are sufficient for on-line use, and
+          users who wish to print the documentation (in PS or DVI format)
+          can do this directly off the source distribution.
+          (DVIPS): Use "-D600" instead of "-Pljfour", for portability.
+
+1998-05-20  Akim Demaille  <demaille@inf.enst.fr>
+
+        * doc/gperf.texi: Many modifications:
+          (Output Format): Declare `hash' and `in_word_set' as functions.
+          (Concept Index): New section.
+          (Title page): Use standard presentation.
+          (Top): Use @top instead of @unnumbered so that automatic master
+          update works.
+          (Motivation): Avoid spaces in @var.
+          (Options): Use the standard name ``Invoking ...''.
+          (Options): Declare also the long form of the options.
+          (Options): Remove redundant @itemize when @table is used.
+
+1998-05-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+        * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not
+          ac_cv_path_install.
+
+Sat May  2 13:20:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * gperf-2.7 released.
+
+Sat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * src/version.cc (version_string): Remove the "(C++ version)" suffix.
+          It's redundant: the early C versions of gperf are called cperf.
+          Reported by Karl Berry.
+        * src/option.cc (Options::operator()): Trim the output of "gperf -v".
+
+Thu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
+          Solaris "make" sets it to a value not understood by "cc".
+
+Wed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
+          use $<. AIX "make" and OSF/1 "make" have problems with both.
+        * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
+          otherwise it doesn't compile on SunOS 4.
+        * src/key-list.h: Declare structs outside of other declarations,
+          needed for OSF/1 cxx 5.5.
+        * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
+          Don't give a prototype for getopt(), to avoid error on SunOS 4.
+        * lib/getopt.c: Declare strncmp, to avoid warnings.
+
+Tue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * lib/GetOpt.{h,cc}: Remove files.
+        * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
+        * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
+        * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
+          (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
+          "make"s don't support to have both implicit rules for "%.o : %.c"
+          and "%.o : %.cc" in the same Makefile.
+        * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
+        * src/option.h (Options::usage): Remove.
+          (Options::short_usage, Options::long_usage): Declare.
+        * src/option.cc (Options::usage): Remove.
+          (Options::short_usage, Options::long_usage): New functions.
+          (long_options): New array.
+          (Options::operator()): Use getopt_long instead of GetOpt::operator(),
+          change all references to GetOpt members.
+
+        * src/std-err.{h,cc}: Remove files.
+        * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
+          Call fprintf(stderr) instead of Std_Err::report_error().
+        * src/key-list.h, src/list-node.h, src/options.h: Don't use class
+          Std_Err any more.
+        * src/option.cc (program_name): New variable.
+        * src/Makefile.in: Remove STD_ERR_H.
+          (OBJECTS): Remove std-err.o.
+
+Mon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
+          CL_CXX_WORKS, already contained in autoconf 2.12.
+
+        * src/gen-perf.cc, src/key-list.cc: Move some code from
+          Gen_Perf::Gen_Perf() to Key_List::output().
+        * src/Makefile.in: Update dependencies.
+
+        * src/options.{h,cc}: Remove option "-p".
+        * src/key-list.cc (Key_List::set_output_types): Rewrite.
+          (default_array_type, default_return_type): Remove.
+        * src/key-list.cc: Adjust "const" handling.
+          + With option "-t" [TYPE], don't emit wrong code if there is no
+            space before the struct's opening brace.
+
+Sun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * src/key-list.{h,cc}: Completely reorganized the output routines.
+          Rewrote from scratch the output_switch() function. Use classes
+          (Output_Constants, Output_Expr, Output_Compare) for abstraction.
+          In particular:
+          + Don't emit trailing whitespace and spurious blank lines.
+          + Adjust indentation of the arrays.
+          + Don't emit commas at the end of array initializers and
+            struct initializers.
+          + With option "-l" [LENTABLE], compare the length before
+            fetching the word from memory.
+          + With option "-S" [SWITCH], emit the comparison code just once,
+            not once in every switch statement.
+          + With option "-S" [SWITCH], choose the right switch statement
+            through a binary search, not a linear search.
+          + With option "-S" [SWITCH], emit straightforward comparisons
+            instead of switch statements with just one "case" label.
+          + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
+            spurious empty elements at the beginning of the wordlist array.
+          + With option "-D" [DUP] and not option "-S" [SWITCH], if there
+            is no more room for duplicate entries in the lookup array,
+            don't call `assert (i != 0)'. Instead, make the array larger :-)
+          + With option "-D" [DUP], if there are no duplicates, don't
+            automatically fall back to the non-"-D" algorithm. If the user
+            wants the non-"-D" algorithm, he can just not specify "-D".
+          + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
+            or not option "-S" [SWITCH], don't emit spurious empty elements
+            at the beginning of the wordlist array.
+          + With option "-D" [DUP], simplify the detection and processing
+            of duplicate entries in the lookup array.
+          + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
+            don't forget to emit the lengthtable array.
+          + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
+            compare the lengths before comparing the strings.
+
+        * src/gen-perf.cc: No need to include <assert.h>.
+        * src/options.cc: Likewise.
+
+        * src/options.cc: Don't use `errno' after freopen failed.
+        * src/std-err.cc: `report_error' doesn't call strerror(errno) any
+          more. No need to include <string.h> and <errno.h>.
+
+        * tests/Makefile.in (check-*): Any difference between .exp and .out
+          is a failure. Don't ignore whitespace differences.
+
+        * tests/Makefile.in (check-lang-syntax): Add some more checks.
+
+Fri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
+          of Minix and SVR2 14-character filename limit.
+        * src/key-list.cc (output_string): New function.
+          (Key_List::output_switch, Key_List::output_keyword_table): Call it.
+
+        * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
+          option -W.
+        * src/key-list.cc (Key_List::output_switch,
+          Key_List::output_keyword_table, Key_List::output_lookup_function):
+          Use it.
+        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
+
+        * src/version.cc: Bump version number directly from 2.5 to 2.7,
+          because Schmidt's last release from 1991 carries version number 2.6.
+
+Tue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
+
+        * Fixed a small bug in the Key_List::output_keyword_table routine
+          that caused an extra newline to be printed if there where no
+          leading blank entries... (who cares, right?!)
+
+Mon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
+
+        * Modified the handling of the -E (emit enums rather than
+          #defines) option in conjunction with the -G option.  Now, if -G
+          and -E are given the enums are generated outside the lookup
+          function, rather than within it!
+
+Mon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)
+
+        * Yucko, there was a bug in the handling of -c (and of course the
+          new -I command in key-list.cc).  Apparently when I added the
+          super-duper hack that provided support for duplicate keys I
+          forgot to update the strcmp output...
+
+Mon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * Moved the documentation to doc/, put the stuff borrowed from
+          libg++ into lib/.
+        * Rewrote all Makefile.in's for better compliance with GNU standards.
+        * Autoconf based configuration. Rewrote all configure.in's. Added
+          aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
+        * src/depend: Removed. Dependencies are now in src/Makefile.in.
+
+        * src/bool-array.icc: New file, contains inline functions, from both
+          src/bool-array.h and src/bool-array.cc.
+        * src/options.icc: New file, contains inline functions, from both
+          src/options.h and src/options.cc.
+        * src/read-line.icc: New file, contains inline functions, from both
+          src/read-line.h and src/read-line.cc.
+
+        * src/bool-array.h: Don't include <std.h>.
+        * src/bool-array.cc: Include <string.h>.
+        * src/gen-perf.cc: No need to include <ctype.h>. Don't include
+          <_G_config.h>.
+        * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
+          <string.h> and lib/hash.h instead.
+        * src/iterator.cc: Don't include <std.h>.
+        * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
+          <stdlib.h> instead.
+        * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
+          Remove `index' hack.
+        * src/main.cc: Don't include <_G_config.h>.
+        * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
+        * src/options.cc: Don't include <builtin.h>. Include <string.h> and
+          <stdlib.h> instead.
+        * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
+          instead.
+        * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
+        * src/vectors.h: No need to include <stdio.h>.
+        * src/version.cc: No need to include <stdio.h>.
+
+        * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
+        * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
+          to unsigned int.
+        * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
+          from STORAGE_TYPE to unsigned int.
+        * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
+          argument types from `char *' to `const char *'.
+        * src/iterator.h: Change type of `Iterator::str' and argument of
+          `Iterator::Iterator' from `char *' to `const char *'.
+        * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
+        * src/key-list.{h,cc}: Change type of `Key_List::array_type',
+          `Key_List::return_type', `Key_List::struct_tag',
+          `Key_List::include_src', `default_array_type', `default_return_type'
+          and return type of `Key_List::get_array_type',
+          `Key_List::get_special_input', `Key_List::save_include_src' from
+          `char *' to `const char *'.
+        * src/key-list.cc: Change "pretty gross" assignment.
+        * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
+        * lib/GetOpt.cc: Likewise.
+        * src/key-list.cc (merge): Use iteration instead of recursion.
+        * src/list-node.{h,cc}: Change type of `List_Node::key',
+          `List_Node::rest', `List_Node::char_set' from `char *' to
+          `const char *'.
+        * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
+        * src/read-line.h: Don't use BUFSIZ.
+        * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
+          buffers on the stack by default. Use memcpy for copying buffers.
+          Include <string.h>.
+        * src/read-line.icc (get_line): Use iteration instead of tail recursion.
+          Don't call ungetc(EOF,stdin).
+        * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
+          argument `Std_Err::report_error' from `char *' to `const char *'.
+        * src/std-err.cc: `report_error' doesn't call `exit' any more. All
+          callers changed to do that themselves.
+        * src/trace.h: Make constructor/destructor calls non-inline.
+
+        * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
+          always make the hash function inline.
+          (output): Declare the hash function inline, with the right name.
+        * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
+          options -g, making it on by default. Remove option -a. Instead,
+          introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
+        * src/options.{h,cc}, src/key-list.cc: Add option -I.
+        * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
+        * src/key-list.cc: Don't emit a comma at the end of an enum list.
+        * src/main.cc: Remove COUNT_TIME code.
+        * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
+          ALPHA_SIZE defaults to 256 now. Add option -7.
+
+        * tests/javascript.gperf: New file.
+        * tests/jstest*.gperf, tests/validate: New tests.
+
+Sat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>
+
+       * src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).
+
+Wed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>
+
+       * configure.in (package_makefile_rules_frag): New and
+       redirect stderr from ${srcdir}/config.shared to
+       ${package_makefile_rules_frag}.
+       * src/configure.in: Ditto.
+       * tests/configure.in: Ditto.
+
+Fri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)
+
+       * gperf.texi (@ichapter): Changed to @chapter.
+
+Wed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)
+
+       * src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
+       define if strcspn is defined.
+
+Fri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>
+
+       * src/new.cc (operator delete): Add the exception specification.
+
+Mon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>
+
+       * src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last line
+       has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
+       away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
+       * src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.
+
+Tue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>
+
+       * src/list-node.cc (List_Node): Reorder init of nodes to
+       match declaration order.
+       * src/hash-table.cc (Hash_Table): Likewise.
+
+Tue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>
+
+       * src/new.cc: Since malloc/delete are not paired, we cannot call
+       free.
+
+Wed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+
+       * src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
+       Patch from John Interrante <interran@uluru.stanford.edu>.
+
+Sat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)
+
+       * src/Makefile.in (LIBS): Remove.
+
+Tue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>
+
+       * src/std-err.cc:  Use stderror, instead of the non-standard
+       sys_nerr and sys_errlist.
+
+Sat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * src/key-list.cc (output_hash_function):
+       Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
+
+Fri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)
+
+       * src/std-err.cc:  #include <errno.h>, and only declare
+       extern int errno if errno is not a macro.
+
+Mon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * Makefile.in (src_all, install):  Make sure to add '/' after
+       `pwd` in $rootme, as expected by FLAGS_TO_PASS.
+
+Wed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)
+
+       Make libg++ build with gcc -ansi -pedantic-errors
+       * src/options.h: Lose commas at end of enumerator lists.
+
+Sun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
+
+       * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
+       argument to fprintf, since it's not expecting one.
+
+Fri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * src/list-node.cc:  #undef index, for the sake of broken NeXT,
+
+Thu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * Makefile.in (install):  Use INSTALL_DATA for gperf.1.
+
+Mon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * src/key-list.cc (Key_List::read_keys):  Use POW macro
+       to increase hash table size to power of 2.
+
+       * options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
+       * gen-perf.cc, key-list.cc, read-line.cc:       
+       Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
+       * main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
+       if LARGE_STACK_ARRAYS.
+
+Mon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.
+
+Wed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)
+
+       * Makefile.in (src_all):  Make less verbose output.
+
+Fri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
+       2-operand conditional expression.
+       * src/key-list.cc (Key_List::output_lookup_array):
+       Don't use variable-size stack arrays, unless compiled by g++.
+
+Tue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)
+
+       Changes (mostly from Peter Schauer) to permit compilation
+       using cfront 3.0 and otherwise be ARM-conforming.
+       * src/key-list.h:  class Key_List must use public derivation
+       of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
+       calls Std_Err::report_error).
+       * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
+       (Hash_Table::operator()):  Don't use gcc-specific 2-operand
+       conditional expression.
+       * src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
+       range construct in case label.
+       * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
+       src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
+       (Read_Line::readln_aux):  If not gcc, don't allocate
+       variable-sized arrays on stack.
+       * src/new.cc (operator new):  Argument type should be size_t.
+       * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
+       new/cc (::operator new): Don't use non-standard >?= operator.
+
+Tue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)
+
+       * src/Makefile.in:  Define TARGETPROG, and use it.
+
+Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)
+
+       * Makefile.in, configure.in:  Re-vamped configure scheme.
+       * gperf.texinfo:  Renamed to gperf.texi.
+       * src/bool-array.{h,cc}:  ANSIfy bzero->memset.
+
+Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
+
+       * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
+       pout, and preout.
+
+Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)
+
+       * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
+       (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.
+
+Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * tests/expected.* renamed to *.exp to fit in 14 chars.
+       * tests/Makefile.in:  Update accordingly.
+       Also rename output.* to *.out.
+       * src/Makefile.in (clean):  Remove gperf program.
+
+Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)
+
+       * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.
+
+Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)
+
+       * Makefile.in (distclean, realclean): Don't delete
+       Makefile before recursing.
+
+Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * key-list.{h,cc}:  Remove MAX_INT (and similar) constant
+       fields from Key_List class, and use INT_MAX (etc) from limits.h.
+       * key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
+       uses of initialized const fields, as they are non-standard
+       - and their use was easy to do away with.  Mostly, just
+       made the constants static non-fields in the .cc file.
+
+Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)
+
+       * tests/Makefile.in:  When generating cinset.c, don't pass -C,
+       since -C assumes an ANSI compiler.  Add the -C flag (with -a)
+       when generating test.out.3 instead.
+       * tests/expected.out.3:  Update accordingly.
+
+Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)
+
+       * Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
+       * Makefile.in:  'install-info' depends on gperf.info.
+
+Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)
+
+       * Makefile.in, src/Makefile.in: always create installation
+       directories.
+
+Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)
+
+       * src/new.cc (operator new):  Add cast from void * to char *,
+       since it is not a standard conversion.
+
+Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
+       * src/key-list.cc:  alloca() hair.
+       * src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
+       * Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.
+
+Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * src/gen-perf.cc:  Replace USG -> _G_SYSV.
+
+Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
+       * tests/Makefile.in (clean): Fix.
+
+Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
+
+       * gperf.texinfo: added menu item hook.
+
+Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)
+
+       * Makefile.in, configure.in: removed traces of namesubdir,
+         -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
+         copyrights to '92, changed some from Cygnus to FSF.
+
+Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)
+
+       * tests/Makefile.in:  Use re-directed stdin instead of file
+       name in argv.  This allows us to remove the filename
+       from the output, the expected output, and hence the diffs.
+       (Note that the input file is in $(srcdir), which we cannot
+       place in the expected out files.)
+       * tests/expected.out.[1235]:  Edit out input filename,
+       to match new output.
+
+Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)
+
+       * Wow, first fix on the new job!  There was a dumb error
+         in Key_List::output_lookup_function, where I printed the
+         string "&wordlist[key]" instead of the correct "&wordlist[index]".
+         
+       * Added a couple of #ifdefs for USG support.
+               
+Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Updated the version number to 2.5 and sent to Doug Lea for release
+          with the latest GNU libg++.
+
+        * Changed the error handling when a keyword file cannot be opened
+          (now calls perror).
+
+Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Instrumented the source code with trace statements automagically
+          inserted using my new automated trace instrumentation tool!
+
+Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Really fixed the previous bug.  Turns out that a small amount
+          of logic had to be duplicated to handle static links that occur
+          as part of dynamic link chains.  What a pain!!!
+
+Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Fixed a stupid bug in Key_List::output_lookup_array that was
+          causing incorrect counts to be generated when there were both
+          static and dynamic links occurring for the same hash value.
+          Also simplified the code that performs the logic in this routine.
+
+Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Fixed stupid bug in Key_List::output_lookup_array that was
+          making the generated lookup[] array contain `chars' even
+          when the values stored in the chars are greater than 127!
+
+        * Changed the behavior of the -G (global table) option so that it
+          will output the `length[]' array in the global scope along with
+          the `word_list[]' array.
+
+        * Fixed a stupid bug in Key_List::output_lookup_function that
+          would always output the complicated `duplicate-handling' lookup
+          logic, even when there were no duplicates in the input!
+
+        * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
+          handle duplicate entries.  Changed the generated code so that
+          the MIN_HASH_VALUE is no longer subtracted off when calculating
+          the hash value for a keyword.  This required changing some other
+          code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
+          Finally, this means that the generated tables may contain leading 
+          null entries, but I suppose it is better to trade-off space to get 
+          faster performance...
+
+Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Updated version number to 2.4 to reflect the latest changes.
+
+        * Changed the main program so that it always prints out gperf's
+          execution timings to the generated output file.
+          
+Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Added the -Z option so that users can specify the name of the
+          generated class explicitly.  Updated documentation to reflect
+          this change.
+          
+        * Modified the generated C++ class interface so that the functions
+          are declared static (to remove the overhead of passing the `this'
+          pointer).  This means that operator()() can no longer be used,
+          since it only works on non-static member functions.
+          Also changed things so that there is no constructor (why waste
+          the extra call, when it doesn't do anything, eh?)
+
+        * Modified the behavior of Key_List::output when the -L C++ option
+          is enabled.  Previously the code generated use const data members
+          to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
+          pointed out by James Clark this may result in suboptimal behavior
+          on the part of C++ compilers that can't inline these values.
+          Therefore, the new behavior is identical to what happens with
+          -L C, i.e., either #defines or function-specific enums are used.
+          Why sacrifice speed for some abstract notion of `code purity?' ;-)
+
+Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Added the -E option that defines constant values using an enum
+          local to the lookup function rather than with #defines.  This
+          also means that different lookup functions can reside in the
+          same file.  Thanks to James Clark (jjc@ai.mit.edu). 
+
+Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Added a special case to key_list::output_switch that doesn't
+          generate extra comparisons when the `-S' is given an argument
+          of 1 (the normal case).  This should speed up the generated
+          code output a tad...
+
+Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Renamed all instances of member function get_keysig_size
+          to get_max_keysig_size, since this is more precise...
+
+        * Changed all occurrences of charset to keysig (stands for ``key
+          signature'') to reflect the new naming convention used in the 
+          USENIX paper.
+
+Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Changed the name of the generated associated values table from
+          asso_value to asso_values to reflect conventions in the USENIX
+          C++ paper.
+
+Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Updated the gperf.texinfo file to fix some formatting problems
+          that had crept in since last time.
+
+Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Fixed stupid bug in key-list.cc (get_special_input), wher
+          gperf replaced each '%' with the succeeding character.
+
+        * Added support for multiple target language generation.  Currently
+          handled languages are C and C++, with C as the default.  Updated
+          documentation and option handler to reflect the changes.
+
+        * Added a global destructor to new.cc and removed the #ifdef, since
+          the bloody thing now works with libg++.
+
+Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Found out that my gperf paper was accepted at the upcoming
+          USENIX C++ Conference in San Francisco.  Yow!
+
+Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * #ifdef'd out the new.cc memory allocator, since there are
+          problems with this and the libg++ stuff.
+
+        * Changed key-list.h so that class Vectors is a public (rather
+          than private) base class for class Key_List.  The previous
+          form was illegal C++, but wasn't being caught by the old
+          g++ compiler.  Should work now... ;-)
+
+Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added several changes from rfg@ics.uci.edu.  These changes
+          help to automate the build process.
+
+Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Removed conditional compilation for GATHER_STATISTICS.  There's
+          really no good reason to avoid collecting this info at run-time,
+          since that section of code is *hardly* the bottleneck... ;-)
+
+        * Simplified the C output routines in Key_List::set_output_types
+          and Key_List::output_keyword_table a bit in order to
+          speed-up and clean up the code generation.
+
+        * Modified function Key_List::get_special_input so that it does
+          not try to `delete' a buffer that turned out to be too short.
+          This is important since the new memory management scheme
+          does not handle deletions.  However, adding a small amount of
+          garbage won't hurt anything, since we generally don't do this
+          operation more than a couple times *at most*!
+
+        * Created a new file (new.cc) which includes my own overloaded
+          operator new.  This function should dramatically reduce the
+          number of calls to malloc since it grabs large chunks and
+          doles them out in small pieces.  As a result of this change
+          the class-specific `operator new' was removed from class List_Node.
+
+Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Continued to refine the great hack.  The latest trick is to
+          try and replace most uses of dynamic memory (i.e., calls to
+          new) with uses of gcc dynamic arrays (i.e., an alloca solution).
+          This makes life much easier for the overall process-size, since 
+          it reduces the amount of overhead for memory management.  As a
+          side-effect from this change there is no reason to have the
+          Bool_Array::dispose member function, so it's outta here!
+
+        * Fixed a stupid bug that was an disaster waiting to happen...
+          Instead of making the boolean array large enough to index
+          max_hash_value it was only large enough to index max_hash_value
+          - 1.  Once again, an off-by-one mistake in C/C++!!!!
+
+Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added the final great hack!  This allows us to generate hash tables
+          for near-perfect hash functions that contain duplicates, *without*
+          having to use switch statements!  Since many compilers die on large
+          switch statements this feature is essential.  Furthermore, it appears
+          that the generated code is often *smaller* than that put out by
+          compilers, even though a large, sparse array must be created.
+          Here's the general idea:
+
+             a. Generate the wordlist as a contiguous block of keywords, 
+                just as before when using a switch statement.  This
+                wordlist *must* be sorted by hash value. 
+
+             b. Generate the lookup array, which is an array of signed
+                {chars,shorts,ints}, (which ever allows full coverage of
+                the wordlist dimensions).  If the value v, where v =
+                lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
+                simply use this result as a direct access into the wordlist 
+                array to snag the keyword for comparison.  
+
+             c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
+                this is an indication that we'll need to search through
+                some number of duplicates hash values.  Using a hash
+                linking scheme we'd then index into a different part of
+                the hash table that provides the starting index and total
+                length of the duplicate entries to find via linear search!
+
+Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Simplified Key_List::output_min_max considerably by recognizing
+          that since the keyword list was already sorted by hash value finding 
+          the min and max values is trivial!
+
+        * Improved the debugging diagnostics considerably in classes Key_List,
+          Hash_Table, and Gen_Perf.
+
+        * Modified the `-s' option so that a negative argument is now 
+          interpreted to mean `allow the maximum associated value to be
+          about x times *smaller* than the number of input keys.'  This
+          should help prevent massive explosion of generated hash table
+          size for large keysets.
+
+Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added a field in class Key_List that counts the total number
+          of duplicate keywords, both static and dynamic.
+
+        * Added a new member function Bool_Array that deletes the dynamic
+          memory allocated to Bool_Array::storage_array.  This space may
+          be needed for subsequent options, so it made sense to free it as
+          soon as possible...
+          
+        * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
+          with 14 character length filenames on SYSV.  Also changed file
+          adapredefined.gperf to adadefs.gperf in the ./tests directory.
+
+        * Modified class Options by changing the member function
+          Options::total_positions to Options::get_charset_size and
+          Options::set_charset_size.  These two routines now either return
+          the total charset size *or* the length of the largest keyword
+          if the user specifies the -k'*' (ALLCHARS) option.  This change
+          cleans up client code.
+
+        * Merged all the cperf changes into gperf.
+        
+        * Made sure to explicitly initialize perfect.fewest_collisions to
+          0.
+
+        * Cleaned up some loose ends noticed by Nels Olson.
+          1.  Removed `if (collisions <= perfect.fewest_collisions)'
+              from Gen_Perf::affects_prev since it was superfluous.
+          2.  Removed the fields best_char_value and best_asso_value
+              from Gen_Perf.  There were also unnecessary.
+          3.  Fixed a braino in the Bool_Array::bool_array_reset
+              function.  Since iteration numbers can never be zero
+              the `if (bool_array.iteration_number++ == 0)' must be
+              `if (++bool_array.iteration_number == 0).'
+          4.  Modified Std_Err::report_error so that it correctly handles
+              "%%".
+
+        * It is important to note that -D no longer enables -S.
+          There is a good reason for this change, which will become
+          manifested in the next release... (suspense!).
+
+        * Made some subtle changes to Key_List::print_switch so that if finally
+          seems to work correctly.  Needs more stress testing, however...
+
+        * Made a major change to the Key_List::print_switch function.
+          The user can now specify the number of switch statements to generate
+          via an argument to the -S option, i.e., -S1 means `generate 1
+          switch statement with all keywords in it,' -S2 means generate
+          2 switch statements with 1/2 the elements in each one, etc.
+          Hopefully this will fix the problem with C compilers not being
+          able to generate code for giant switch statements (but don't
+          hold your breath!)
+
+        * Changed Key_List::length function to Key_List::keyword_list_length.
+
+        * Added a feature to main.c that prints out the starting wall-clock
+          time before the program begins and prints out the ending wall-clock
+          time when the program is finished.
+
+        * Added the GATHER_STATISTICS code in hash-table.c so we can
+          keep track of how well double hashing is doing.  Eventually,
+          GATHER_STATISTICS will be added so that all instrumentation
+          code can be conditionally compiled in.
+
+        * Fixed a stupid bug in Key_List::print_switch routine.  This
+          was necessary to make sure the generated switch statement worked
+          correctly when *both* `natural,' i.e., static links and dynamic
+          links, i.e., unresolved duplicates, hash to the same value.
+
+        * Modified Bool_Array::~Bool_Array destructor so that
+          it now frees the bool_array.storage_array when it is no longer
+          needed.  Since this array is generally very large it makes sense
+          to return the memory to the freelist when it is no longer in use.
+
+        * Changed the interface to constructor Hash_Table::Hash_Table.  This 
+          constructor now passed a pointer to a power-of-two sized buffer that 
+          serve as storage for the hash table.  Although this weakens information
+          hiding a little bit it greatly reduces dynamic memory fragmentation,
+          since we can now obtain the memory via a call to alloca, rather
+          than malloc.  This change modified Key_List::read_keys calling
+          interface.
+
+        * Since alloca is now being used more aggressively a conditional
+          compilation section was added in main.c. Taken from GNU GCC,
+          this code gets rid of any avoidable limit on stack size so that
+          alloca does not fail.  It is only used if the -DRLIMIT_STACK
+          symbol is defined when gperf is compiled. 
+
+        * Added warnings in option.c so that user's would be informed
+          that -r superceeds -i on the command-line.
+          
+        * Rewrote Gen_Perf::affects_prev.  First, the code structure
+          was cleaned up considerably (removing the need for a dreaded
+          goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
+          returns FALSE (success) when fewest_hits gets down to whatever
+          it was after inserting the previous key (instead of waiting for
+          it to reach 0).  In other words, it stops trying if it can
+          resolve the new collisions added by a key, even if there are
+          still other old, unresolved collisions.  This modification was
+          suggested by Nels Olson and seems to *greatly* increase the
+          speed of gperf for large keyfiles.  Thanks Nels!
+
+        * In a similar vein, inside the Gen_Perf::change routine 
+          the variable `perfect.fewest_collisions is no longer initialized
+          with the length of the keyword list.  Instead it starts out at
+          0 and is incremented by 1 every time change () is called.
+          The rationale for this behavior is that there are times when a
+          collision causes the number of duplicates (collisions) to
+          increase by a large amount when it would presumably just have
+          gone up by 1 if none of the asso_values were changed.  That is,
+          at the beginning of change(), you could initialize fewest_hits
+          to 1+(previous value of fewest_hits) instead of to the number of
+          keys.  Thanks again, Nels.
+
+        * Replaced alloca with new in the Gen_Perf::change function.
+          This should eliminate some overhead at the expense of a little
+          extra memory that is never reclaimed.
+
+        * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
+          to reflect the change in behavior.
+
+        * Added the -e option so users can supply a string containing
+          the characters used to separate keywords from their attributes.
+          The default behavior is ",\n".
+
+        * Removed the char *uniq_set field from LIST_NODE and modified
+          uses of uniq_set in perfect.c and keylist.c.  Due to changes
+          to Gen_Perf::compute_disjoint_sets this field was no longer
+          necessary, and its removal makes the program smaller and
+          potentially faster. 
+          
+        * Added lots of changes/fixes suggested by Nels Olson
+          (umls.UUCP!olson@mis.ucsf.edu).  In particular:
+          1.  Changed Bool_Array so that it would dynamically create
+              an array of unsigned shorts rather than ints if the 
+              LO_CAL symbol was defined during program compilation.
+              This cuts the amount of dynamic memory usage in half,
+              which is important for large keyfile input.
+          2.  Added some additional debugging statements that print extra
+              info to stderr when the -d option is enabled.
+          3.  Fixed a really stupid bug in Key_List::print_switch
+              A right paren was placed at the wrong location, which broke
+              strlen ().
+          4.  Fixed a subtle problem with printing case values when keylinks
+              appear.  The logic failed to account for the fact that there
+              can be keylinks *and* regular node info also!
+          5.  Changed the behavior of Key_List::read_keys so that it would
+              honor -D unequivocally, i.e., it doesn't try to turn off dup
+              handling if the user requests it, even if there are no
+              immediate links in the keyfile input. 
+          6.  Modified the -j option so that -j 0 means `try random values
+              when searching for a way to resolve collisions.'
+          7.  Added a field `num_done' to the Gen_Perf struct.  This is used
+              to report information collected when trying to resolve
+              hash collisions.
+          8.  Modified the merge_sets algorithm to perform a disjoint
+              union of two multisets.  This ensures that subsequent
+              processing in Gen_Perf::affect_prev doesn't
+              waste time trying to change an associated value that is
+              shared between two conflicting keywords.
+          9.  Modified Gen_Perf::affects_prev so that it doesn't try
+              random jump values unless the -j 0 option is enabled.
+          10. Fixed a silly bug in Gen_Perf::change.  This problem caused
+              gperf to seg fault when the -k* option was given and the
+              keyfile file had long keywords.
+        
+Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Modified class-specific new operations for Read_Line and
+          List_Node so they don't fail if SIZE is larger than twice
+          the previous buffer size.  Note we double buffer size
+          everytime the previous buffer runs out, as a heuristic
+          to reduce future calls to malloc.
+
+Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Updated gperf version number to 2.0.  Send to Doug Lea for
+          incorporation into the long-awaited `official' libg++ 1.36
+          release! 
+
+        * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
+          was fixed.  This problem caused gperf to seg fault when
+          the -k* option was given and the keyfile file had long
+          keywords.
+          
+        * Modified Key_List::print_hash_function so that it output
+          max_hash_value + 1 (rather than just max_hash_value) for
+          any associated value entries that don't correspond to
+          keyword charset characters.  This should speed up rejection
+          of non-keyword strings a little in some cases.
+
+Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Fixed Key_List::print_hash_function so that it no longer output
+          things like `return 0 + ...'  Although this probably gets
+          optimized away by even the worst C compilers there isn't any
+          point tempting fate... ;-)
+
+        * Fixed class List_Node's constructor so that it wouldn't a priori
+          refuse to consider trying to hash keys whose length is less
+          than the smallest user-specified key position.  It turns out
+          this is not a problem unless the user also specifies the -n
+          (NOLENGTH) option, in which case such keys most likely
+          don't have a prayer of being hashed correctly!
+
+        * Changed the name of the generated lookup table from `Hash_Table'
+          to `asso_value' to be consistent with the gperf paper.
+
+Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added a flag GATHER_STATISTICS in the Makefile.  If defined
+          during compilation this turns on certain collection facilities
+          that track the performance of gperf during its execution.  In
+          particular, I want to see how many collisions occur for the
+          double hashing Hash_Table.
+
+        * Added a safety check so that we don't screw up if the total
+          number of `resets' of the Bool_Array exceeds MAX_INT.  Since
+          this number is around 2^31 it is unlikely that this would ever
+          occur for most input, but why take the risk?
+
+        * Changed the behavior for the -a (ANSI) option so that the
+          generated prototypes use int rather than size_t for the LEN 
+          parameter.  It was too ugly having to #include <stddef.h> all
+          over the place...
+
+Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Continued to work on the gperf paper for the USENIX C++
+          conference.  At some point this will be merged back into
+          the gperf documentation...
+
+Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Added a majorly neat hack to Bool_Array, suggested by rfg.
+          The basic idea was to throw away the Ullman array technique.
+          The Ullman array was used to remove the need to reinitialize all 
+          the Bool_Array elements to zero everytime we needed to determine
+          whether there were duplicate hash values in the keyword list.  
+          The current trick uses an `iteration number' scheme, which takes
+          about 1/3 the space and reduces the overall program running a 
+          time by about 20 percent for large input!  The hack works as 
+          follows:
+          
+          1. Dynamically allocation 1 boolean array of size k.
+          2. Initialize the boolean array to zeros, and consider the first
+             iteration to be iteration 1.
+          2. Then on all subsequent iterations we `reset' the bool array by
+             kicking the iteration count by 1. 
+          3. When it comes time to check whether a hash value is currently
+             in the boolean array we simply check its index location.  If
+             the value stored there is *not* equal to the current iteration
+             number then the item is clearly *not* in the set.  In that
+             case we assign the iteration number to that array's index
+             location for future reference.  Otherwise, if the item at
+             the index location *is* equal to the iteration number we've
+             found a duplicate.  No muss, no fuss!
+             
+Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Changed some consts in options.h to enumerals, since g++
+          doesn't seem to like them at the moment!
+
+Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed a stupid bug in Key_List::print_hash_function that manifested
+          itself if the `-k$' option was given (i.e., only use the key[length]
+          character in the hash function).
+
+        * Added support for the -C option.  This makes the contents of
+          all generated tables `readonly'.
+
+        * Changed the handling of generated switches so that there is
+          only one call to str[n]?cmp.  This *greatly* reduces the size of
+          the generated assembly code on all compilers I've seen.
+
+        * Fixed a subtle bug that occurred when the -l and -S option
+          was given.  Code produced looked something like:
+
+          if (len != key_len || !strcmp (s1, resword->name)) return resword;
+
+          which doesn't make any sense.  Clearly, this should be:
+
+          if (len == key_len && !strcmp (s1, resword->name)) return resword;
+
+Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Changed class Read_Line's definition so that it no longer
+          needs to know about the buffering scheme used to speed up 
+          dynamic memory allocation of input keywords and their
+          associated attributes.  This means that operator new is no longer
+          a friend of Read_Line.
+
+Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Decided that Obstacks had too much overhead, so they were
+          removed in favor of super-efficient, low-overhead buffered
+          storage allocation hacks in Read_Line and List_Node.
+
+        * No longer try to inline functions that g++ complains about
+          (Key_List::Merge and Key_List::Merge_Sort).
+
+Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Changed classes Read_Line and List_Node to use Obstacks in order
+          to cache memory allocation for keyword strings and List_Nodes.
+          
+        * Continued to experiment with inheritance schemes.
+        
+        * Added a new file `alpha.h', that declares static data shared
+          (i.e., inherited) between classes List_Node and Key_List.
+
+Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Made numerous changes to incorporate multiple inheritance in 
+          gperf.
+
+Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
+          implies that people trying to compile gperf need to have a
+          working version of the new g++ compiler (1.36.0).
+
+        * Removed some extra spaces that were being added in the generated
+          C code.
+
+Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
+          so that the generated functions take an unsigned int length argument.
+          If -a is enabled the prototype is (const char *str, size_t len).
+
+Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
+          the indentation from working correctly.
+
+        * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
+          that prevented links from being printed correctly.
+
+Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Fixed up readline.cc and readline.h so that they work OK
+          with g++ compilers that aren't completely up-to-date.
+          If symbol COMPILER_FIXED is defined then the behavior
+          that works on my more recent version of g++ is enabled.
+
+Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Changed the ./tests subdirectory Makefile so that it 
+          uses $(CC) instead of gcc.
+
+Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed a number of subtle bugs that occurred when -S was
+          combined with various and sundry options.
+
+        * Added the -G option, that makes the generated keyword table
+          a global static variable, rather than hiding it inside
+          the lookup function.  This allows other functions to directly
+          access the contents in this table.
+
+        * Added the "#" feature, that allows comments inside the keyword
+          list from the input file. Comment handling takes place in readline.c.  
+          This simplifies the code and reduces the number of malloc calls.
+          
+        * Also added the -H option (user can give the name of the hash
+          function) and the -T option (prevents the transfer of the type decl
+          to the output file, which is useful if the type is already defined
+          elsewhere).
+
+Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Modified many classes so that they would inherit Std_Err as
+          a base class.  This makes things more abstract...
+
+Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Modified the -f (FAST) option.  This now takes an argument.
+          The argument corresponds to the number of iterations used
+          to resolve collisions.  -f 0 uses the length of the
+          keyword list (which is what -f did before).  This makes
+          life much easier when dealing with large keyword files.
+
+Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added the -c (comparison) option.  Enabling this
+          will use the strncmp function for string comparisons.
+          The default is to use strcmp.
+
+        * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
+          faulty C code to be generated when the -D, -p, and -t
+          options were all enabled.
+
+Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Once again, changed class Read_Line to overload global operator
+          new.  Hopefully, this will work...!
+
+Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Modified Key_List::print_hash_function () so that it properly
+          formats the associated values in the hash table according to
+          the maximum number of digits required to represent the largest
+          value.
+
+        * Removed the named return value from class Hash_Table's
+          operator (), since this causes a seg fault when -O is enabled.
+          No sense tripping subtle g++ bugs if we don't have to.... ;-)
+
+        * Removed the operator new hack from Read_Line, since this seemed
+          to create horrible bus error problems.
+                    
+        * Changed many class member functions and data members to be `static', 
+          if they don't manipulate this!
+          
+Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Changed class Std_Err to use static member functions, a la
+          Ada or Modula 2.  This eliminates the need for an explicit
+          error-handler class object.
+
+        * Added the ``named return value'' feature to Hash_Table::operator ()
+          and Bool_Array::operator [], just for the heck of it.... ;-)
+
+        * Changed the previous hack in Read_Line so that we now use
+          the overloaded global `new' instead of NEW_STRING!
+
+Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Updated to version 1.7.  This reflects the recent major changes
+          and the new C port.
+
+        * Modified the GNU getopt.cc routine to have a class-based interface.
+
+        * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
+          hash table size from being printed (maybe the stream classes
+          weren't so bad after all.... ;-).
+
+        * Added support for the -f option.  This generates the perfect
+          hash function ``fast.''  It reduces the execution time of
+          gperf, at the cost of minimizing the range of hash values.
+
+Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Added an efficiency hack to Read_Line.  Instead of making
+          a call to operator NEW (a.k.a. malloc) for each input string
+          a new member function NEW_STRING stores a large buffer from
+          which new strings are carved out, growing the buffer if
+          necessary.  It might be useful to add this throughout the
+          program....
+
+        * Removed all unnecessary calls to DELETE.  If the program is about
+          to exit it is silly to waste time freeing memory.
+
+        * Added the GNU getopt program to the distribution.  This makes
+          GPERF portable to systems that don't include getopt in libc.
+          
+        * Added a strcspn member to class Key_List.  This also increases
+          portability.
+
+        * Added the get_include_src function from keylist.c as a member
+          function in class Key_List.  Hopefully every function is 
+          now associated with a class.  This aids abstraction and
+          modularity.
+
+        * Ported gperf to C.  From now on both K&R C and GNU G++ versions
+          will be supported.  There will be two ChangeLog files, one
+          for each version of the program.
+
+Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed a bug with -k'*'.  This now prints out *all* the cases
+          up to the length of the longest word in the keyword set.
+
+Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Removed all use of the stream classes.  Too ugly, slow, and
+          not handled by the c++-mode formatter....
+
+        * Modified the handling of links (i.e., keywords that have
+          identical hash values as other keywords).  This should 
+          speed up hash function generation for keyword sets with
+          many duplicate entries.  The trick is to treat duplicate
+          values as equivalence classes, so that each set of duplicate
+          values is represented only once in the main list processing.
+
+        * Fixed some capitialization typos and indentations mistakes in 
+          Key_List::print_hash_function.
+
+Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Fixed a typo/logico in Key_List::print_switch that prevented
+          the last keyword in the keyword list to be print out.  This
+          requires further examination.....
+
+        * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
+          was enabled the KEY_SET string wasn't getting terminated with
+          '\0'!
+
+Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
+          Also changed the strexp class to iterator.  Continued to work
+          on style...
+
+        * Updated the version number to 1.6.  This reflects all the 
+          recent changes.
+
+Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added the -D option that properly handles keyword sets that
+          contain duplicate hash values.
+
+        * Continued the stylistic changes.  Added the #pragma once
+          directive to all the *.h files.  Removed all #defines and
+          replaced them with static consts.  Also moved the key_sort
+          routine from options.cc into the options class as a 
+          member function.
+
+Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
+
+        * Made massive stylistic changes to bring source code into
+          conformance with GNU style guidelines.
+
+Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Fixed up the output routines so that they generate code
+          corresponding to the GNU style guidelines.
+
+Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed Stderr constructors so that they wouldn't try to
+          use the base class initializer syntax for the static 
+          class variable Program_Name.  G++ 1.34 is stricter in
+          enforcing the rules!
+
+Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Removed -v and ``| more'' from the Makefile to keep rfg happy...
+
+Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
+          into libg++ 1.34.  Note that there is a small bug with
+          the new %{ ... %} source inclusion facility, since it doesn't
+          understand comments and will barf if %{ or %} appear nested
+          inside the outermost delimiters.  This is too trivial of
+          a defect to fix at the moment...
+
+Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added the -K option, which allows the user to provide a
+          alternative name for the keyword structure component.
+          The default is still ``name.''
+
+        * Added the LEX and YACC-like ability to include arbitrary
+          text at the beginning of the generated C source code output.
+          This required two new functions Get_Special_Input, 
+          Key_List::Save_Include_Src;
+
+        * Fixed memory allocation bug in Key_List::Set_Types.
+          Variable Return_Type needs 1 additional location
+          to store the "*" if the -p option is used.
+          
+        * Added code to NULL terminate both Struct_Tag and Return_Type,
+          *after* the strncpy (stupid mistake).
+          
+Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added a new option -N.  This allows the user to specify the
+          name to be used for the generated lookup function.  The
+          default name is still ``in_word_set.''  This makes it
+          possible to completely automate the perfect hash function
+          generation process!
+
+Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Corrected the Hash_Table::operator () function so that
+          *it* is responsible for deciding when a new key has the
+          same signature as a previously seen key.  The key length 
+          information is now used internally to this function to
+          decide whether to add to the hash table those keys with
+          the same key sets, but different lengths.  Before, this
+          was handled by the Key_List::Read_Keys function.  However,
+          this failed to work for certain duplicate keys, since
+          they weren't being entered into the hash table properly.
+
+Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Modified class Options by moving the enum Option_Type out
+          of the class.  This is to satisfy the new enumeration
+          scope rules in C++.
+
+Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Incremented the version number upto 1.4 to reflect the new 
+          options that affect the generated code.  Send the new 
+          distribution off to Michael for use with g++ 1.33.
+
+        * Added a fix to Key_List::Read_Keys so that it checks for links
+          properly when the -n option is used.  Previously, it didn't
+          catch obvious links, which caused it to spend large amount
+          of time searching for a solution that could never occur!
+
+        * Modified the Key_List data structure to record *both* the 
+          minimum and the maximum key lengths.  This information
+          is now computed in Key_List::Read_Keys, and thus 
+          Key_List::Print_Min_Max doesn't need to bother.
+
+        * Modifed the key position iterator scheme in options.cc to
+          eliminate the need for member function Options::Advance.
+          Now, the Options::Get function performs the advancement
+          automatically, obviating the need for an extra function call.
+
+        * Added the new function Options::Print_Options, to print out
+          the user-specified command line options to generated C
+          output file.
+
+        * Added a new function, Key_List::Print_Keylength_Table,
+          which creates a table of lengths for use in speeding
+          up the keyword search.  This also meant that a new
+          option, -l (LENTABLE) is recognized.  It controls 
+          whether the length table is printed and the comparison
+          made in the generated function ``in_word_set.''
+
+        * Added a comment at the top of the generated C code
+          output file that tells what version of gperf was used.
+          Next, I'll also dump out the command line options
+          as a comment too.  Thanks to Michael Tiemann for the
+          feedback on this.
+
+        * Fixed the -n option to make it work correctly with
+          other parts of the program (most notably the Perfect::Hash
+          function and the computation of minimum and maximum lengths.
+
+Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Realized the the need to add a test that will enable
+          optimziation of the generated C code in the ``hash'' function
+          by checking whether all the requested key positions are
+          guaranteed to exist due to the comparison in `in_word_set.''
+          I'll put this in soon....
+
+Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Added pascal, modula3, and modula2 tests inputs to the 
+          Makefile
+        
+        * Recognised that there is a bug with the -n option.  However
+          I'm too busy to fix it properly, right now.  The problem 
+          is that the generated #define end up being 0, since that's
+          my hack to make -n work.  This needs complete rethinking!
+
+Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Added a new option, -n, that instructs gperf to not use the
+          length of an identifier when computing the hash functions.
+          I'm not sure how useful this is!
+          
+        * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
+          this will work!
+
+        * Began fixing the indentation and capitalization to conform
+          to the GNU coding guidelines.
+
+Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)
+
+        * Fixed horrible bug in Read_Line::Readln_Aux.  This was
+          a subtle and pernicous off-by-1 error, that overwrote
+          past the last character of the input string buffer.  I
+          think this fault was killing the vax!
+
+        * Yow, fixed an oversight in List_Node::List_Node, where the
+          pointer field Next was uninitialized.  Luckily, the new routine
+          seems to return 0 filled objects the first time through!
+
+Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
+          to be more helpful and easy to read.
+
+        * Fixed the List_Node::List_Node so that it would ignore trailing
+          fields if the -t option was not enabled.
+
+        * Moved the List_Node declarations out of keylist.h and
+          into a file of its own, called listnode.cc and listnode.h
+          Made Set_Sort a member function of class List_Node.
+
+        * Massively updated the documentation in the gperf.texinfo file.
+        
+        * Polished off the major revision to the print functions,
+          added a few new tests in the Makefile to check for the
+          validity of the program and ftp'ed the entire distribution
+          off to Doug Lea for libg++. ( changed it to
+          1.3 to reflect the major changes with the generated
+          C code ).
+
+        * Fixed Key_List::Print_Switch to deal with the -p and -t options.
+          This meant that the ``still-born'' function Key_List::
+          Print_Type_Switch was superflous, so I removed it.
+          Also, removed the restriction in Option that the -p and
+          -t options couldn't be used simultaneously.
+
+        * Modified List_Node::List_Node, to perform only 1 call to 
+          ``new'' when dynamically allocating memory for the Key_Set
+          and the Uniq_Set.
+
+Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
+
+        * Fixed a big bug with the new policy of nesting the
+          wordlist inside of generated function ``in_word_set.''
+          I'd forgotten to declare the wordlist array as static!
+          ( arrgh ).
+
+        * Added a new function Key_List::Set_Types, that figures out
+          the return type for generated function ``in_word_set,''
+          the user-defined ``struct tag,'' if one is used, and also
+          formates the array type for the static local array.
+
+        * Changed the print routines to take advantage of the
+          new -p option.
+
+        * Began adding the hooks to allow the return of a pointer
+          to a user defined struct location from the generated
+          ``in_word_set'' function instead of the current 0 or 1
+          return value.  Created function Key_List::Print_Type_Switch
+          and added option -p to class Option, allowing the user to 
+          request generation of the aforementioned pointers returned 
+          instead of booleans.
+
+        * Put in checks in class Option to make sure that -S and -t
+          options are not used simultaneously.  This restriction
+          will be removed in subsequent releases, once I decide on
+          a clean way to implement it.
+
+        * Sent version 1.2 to Doug Lea for possible inclusion into
+          the libg++ distribution.
+          
+        * Moved the static word_list array inside the generated function
+          in_word_set.  This supports better data hiding.
+
+        * Added a texinfo file, gperf.texinfo
+          
+        * Revised the Makefile to cleanup the droppings from texinfo
+          and changed the name of gperf.cc and gperf.h to perfect.cc
+          and perfect.h.
+
+Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
+
+        * Implemented the switch statement output format.  Much better
+          for large datasets in terms of space used.
+
+        * Added new functions to break up the Key_List::Output function.
+          Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
+          Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
+          and Key_List::Print_Lookup_Function.  This simplifies the
+          big mess in Key_List::Output considerably!
+          
+        * Added switch statement option to Options, which potentially 
+          trades time for space in the generated lookup code.
+
+Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
+
+        * Released version 1.1
+        
+        * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
+          between the Set_1 and Set_2.
+
+        * Added the optimal min/max algorithm in Key_List::Output.  This
+          runs in O ( 3n/2 ), rather than O ( 2n ) time.
+
+        * Changed Gperf::Sort_Set to use insertion sort, rather than
+          bubble sort.
+        
+        * Added a check in Key_List::Output for the special case where
+          the keys used are 1,$.  It is possible to generate more
+          efficient C code in this case.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..5a151a2
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,230 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.ac' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.ac' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes a while.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases.  You
+may have to build one architecture at a time and combine the results
+using the 'lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular Systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
+is not installed, it is recommended to use the following options in order
+to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On AIX 3, the C include files by default don't define some necessary
+prototype declarations.  If GNU CC is not installed, it is recommended to
+use the following options:
+
+     ./configure CC="xlc -D_ALL_SOURCE"
+
+   On BeOS, user installed software goes in /boot/home/config, not
+/usr/local.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/home/config
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.devel b/Makefile.devel
new file mode 100644 (file)
index 0000000..566c868
--- /dev/null
@@ -0,0 +1,44 @@
+# This is the developer's makefile, not the user's makefile.
+# Don't use it unless you know exactly what you do!
+
+SHELL = /bin/sh
+MAKE = make
+
+all : configures src/config.h.in src/config.h.msvc src/config.h_vms doc/gperf.1
+
+CONFIGURES = configure lib/configure src/configure tests/configure doc/configure
+
+configures : $(CONFIGURES)
+
+configure : configure.ac aclocal.m4
+       autoconf -I .
+
+lib/configure : lib/configure.ac aclocal.m4
+       cd lib && autoconf -I ..
+
+src/configure : src/configure.ac aclocal.m4
+       cd src && autoconf -I ..
+
+tests/configure : tests/configure.ac aclocal.m4
+       cd tests && autoconf -I ..
+
+doc/configure : doc/configure.ac aclocal.m4
+       cd doc && autoconf -I ..
+
+check-configures : $(CONFIGURES)
+       set -e; for f in $(CONFIGURES); do bash -x -n $$f; done
+
+src/config.h.in : src/configure.ac aclocal.m4
+       cd src && autoheader -I ..
+
+src/config.h.msvc : src/config.h.in
+       cp src/config.h.in src/config.h.msvc
+
+src/config.h_vms : src/config.h.in
+       cp src/config.h.in src/config.h_vms
+
+doc/gperf.1 : force
+       prog=`PATH=build/src:src:$$PATH which gperf`; if test -n "$$prog"; then doc/help2man --name='generate a perfect hash function from a key set' --section=1 $$prog > doc/gperf.1; fi
+
+force :
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..18c7b23
--- /dev/null
@@ -0,0 +1,62 @@
+# Makefile for gperf
+
+# Copyright (C) 1989, 1992, 1993, 1998, 2002 Free Software Foundation, Inc.
+# Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+# and Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Programs used by "make":
+RM = rm -f
+@SET_MAKE@
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+all : force
+       cd @subdir@; $(MAKE) all
+
+install : force
+       cd @subdir@; $(MAKE) install
+
+installdirs : force
+       cd @subdir@; $(MAKE) installdirs
+
+uninstall : force
+       cd @subdir@; $(MAKE) uninstall
+
+check : force
+       cd @subdir@; $(MAKE) check
+
+mostlyclean : force
+       cd @subdir@; $(MAKE) mostlyclean
+
+clean : force
+       cd @subdir@; $(MAKE) clean
+
+distclean : force
+       cd @subdir@; if test -f Makefile; then $(MAKE) distclean; fi
+       $(RM) config.status config.log config.cache Makefile
+
+maintainer-clean : force
+       cd @subdir@; if test -f Makefile; then $(MAKE) maintainer-clean; fi
+       $(RM) config.status config.log config.cache Makefile
+
+force :
+
diff --git a/Makefile.msvc b/Makefile.msvc
new file mode 100644 (file)
index 0000000..c227b85
--- /dev/null
@@ -0,0 +1,198 @@
+# -*- Makefile -*- for gperf
+
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Flags that can be set on the nmake command line:
+#   MFLAGS={-ML|-MT|-MD} for defining the compilation model
+#     MFLAGS=-ML (the default)  Single-threaded, statically linked - libc.lib
+#     MFLAGS=-MT                Multi-threaded, statically linked  - libcmt.lib
+#     MFLAGS=-MD                Multi-threaded, dynamically linked - msvcrt.lib
+#   DEBUG=1   for compiling with debugging information
+!if !defined(DEBUG)
+DEBUG=0
+!endif
+!if !defined(MFLAGS)
+MFLAGS=
+!endif
+
+# Directories used by "make":
+srcdir = .
+
+# Directories used by "make install":
+prefix = c:\usr
+exec_prefix = $(prefix)
+datadir = $(prefix)\share
+bindir = $(exec_prefix)\bin
+mandir = $(datadir)\man
+man1dir = $(mandir)\man1
+docdir = $(datadir)\doc\gperf
+
+# Programs used by "make":
+
+CC = cl
+CXX = cl -TP
+
+# Set to -W3 if you want to see maximum amount of warnings, including stupid
+# ones. Set to -W1 to avoid warnings about signed/unsigned combinations.
+WARN_CFLAGS = -W1
+
+!if $(DEBUG)
+OPTIMFLAGS = -Od -Z7
+DEBUGFLAGS = -Z7
+!else
+# Some people prefer -O2 -G6 instead of -O1, but -O2 is not reliable in MSVC5.
+OPTIMFLAGS = -D_NDEBUG -O1
+DEBUGFLAGS =
+!endif
+
+CFLAGS = $(MFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS)
+CXXFLAGS = $(MFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS)
+
+INCLUDES = -Ilib -Isrc
+
+LN = copy
+RM = -del
+
+# Programs used by "make install":
+INSTALL = copy
+INSTALL_PROGRAM = copy
+INSTALL_DATA = copy
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+LIB_OBJECTS = lib\getopt.obj lib\getopt1.obj lib\getline.obj lib\hash.obj
+SRC_OBJECTS = src\version.obj src\positions.obj src\options.obj src\keyword.obj src\keyword-list.obj src\input.obj src\bool-array.obj src\hash-table.obj src\search.obj src\output.obj src\main.obj
+OBJECTS = $(LIB_OBJECTS) $(SRC_OBJECTS)
+
+all : gperf.exe
+
+src\config.h : src\config.h.msvc
+       -$(RM) src\config.h
+       $(LN) src\config.h.msvc src\config.h
+
+lib\getopt.obj : lib\getopt.c
+       $(CC) $(INCLUDES) $(CFLAGS) -c lib\getopt.c -Folib\getopt.obj
+
+lib\getopt1.obj : lib\getopt1.c
+       $(CC) $(INCLUDES) $(CFLAGS) -c lib\getopt1.c -Folib\getopt1.obj
+
+lib\getline.obj : lib\getline.cc
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c lib\getline.cc -Folib\getline.obj
+
+lib\hash.obj : lib\hash.cc
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c lib\hash.cc -Folib\hash.obj
+
+# Dependencies.
+CONFIG_H = src\config.h
+VERSION_H = src\version.h
+POSITIONS_H = src\positions.h src\positions.icc
+OPTIONS_H = src\options.h src\options.icc $(POSITIONS_H)
+KEYWORD_H = src\keyword.h src\keyword.icc
+KEYWORD_LIST_H = src\keyword-list.h src\keyword-list.icc $(KEYWORD_H)
+INPUT_H = src\input.h $(KEYWORD_LIST_H)
+BOOL_ARRAY_H = src\bool-array.h src\bool-array.icc $(OPTIONS_H)
+HASH_TABLE_H = src\hash-table.h $(KEYWORD_H)
+SEARCH_H = src\search.h $(KEYWORD_LIST_H) $(POSITIONS_H) $(BOOL_ARRAY_H)
+OUTPUT_H = src\output.h $(KEYWORD_LIST_H) $(POSITIONS_H)
+
+src\version.obj : src\version.cc $(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\version.cc -Fosrc\version.obj
+
+src\positions.obj : src\positions.cc $(POSITIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\positions.cc -Fosrc\positions.obj
+
+src\options.obj : src\options.cc $(OPTIONS_H) $(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\options.cc -Fosrc\options.obj
+
+src\keyword.obj : src\keyword.cc $(KEYWORD_H) $(POSITIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\keyword.cc -Fosrc\keyword.obj
+
+src\keyword-list.obj : src\keyword-list.cc $(KEYWORD_LIST_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\keyword-list.cc -Fosrc\keyword-list.obj
+
+src\input.obj : src\input.cc $(INPUT_H) $(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\input.cc -Fosrc\input.obj
+
+src\bool-array.obj : src\bool-array.cc $(BOOL_ARRAY_H) $(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\bool-array.cc -Fosrc\bool-array.obj
+
+src\hash-table.obj : src\hash-table.cc $(HASH_TABLE_H) $(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\hash-table.cc -Fosrc\hash-table.obj
+
+src\search.obj : src\search.cc $(SEARCH_H) $(OPTIONS_H) $(HASH_TABLE_H) $(CONFIG_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\search.cc -Fosrc\search.obj
+
+src\output.obj : src\output.cc $(OUTPUT_H) $(OPTIONS_H) $(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\output.cc -Fosrc\output.obj
+
+src\main.obj : src\main.cc $(OPTIONS_H) $(INPUT_H) $(SEARCH_H) $(OUTPUT_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\main.cc -Fosrc\main.obj
+
+gperf.exe : $(OBJECTS)
+       $(CC) $(MFLAGS) $(DEBUGFLAGS) $(OBJECTS) -Fegperf.exe
+
+install : all force
+       -mkdir $(prefix)
+       -mkdir $(exec_prefix)
+       -mkdir $(bindir)
+       $(INSTALL_PROGRAM) gperf.exe $(bindir)\gperf.exe
+       -mkdir $(datadir)
+       -mkdir $(mandir)
+       -mkdir $(man1dir)
+       $(INSTALL_DATA) doc\gperf.1 $(man1dir)\gperf.1
+       -mkdir $(datadir)\doc
+       -mkdir $(docdir)
+       $(INSTALL_DATA) doc\gperf.html $(docdir)\gperf.html
+
+installdirs : force
+       -mkdir $(prefix)
+       -mkdir $(exec_prefix)
+       -mkdir $(bindir)
+       -mkdir $(datadir)
+       -mkdir $(mandir)
+       -mkdir $(man1dir)
+       -mkdir $(datadir)\doc
+       -mkdir $(docdir)
+
+uninstall : force
+       $(RM) $(bindir)\gperf.exe
+       $(RM) $(man1dir)\gperf.1
+       $(RM) $(docdir)\gperf.html
+
+check : all
+
+mostlyclean : clean
+
+clean : force
+       $(RM) lib\*.obj
+       $(RM) src\*.obj
+       $(RM) gperf.exe
+       $(RM) core
+
+distclean : clean
+       $(RM) src\config.h
+
+maintainer-clean : distclean
+
+force :
+
diff --git a/Makefile.vms b/Makefile.vms
new file mode 100644 (file)
index 0000000..3776337
--- /dev/null
@@ -0,0 +1,177 @@
+# -*- Makefile -*- for gperf on VMS using the MMS utility
+
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Written by Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Directories used by "make install":
+prefix = SYS$DATA:[
+exec_prefix = $(prefix)
+datadir = $(prefix).share
+bindir = $(exec_prefix).bin
+mandir = $(datadir).man
+man1dir = $(mandir).man1
+docdir = $(datadir).doc.gperf
+
+# Programs used by "make":
+
+CC = cc
+CXX = cxx
+
+# These flags affect binary compatibility. GNU gperf does not need them,
+# but other packages do.
+ABIFLAGS = /name=(as_is,short) /float=ieee
+
+WARN_CFLAGS = /warning
+
+OPTIMFLAGS = /optimize
+
+CFLAGS = $(ABIFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS)
+CXXFLAGS = $(ABIFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS)
+DEFS = "VMS=1","HAVE_CONFIG_H=1"
+
+INCLUDES = /include=([],[.lib],[.src])
+
+LN = copy
+RM = delete
+
+# Programs used by "make install":
+INSTALL = copy
+INSTALL_PROGRAM = copy
+INSTALL_DATA = copy
+
+#### End of system configuration section. ####
+
+LIB_OBJECTS = [.lib]getopt.obj,[.lib]getopt1.obj,[.lib]getline.obj,[.lib]hash.obj
+SRC_OBJECTS = [.src]version.obj,[.src]positions.obj,[.src]options.obj,[.src]keyword.obj,[.src]keyword-list.obj,[.src]input.obj,[.src]bool-array.obj,[.src]hash-table.obj,[.src]search.obj,[.src]output.obj,[.src]main.obj
+OBJECTS = $(LIB_OBJECTS),$(SRC_OBJECTS)
+
+all : gperf.exe
+       write sys$output "Nothing else to be done for 'all'."
+
+[.src]config.h : [.src]config.h_vms
+       $(LN) [.src]config.h_vms [.src]config.h
+
+[.lib]getopt.obj : [.lib]getopt.c
+       $(CC) $(INCLUDES) $(CFLAGS) /define=("VMS=1") [.lib]getopt.c /obj=[.lib]getopt.obj
+
+[.lib]getopt1.obj : [.lib]getopt1.c
+       $(CC) $(INCLUDES) $(CFLAGS) /define=("VMS=1") [.lib]getopt1.c /obj=[.lib]getopt1.obj
+
+[.lib]getline.obj : [.lib]getline.cc
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=("VMS=1") [.lib]getline.cc /obj=[.lib]getline.obj
+
+[.lib]hash.obj : [.lib]hash.cc
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=("VMS=1") [.lib]hash.cc /obj=[.lib]hash.obj
+
+# Dependencies.
+CONFIG_H = [.src]config.h
+VERSION_H = [.src]version.h
+POSITIONS_H = [.src]positions.h,[.src]positions.icc
+OPTIONS_H = [.src]options.h,[.src]options.icc,$(POSITIONS_H)
+KEYWORD_H = [.src]keyword.h,[.src]keyword.icc
+KEYWORD_LIST_H = [.src]keyword-list.h,[.src]keyword-list.icc,$(KEYWORD_H)
+INPUT_H = [.src]input.h,$(KEYWORD_LIST_H)
+BOOL_ARRAY_H = [.src]bool-array.h,[.src]bool-array.icc,$(OPTIONS_H)
+HASH_TABLE_H = [.src]hash-table.h,$(KEYWORD_H)
+SEARCH_H = [.src]search.h,$(KEYWORD_LIST_H),$(POSITIONS_H),$(BOOL_ARRAY_H)
+OUTPUT_H = [.src]output.h,$(KEYWORD_LIST_H),$(POSITIONS_H)
+
+[.src]version.obj : [.src]version.cc,$(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]version.cc /obj=[.src]version.obj
+
+[.src]positions.obj : [.src]positions.cc,$(POSITIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]positions.cc /obj=[.src]positions.obj
+
+[.src]options.obj : [.src]options.cc,$(OPTIONS_H),$(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]options.cc /obj=[.src]options.obj
+
+[.src]keyword.obj : [.src]keyword.cc,$(KEYWORD_H),$(POSITIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]keyword.cc /obj=[.src]keyword.obj
+
+[.src]keyword-list.obj : [.src]keyword-list.cc,$(KEYWORD_LIST_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]keyword-list.cc /obj=[.src]keyword-list.obj
+
+[.src]input.obj : [.src]input.cc,$(INPUT_H),$(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]input.cc /obj=[.src]input.obj
+
+[.src]bool-array.obj : [.src]bool-array.cc,$(BOOL_ARRAY_H),$(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]bool-array.cc /obj=[.src]bool-array.obj
+
+[.src]hash-table.obj : [.src]hash-table.cc,$(HASH_TABLE_H),$(OPTIONS_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]hash-table.cc /obj=[.src]hash-table.obj
+
+[.src]search.obj : [.src]search.cc,$(SEARCH_H),$(OPTIONS_H),$(HASH_TABLE_H),$(CONFIG_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]search.cc /obj=[.src]search.obj
+
+[.src]output.obj : [.src]output.cc,$(OUTPUT_H),$(OPTIONS_H),$(VERSION_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]output.cc /obj=[.src]output.obj
+
+[.src]main.obj : [.src]main.cc,$(OPTIONS_H),$(INPUT_H),$(SEARCH_H),$(OUTPUT_H)
+       $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]main.cc /obj=[.src]main.obj
+
+gperf.exe : $(OBJECTS)
+       link /executable=gperf.exe $(OBJECTS)
+
+install : all force
+       create /directory $(prefix)]
+       create /directory $(exec_prefix)]
+       create /directory $(bindir)]
+       $(INSTALL_PROGRAM) gperf.exe $(bindir)]gperf.exe
+       create /directory $(datadir)]
+       create /directory $(mandir)]
+       create /directory $(man1dir)]
+       $(INSTALL_DATA) [.doc]gperf.1 $(man1dir)]gperf.1
+       create /directory $(datadir).doc]
+       create /directory $(docdir)]
+       $(INSTALL_DATA) [.doc]gperf.html $(docdir)]gperf.html
+
+installdirs : force
+       create /directory $(prefix)]
+       create /directory $(exec_prefix)]
+       create /directory $(bindir)]
+       create /directory $(datadir)]
+       create /directory $(mandir)]
+       create /directory $(man1dir)]
+       create /directory $(datadir).doc]
+       create /directory $(docdir)]
+
+uninstall : force
+       $(RM) $(bindir)]gperf.exe;
+       $(RM) $(man1dir)]gperf.1;
+       $(RM) $(docdir)]gperf.html;
+
+check : all
+       write sys$output "Nothing else to be done for 'check'."
+
+mostlyclean : clean
+       write sys$output "Nothing else to be done for 'mostlyclean'."
+
+clean :
+       $(RM) [.lib]*.obj;*
+       $(RM) [.src]*.obj;*
+       $(RM) gperf.exe;*
+       $(RM) [.src]config.h;*
+
+distclean : clean
+       write sys$output "Nothing else to be done for 'distclean'."
+
+maintainer-clean : distclean
+       write sys$output "Nothing else to be done for 'maintainer-clean'."
+
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..85f8088
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,96 @@
+New in 3.0.4:
+
+* gperf is now licensed under the GPL version 3 or newer.
+* The generated C code gives less warnings with gcc-4.2.x in c99 or gnu99 mode.
+
+New in 3.0.3:
+
+* The generated C code is compatible with gcc-4.3.x in c99 or gnu99 mode.
+
+New in 3.0.2:
+
+* Compiles with g++-4.0.x.
+* Added option --length-table-name.
+* Added declaration %define length-table-name.
+* Fixed  #line directives for filenames containing backslashes.
+
+New in 3.0.1:
+
+* Bug fix.
+
+New in 3.0:
+
+* Added option --output that allows to specify the output file name.
+* Some options have been renamed:
+    --hash-fn-name=NAME     -->   --hash-function-name=NAME
+    --lookup-fn-name=NAME   -->   --lookup-function-name=NAME
+    --compare-strlen        -->   --compare-lengths
+    --global                -->   --global-table
+  The older variants are still supported for backward compatibility.
+* The following options can now be specified inside the input file:
+    %delimiters=DELIMITER-LIST
+    %struct-type
+    %ignore-case
+    %language=LANGUAGE-NAME
+    %define slot-name NAME
+    %define initializer-suffix INITIALIZERS
+    %define hash-function-name NAME
+    %define lookup-function-name NAME
+    %define class-name NAME
+    %7bit
+    %compare-lengths
+    %compare-strncmp
+    %readonly-tables
+    %enum
+    %includes
+    %global-table
+    %pic
+    %define string-pool-name NAME
+    %null-strings
+    %define word-array-name NAME
+    %switch=COUNT
+    %omit-struct-type
+* When the option -k is not given, the default key positions are now
+  computed depending on the set of keywords.
+* If the input file is given by name, the output file will now contain
+  #line directives referring to the input file.
+* Some keyword sets containing permutations, like { "xy", "yx", "xz", "zx" }
+  or { "abc", "acb", "bca", "cab" }, are now handled by gperf without
+  requiring the option -D.
+* The generated table is usually much smaller than it was with earlier
+  versions of gperf.
+* Added option -m/--multiple-iterations that allows to further reduce the
+  size of the generated table.
+* When the search for a good hash function is not immediately successful,
+  the table's size will grow as needed. Earlier versions of gperf bailed
+  out with an "Internal error, duplicate hash code value".
+* The options -f/--fast and -o/--occurrence-sort have no effect any more.
+* Added options -P/--pic and --null-strings that optimize the generated code
+  for use in shared libraries. -P/--pic does a perfect optimization but may
+  require some small code changes (see the documentation for details), whereas
+  --null-strings does only a half-hearted optimization but works without
+  needing any change to surrounding code.
+* Added option --ignore-case that produces a case independent lookup function.
+* Bug fixes.
+
+New in 2.7.2:
+
+* Keywords may now be enclosed in double quotes; this permits the use of
+  '#', ',', space or NUL inside keywords.
+* Bug fixes.
+
+New in 2.7.1:
+
+* Added option "-F" for gcc.
+
+New in 2.7:
+
+* gperf is now a stand-alone package, untied from libg++.
+* Autoconfiguring.
+* Removed the "-a" and "-g" options, extended the "-L" option instead.
+* Removed the "-p" option, it is the default.
+* Added long options ("--help", "--version" etc.).
+* 8-bit cleanliness is now the default; use "-7" to get the old behaviour.
+* Compiles with any C++ compiler.
+* Numerous small improvements.
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..26173bf
--- /dev/null
+++ b/README
@@ -0,0 +1,28 @@
+This is GNU gperf. It is a program that generates perfect hash
+functions for sets of key words.  A perfect hash function is:
+
+          A hash function and a data structure that allows 
+          recognition of a key word in a set of words using 
+          exactly 1 probe into the data structure.
+
+The doc/gperf.html file explains how the program works, the form of
+the input, what options are available, and hints on choosing the best
+options for particular key words set.
+
+See the file NEWS for a list of major changes in the current release.
+
+See the file INSTALL for compilation and installation instructions.
+
+Output from the GPERF program is used to recognize reserved words in
+the GNU C, GNU C++, and GNU Pascal compilers, as well as with the GNU
+indent program.
+
+For general documentation on the coding and usage standards
+this distribution follows, see the GNU standards document
+ftp://ftp.gnu.org/pub/gnu/standards.*, especially the 'Makefile
+Conventions', 'Configuration', and 'User Interfaces' sections.
+
+Mail suggestions and bug reports to <bug-gnu-gperf@gnu.org>.  When
+reporting bugs, please include in the subject line the package name
+and version (output of 'gperf --version') for which you found a problem.
+
diff --git a/README.vms b/README.vms
new file mode 100644 (file)
index 0000000..6408f46
--- /dev/null
@@ -0,0 +1,9 @@
+Installation on VMS:
+
+- Build instructions:
+
+  $ mms /description=Makefile.vms
+
+- Installation:
+
+  $ mms /description=Makefile.vms install
diff --git a/README.woe32 b/README.woe32
new file mode 100644 (file)
index 0000000..44fe4f2
--- /dev/null
@@ -0,0 +1,35 @@
+Installation on Woe32 (WinNT/2000/XP, Win95/98/ME):
+
+- Requires MS Visual C/C++ 4.0 or 5.0 or 6.0 or 7.0.
+
+  Note that binaries created with MSVC 7.0 should not be distributed: They
+  depend on a closed-source library 'msvcr70.dll' which is not normally part
+  of a Woe32 installation. You cannot distribute 'msvcr70.dll' with the
+  binaries - this would be a violation of the GPL and of the Microsoft EULA.
+  You can distribute the binaries without including 'msvcr70.dll', but this
+  will cause problems for users that don't have this library on their system.
+  Therefore it is not recommended. This problem does not occur with MSVC 6.0
+  and earlier.
+
+- Cannot build in a separate directory.
+
+- Build instructions:
+
+   Make sure that the MSVC4.0 or MSVC5.0 or MSVC6.0 or MSVC7.0 utilities
+   ("cl" etc.) are found in PATH. In a typical MSVC6.0 installation, this
+   can be achieved by running
+        C:\Program Files\Microsoft Visual Studio\VC98\bin\vcvars32.bat
+   In a typical MSVC7.0 installation, it can be achieved by running
+        C:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\vsvars32.bat
+
+        nmake -f Makefile.msvc
+
+- Installation:
+
+   Either:
+
+        Copy gperf.exe to your program repository.
+
+   Or:
+
+        nmake -f Makefile.msvc install prefix=InstallBaseDirectory
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..41598df
--- /dev/null
@@ -0,0 +1,69 @@
+AC_PREREQ(2.12)
+
+AC_DEFUN(CL_PROG_INSTALL,
+[dnl This is mostly copied from AC_PROG_INSTALL.
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+AC_MSG_CHECKING(for a BSD compatible install)
+if test -z "$INSTALL"; then
+AC_CACHE_VAL(cl_cv_path_install,
+[  IFS="${IFS=         }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           if test $ac_prog = installbsd &&
+             strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then
+             # AIX installbsd doesn't work without option "-g".
+             :
+           else
+             cl_cv_path_install="$ac_dir/$ac_prog -c"
+             break 2
+           fi
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use cp.
+  test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
+])dnl
+  INSTALL="$cl_cv_path_install"
+fi
+dnl We do special magic for INSTALL instead of AC_SUBST, to get
+dnl relative paths right. 
+AC_MSG_RESULT($INSTALL)
+AC_SUBST(INSTALL)dnl
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
+AC_SUBST(INSTALL_PROGRAM)dnl
+if test -z "$INSTALL_DATA"; then
+  case "$INSTALL" in
+    cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
+    * )         INSTALL_DATA='$(INSTALL) -m 644' ;;
+  esac
+fi
+AC_SUBST(INSTALL_DATA)dnl
+])
+
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..6a82f3d
--- /dev/null
+++ b/configure
@@ -0,0 +1,2844 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="doc/gperf.1"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+subdirs
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias'
+ac_subdirs_all='lib src tests doc'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+
+ac_aux_dir=$srcdir
+
+subdirs="$subdirs lib src tests doc"
+
+
+extrasub="$extrasub"'
+/@subdir@/{
+h
+g
+s/@subdir@/lib/
+p
+g
+s/@subdir@/src/
+p
+g
+s/@subdir@/tests/
+p
+g
+s/@subdir@/doc/
+p
+d
+}
+'
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+subdirs!$subdirs$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 41; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+  # Remove --cache-file and --srcdir arguments so they do not pile up.
+  ac_sub_configure_args=
+  ac_prev=
+  eval "set x $ac_configure_args"
+  shift
+  for ac_arg
+  do
+    if test -n "$ac_prev"; then
+      ac_prev=
+      continue
+    fi
+    case $ac_arg in
+    -cache-file | --cache-file | --cache-fil | --cache-fi \
+    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+      ac_prev=cache_file ;;
+    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+    | --c=*)
+      ;;
+    --config-cache | -C)
+      ;;
+    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+      ac_prev=srcdir ;;
+    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+      ;;
+    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+      ac_prev=prefix ;;
+    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+      ;;
+    *)
+      case $ac_arg in
+      *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      esac
+      ac_sub_configure_args="$ac_sub_configure_args '$ac_arg'" ;;
+    esac
+  done
+
+  # Always prepend --prefix to ensure using the same prefix
+  # in subdir configurations.
+  ac_arg="--prefix=$prefix"
+  case $ac_arg in
+  *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+  # Pass --silent
+  if test "$silent" = yes; then
+    ac_sub_configure_args="--silent $ac_sub_configure_args"
+  fi
+
+  ac_popdir=`pwd`
+  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+    # Do not complain, so a configure script can configure whichever
+    # parts of a large source tree are present.
+    test -d "$srcdir/$ac_dir" || continue
+
+    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+    echo "$as_me:$LINENO: $ac_msg" >&5
+    echo "$ac_msg" >&6
+    { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+    cd "$ac_dir"
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      ac_sub_configure=$ac_srcdir/configure.gnu
+    elif test -f "$ac_srcdir/configure"; then
+      ac_sub_configure=$ac_srcdir/configure
+    elif test -f "$ac_srcdir/configure.in"; then
+      # This should be Cygnus configure.
+      ac_sub_configure=$ac_aux_dir/configure
+    else
+      { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
+echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+      ac_sub_configure=
+    fi
+
+    # The recursion is here.
+    if test -n "$ac_sub_configure"; then
+      # Make the cache file name correct relative to the subdirectory.
+      case $cache_file in
+      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+      *) # Relative name.
+       ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+      esac
+
+      { echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      # The eval makes quoting arguments work.
+      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+          --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+       { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
+echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+
+    cd "$ac_popdir"
+  done
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..c2ff675
--- /dev/null
@@ -0,0 +1,53 @@
+dnl autoconf configuration for gperf
+
+dnl Copyright (C) 1998, 2002, 2003, 2005-2007, 2009 Free Software Foundation, Inc.
+dnl Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+dnl and Bruno Haible <bruno@clisp.org>.
+dnl
+dnl This file is part of GNU GPERF.
+dnl
+dnl This program is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (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 You should have received a copy of the GNU General Public License
+dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_PREREQ([2.60])
+AC_INIT([doc/gperf.1])
+AC_PROG_MAKE_SET
+AC_OBJEXT
+AC_EXEEXT
+
+dnl An autoconf-2.52 bug: AC_CONFIG_SUBDIRS requires AC_CONFIG_AUX_DIR_DEFAULT.
+ac_aux_dir=$srcdir
+AC_PROVIDE([AC_CONFIG_AUX_DIR_DEFAULT])
+AC_CONFIG_SUBDIRS([lib src tests doc])
+
+dnl This piece of sed script replaces every line containing '@subdir@'
+dnl by several consecutive lines, each referencing one subdir.
+extrasub="$extrasub"'
+/@subdir@/{
+h
+g
+s/@subdir@/lib/
+p
+g
+s/@subdir@/src/
+p
+g
+s/@subdir@/tests/
+p
+g
+s/@subdir@/doc/
+p
+d
+}
+'
+AC_OUTPUT([Makefile])
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644 (file)
index 0000000..fc06c15
--- /dev/null
@@ -0,0 +1,151 @@
+# Makefile for gperf/doc
+
+# Copyright (C) 1998, 2000, 2002-2003, 2007 Free Software Foundation, Inc.
+# Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+# and Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Directories used by "make":
+srcdir = @srcdir@
+
+# Directories used by "make install":
+prefix = @prefix@
+local_prefix = /usr/local
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+infodir = @infodir@
+mandir = @mandir@
+man1dir = $(mandir)/man1
+docdir = @docdir@
+dvidir = @dvidir@
+psdir = @psdir@
+pdfdir = @pdfdir@
+htmldir = @htmldir@
+
+# Programs used by "make":
+RM = rm -f
+@SET_MAKE@
+
+# Programs used by "make" if you have changed the documentation files:
+TEX = tex
+TEXI2DVI = texi2dvi
+DVIPS = dvips -D600
+TEXI2PDF = texi2pdf
+MAKEINFO = LANG= LC_MESSAGES= LC_ALL= LANGUAGE= makeinfo
+TEXI2HTML = perl $(srcdir)/texi2html
+
+# Programs used by "make install":
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(SHELL) $(srcdir)/../mkinstalldirs
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+VPATH = $(srcdir)
+
+all : info ps pdf html
+
+
+info : $(srcdir)/gperf.info
+
+$(srcdir)/gperf.info : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi
+       cd $(srcdir) && $(MAKEINFO) --no-split gperf.texi
+
+
+dvi : $(srcdir)/gperf.dvi
+
+$(srcdir)/gperf.dvi : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi
+       cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps
+       cd $(srcdir) && $(TEXI2DVI) gperf.texi
+       cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps
+
+
+ps : $(srcdir)/gperf.ps
+
+$(srcdir)/gperf.ps : $(srcdir)/gperf.dvi
+       $(DVIPS) -o $@ $(srcdir)/gperf.dvi
+
+
+pdf : $(srcdir)/gperf.pdf
+
+$(srcdir)/gperf.pdf : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi
+       cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps
+       cd $(srcdir) && $(TEXI2PDF) gperf.texi
+       cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps
+
+
+html : gperf.html gperf_toc.html
+
+gperf.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi
+       cd $(srcdir) && $(TEXI2HTML) -number -monolithic gperf.texi
+
+gperf_toc.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi
+       cd $(srcdir) && $(RM) gperf_*.html
+       cd $(srcdir) && $(TEXI2HTML) -number -split_chapter gperf.texi
+
+
+install : all force
+       $(MKINSTALLDIRS) $(DESTDIR)$(infodir)
+       $(INSTALL_DATA) $(srcdir)/gperf.info $(DESTDIR)$(infodir)/gperf.info
+       $(MKINSTALLDIRS) $(DESTDIR)$(man1dir)
+       $(INSTALL_DATA) $(srcdir)/gperf.1 $(DESTDIR)$(man1dir)/gperf.1
+#      $(MKINSTALLDIRS) $(DESTDIR)$(dvidir)
+#      $(INSTALL_DATA) $(srcdir)/gperf.dvi $(DESTDIR)$(dvidir)/gperf.dvi
+#      $(MKINSTALLDIRS) $(DESTDIR)$(psdir)
+#      $(INSTALL_DATA) $(srcdir)/gperf.ps $(DESTDIR)$(psdir)/gperf.ps
+#      $(MKINSTALLDIRS) $(DESTDIR)$(pdfdir)
+#      $(INSTALL_DATA) $(srcdir)/gperf.pdf $(DESTDIR)$(pdfdir)/gperf.pdf
+       $(MKINSTALLDIRS) $(DESTDIR)$(htmldir)
+       $(INSTALL_DATA) $(srcdir)/gperf.html $(DESTDIR)$(htmldir)/gperf.html
+
+installdirs : force
+       $(MKINSTALLDIRS) $(DESTDIR)$(infodir)
+       $(MKINSTALLDIRS) $(DESTDIR)$(man1dir)
+#      $(MKINSTALLDIRS) $(DESTDIR)$(dvidir)
+#      $(MKINSTALLDIRS) $(DESTDIR)$(psdir)
+#      $(MKINSTALLDIRS) $(DESTDIR)$(pdfdir)
+       $(MKINSTALLDIRS) $(DESTDIR)$(htmldir)
+
+uninstall : force
+       $(RM) $(DESTDIR)$(infodir)/gperf.info
+       $(RM) $(DESTDIR)$(man1dir)/gperf.1
+#      $(RM) $(DESTDIR)$(dvidir)/gperf.dvi
+#      $(RM) $(DESTDIR)$(psdir)/gperf.ps
+#      $(RM) $(DESTDIR)$(pdfdir)/gperf.pdf
+       $(RM) $(DESTDIR)$(htmldir)/gperf.html
+
+check : all
+
+mostlyclean : clean
+
+clean : force
+       $(RM) *~ *.aux *.toc *.cp *.fn *.ky *.pg *.tp *.vr *.my *.log *.cps core
+
+distclean : clean
+       $(RM) config.status config.log config.cache Makefile
+
+maintainer-clean : distclean
+       $(RM) *.info *.dvi *.ps *.pdf *.html
+
+force :
+
diff --git a/doc/configure b/doc/configure
new file mode 100755 (executable)
index 0000000..bb9e3cd
--- /dev/null
@@ -0,0 +1,2710 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="gperf.1"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+PACKAGE
+SET_MAKE
+INSTALL
+INSTALL_PROGRAM
+INSTALL_DATA
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+PACKAGE=gperf
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${cl_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           if test $ac_prog = installbsd &&
+             strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then
+             # AIX installbsd doesn't work without option "-g".
+             :
+           else
+             cl_cv_path_install="$ac_dir/$ac_prog -c"
+             break 2
+           fi
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use cp.
+  test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
+
+fi
+  INSTALL="$cl_cv_path_install"
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
+if test -z "$INSTALL_DATA"; then
+  case "$INSTALL" in
+    cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
+    * )         INSTALL_DATA='$(INSTALL) -m 644' ;;
+  esac
+fi
+
+                      ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+INSTALL!$INSTALL$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 44; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/doc/configure.ac b/doc/configure.ac
new file mode 100644 (file)
index 0000000..c4279dc
--- /dev/null
@@ -0,0 +1,35 @@
+dnl autoconf configuration for gperf/doc
+
+dnl Copyright (C) 1998, 2000, 2002-2003, 2007, 2009 Free Software Foundation, Inc.
+dnl Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+dnl and Bruno Haible <bruno@clisp.org>.
+dnl
+dnl This file is part of GNU GPERF.
+dnl
+dnl This program is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (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 You should have received a copy of the GNU General Public License
+dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_PREREQ([2.60])
+AC_INIT([gperf.1])
+PACKAGE=gperf
+AC_SUBST([PACKAGE])
+AC_PROG_MAKE_SET
+dnl
+dnl           checks for programs
+dnl
+CL_PROG_INSTALL
+                      dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
+dnl
+dnl           That's it.
+dnl
+AC_OUTPUT([Makefile])
diff --git a/doc/gperf.1 b/doc/gperf.1
new file mode 100644 (file)
index 0000000..5828d12
--- /dev/null
@@ -0,0 +1,216 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
+.TH GPERF "1" "February 2009" "GNU gperf 3.0.4" FSF
+.SH NAME
+gperf \- generate a perfect hash function from a key set
+.SH SYNOPSIS
+.B gperf
+[\fIOPTION\fR]... [\fIINPUT-FILE\fR]
+.SH DESCRIPTION
+GNU 'gperf' generates perfect hash functions.
+.PP
+If a long option shows an argument as mandatory, then it is mandatory
+for the equivalent short option also.
+.SS "Output file location:"
+.HP
+\fB\-\-output\-file\fR=\fIFILE\fR Write output to specified file.
+.PP
+The results are written to standard output if no output file is specified
+or if it is -.
+.SS "Input file interpretation:"
+.TP
+\fB\-e\fR, \fB\-\-delimiters\fR=\fIDELIMITER\-LIST\fR
+Allow user to provide a string containing delimiters
+used to separate keywords from their attributes.
+Default is ",".
+.TP
+\fB\-t\fR, \fB\-\-struct\-type\fR
+Allows the user to include a structured type
+declaration for generated code. Any text before %%
+is considered part of the type declaration. Key
+words and additional fields may follow this, one
+group of fields per line.
+.TP
+\fB\-\-ignore\-case\fR
+Consider upper and lower case ASCII characters as
+equivalent. Note that locale dependent case mappings
+are ignored.
+.SS "Language for the output code:"
+.TP
+\fB\-L\fR, \fB\-\-language\fR=\fILANGUAGE\-NAME\fR
+Generates code in the specified language. Languages
+handled are currently C++, ANSI-C, C, and KR-C. The
+default is C.
+.SS "Details in the output code:"
+.TP
+\fB\-K\fR, \fB\-\-slot\-name\fR=\fINAME\fR
+Select name of the keyword component in the keyword
+structure.
+.TP
+\fB\-F\fR, \fB\-\-initializer\-suffix\fR=\fIINITIALIZERS\fR
+Initializers for additional components in the keyword
+structure.
+.TP
+\fB\-H\fR, \fB\-\-hash\-function\-name\fR=\fINAME\fR
+Specify name of generated hash function. Default is
+\&'hash'.
+.TP
+\fB\-N\fR, \fB\-\-lookup\-function\-name\fR=\fINAME\fR
+Specify name of generated lookup function. Default
+name is 'in_word_set'.
+.TP
+\fB\-Z\fR, \fB\-\-class\-name\fR=\fINAME\fR
+Specify name of generated C++ class. Default name is
+\&'Perfect_Hash'.
+.TP
+\fB\-7\fR, \fB\-\-seven\-bit\fR
+Assume 7-bit characters.
+.TP
+\fB\-l\fR, \fB\-\-compare\-lengths\fR
+Compare key lengths before trying a string
+comparison. This is necessary if the keywords
+contain NUL bytes. It also helps cut down on the
+number of string comparisons made during the lookup.
+.TP
+\fB\-c\fR, \fB\-\-compare\-strncmp\fR
+Generate comparison code using strncmp rather than
+strcmp.
+.TP
+\fB\-C\fR, \fB\-\-readonly\-tables\fR
+Make the contents of generated lookup tables
+constant, i.e., readonly.
+.TP
+\fB\-E\fR, \fB\-\-enum\fR
+Define constant values using an enum local to the
+lookup function rather than with defines.
+.TP
+\fB\-I\fR, \fB\-\-includes\fR
+Include the necessary system include file <string.h>
+at the beginning of the code.
+.TP
+\fB\-G\fR, \fB\-\-global\-table\fR
+Generate the static table of keywords as a static
+global variable, rather than hiding it inside of the
+lookup function (which is the default behavior).
+.TP
+\fB\-P\fR, \fB\-\-pic\fR
+Optimize the generated table for inclusion in shared
+libraries.  This reduces the startup time of programs
+using a shared library containing the generated code.
+.TP
+\fB\-Q\fR, \fB\-\-string\-pool\-name\fR=\fINAME\fR
+Specify name of string pool generated by option \fB\-\-pic\fR.
+Default name is 'stringpool'.
+.TP
+\fB\-\-null\-strings\fR
+Use NULL strings instead of empty strings for empty
+keyword table entries.
+.TP
+\fB\-W\fR, \fB\-\-word\-array\-name\fR=\fINAME\fR
+Specify name of word list array. Default name is
+\&'wordlist'.
+.TP
+\fB\-\-length\-table\-name\fR=\fINAME\fR
+Specify name of length table array. Default name is
+\&'lengthtable'.
+.TP
+\fB\-S\fR, \fB\-\-switch\fR=\fICOUNT\fR
+Causes the generated C code to use a switch
+statement scheme, rather than an array lookup table.
+This can lead to a reduction in both time and space
+requirements for some keyfiles. The COUNT argument
+determines how many switch statements are generated.
+A value of 1 generates 1 switch containing all the
+elements, a value of 2 generates 2 tables with 1/2
+the elements in each table, etc. If COUNT is very
+large, say 1000000, the generated C code does a
+binary search.
+.TP
+\fB\-T\fR, \fB\-\-omit\-struct\-type\fR
+Prevents the transfer of the type declaration to the
+output file. Use this option if the type is already
+defined elsewhere.
+.SS "Algorithm employed by gperf:"
+.TP
+\fB\-k\fR, \fB\-\-key\-positions\fR=\fIKEYS\fR
+Select the key positions used in the hash function.
+The allowable choices range between 1-255, inclusive.
+The positions are separated by commas, ranges may be
+used, and key positions may occur in any order.
+Also, the meta-character '*' causes the generated
+hash function to consider ALL key positions, and $
+indicates the "final character" of a key, e.g.,
+$,1,2,4,6-10.
+.TP
+\fB\-D\fR, \fB\-\-duplicates\fR
+Handle keywords that hash to duplicate values. This
+is useful for certain highly redundant keyword sets.
+.TP
+\fB\-m\fR, \fB\-\-multiple\-iterations\fR=\fIITERATIONS\fR
+Perform multiple choices of the \fB\-i\fR and \fB\-j\fR values,
+and choose the best results. This increases the
+running time by a factor of ITERATIONS but does a
+good job minimizing the generated table size.
+.TP
+\fB\-i\fR, \fB\-\-initial\-asso\fR=\fIN\fR
+Provide an initial value for the associate values
+array. Default is 0. Setting this value larger helps
+inflate the size of the final table.
+.TP
+\fB\-j\fR, \fB\-\-jump\fR=\fIJUMP\-VALUE\fR
+Affects the "jump value", i.e., how far to advance
+the associated character value upon collisions. Must
+be an odd number, default is 5.
+.TP
+\fB\-n\fR, \fB\-\-no\-strlen\fR
+Do not include the length of the keyword when
+computing the hash function.
+.TP
+\fB\-r\fR, \fB\-\-random\fR
+Utilizes randomness to initialize the associated
+values table.
+.TP
+\fB\-s\fR, \fB\-\-size\-multiple\fR=\fIN\fR
+Affects the size of the generated hash table. The
+numeric argument N indicates "how many times larger
+or smaller" the associated value range should be,
+in relationship to the number of keys, e.g. a value
+of 3 means "allow the maximum associated value to
+be about 3 times larger than the number of input
+keys". Conversely, a value of 1/3 means "make the
+maximum associated value about 3 times smaller than
+the number of input keys". A larger table should
+decrease the time required for an unsuccessful
+search, at the expense of extra table space. Default
+value is 1.
+.SS "Informative output:"
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Print this message.
+.TP
+\fB\-v\fR, \fB\-\-version\fR
+Print the gperf version number.
+.TP
+\fB\-d\fR, \fB\-\-debug\fR
+Enables the debugging option (produces verbose
+output to the standard error).
+.SH AUTHOR
+Written by Douglas C. Schmidt and Bruno Haible.
+.SH "REPORTING BUGS"
+Report bugs to <bug-gnu-gperf@gnu.org>.
+.SH COPYRIGHT
+Copyright \(co 1989-1998, 2000-2004, 2006-2007, 2009 Free Software Foundation, Inc.
+.br
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+The full documentation for
+.B gperf
+is maintained as a Texinfo manual.  If the
+.B info
+and
+.B gperf
+programs are properly installed at your site, the command
+.IP
+.B info gperf
+.PP
+should give you access to the complete manual.
diff --git a/doc/gperf.dvi b/doc/gperf.dvi
new file mode 100644 (file)
index 0000000..80abb3f
Binary files /dev/null and b/doc/gperf.dvi differ
diff --git a/doc/gperf.html b/doc/gperf.html
new file mode 100644 (file)
index 0000000..5ebf2e4
--- /dev/null
@@ -0,0 +1,2482 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator</TITLE>
+</HEAD>
+<BODY>
+<H1>User's Guide to <CODE>gperf</CODE> 3.0.4</H1>
+<H2>The GNU Perfect Hash Function Generator</H2>
+<H2>Edition 3.0.4, 1 February 2009</H2>
+<ADDRESS>Douglas C. Schmidt</ADDRESS>
+<ADDRESS>Bruno Haible</ADDRESS>
+<P>
+<P><HR><P>
+<H1>Table of Contents</H1>
+<UL>
+<LI><A NAME="TOC1" HREF="gperf.html#SEC1">GNU GENERAL PUBLIC LICENSE</A>
+<LI><A NAME="TOC2" HREF="gperf.html#SEC2">Contributors to GNU <CODE>gperf</CODE> Utility</A>
+<LI><A NAME="TOC3" HREF="gperf.html#SEC3">2  Introduction</A>
+<LI><A NAME="TOC4" HREF="gperf.html#SEC4">3  Static search structures and GNU <CODE>gperf</CODE></A>
+<LI><A NAME="TOC5" HREF="gperf.html#SEC5">4  High-Level Description of GNU <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC6" HREF="gperf.html#SEC6">4.1  Input Format to <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC7" HREF="gperf.html#SEC7">4.1.1  Declarations</A>
+<UL>
+<LI><A NAME="TOC8" HREF="gperf.html#SEC8">4.1.1.1  User-supplied <CODE>struct</CODE></A>
+<LI><A NAME="TOC9" HREF="gperf.html#SEC9">4.1.1.2  Gperf Declarations</A>
+<LI><A NAME="TOC10" HREF="gperf.html#SEC10">4.1.1.3  C Code Inclusion</A>
+</UL>
+<LI><A NAME="TOC11" HREF="gperf.html#SEC11">4.1.2  Format for Keyword Entries</A>
+<LI><A NAME="TOC12" HREF="gperf.html#SEC12">4.1.3  Including Additional C Functions</A>
+<LI><A NAME="TOC13" HREF="gperf.html#SEC13">4.1.4  Where to place directives for GNU <CODE>indent</CODE>.</A>
+</UL>
+<LI><A NAME="TOC14" HREF="gperf.html#SEC14">4.2  Output Format for Generated C Code with <CODE>gperf</CODE></A>
+<LI><A NAME="TOC15" HREF="gperf.html#SEC15">4.3  Use of NUL bytes</A>
+<LI><A NAME="TOC16" HREF="gperf.html#SEC16">4.4  The Copyright of the Output</A>
+</UL>
+<LI><A NAME="TOC17" HREF="gperf.html#SEC17">5  Invoking <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC18" HREF="gperf.html#SEC18">5.1  Specifying the Location of the Output File</A>
+<LI><A NAME="TOC19" HREF="gperf.html#SEC19">5.2  Options that affect Interpretation of the Input File</A>
+<LI><A NAME="TOC20" HREF="gperf.html#SEC20">5.3  Options to specify the Language for the Output Code</A>
+<LI><A NAME="TOC21" HREF="gperf.html#SEC21">5.4  Options for fine tuning Details in the Output Code</A>
+<LI><A NAME="TOC22" HREF="gperf.html#SEC22">5.5  Options for changing the Algorithms employed by <CODE>gperf</CODE></A>
+<LI><A NAME="TOC23" HREF="gperf.html#SEC23">5.6  Informative Output</A>
+</UL>
+<LI><A NAME="TOC24" HREF="gperf.html#SEC24">6  Known Bugs and Limitations with <CODE>gperf</CODE></A>
+<LI><A NAME="TOC25" HREF="gperf.html#SEC25">7  Things Still Left to Do</A>
+<LI><A NAME="TOC26" HREF="gperf.html#SEC26">8  Bibliography</A>
+<LI><A NAME="TOC27" HREF="gperf.html#SEC27">Concept Index</A>
+</UL>
+<P><HR><P>
+
+<P>
+Copyright (C) 1989-2009 Free Software Foundation, Inc.
+
+</P>
+
+<P>
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+</P>
+<P>
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+section entitled “GNU General Public License” is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+</P>
+<P>
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that the section entitled “GNU General Public License” may be
+included in a translation approved by the author instead of in the
+original English.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="gperf.html#TOC1">GNU GENERAL PUBLIC LICENSE</A></H1>
+<P>
+Version 3, 29 June 2007
+
+</P>
+
+
+<PRE>
+Copyright (C) 2007 Free Software Foundation, Inc. <A HREF="http://fsf.org/">http://fsf.org/</A>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+</PRE>
+
+
+<H2>1.0  Preamble</H2>
+
+<P>
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+</P>
+<P>
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program--to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+</P>
+<P>
+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
+them 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.
+
+</P>
+<P>
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+</P>
+<P>
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+</P>
+<P>
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+</P>
+<P>
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+</P>
+<P>
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+</P>
+<P>
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+</P>
+<P>
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+
+<H2>1.1  TERMS AND CONDITIONS</H2>
+
+
+<OL>
+<LI>Definitions.
+
+“This License” refers to version 3 of the GNU General Public License.
+
+“Copyright” also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.
+
+To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a “modified version” of
+the earlier work or a work “based on” the earlier work.
+
+A “covered work” means either the unmodified Program or a work based
+on the Program.
+
+To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays “Appropriate Legal Notices” to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+<LI>Source Code.
+
+The “source code” for a work means the preferred form of the work for
+making modifications to it.  “Object code” means any non-source form
+of a work.
+
+A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+<LI>Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+<LI>Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+<LI>Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+<LI>Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+
+<OL>
+<LI>
+
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+<LI>
+
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to “keep intact all
+notices”.
+
+<LI>
+
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+<LI>
+
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+</OL>
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+<LI>Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+
+<OL>
+<LI>
+
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+<LI>
+
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+<LI>
+
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+<LI>
+
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+<LI>
+
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+</OL>
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+“normally used” refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+<LI>Additional Terms.
+
+“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+
+<OL>
+<LI>
+
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+<LI>
+
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+<LI>
+
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+<LI>
+
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+<LI>
+
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+<LI>
+
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+</OL>
+
+All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+<LI>Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+<LI>Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+<LI>Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+<LI>Patents.
+
+A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.
+
+A contributor's “essential patent claims” are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is “discriminatory” if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+<LI>No Surrender of Others' Freedom.
+
+If 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 convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+<LI>Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+<LI>Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU 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 Program
+specifies that a certain numbered version of the GNU General Public
+License “or any later version” applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+<LI>Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “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 PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+<LI>Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM 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 PROGRAM (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 PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+<LI>Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+</OL>
+
+
+<H2>1.2  END OF TERMS AND CONDITIONS</H2>
+
+
+<H2>1.3  How to Apply These Terms to Your New Programs</H2>
+
+<P>
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+</P>
+<P>
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.
+
+</P>
+
+<PRE>
+<VAR>one line to give the program's name and a brief idea of what it does.</VAR>
+Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, 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.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <A HREF="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</A>.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+</P>
+
+<PRE>
+<VAR>program</VAR> Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+This program comes with ABSOLUTELY NO WARRANTY; for details type <SAMP>&lsquo;show w&rsquo;</SAMP>.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type <SAMP>&lsquo;show c&rsquo;</SAMP> for details.
+</PRE>
+
+<P>
+The hypothetical commands <SAMP>&lsquo;show w&rsquo;</SAMP> and <SAMP>&lsquo;show c&rsquo;</SAMP> should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an “about box”.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<A HREF="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</A>.
+
+</P>
+<P>
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read <A HREF="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</A>.
+
+</P>
+
+
+<H1><A NAME="SEC2" HREF="gperf.html#TOC2">Contributors to GNU <CODE>gperf</CODE> Utility</A></H1>
+
+
+<UL>
+<LI>
+
+<A NAME="IDX1"></A>
+The GNU <CODE>gperf</CODE> perfect hash function generator utility was
+written in GNU C++ by Douglas C. Schmidt.  The general
+idea for the perfect hash function generator was inspired by Keith
+Bostic's algorithm written in C, and distributed to net.sources around
+1984.  The current program is a heavily modified, enhanced, and extended
+implementation of Keith's basic idea, created at the University of
+California, Irvine.  Bugs, patches, and suggestions should be reported
+to <CODE>&#60;bug-gnu-gperf@gnu.org&#62;</CODE>.
+
+<LI>
+
+Special thanks is extended to Michael Tiemann and Doug Lea, for
+providing a useful compiler, and for giving me a forum to exhibit my
+creation.
+
+In addition, Adam de Boor and Nels Olson provided many tips and insights
+that greatly helped improve the quality and functionality of <CODE>gperf</CODE>.
+
+<LI>
+
+Bruno Haible enhanced and optimized the search algorithm.  He also rewrote
+the input routines and the output routines for better reliability, and
+added a testsuite.
+</UL>
+
+
+
+<H1><A NAME="SEC3" HREF="gperf.html#TOC3">2  Introduction</A></H1>
+
+<P>
+<CODE>gperf</CODE> is a perfect hash function generator written in C++.  It
+transforms an <VAR>n</VAR> element user-specified keyword set <VAR>W</VAR> into a
+perfect hash function <VAR>F</VAR>.  <VAR>F</VAR> uniquely maps keywords in
+<VAR>W</VAR> onto the range 0..<VAR>k</VAR>, where <VAR>k</VAR> &#62;= <VAR>n-1</VAR>.  If <VAR>k</VAR>
+= <VAR>n-1</VAR> then <VAR>F</VAR> is a <EM>minimal</EM> perfect hash function.
+<CODE>gperf</CODE> generates a 0..<VAR>k</VAR> element static lookup table and a
+pair of C functions.  These functions determine whether a given
+character string <VAR>s</VAR> occurs in <VAR>W</VAR>, using at most one probe into
+the lookup table.
+
+</P>
+<P>
+<CODE>gperf</CODE> currently generates the reserved keyword recognizer for
+lexical analyzers in several production and research compilers and
+language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal,
+GNU Modula 3, and GNU indent.  Complete C++ source code for <CODE>gperf</CODE> is
+available from <CODE>http://ftp.gnu.org/pub/gnu/gperf/</CODE>.
+A paper describing <CODE>gperf</CODE>'s design and implementation in greater
+detail is available in the Second USENIX C++ Conference proceedings
+or from <CODE>http://www.cs.wustl.edu/~schmidt/resume.html</CODE>.
+
+</P>
+
+
+<H1><A NAME="SEC4" HREF="gperf.html#TOC4">3  Static search structures and GNU <CODE>gperf</CODE></A></H1>
+<P>
+<A NAME="IDX2"></A>
+
+</P>
+<P>
+A <EM>static search structure</EM> is an Abstract Data Type with certain
+fundamental operations, e.g., <EM>initialize</EM>, <EM>insert</EM>,
+and <EM>retrieve</EM>.  Conceptually, all insertions occur before any
+retrievals.  In practice, <CODE>gperf</CODE> generates a <EM>static</EM> array
+containing search set keywords and any associated attributes specified
+by the user.  Thus, there is essentially no execution-time cost for the
+insertions.  It is a useful data structure for representing <EM>static
+search sets</EM>.  Static search sets occur frequently in software system
+applications.  Typical static search sets include compiler reserved
+words, assembler instruction opcodes, and built-in shell interpreter
+commands.  Search set members, called <EM>keywords</EM>, are inserted into
+the structure only once, usually during program initialization, and are
+not generally modified at run-time.
+
+</P>
+<P>
+Numerous static search structure implementations exist, e.g.,
+arrays, linked lists, binary search trees, digital search tries, and
+hash tables.  Different approaches offer trade-offs between space
+utilization and search time efficiency.  For example, an <VAR>n</VAR> element
+sorted array is space efficient, though the average-case time
+complexity for retrieval operations using binary search is
+proportional to log <VAR>n</VAR>.  Conversely, hash table implementations
+often locate a table entry in constant time, but typically impose
+additional memory overhead and exhibit poor worst case performance.
+
+</P>
+<P>
+<A NAME="IDX3"></A>
+<EM>Minimal perfect hash functions</EM> provide an optimal solution for a
+particular class of static search sets.  A minimal perfect hash
+function is defined by two properties:
+
+</P>
+
+<UL>
+<LI>
+
+It allows keyword recognition in a static search set using at most
+<EM>one</EM> probe into the hash table.  This represents the “perfect”
+property.
+<LI>
+
+The actual memory allocated to store the keywords is precisely large
+enough for the keyword set, and <EM>no larger</EM>.  This is the
+“minimal” property.
+</UL>
+
+<P>
+For most applications it is far easier to generate <EM>perfect</EM> hash
+functions than <EM>minimal perfect</EM> hash functions.  Moreover,
+non-minimal perfect hash functions frequently execute faster than
+minimal ones in practice.  This phenomena occurs since searching a
+sparse keyword table increases the probability of locating a “null”
+entry, thereby reducing string comparisons.  <CODE>gperf</CODE>'s default
+behavior generates <EM>near-minimal</EM> perfect hash functions for
+keyword sets.  However, <CODE>gperf</CODE> provides many options that permit
+user control over the degree of minimality and perfection.
+
+</P>
+<P>
+Static search sets often exhibit relative stability over time.  For
+example, Ada's 63 reserved words have remained constant for nearly a
+decade.  It is therefore frequently worthwhile to expend concerted
+effort building an optimal search structure <EM>once</EM>, if it
+subsequently receives heavy use multiple times.  <CODE>gperf</CODE> removes
+the drudgery associated with constructing time- and space-efficient
+search structures by hand.  It has proven a useful and practical tool
+for serious programming projects.  Output from <CODE>gperf</CODE> is currently
+used in several production and research compilers, including GNU C, GNU
+C++, GNU Java, GNU Pascal, and GNU Modula 3.  The latter two compilers are
+not yet part of the official GNU distribution.  Each compiler utilizes
+<CODE>gperf</CODE> to automatically generate static search structures that
+efficiently identify their respective reserved keywords.
+
+</P>
+
+
+<H1><A NAME="SEC5" HREF="gperf.html#TOC5">4  High-Level Description of GNU <CODE>gperf</CODE></A></H1>
+
+<P>
+The perfect hash function generator <CODE>gperf</CODE> reads a set of
+“keywords” from an input file (or from the standard input by
+default).  It attempts to derive a perfect hashing function that
+recognizes a member of the <EM>static keyword set</EM> with at most a
+single probe into the lookup table.  If <CODE>gperf</CODE> succeeds in
+generating such a function it produces a pair of C source code routines
+that perform hashing and table lookup recognition.  All generated C code
+is directed to the standard output.  Command-line options described
+below allow you to modify the input and output format to <CODE>gperf</CODE>.
+
+</P>
+<P>
+By default, <CODE>gperf</CODE> attempts to produce time-efficient code, with
+less emphasis on efficient space utilization.  However, several options
+exist that permit trading-off execution time for storage space and vice
+versa.  In particular, expanding the generated table size produces a
+sparse search structure, generally yielding faster searches.
+Conversely, you can direct <CODE>gperf</CODE> to utilize a C <CODE>switch</CODE>
+statement scheme that minimizes data space storage size.  Furthermore,
+using a C <CODE>switch</CODE> may actually speed up the keyword retrieval time
+somewhat.  Actual results depend on your C compiler, of course.
+
+</P>
+<P>
+In general, <CODE>gperf</CODE> assigns values to the bytes it is using
+for hashing until some set of values gives each keyword a unique value.
+A helpful heuristic is that the larger the hash value range, the easier
+it is for <CODE>gperf</CODE> to find and generate a perfect hash function.
+Experimentation is the key to getting the most from <CODE>gperf</CODE>.
+
+</P>
+
+
+<H2><A NAME="SEC6" HREF="gperf.html#TOC6">4.1  Input Format to <CODE>gperf</CODE></A></H2>
+<P>
+<A NAME="IDX4"></A>
+<A NAME="IDX5"></A>
+<A NAME="IDX6"></A>
+<A NAME="IDX7"></A>
+You can control the input file format by varying certain command-line
+arguments, in particular the <SAMP>&lsquo;-t&rsquo;</SAMP> option.  The input's appearance
+is similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE> (or UNIX
+utilities <CODE>lex</CODE> and <CODE>yacc</CODE>).  Here's an outline of the general
+format:
+
+</P>
+
+<PRE>
+declarations
+%%
+keywords
+%%
+functions
+</PRE>
+
+<P>
+<EM>Unlike</EM> <CODE>flex</CODE> or <CODE>bison</CODE>, the declarations section and
+the functions section are optional.  The following sections describe the
+input format for each section.
+
+</P>
+
+<P>
+It is possible to omit the declaration section entirely, if the <SAMP>&lsquo;-t&rsquo;</SAMP>
+option is not given.  In this case the input file begins directly with the
+first keyword line, e.g.:
+
+</P>
+
+<PRE>
+january
+february
+march
+april
+...
+</PRE>
+
+
+
+<H3><A NAME="SEC7" HREF="gperf.html#TOC7">4.1.1  Declarations</A></H3>
+
+<P>
+The keyword input file optionally contains a section for including
+arbitrary C declarations and definitions, <CODE>gperf</CODE> declarations that
+act like command-line options, as well as for providing a user-supplied
+<CODE>struct</CODE>.
+
+</P>
+
+
+
+<H4><A NAME="SEC8" HREF="gperf.html#TOC8">4.1.1.1  User-supplied <CODE>struct</CODE></A></H4>
+
+<P>
+If the <SAMP>&lsquo;-t&rsquo;</SAMP> option (or, equivalently, the <SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration)
+<EM>is</EM> enabled, you <EM>must</EM> provide a C <CODE>struct</CODE> as the last
+component in the declaration section from the input file.  The first
+field in this struct must be of type <CODE>char *</CODE> or <CODE>const char *</CODE>
+if the <SAMP>&lsquo;-P&rsquo;</SAMP> option is not given, or of type <CODE>int</CODE> if the option
+<SAMP>&lsquo;-P&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%pic&rsquo;</SAMP> declaration) is enabled.
+This first field must be called <SAMP>&lsquo;name&rsquo;</SAMP>, although it is possible to modify
+its name with the <SAMP>&lsquo;-K&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%define slot-name&rsquo;</SAMP> declaration) described below.
+
+</P>
+<P>
+Here is a simple example, using months of the year and their attributes as
+input:
+
+</P>
+
+<PRE>
+struct month { char *name; int number; int days; int leap_days; };
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+april,     4, 30, 30
+may,       5, 31, 31
+june,      6, 30, 30
+july,      7, 31, 31
+august,    8, 31, 31
+september, 9, 30, 30
+october,  10, 31, 31
+november, 11, 30, 30
+december, 12, 31, 31
+</PRE>
+
+<P>
+<A NAME="IDX8"></A>
+Separating the <CODE>struct</CODE> declaration from the list of keywords and
+other fields are a pair of consecutive percent signs, <SAMP>&lsquo;%%&rsquo;</SAMP>,
+appearing left justified in the first column, as in the UNIX utility
+<CODE>lex</CODE>.
+
+</P>
+<P>
+If the <CODE>struct</CODE> has already been declared in an include file, it can
+be mentioned in an abbreviated form, like this:
+
+</P>
+
+<PRE>
+struct month;
+%%
+january,   1, 31, 31
+...
+</PRE>
+
+
+
+<H4><A NAME="SEC9" HREF="gperf.html#TOC9">4.1.1.2  Gperf Declarations</A></H4>
+
+<P>
+The declaration section can contain <CODE>gperf</CODE> declarations.  They
+influence the way <CODE>gperf</CODE> works, like command line options do.
+In fact, every such declaration is equivalent to a command line option.
+There are three forms of declarations:
+
+</P>
+
+<OL>
+<LI>
+
+Declarations without argument, like <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>.
+
+<LI>
+
+Declarations with an argument, like <SAMP>&lsquo;%switch=<VAR>count</VAR>&rsquo;</SAMP>.
+
+<LI>
+
+Declarations of names of entities in the output file, like
+<SAMP>&lsquo;%define lookup-function-name <VAR>name</VAR>&rsquo;</SAMP>.
+</OL>
+
+<P>
+When a declaration is given both in the input file and as a command line
+option, the command-line option's value prevails.
+
+</P>
+<P>
+The following <CODE>gperf</CODE> declarations are available.
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;%delimiters=<VAR>delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX9"></A>
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.
+
+<DT><SAMP>&lsquo;%struct-type&rsquo;</SAMP>
+<DD>
+<A NAME="IDX10"></A>
+Allows you to include a <CODE>struct</CODE> type declaration for generated
+code; see above for an example.
+
+<DT><SAMP>&lsquo;%ignore-case&rsquo;</SAMP>
+<DD>
+<A NAME="IDX11"></A>
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.
+
+<DT><SAMP>&lsquo;%language=<VAR>language-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX12"></A>
+Instructs <CODE>gperf</CODE> to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;KR-C&rsquo;</SAMP>
+<DD>
+Old-style K&#38;R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking <SAMP>&lsquo;const&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;C&rsquo;</SAMP>
+<DD>
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you <CODE>#define const</CODE> to empty
+for compilers which don't know about this keyword.
+
+<DT><SAMP>&lsquo;ANSI-C&rsquo;</SAMP>
+<DD>
+ANSI C.  This language is understood by ANSI C (C89, ISO C90) compilers,
+ISO C99 compilers, and C++ compilers.
+
+<DT><SAMP>&lsquo;C++&rsquo;</SAMP>
+<DD>
+C++.  This language is understood by C++ compilers.
+</DL>
+
+The default is C.
+
+<DT><SAMP>&lsquo;%define slot-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX13"></A>
+This declaration is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is <SAMP>&lsquo;name&rsquo;</SAMP>.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;%define initializer-suffix <VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX14"></A>
+This declaration is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+It permits to specify initializers for the structure members following
+<VAR>slot-name</VAR> in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following <VAR>slot-name</VAR>.
+
+<DT><SAMP>&lsquo;%define hash-function-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX15"></A>
+Allows you to specify the name for the generated hash function.  Default
+name is <SAMP>&lsquo;hash&rsquo;</SAMP>.  This option permits the use of two hash tables in
+the same file.
+
+<DT><SAMP>&lsquo;%define lookup-function-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX16"></A>
+Allows you to specify the name for the generated lookup function.
+Default name is <SAMP>&lsquo;in_word_set&rsquo;</SAMP>.  This option permits multiple
+generated hash functions to be used in the same application.
+
+<DT><SAMP>&lsquo;%define class-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX17"></A>
+This option is only useful when option <SAMP>&lsquo;-L C++&rsquo;</SAMP> (or, equivalently,
+the <SAMP>&lsquo;%language=C++&rsquo;</SAMP> declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+<CODE>Perfect_Hash</CODE>.
+
+<DT><SAMP>&lsquo;%7bit&rsquo;</SAMP>
+<DD>
+<A NAME="IDX18"></A>
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions <CODE>isalnum</CODE> and <CODE>isgraph</CODE> do
+<EM>not</EM> guarantee that a byte is in this range.  Only an explicit
+test like <SAMP>&lsquo;c &#62;= 'A' &#38;&#38; c &#60;= 'Z'&rsquo;</SAMP> guarantees this.)
+
+<DT><SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>
+<DD>
+<A NAME="IDX19"></A>
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (see section <A HREF="gperf.html#SEC15">4.3  Use of NUL bytes</A>).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via <CODE>strcmp</CODE>.
+However, using <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP> might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option <SAMP>&lsquo;-S&rsquo;</SAMP> or <SAMP>&lsquo;%switch&rsquo;</SAMP> is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+<DT><SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+<DD>
+<A NAME="IDX20"></A>
+Generates C code that uses the <CODE>strncmp</CODE> function to perform
+string comparisons.  The default action is to use <CODE>strcmp</CODE>.
+
+<DT><SAMP>&lsquo;%readonly-tables&rsquo;</SAMP>
+<DD>
+<A NAME="IDX21"></A>
+Makes the contents of all generated lookup tables constant, i.e.,
+“readonly”.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+<DT><SAMP>&lsquo;%enum&rsquo;</SAMP>
+<DD>
+<A NAME="IDX22"></A>
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark <CODE>&#60;jjc@ai.mit.edu&#62;</CODE>.
+
+<DT><SAMP>&lsquo;%includes&rsquo;</SAMP>
+<DD>
+<A NAME="IDX23"></A>
+Include the necessary system include file, <CODE>&#60;string.h&#62;</CODE>, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+<DT><SAMP>&lsquo;%global-table&rsquo;</SAMP>
+<DD>
+<A NAME="IDX24"></A>
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+<DT><SAMP>&lsquo;%pic&rsquo;</SAMP>
+<DD>
+<A NAME="IDX25"></A>
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the <SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration (or,
+equivalently, the option <SAMP>&lsquo;-t&rsquo;</SAMP>) is also given, the first field of the
+user-defined struct must be of type <SAMP>&lsquo;int&rsquo;</SAMP>, not <SAMP>&lsquo;char *&rsquo;</SAMP>, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+<SAMP>&lsquo;stringpool + <VAR>o</VAR>&rsquo;</SAMP>, where <VAR>o</VAR> is the offset.  The string pool
+name can be changed through the <SAMP>&lsquo;%define string-pool-name&rsquo;</SAMP> declaration.
+
+<DT><SAMP>&lsquo;%define string-pool-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX26"></A>
+Allows you to specify the name of the generated string pool created by
+the declaration <SAMP>&lsquo;%pic&rsquo;</SAMP> (or, equivalently, the option <SAMP>&lsquo;-P&rsquo;</SAMP>).
+The default name is <SAMP>&lsquo;stringpool&rsquo;</SAMP>.  This declaration permits the use of
+two hash tables in the same file, with <SAMP>&lsquo;%pic&rsquo;</SAMP> and even when the
+<SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration (or, equivalently, the option <SAMP>&lsquo;-G&rsquo;</SAMP>)
+is given.
+
+<DT><SAMP>&lsquo;%null-strings&rsquo;</SAMP>
+<DD>
+<A NAME="IDX27"></A>
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as the declaration <SAMP>&lsquo;%pic&rsquo;</SAMP>), at the
+expense of one more test-and-branch instruction at run time.
+
+<DT><SAMP>&lsquo;%define word-array-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX28"></A>
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is <SAMP>&lsquo;wordlist&rsquo;</SAMP>.  This option permits the
+use of two hash tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;%define length-table-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX29"></A>
+Allows you to specify the name for the generated array containing the
+length table.  Default name is <SAMP>&lsquo;lengthtable&rsquo;</SAMP>.  This option permits the
+use of two length tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;%switch=<VAR>count</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX30"></A>
+Causes the generated C code to use a <CODE>switch</CODE> statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many <CODE>switch</CODE> statements are generated.  A
+value of 1 generates 1 <CODE>switch</CODE> containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+<CODE>switch</CODE>, etc.  This is useful since many C compilers cannot
+correctly generate code for large <CODE>switch</CODE> statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+<DT><SAMP>&lsquo;%omit-struct-type&rsquo;</SAMP>
+<DD>
+<A NAME="IDX31"></A>
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+</DL>
+
+
+
+<H4><A NAME="SEC10" HREF="gperf.html#TOC10">4.1.1.3  C Code Inclusion</A></H4>
+
+<P>
+<A NAME="IDX32"></A>
+<A NAME="IDX33"></A>
+Using a syntax similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE>, it
+is possible to directly include C source text and comments verbatim into
+the generated output file.  This is accomplished by enclosing the region
+inside left-justified surrounding <SAMP>&lsquo;%{&rsquo;</SAMP>, <SAMP>&lsquo;%}&rsquo;</SAMP> pairs.  Here is
+an input fragment based on the previous example that illustrates this
+feature:
+
+</P>
+
+<PRE>
+%{
+#include &#60;assert.h&#62;
+/* This section of code is inserted directly into the output. */
+int return_month_days (struct month *months, int is_leap_year);
+%}
+struct month { char *name; int number; int days; int leap_days; };
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+...
+</PRE>
+
+
+
+<H3><A NAME="SEC11" HREF="gperf.html#TOC11">4.1.2  Format for Keyword Entries</A></H3>
+
+<P>
+The second input file format section contains lines of keywords and any
+associated attributes you might supply.  A line beginning with <SAMP>&lsquo;#&rsquo;</SAMP>
+in the first column is considered a comment.  Everything following the
+<SAMP>&lsquo;#&rsquo;</SAMP> is ignored, up to and including the following newline.  A line
+beginning with <SAMP>&lsquo;%&rsquo;</SAMP> in the first column is an option declaration and
+must not occur within the keywords section.
+
+</P>
+<P>
+The first field of each non-comment line is always the keyword itself.  It
+can be given in two ways: as a simple name, i.e., without surrounding
+string quotation marks, or as a string enclosed in double-quotes, in
+C syntax, possibly with backslash escapes like <CODE>\"</CODE> or <CODE>\234</CODE>
+or <CODE>\xa8</CODE>.  In either case, it must start right at the beginning
+of the line, without leading whitespace.
+In this context, a “field” is considered to extend up to, but
+not include, the first blank, comma, or newline.  Here is a simple
+example taken from a partial list of C reserved words:
+
+</P>
+
+<PRE>
+# These are a few C reserved words, see the c.gperf file 
+# for a complete list of ANSI C reserved words.
+unsigned
+sizeof
+switch
+signed
+if
+default
+for
+while
+return
+</PRE>
+
+<P>
+Note that unlike <CODE>flex</CODE> or <CODE>bison</CODE> the first <SAMP>&lsquo;%%&rsquo;</SAMP> marker
+may be elided if the declaration section is empty.
+
+</P>
+<P>
+Additional fields may optionally follow the leading keyword.  Fields
+should be separated by commas, and terminate at the end of line.  What
+these fields mean is entirely up to you; they are used to initialize the
+elements of the user-defined <CODE>struct</CODE> provided by you in the
+declaration section.  If the <SAMP>&lsquo;-t&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) is <EM>not</EM> enabled
+these fields are simply ignored.  All previous examples except the last
+one contain keyword attributes.
+
+</P>
+
+
+<H3><A NAME="SEC12" HREF="gperf.html#TOC12">4.1.3  Including Additional C Functions</A></H3>
+
+<P>
+The optional third section also corresponds closely with conventions
+found in <CODE>flex</CODE> and <CODE>bison</CODE>.  All text in this section,
+starting at the final <SAMP>&lsquo;%%&rsquo;</SAMP> and extending to the end of the input
+file, is included verbatim into the generated output file.  Naturally,
+it is your responsibility to ensure that the code contained in this
+section is valid C.
+
+</P>
+
+
+<H3><A NAME="SEC13" HREF="gperf.html#TOC13">4.1.4  Where to place directives for GNU <CODE>indent</CODE>.</A></H3>
+
+<P>
+If you want to invoke GNU <CODE>indent</CODE> on a <CODE>gperf</CODE> input file,
+you will see that GNU <CODE>indent</CODE> doesn't understand the <SAMP>&lsquo;%%&rsquo;</SAMP>,
+<SAMP>&lsquo;%{&rsquo;</SAMP> and <SAMP>&lsquo;%}&rsquo;</SAMP> directives that control <CODE>gperf</CODE>'s
+interpretation of the input file.  Therefore you have to insert some
+directives for GNU <CODE>indent</CODE>.  More precisely, assuming the most
+general input file structure
+
+</P>
+
+<PRE>
+declarations part 1
+%{
+verbatim code
+%}
+declarations part 2
+%%
+keywords
+%%
+functions
+</PRE>
+
+<P>
+you would insert <SAMP>&lsquo;*INDENT-OFF*&rsquo;</SAMP> and <SAMP>&lsquo;*INDENT-ON*&rsquo;</SAMP> comments
+as follows:
+
+</P>
+
+<PRE>
+/* *INDENT-OFF* */
+declarations part 1
+%{
+/* *INDENT-ON* */
+verbatim code
+/* *INDENT-OFF* */
+%}
+declarations part 2
+%%
+keywords
+%%
+/* *INDENT-ON* */
+functions
+</PRE>
+
+
+
+<H2><A NAME="SEC14" HREF="gperf.html#TOC14">4.2  Output Format for Generated C Code with <CODE>gperf</CODE></A></H2>
+<P>
+<A NAME="IDX34"></A>
+
+</P>
+<P>
+Several options control how the generated C code appears on the standard 
+output.  Two C functions are generated.  They are called <CODE>hash</CODE> and 
+<CODE>in_word_set</CODE>, although you may modify their names with a command-line 
+option.  Both functions require two arguments, a string, <CODE>char *</CODE> 
+<VAR>str</VAR>, and a length parameter, <CODE>int</CODE> <VAR>len</VAR>.  Their default 
+function prototypes are as follows:
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> unsigned int <B>hash</B> <I>(const char * <VAR>str</VAR>, unsigned int <VAR>len</VAR>)</I>
+<DD><A NAME="IDX35"></A>
+By default, the generated <CODE>hash</CODE> function returns an integer value
+created by adding <VAR>len</VAR> to several user-specified <VAR>str</VAR> byte
+positions indexed into an <EM>associated values</EM> table stored in a
+local static array.  The associated values table is constructed
+internally by <CODE>gperf</CODE> and later output as a static local C array
+called <SAMP>&lsquo;hash_table&rsquo;</SAMP>.  The relevant selected positions (i.e. indices
+into <VAR>str</VAR>) are specified via the <SAMP>&lsquo;-k&rsquo;</SAMP> option when running
+<CODE>gperf</CODE>, as detailed in the <EM>Options</EM> section below (see section <A HREF="gperf.html#SEC17">5  Invoking <CODE>gperf</CODE></A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U>  <B>in_word_set</B> <I>(const char * <VAR>str</VAR>, unsigned int <VAR>len</VAR>)</I>
+<DD><A NAME="IDX36"></A>
+If <VAR>str</VAR> is in the keyword set, returns a pointer to that
+keyword.  More exactly, if the option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) was given, it returns
+a pointer to the matching keyword's structure.  Otherwise it returns
+<CODE>NULL</CODE>.
+</DL>
+
+</P>
+<P>
+If the option <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+declaration) is not used, <VAR>str</VAR> must be a NUL terminated
+string of exactly length <VAR>len</VAR>.  If <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP> declaration) is used, <VAR>str</VAR> must
+simply be an array of <VAR>len</VAR> bytes and does not need to be NUL
+terminated.
+
+</P>
+<P>
+The code generated for these two functions is affected by the following
+options:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-t&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--struct-type&rsquo;</SAMP>
+<DD>
+Make use of the user-defined <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;-S <VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--switch=<VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX37"></A>
+Generate 1 or more C <CODE>switch</CODE> statement rather than use a large,
+(and potentially sparse) static array.  Although the exact time and
+space savings of this approach vary according to your C compiler's
+degree of optimization, this method often results in smaller and faster
+code.
+</DL>
+
+<P>
+If the <SAMP>&lsquo;-t&rsquo;</SAMP> and <SAMP>&lsquo;-S&rsquo;</SAMP> options (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> and <SAMP>&lsquo;%switch&rsquo;</SAMP> declarations) are omitted, the default
+action
+is to generate a <CODE>char *</CODE> array containing the keywords, together with
+additional empty strings used for padding the array.  By experimenting
+with the various input and output options, and timing the resulting C
+code, you can determine the best option choices for different keyword
+set characteristics.
+
+</P>
+
+
+<H2><A NAME="SEC15" HREF="gperf.html#TOC15">4.3  Use of NUL bytes</A></H2>
+<P>
+<A NAME="IDX38"></A>
+
+</P>
+<P>
+By default, the code generated by <CODE>gperf</CODE> operates on zero
+terminated strings, the usual representation of strings in C.  This means
+that the keywords in the input file must not contain NUL bytes,
+and the <VAR>str</VAR> argument passed to <CODE>hash</CODE> or <CODE>in_word_set</CODE>
+must be NUL terminated and have exactly length <VAR>len</VAR>.
+
+</P>
+<P>
+If option <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+declaration) is used, then the <VAR>str</VAR> argument does not need
+to be NUL terminated.  The code generated by <CODE>gperf</CODE> will only
+access the first <VAR>len</VAR>, not <VAR>len+1</VAR>, bytes starting at <VAR>str</VAR>.
+However, the keywords in the input file still must not contain NUL
+bytes.
+
+</P>
+<P>
+If option <SAMP>&lsquo;-l&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>
+declaration) is used, then the hash table performs binary
+comparison.  The keywords in the input file may contain NUL bytes,
+written in string syntax as <CODE>\000</CODE> or <CODE>\x00</CODE>, and the code
+generated by <CODE>gperf</CODE> will treat NUL like any other byte.
+Also, in this case the <SAMP>&lsquo;-c&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP> declaration) is ignored.
+
+</P>
+
+
+<H2><A NAME="SEC16" HREF="gperf.html#TOC16">4.4  The Copyright of the Output</A></H2>
+<P>
+<A NAME="IDX39"></A>
+
+</P>
+<P>
+<CODE>gperf</CODE> is under GPL, but that does not cause the output produced
+by <CODE>gperf</CODE> to be under GPL.  The reason is that the output contains
+only small pieces of text that come directly from <CODE>gperf</CODE>'s source
+code -- only about 7 lines long, too small for being significant --, and
+therefore the output is not a “work based on <CODE>gperf</CODE>” (in the
+sense of the GPL version 3).
+
+</P>
+<P>
+On the other hand, the output produced by <CODE>gperf</CODE> contains
+essentially all of the input file.  Therefore the output is a
+“derivative work” of the input (in the sense of U.S. copyright law);
+and its copyright status depends on the copyright of the input.  For most
+software licenses, the result is that the the output is under the same
+license, with the same copyright holder, as the input that was passed to
+<CODE>gperf</CODE>.
+
+</P>
+
+
+<H1><A NAME="SEC17" HREF="gperf.html#TOC17">5  Invoking <CODE>gperf</CODE></A></H1>
+
+<P>
+There are <EM>many</EM> options to <CODE>gperf</CODE>.  They were added to make
+the program more convenient for use with real applications.  “On-line”
+help is readily available via the <SAMP>&lsquo;--help&rsquo;</SAMP> option.  Here is the
+complete list of options.
+
+</P>
+
+
+
+<H2><A NAME="SEC18" HREF="gperf.html#TOC18">5.1  Specifying the Location of the Output File</A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;--output-file=<VAR>file</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name of the file to which the output is written to.
+</DL>
+
+<P>
+The results are written to standard output if no output file is specified
+or if it is <SAMP>&lsquo;-&rsquo;</SAMP>.
+
+</P>
+
+
+<H2><A NAME="SEC19" HREF="gperf.html#TOC19">5.2  Options that affect Interpretation of the Input File</A></H2>
+
+<P>
+These options are also available as declarations in the input file
+(see section <A HREF="gperf.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-e <VAR>keyword-delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--delimiters=<VAR>keyword-delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX40"></A>
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.  One useful trick is to use -e'TAB', where TAB is
+the literal tab character.
+
+<DT><SAMP>&lsquo;-t&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--struct-type&rsquo;</SAMP>
+<DD>
+Allows you to include a <CODE>struct</CODE> type declaration for generated
+code.  Any text before a pair of consecutive <SAMP>&lsquo;%%&rsquo;</SAMP> is considered
+part of the type declaration.  Keywords and additional fields may follow
+this, one group of fields per line.  A set of examples for generating
+perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2,
+Modula 3 and JavaScript reserved words are distributed with this release.
+
+<DT><SAMP>&lsquo;--ignore-case&rsquo;</SAMP>
+<DD>
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.  This option is therefore not
+suitable if a properly internationalized or locale aware case mapping
+should be used.  (For example, in a Turkish locale, the upper case equivalent
+of the lowercase ASCII letter <SAMP>&lsquo;i&rsquo;</SAMP> is the non-ASCII character
+<SAMP>&lsquo;capital i with dot above&rsquo;</SAMP>.)  For this case, it is better to apply
+an uppercase or lowercase conversion on the string before passing it to
+the <CODE>gperf</CODE> generated function.
+</DL>
+
+
+
+<H2><A NAME="SEC20" HREF="gperf.html#TOC20">5.3  Options to specify the Language for the Output Code</A></H2>
+
+<P>
+These options are also available as declarations in the input file
+(see section <A HREF="gperf.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-L <VAR>generated-language-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--language=<VAR>generated-language-name</VAR>&rsquo;</SAMP>
+<DD>
+Instructs <CODE>gperf</CODE> to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;KR-C&rsquo;</SAMP>
+<DD>
+Old-style K&#38;R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking <SAMP>&lsquo;const&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;C&rsquo;</SAMP>
+<DD>
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you <CODE>#define const</CODE> to empty
+for compilers which don't know about this keyword.
+
+<DT><SAMP>&lsquo;ANSI-C&rsquo;</SAMP>
+<DD>
+ANSI C.  This language is understood by ANSI C compilers and C++ compilers.
+
+<DT><SAMP>&lsquo;C++&rsquo;</SAMP>
+<DD>
+C++.  This language is understood by C++ compilers.
+</DL>
+
+The default is C.
+
+<DT><SAMP>&lsquo;-a&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+
+<DT><SAMP>&lsquo;-g&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+</DL>
+
+
+
+<H2><A NAME="SEC21" HREF="gperf.html#TOC21">5.4  Options for fine tuning Details in the Output Code</A></H2>
+
+<P>
+Most of these options are also available as declarations in the input file
+(see section <A HREF="gperf.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-K <VAR>slot-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--slot-name=<VAR>slot-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX41"></A>
+This option is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is <SAMP>&lsquo;name&rsquo;</SAMP>.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;-F <VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--initializer-suffix=<VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX42"></A>
+This option is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+It permits to specify initializers for the structure members following
+<VAR>slot-name</VAR> in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following <VAR>slot-name</VAR>.
+
+<DT><SAMP>&lsquo;-H <VAR>hash-function-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--hash-function-name=<VAR>hash-function-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name for the generated hash function.  Default
+name is <SAMP>&lsquo;hash&rsquo;</SAMP>.  This option permits the use of two hash tables in
+the same file.
+
+<DT><SAMP>&lsquo;-N <VAR>lookup-function-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--lookup-function-name=<VAR>lookup-function-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name for the generated lookup function.
+Default name is <SAMP>&lsquo;in_word_set&rsquo;</SAMP>.  This option permits multiple
+generated hash functions to be used in the same application.
+
+<DT><SAMP>&lsquo;-Z <VAR>class-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--class-name=<VAR>class-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX43"></A>
+This option is only useful when option <SAMP>&lsquo;-L C++&rsquo;</SAMP> (or, equivalently,
+the <SAMP>&lsquo;%language=C++&rsquo;</SAMP> declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+<CODE>Perfect_Hash</CODE>.
+
+<DT><SAMP>&lsquo;-7&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--seven-bit&rsquo;</SAMP>
+<DD>
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions <CODE>isalnum</CODE> and <CODE>isgraph</CODE> do
+<EM>not</EM> guarantee that a byte is in this range.  Only an explicit
+test like <SAMP>&lsquo;c &#62;= 'A' &#38;&#38; c &#60;= 'Z'&rsquo;</SAMP> guarantees this.) This was the
+default in versions of <CODE>gperf</CODE> earlier than 2.7; now the default is
+to support 8-bit and multibyte characters.
+
+<DT><SAMP>&lsquo;-l&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--compare-lengths&rsquo;</SAMP>
+<DD>
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (see section <A HREF="gperf.html#SEC15">4.3  Use of NUL bytes</A>).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via <CODE>strcmp</CODE>.
+However, using <SAMP>&lsquo;-l&rsquo;</SAMP> might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option <SAMP>&lsquo;-S&rsquo;</SAMP> or <SAMP>&lsquo;%switch&rsquo;</SAMP> is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+<DT><SAMP>&lsquo;-c&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--compare-strncmp&rsquo;</SAMP>
+<DD>
+Generates C code that uses the <CODE>strncmp</CODE> function to perform
+string comparisons.  The default action is to use <CODE>strcmp</CODE>.
+
+<DT><SAMP>&lsquo;-C&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--readonly-tables&rsquo;</SAMP>
+<DD>
+Makes the contents of all generated lookup tables constant, i.e.,
+“readonly”.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+<DT><SAMP>&lsquo;-E&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--enum&rsquo;</SAMP>
+<DD>
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark <CODE>&#60;jjc@ai.mit.edu&#62;</CODE>.
+
+<DT><SAMP>&lsquo;-I&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--includes&rsquo;</SAMP>
+<DD>
+Include the necessary system include file, <CODE>&#60;string.h&#62;</CODE>, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+<DT><SAMP>&lsquo;-G&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--global-table&rsquo;</SAMP>
+<DD>
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+<DT><SAMP>&lsquo;-P&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--pic&rsquo;</SAMP>
+<DD>
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) is also given, the first field of the
+user-defined struct must be of type <SAMP>&lsquo;int&rsquo;</SAMP>, not <SAMP>&lsquo;char *&rsquo;</SAMP>, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+<SAMP>&lsquo;stringpool + <VAR>o</VAR>&rsquo;</SAMP>, where <VAR>o</VAR> is the offset.  The string pool
+name can be changed through the option <SAMP>&lsquo;--string-pool-name&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;-Q <VAR>string-pool-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--string-pool-name=<VAR>string-pool-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name of the generated string pool created by
+option <SAMP>&lsquo;-P&rsquo;</SAMP>.  The default name is <SAMP>&lsquo;stringpool&rsquo;</SAMP>.  This option
+permits the use of two hash tables in the same file, with <SAMP>&lsquo;-P&rsquo;</SAMP> and
+even when the option <SAMP>&lsquo;-G&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP>
+declaration) is given.
+
+<DT><SAMP>&lsquo;--null-strings&rsquo;</SAMP>
+<DD>
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as option <SAMP>&lsquo;-P&rsquo;</SAMP>), at the expense
+of one more test-and-branch instruction at run time.
+
+<DT><SAMP>&lsquo;-W <VAR>hash-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--word-array-name=<VAR>hash-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX44"></A>
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is <SAMP>&lsquo;wordlist&rsquo;</SAMP>.  This option permits the
+use of two hash tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;--length-table-name=<VAR>length-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX45"></A>
+Allows you to specify the name for the generated array containing the
+length table.  Default name is <SAMP>&lsquo;lengthtable&rsquo;</SAMP>.  This option permits the
+use of two length tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;-S <VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--switch=<VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX46"></A>
+Causes the generated C code to use a <CODE>switch</CODE> statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many <CODE>switch</CODE> statements are generated.  A
+value of 1 generates 1 <CODE>switch</CODE> containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+<CODE>switch</CODE>, etc.  This is useful since many C compilers cannot
+correctly generate code for large <CODE>switch</CODE> statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+<DT><SAMP>&lsquo;-T&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--omit-struct-type&rsquo;</SAMP>
+<DD>
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+
+<DT><SAMP>&lsquo;-p&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+</DL>
+
+
+
+<H2><A NAME="SEC22" HREF="gperf.html#TOC22">5.5  Options for changing the Algorithms employed by <CODE>gperf</CODE></A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-k <VAR>selected-byte-positions</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--key-positions=<VAR>selected-byte-positions</VAR>&rsquo;</SAMP>
+<DD>
+Allows selection of the byte positions used in the keywords'
+hash function.  The allowable choices range between 1-255, inclusive.
+The positions are separated by commas, e.g., <SAMP>&lsquo;-k 9,4,13,14&rsquo;</SAMP>;
+ranges may be used, e.g., <SAMP>&lsquo;-k 2-7&rsquo;</SAMP>; and positions may occur
+in any order.  Furthermore, the wildcard '*' causes the generated
+hash function to consider <STRONG>all</STRONG> byte positions in each keyword,
+whereas '$' instructs the hash function to use the “final byte”
+of a keyword (this is the only way to use a byte position greater than
+255, incidentally).
+
+For instance, the option <SAMP>&lsquo;-k 1,2,4,6-10,'$'&rsquo;</SAMP> generates a hash
+function that considers positions 1,2,4,6,7,8,9,10, plus the last
+byte in each keyword (which may be at a different position for each
+keyword, obviously).  Keywords
+with length less than the indicated byte positions work properly, since
+selected byte positions exceeding the keyword length are simply not
+referenced in the hash function.
+
+This option is not normally needed since version 2.8 of <CODE>gperf</CODE>;
+the default byte positions are computed depending on the keyword set,
+through a search that minimizes the number of byte positions.
+
+<DT><SAMP>&lsquo;-D&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--duplicates&rsquo;</SAMP>
+<DD>
+<A NAME="IDX47"></A>
+Handle keywords whose selected byte sets hash to duplicate values.
+Duplicate hash values can occur if a set of keywords has the same names, but
+possesses different attributes, or if the selected byte positions are not well
+chosen.  With the -D option <CODE>gperf</CODE> treats all these keywords as
+part of an equivalence class and generates a perfect hash function with
+multiple comparisons for duplicate keywords.  It is up to you to completely
+disambiguate the keywords by modifying the generated C code.  However,
+<CODE>gperf</CODE> helps you out by organizing the output.
+
+Using this option usually means that the generated hash function is no
+longer perfect.  On the other hand, it permits <CODE>gperf</CODE> to work on
+keyword sets that it otherwise could not handle.
+
+<DT><SAMP>&lsquo;-m <VAR>iterations</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--multiple-iterations=<VAR>iterations</VAR>&rsquo;</SAMP>
+<DD>
+Perform multiple choices of the <SAMP>&lsquo;-i&rsquo;</SAMP> and <SAMP>&lsquo;-j&rsquo;</SAMP> values, and
+choose the best results.  This increases the running time by a factor of
+<VAR>iterations</VAR> but does a good job minimizing the generated table size.
+
+<DT><SAMP>&lsquo;-i <VAR>initial-value</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--initial-asso=<VAR>initial-value</VAR>&rsquo;</SAMP>
+<DD>
+Provides an initial <VAR>value</VAR> for the associate values array.  Default
+is 0.  Increasing the initial value helps inflate the final table size,
+possibly leading to more time efficient keyword lookups.  Note that this
+option is not particularly useful when <SAMP>&lsquo;-S&rsquo;</SAMP> (or, equivalently,
+<SAMP>&lsquo;%switch&rsquo;</SAMP>) is used.  Also,
+<SAMP>&lsquo;-i&rsquo;</SAMP> is overridden when the <SAMP>&lsquo;-r&rsquo;</SAMP> option is used.
+
+<DT><SAMP>&lsquo;-j <VAR>jump-value</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--jump=<VAR>jump-value</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX48"></A>
+Affects the “jump value”, i.e., how far to advance the associated
+byte value upon collisions.  <VAR>Jump-value</VAR> is rounded up to an
+odd number, the default is 5.  If the <VAR>jump-value</VAR> is 0 <CODE>gperf</CODE>
+jumps by random amounts.
+
+<DT><SAMP>&lsquo;-n&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--no-strlen&rsquo;</SAMP>
+<DD>
+Instructs the generator not to include the length of a keyword when
+computing its hash value.  This may save a few assembly instructions in
+the generated lookup table.
+
+<DT><SAMP>&lsquo;-r&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--random&rsquo;</SAMP>
+<DD>
+Utilizes randomness to initialize the associated values table.  This
+frequently generates solutions faster than using deterministic
+initialization (which starts all associated values at 0).  Furthermore,
+using the randomization option generally increases the size of the
+table.
+
+<DT><SAMP>&lsquo;-s <VAR>size-multiple</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--size-multiple=<VAR>size-multiple</VAR>&rsquo;</SAMP>
+<DD>
+Affects the size of the generated hash table.  The numeric argument for
+this option indicates “how many times larger or smaller” the maximum
+associated value range should be, in relationship to the number of keywords.
+It can be written as an integer, a floating-point number or a fraction.
+For example, a value of 3 means “allow the maximum associated value to be
+about 3 times larger than the number of input keywords”.
+Conversely, a value of 1/3 means “allow the maximum associated value to
+be about 3 times smaller than the number of input keywords”.  Values
+smaller than 1 are useful for limiting the overall size of the generated hash
+table, though the option <SAMP>&lsquo;-m&rsquo;</SAMP> is better at this purpose.
+
+If `generate switch' option <SAMP>&lsquo;-S&rsquo;</SAMP> (or, equivalently, <SAMP>&lsquo;%switch&rsquo;</SAMP>) is
+<EM>not</EM> enabled, the maximum
+associated value influences the static array table size, and a larger
+table should decrease the time required for an unsuccessful search, at
+the expense of extra table space.
+
+The default value is 1, thus the default maximum associated value about
+the same size as the number of keywords (for efficiency, the maximum
+associated value is always rounded up to a power of 2).  The actual
+table size may vary somewhat, since this technique is essentially a
+heuristic.
+</DL>
+
+
+
+<H2><A NAME="SEC23" HREF="gperf.html#TOC23">5.6  Informative Output</A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-h&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--help&rsquo;</SAMP>
+<DD>
+Prints a short summary on the meaning of each program option.  Aborts
+further program execution.
+
+<DT><SAMP>&lsquo;-v&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--version&rsquo;</SAMP>
+<DD>
+Prints out the current version number.
+
+<DT><SAMP>&lsquo;-d&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--debug&rsquo;</SAMP>
+<DD>
+Enables the debugging option.  This produces verbose diagnostics to
+“standard error” when <CODE>gperf</CODE> is executing.  It is useful both for
+maintaining the program and for determining whether a given set of
+options is actually speeding up the search for a solution.  Some useful
+information is dumped at the end of the program when the <SAMP>&lsquo;-d&rsquo;</SAMP>
+option is enabled.
+</DL>
+
+
+
+<H1><A NAME="SEC24" HREF="gperf.html#TOC24">6  Known Bugs and Limitations with <CODE>gperf</CODE></A></H1>
+
+<P>
+The following are some limitations with the current release of
+<CODE>gperf</CODE>:
+
+</P>
+
+<UL>
+<LI>
+
+The <CODE>gperf</CODE> utility is tuned to execute quickly, and works quickly
+for small to medium size data sets (around 1000 keywords).  It is
+extremely useful for maintaining perfect hash functions for compiler
+keyword sets.  Several recent enhancements now enable <CODE>gperf</CODE> to
+work efficiently on much larger keyword sets (over 15,000 keywords).
+When processing large keyword sets it helps greatly to have over 8 megs
+of RAM.
+
+<LI>
+
+The size of the generate static keyword array can get <EM>extremely</EM>
+large if the input keyword file is large or if the keywords are quite
+similar.  This tends to slow down the compilation of the generated C
+code, and <EM>greatly</EM> inflates the object code size.  If this
+situation occurs, consider using the <SAMP>&lsquo;-S&rsquo;</SAMP> option to reduce data
+size, potentially increasing keyword recognition time a negligible
+amount.  Since many C compilers cannot correctly generate code for
+large switch statements it is important to qualify the <VAR>-S</VAR> option
+with an appropriate numerical argument that controls the number of
+switch statements generated.
+
+<LI>
+
+The maximum number of selected byte positions has an
+arbitrary limit of 255.  This restriction should be removed, and if
+anyone considers this a problem write me and let me know so I can remove
+the constraint.
+</UL>
+
+
+
+<H1><A NAME="SEC25" HREF="gperf.html#TOC25">7  Things Still Left to Do</A></H1>
+
+<P>
+It should be “relatively” easy to replace the current perfect hash
+function algorithm with a more exhaustive approach; the perfect hash
+module is essential independent from other program modules.  Additional
+worthwhile improvements include:
+
+</P>
+
+<UL>
+<LI>
+
+Another useful extension involves modifying the program to generate
+“minimal” perfect hash functions (under certain circumstances, the
+current version can be rather extravagant in the generated table size).
+This is mostly of theoretical interest, since a sparse table
+often produces faster lookups, and use of the <SAMP>&lsquo;-S&rsquo;</SAMP> <CODE>switch</CODE>
+option can minimize the data size, at the expense of slightly longer
+lookups (note that the gcc compiler generally produces good code for
+<CODE>switch</CODE> statements, reducing the need for more complex schemes).
+
+<LI>
+
+In addition to improving the algorithm, it would also be useful to
+generate an Ada package as the code output, in addition to the current
+C and C++ routines.
+</UL>
+
+
+
+<H1><A NAME="SEC26" HREF="gperf.html#TOC26">8  Bibliography</A></H1>
+
+<P>
+[1] Chang, C.C.: <I>A Scheme for Constructing Ordered Minimal Perfect
+Hashing Functions</I> Information Sciences 39(1986), 187-195.
+
+</P>
+<P>
+[2] Cichelli, Richard J. <I>Author's Response to “On Cichelli's Minimal Perfect Hash
+Functions Method”</I> Communications of the ACM, 23, 12(December 1980), 729.
+
+</P>
+<P>
+[3] Cichelli, Richard J. <I>Minimal Perfect Hash Functions Made Simple</I>
+Communications of the ACM, 23, 1(January 1980), 17-19.
+
+</P>
+<P>
+[4] Cook, C. R. and Oldehoeft, R.R. <I>A Letter Oriented Minimal
+Perfect Hashing Function</I> SIGPLAN Notices, 17, 9(September 1982), 18-27.
+
+</P>
+<P>
+[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
+<I>Practical Perfect Hashing</I> Computer Journal, 28, 1(January 1985), 54-58.
+
+</P>
+<P>
+[6] Jaeschke, G. <I>Reciprocal Hashing: A Method for Generating Minimal
+Perfect Hashing Functions</I> Communications of the ACM, 24, 12(December
+1981), 829-833.
+
+</P>
+<P>
+[7] Jaeschke, G. and Osterburg, G. <I>On Cichelli's Minimal Perfect
+Hash Functions Method</I> Communications of the ACM, 23, 12(December 1980),
+728-729.
+
+</P>
+<P>
+[8] Sager, Thomas J. <I>A Polynomial Time Generator for Minimal Perfect
+Hash Functions</I> Communications of the ACM, 28, 5(December 1985), 523-532
+
+</P>
+<P>
+[9] Schmidt, Douglas C. <I>GPERF: A Perfect Hash Function Generator</I>
+Second USENIX C++ Conference Proceedings, April 1990.
+
+</P>
+<P>
+[10] Schmidt, Douglas C. <I>GPERF: A Perfect Hash Function Generator</I>
+C++ Report, SIGS 10 10 (November/December 1998).
+
+</P>
+<P>
+[11] Sebesta, R.W. and Taylor, M.A. <I>Minimal Perfect Hash Functions
+for Reserved Word Lists</I>  SIGPLAN Notices, 20, 12(September 1985), 47-53.
+
+</P>
+<P>
+[12] Sprugnoli, R. <I>Perfect Hashing Functions: A Single Probe
+Retrieving Method for Static Sets</I> Communications of the ACM, 20
+11(November 1977), 841-850.
+
+</P>
+<P>
+[13] Stallman, Richard M. <I>Using and Porting GNU CC</I> Free Software Foundation,
+1988.
+
+</P>
+<P>
+[14] Stroustrup, Bjarne <I>The C++ Programming Language.</I> Addison-Wesley, 1986.
+
+</P>
+<P>
+[15] Tiemann, Michael D. <I>User's Guide to GNU C++</I> Free Software
+Foundation, 1989.
+
+</P>
+
+
+<H1><A NAME="SEC27" HREF="gperf.html#TOC27">Concept Index</A></H1>
+
+<P>
+Jump to:
+<A HREF="#cindex_&">&#38;</A>
+-
+<A HREF="#cindex_a">a</A>
+-
+<A HREF="#cindex_b">b</A>
+-
+<A HREF="#cindex_c">c</A>
+-
+<A HREF="#cindex_d">d</A>
+-
+<A HREF="#cindex_f">f</A>
+-
+<A HREF="#cindex_h">h</A>
+-
+<A HREF="#cindex_i">i</A>
+-
+<A HREF="#cindex_j">j</A>
+-
+<A HREF="#cindex_k">k</A>
+-
+<A HREF="#cindex_m">m</A>
+-
+<A HREF="#cindex_n">n</A>
+-
+<A HREF="#cindex_s">s</A>
+<P>
+<H2><A NAME="cindex_&">&#38;</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX8"><SAMP>&lsquo;%%&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX18"><SAMP>&lsquo;%7bit&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX19"><SAMP>&lsquo;%compare-lengths&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX20"><SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX17"><SAMP>&lsquo;%define class-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX15"><SAMP>&lsquo;%define hash-function-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX14"><SAMP>&lsquo;%define initializer-suffix&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX29"><SAMP>&lsquo;%define length-table-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX16"><SAMP>&lsquo;%define lookup-function-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX13"><SAMP>&lsquo;%define slot-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX26"><SAMP>&lsquo;%define string-pool-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX28"><SAMP>&lsquo;%define word-array-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX9"><SAMP>&lsquo;%delimiters&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX22"><SAMP>&lsquo;%enum&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX24"><SAMP>&lsquo;%global-table&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX11"><SAMP>&lsquo;%ignore-case&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX23"><SAMP>&lsquo;%includes&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX12"><SAMP>&lsquo;%language&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX27"><SAMP>&lsquo;%null-strings&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX31"><SAMP>&lsquo;%omit-struct-type&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX25"><SAMP>&lsquo;%pic&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX21"><SAMP>&lsquo;%readonly-tables&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX10"><SAMP>&lsquo;%struct-type&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX30"><SAMP>&lsquo;%switch&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX32"><SAMP>&lsquo;%{&rsquo;</SAMP></A>
+<LI><A HREF="gperf.html#IDX33"><SAMP>&lsquo;%}&rsquo;</SAMP></A>
+</DIR>
+<H2><A NAME="cindex_a">a</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX44">Array name</A>, <A HREF="gperf.html#IDX45">Array name</A>
+</DIR>
+<H2><A NAME="cindex_b">b</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX1">Bugs</A>
+</DIR>
+<H2><A NAME="cindex_c">c</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX43">Class name</A>
+<LI><A HREF="gperf.html#IDX39">Copyright</A>
+</DIR>
+<H2><A NAME="cindex_d">d</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX5">Declaration section</A>
+<LI><A HREF="gperf.html#IDX40">Delimiters</A>
+<LI><A HREF="gperf.html#IDX47">Duplicates</A>
+</DIR>
+<H2><A NAME="cindex_f">f</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX4">Format</A>
+<LI><A HREF="gperf.html#IDX7">Functions section</A>
+</DIR>
+<H2><A NAME="cindex_h">h</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX35">hash</A>
+<LI><A HREF="gperf.html#IDX34">hash table</A>
+</DIR>
+<H2><A NAME="cindex_i">i</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX36">in_word_set</A>
+<LI><A HREF="gperf.html#IDX42">Initializers</A>
+</DIR>
+<H2><A NAME="cindex_j">j</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX48">Jump value</A>
+</DIR>
+<H2><A NAME="cindex_k">k</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX6">Keywords section</A>
+</DIR>
+<H2><A NAME="cindex_m">m</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX3">Minimal perfect hash functions</A>
+</DIR>
+<H2><A NAME="cindex_n">n</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX38">NUL</A>
+</DIR>
+<H2><A NAME="cindex_s">s</A></H2>
+<DIR>
+<LI><A HREF="gperf.html#IDX41">Slot name</A>
+<LI><A HREF="gperf.html#IDX2">Static search structure</A>
+<LI><A HREF="gperf.html#IDX37"><CODE>switch</CODE></A>, <A HREF="gperf.html#IDX46"><CODE>switch</CODE></A>
+</DIR>
+
+</P>
+
+<P><HR><P>
+This document was generated on 1 February 2009 using the
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>
+translator version 1.52b.</P>
+</BODY>
+</HTML>
diff --git a/doc/gperf.info b/doc/gperf.info
new file mode 100644 (file)
index 0000000..219bf18
--- /dev/null
@@ -0,0 +1,2096 @@
+This is gperf.info, produced by makeinfo version 4.13 from gperf.texi.
+
+INFO-DIR-SECTION Programming Tools
+START-INFO-DIR-ENTRY
+* Gperf: (gperf).                Perfect Hash Function Generator.
+END-INFO-DIR-ENTRY
+
+   This file documents the features of the GNU Perfect Hash Function
+Generator 3.0.4.
+
+   Copyright (C) 1989-2009 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the section entitled "GNU General Public License" is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the section entitled "GNU General Public License"
+and this permission notice may be included in translations approved by
+the Free Software Foundation instead of in the original English.
+
+\1f
+File: gperf.info,  Node: Top,  Next: Copying,  Prev: (dir),  Up: (dir)
+
+Introduction
+************
+
+   This manual documents the GNU `gperf' perfect hash function generator
+utility, focusing on its features and how to use them, and how to report
+bugs.
+
+* Menu:
+
+* Copying::                     GNU General Public License says how you can
+                                copy and share `gperf'.
+* Contributors::                People who have contributed to `gperf'.
+* Motivation::                  The purpose of `gperf'.
+* Search Structures::           Static search structures and GNU `gperf'
+* Description::                 High-level discussion of how GPERF functions.
+* Options::                     A description of options to the program.
+* Bugs::                        Known bugs and limitations with GPERF.
+* Projects::                    Things still left to do.
+* Bibliography::                Material Referenced in this Report.
+
+* Concept Index::
+
+
+High-Level Description of GNU `gperf'
+
+* Input Format::                Input Format to `gperf'
+* Output Format::               Output Format for Generated C Code with `gperf'
+* Binary Strings::              Use of NUL bytes
+* Output Copyright::            The Copyright of the Output.
+
+Input Format to `gperf'
+
+* Declarations::                Declarations.
+* Keywords::                    Format for Keyword Entries.
+* Functions::                   Including Additional C Functions.
+* Controls for GNU indent::     Where to place directives for GNU `indent'.
+
+Declarations
+
+* User-supplied Struct::        Specifying keywords with attributes.
+* Gperf Declarations::          Embedding command line options in the input.
+* C Code Inclusion::            Including C declarations and definitions.
+
+Invoking `gperf'
+
+* Input Details::               Options that affect Interpretation of the Input File
+* Output Language::             Specifying the Language for the Output Code
+* Output Details::              Fine tuning Details in the Output Code
+* Algorithmic Details::         Changing the Algorithms employed by `gperf'
+* Verbosity::                   Informative Output
+
+\1f
+File: gperf.info,  Node: Copying,  Next: Contributors,  Prev: Top,  Up: Top
+
+GNU GENERAL PUBLIC LICENSE
+**************************
+
+                        Version 3, 29 June 2007
+
+     Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
+
+     Everyone is permitted to copy and distribute verbatim copies of this
+     license document, but changing it is not allowed.
+
+Preamble
+========
+
+   The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+   The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains
+free software for all its users.  We, the Free Software Foundation, use
+the GNU General Public License for most of our software; it applies
+also to any other work released this way by its authors.  You can apply
+it to your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the software,
+or if you modify it: responsibilities to respect the freedom of others.
+
+   For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+   Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+   For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+   Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those domains
+in future versions of the GPL, as needed to protect the freedom of
+users.
+
+   Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+   The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+====================
+
+  0. Definitions.
+
+     "This License" refers to version 3 of the GNU General Public
+     License.
+
+     "Copyright" also means copyright-like laws that apply to other
+     kinds of works, such as semiconductor masks.
+
+     "The Program" refers to any copyrightable work licensed under this
+     License.  Each licensee is addressed as "you".  "Licensees" and
+     "recipients" may be individuals or organizations.
+
+     To "modify" a work means to copy from or adapt all or part of the
+     work in a fashion requiring copyright permission, other than the
+     making of an exact copy.  The resulting work is called a "modified
+     version" of the earlier work or a work "based on" the earlier work.
+
+     A "covered work" means either the unmodified Program or a work
+     based on the Program.
+
+     To "propagate" a work means to do anything with it that, without
+     permission, would make you directly or secondarily liable for
+     infringement under applicable copyright law, except executing it
+     on a computer or modifying a private copy.  Propagation includes
+     copying, distribution (with or without modification), making
+     available to the public, and in some countries other activities as
+     well.
+
+     To "convey" a work means any kind of propagation that enables other
+     parties to make or receive copies.  Mere interaction with a user
+     through a computer network, with no transfer of a copy, is not
+     conveying.
+
+     An interactive user interface displays "Appropriate Legal Notices"
+     to the extent that it includes a convenient and prominently visible
+     feature that (1) displays an appropriate copyright notice, and (2)
+     tells the user that there is no warranty for the work (except to
+     the extent that warranties are provided), that licensees may
+     convey the work under this License, and how to view a copy of this
+     License.  If the interface presents a list of user commands or
+     options, such as a menu, a prominent item in the list meets this
+     criterion.
+
+  1. Source Code.
+
+     The "source code" for a work means the preferred form of the work
+     for making modifications to it.  "Object code" means any
+     non-source form of a work.
+
+     A "Standard Interface" means an interface that either is an
+     official standard defined by a recognized standards body, or, in
+     the case of interfaces specified for a particular programming
+     language, one that is widely used among developers working in that
+     language.
+
+     The "System Libraries" of an executable work include anything,
+     other than the work as a whole, that (a) is included in the normal
+     form of packaging a Major Component, but which is not part of that
+     Major Component, and (b) serves only to enable use of the work
+     with that Major Component, or to implement a Standard Interface
+     for which an implementation is available to the public in source
+     code form.  A "Major Component", in this context, means a major
+     essential component (kernel, window system, and so on) of the
+     specific operating system (if any) on which the executable work
+     runs, or a compiler used to produce the work, or an object code
+     interpreter used to run it.
+
+     The "Corresponding Source" for a work in object code form means all
+     the source code needed to generate, install, and (for an executable
+     work) run the object code and to modify the work, including
+     scripts to control those activities.  However, it does not include
+     the work's System Libraries, or general-purpose tools or generally
+     available free programs which are used unmodified in performing
+     those activities but which are not part of the work.  For example,
+     Corresponding Source includes interface definition files
+     associated with source files for the work, and the source code for
+     shared libraries and dynamically linked subprograms that the work
+     is specifically designed to require, such as by intimate data
+     communication or control flow between those subprograms and other
+     parts of the work.
+
+     The Corresponding Source need not include anything that users can
+     regenerate automatically from other parts of the Corresponding
+     Source.
+
+     The Corresponding Source for a work in source code form is that
+     same work.
+
+  2. Basic Permissions.
+
+     All rights granted under this License are granted for the term of
+     copyright on the Program, and are irrevocable provided the stated
+     conditions are met.  This License explicitly affirms your unlimited
+     permission to run the unmodified Program.  The output from running
+     a covered work is covered by this License only if the output,
+     given its content, constitutes a covered work.  This License
+     acknowledges your rights of fair use or other equivalent, as
+     provided by copyright law.
+
+     You may make, run and propagate covered works that you do not
+     convey, without conditions so long as your license otherwise
+     remains in force.  You may convey covered works to others for the
+     sole purpose of having them make modifications exclusively for
+     you, or provide you with facilities for running those works,
+     provided that you comply with the terms of this License in
+     conveying all material for which you do not control copyright.
+     Those thus making or running the covered works for you must do so
+     exclusively on your behalf, under your direction and control, on
+     terms that prohibit them from making any copies of your
+     copyrighted material outside their relationship with you.
+
+     Conveying under any other circumstances is permitted solely under
+     the conditions stated below.  Sublicensing is not allowed; section
+     10 makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+     No covered work shall be deemed part of an effective technological
+     measure under any applicable law fulfilling obligations under
+     article 11 of the WIPO copyright treaty adopted on 20 December
+     1996, or similar laws prohibiting or restricting circumvention of
+     such measures.
+
+     When you convey a covered work, you waive any legal power to forbid
+     circumvention of technological measures to the extent such
+     circumvention is effected by exercising rights under this License
+     with respect to the covered work, and you disclaim any intention
+     to limit operation or modification of the work as a means of
+     enforcing, against the work's users, your or third parties' legal
+     rights to forbid circumvention of technological measures.
+
+  4. Conveying Verbatim Copies.
+
+     You may convey verbatim copies of the Program's source code as you
+     receive it, in any medium, provided that you conspicuously and
+     appropriately publish on each copy an appropriate copyright notice;
+     keep intact all notices stating that this License and any
+     non-permissive terms added in accord with section 7 apply to the
+     code; keep intact all notices of the absence of any warranty; and
+     give all recipients a copy of this License along with the Program.
+
+     You may charge any price or no price for each copy that you convey,
+     and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+     You may convey a work based on the Program, or the modifications to
+     produce it from the Program, in the form of source code under the
+     terms of section 4, provided that you also meet all of these
+     conditions:
+
+       a. The work must carry prominent notices stating that you
+          modified it, and giving a relevant date.
+
+       b. The work must carry prominent notices stating that it is
+          released under this License and any conditions added under
+          section 7.  This requirement modifies the requirement in
+          section 4 to "keep intact all notices".
+
+       c. You must license the entire work, as a whole, under this
+          License to anyone who comes into possession of a copy.  This
+          License will therefore apply, along with any applicable
+          section 7 additional terms, to the whole of the work, and all
+          its parts, regardless of how they are packaged.  This License
+          gives no permission to license the work in any other way, but
+          it does not invalidate such permission if you have separately
+          received it.
+
+       d. If the work has interactive user interfaces, each must display
+          Appropriate Legal Notices; however, if the Program has
+          interactive interfaces that do not display Appropriate Legal
+          Notices, your work need not make them do so.
+
+     A compilation of a covered work with other separate and independent
+     works, which are not by their nature extensions of the covered
+     work, and which are not combined with it such as to form a larger
+     program, in or on a volume of a storage or distribution medium, is
+     called an "aggregate" if the compilation and its resulting
+     copyright are not used to limit the access or legal rights of the
+     compilation's users beyond what the individual works permit.
+     Inclusion of a covered work in an aggregate does not cause this
+     License to apply to the other parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+     You may convey a covered work in object code form under the terms
+     of sections 4 and 5, provided that you also convey the
+     machine-readable Corresponding Source under the terms of this
+     License, in one of these ways:
+
+       a. Convey the object code in, or embodied in, a physical product
+          (including a physical distribution medium), accompanied by the
+          Corresponding Source fixed on a durable physical medium
+          customarily used for software interchange.
+
+       b. Convey the object code in, or embodied in, a physical product
+          (including a physical distribution medium), accompanied by a
+          written offer, valid for at least three years and valid for
+          as long as you offer spare parts or customer support for that
+          product model, to give anyone who possesses the object code
+          either (1) a copy of the Corresponding Source for all the
+          software in the product that is covered by this License, on a
+          durable physical medium customarily used for software
+          interchange, for a price no more than your reasonable cost of
+          physically performing this conveying of source, or (2) access
+          to copy the Corresponding Source from a network server at no
+          charge.
+
+       c. Convey individual copies of the object code with a copy of
+          the written offer to provide the Corresponding Source.  This
+          alternative is allowed only occasionally and noncommercially,
+          and only if you received the object code with such an offer,
+          in accord with subsection 6b.
+
+       d. Convey the object code by offering access from a designated
+          place (gratis or for a charge), and offer equivalent access
+          to the Corresponding Source in the same way through the same
+          place at no further charge.  You need not require recipients
+          to copy the Corresponding Source along with the object code.
+          If the place to copy the object code is a network server, the
+          Corresponding Source may be on a different server (operated
+          by you or a third party) that supports equivalent copying
+          facilities, provided you maintain clear directions next to
+          the object code saying where to find the Corresponding Source.
+          Regardless of what server hosts the Corresponding Source, you
+          remain obligated to ensure that it is available for as long
+          as needed to satisfy these requirements.
+
+       e. Convey the object code using peer-to-peer transmission,
+          provided you inform other peers where the object code and
+          Corresponding Source of the work are being offered to the
+          general public at no charge under subsection 6d.
+
+
+     A separable portion of the object code, whose source code is
+     excluded from the Corresponding Source as a System Library, need
+     not be included in conveying the object code work.
+
+     A "User Product" is either (1) a "consumer product", which means
+     any tangible personal property which is normally used for personal,
+     family, or household purposes, or (2) anything designed or sold for
+     incorporation into a dwelling.  In determining whether a product
+     is a consumer product, doubtful cases shall be resolved in favor of
+     coverage.  For a particular product received by a particular user,
+     "normally used" refers to a typical or common use of that class of
+     product, regardless of the status of the particular user or of the
+     way in which the particular user actually uses, or expects or is
+     expected to use, the product.  A product is a consumer product
+     regardless of whether the product has substantial commercial,
+     industrial or non-consumer uses, unless such uses represent the
+     only significant mode of use of the product.
+
+     "Installation Information" for a User Product means any methods,
+     procedures, authorization keys, or other information required to
+     install and execute modified versions of a covered work in that
+     User Product from a modified version of its Corresponding Source.
+     The information must suffice to ensure that the continued
+     functioning of the modified object code is in no case prevented or
+     interfered with solely because modification has been made.
+
+     If you convey an object code work under this section in, or with,
+     or specifically for use in, a User Product, and the conveying
+     occurs as part of a transaction in which the right of possession
+     and use of the User Product is transferred to the recipient in
+     perpetuity or for a fixed term (regardless of how the transaction
+     is characterized), the Corresponding Source conveyed under this
+     section must be accompanied by the Installation Information.  But
+     this requirement does not apply if neither you nor any third party
+     retains the ability to install modified object code on the User
+     Product (for example, the work has been installed in ROM).
+
+     The requirement to provide Installation Information does not
+     include a requirement to continue to provide support service,
+     warranty, or updates for a work that has been modified or
+     installed by the recipient, or for the User Product in which it
+     has been modified or installed.  Access to a network may be denied
+     when the modification itself materially and adversely affects the
+     operation of the network or violates the rules and protocols for
+     communication across the network.
+
+     Corresponding Source conveyed, and Installation Information
+     provided, in accord with this section must be in a format that is
+     publicly documented (and with an implementation available to the
+     public in source code form), and must require no special password
+     or key for unpacking, reading or copying.
+
+  7. Additional Terms.
+
+     "Additional permissions" are terms that supplement the terms of
+     this License by making exceptions from one or more of its
+     conditions.  Additional permissions that are applicable to the
+     entire Program shall be treated as though they were included in
+     this License, to the extent that they are valid under applicable
+     law.  If additional permissions apply only to part of the Program,
+     that part may be used separately under those permissions, but the
+     entire Program remains governed by this License without regard to
+     the additional permissions.
+
+     When you convey a copy of a covered work, you may at your option
+     remove any additional permissions from that copy, or from any part
+     of it.  (Additional permissions may be written to require their own
+     removal in certain cases when you modify the work.)  You may place
+     additional permissions on material, added by you to a covered work,
+     for which you have or can give appropriate copyright permission.
+
+     Notwithstanding any other provision of this License, for material
+     you add to a covered work, you may (if authorized by the copyright
+     holders of that material) supplement the terms of this License
+     with terms:
+
+       a. Disclaiming warranty or limiting liability differently from
+          the terms of sections 15 and 16 of this License; or
+
+       b. Requiring preservation of specified reasonable legal notices
+          or author attributions in that material or in the Appropriate
+          Legal Notices displayed by works containing it; or
+
+       c. Prohibiting misrepresentation of the origin of that material,
+          or requiring that modified versions of such material be
+          marked in reasonable ways as different from the original
+          version; or
+
+       d. Limiting the use for publicity purposes of names of licensors
+          or authors of the material; or
+
+       e. Declining to grant rights under trademark law for use of some
+          trade names, trademarks, or service marks; or
+
+       f. Requiring indemnification of licensors and authors of that
+          material by anyone who conveys the material (or modified
+          versions of it) with contractual assumptions of liability to
+          the recipient, for any liability that these contractual
+          assumptions directly impose on those licensors and authors.
+
+     All other non-permissive additional terms are considered "further
+     restrictions" within the meaning of section 10.  If the Program as
+     you received it, or any part of it, contains a notice stating that
+     it is governed by this License along with a term that is a further
+     restriction, you may remove that term.  If a license document
+     contains a further restriction but permits relicensing or
+     conveying under this License, you may add to a covered work
+     material governed by the terms of that license document, provided
+     that the further restriction does not survive such relicensing or
+     conveying.
+
+     If you add terms to a covered work in accord with this section, you
+     must place, in the relevant source files, a statement of the
+     additional terms that apply to those files, or a notice indicating
+     where to find the applicable terms.
+
+     Additional terms, permissive or non-permissive, may be stated in
+     the form of a separately written license, or stated as exceptions;
+     the above requirements apply either way.
+
+  8. Termination.
+
+     You may not propagate or modify a covered work except as expressly
+     provided under this License.  Any attempt otherwise to propagate or
+     modify it is void, and will automatically terminate your rights
+     under this License (including any patent licenses granted under
+     the third paragraph of section 11).
+
+     However, if you cease all violation of this License, then your
+     license from a particular copyright holder is reinstated (a)
+     provisionally, unless and until the copyright holder explicitly
+     and finally terminates your license, and (b) permanently, if the
+     copyright holder fails to notify you of the violation by some
+     reasonable means prior to 60 days after the cessation.
+
+     Moreover, your license from a particular copyright holder is
+     reinstated permanently if the copyright holder notifies you of the
+     violation by some reasonable means, this is the first time you have
+     received notice of violation of this License (for any work) from
+     that copyright holder, and you cure the violation prior to 30 days
+     after your receipt of the notice.
+
+     Termination of your rights under this section does not terminate
+     the licenses of parties who have received copies or rights from
+     you under this License.  If your rights have been terminated and
+     not permanently reinstated, you do not qualify to receive new
+     licenses for the same material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+     You are not required to accept this License in order to receive or
+     run a copy of the Program.  Ancillary propagation of a covered work
+     occurring solely as a consequence of using peer-to-peer
+     transmission to receive a copy likewise does not require
+     acceptance.  However, nothing other than this License grants you
+     permission to propagate or modify any covered work.  These actions
+     infringe copyright if you do not accept this License.  Therefore,
+     by modifying or propagating a covered work, you indicate your
+     acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+     Each time you convey a covered work, the recipient automatically
+     receives a license from the original licensors, to run, modify and
+     propagate that work, subject to this License.  You are not
+     responsible for enforcing compliance by third parties with this
+     License.
+
+     An "entity transaction" is a transaction transferring control of an
+     organization, or substantially all assets of one, or subdividing an
+     organization, or merging organizations.  If propagation of a
+     covered work results from an entity transaction, each party to that
+     transaction who receives a copy of the work also receives whatever
+     licenses to the work the party's predecessor in interest had or
+     could give under the previous paragraph, plus a right to
+     possession of the Corresponding Source of the work from the
+     predecessor in interest, if the predecessor has it or can get it
+     with reasonable efforts.
+
+     You may not impose any further restrictions on the exercise of the
+     rights granted or affirmed under this License.  For example, you
+     may not impose a license fee, royalty, or other charge for
+     exercise of rights granted under this License, and you may not
+     initiate litigation (including a cross-claim or counterclaim in a
+     lawsuit) alleging that any patent claim is infringed by making,
+     using, selling, offering for sale, or importing the Program or any
+     portion of it.
+
+ 11. Patents.
+
+     A "contributor" is a copyright holder who authorizes use under this
+     License of the Program or a work on which the Program is based.
+     The work thus licensed is called the contributor's "contributor
+     version".
+
+     A contributor's "essential patent claims" are all patent claims
+     owned or controlled by the contributor, whether already acquired or
+     hereafter acquired, that would be infringed by some manner,
+     permitted by this License, of making, using, or selling its
+     contributor version, but do not include claims that would be
+     infringed only as a consequence of further modification of the
+     contributor version.  For purposes of this definition, "control"
+     includes the right to grant patent sublicenses in a manner
+     consistent with the requirements of this License.
+
+     Each contributor grants you a non-exclusive, worldwide,
+     royalty-free patent license under the contributor's essential
+     patent claims, to make, use, sell, offer for sale, import and
+     otherwise run, modify and propagate the contents of its
+     contributor version.
+
+     In the following three paragraphs, a "patent license" is any
+     express agreement or commitment, however denominated, not to
+     enforce a patent (such as an express permission to practice a
+     patent or covenant not to sue for patent infringement).  To
+     "grant" such a patent license to a party means to make such an
+     agreement or commitment not to enforce a patent against the party.
+
+     If you convey a covered work, knowingly relying on a patent
+     license, and the Corresponding Source of the work is not available
+     for anyone to copy, free of charge and under the terms of this
+     License, through a publicly available network server or other
+     readily accessible means, then you must either (1) cause the
+     Corresponding Source to be so available, or (2) arrange to deprive
+     yourself of the benefit of the patent license for this particular
+     work, or (3) arrange, in a manner consistent with the requirements
+     of this License, to extend the patent license to downstream
+     recipients.  "Knowingly relying" means you have actual knowledge
+     that, but for the patent license, your conveying the covered work
+     in a country, or your recipient's use of the covered work in a
+     country, would infringe one or more identifiable patents in that
+     country that you have reason to believe are valid.
+
+     If, pursuant to or in connection with a single transaction or
+     arrangement, you convey, or propagate by procuring conveyance of, a
+     covered work, and grant a patent license to some of the parties
+     receiving the covered work authorizing them to use, propagate,
+     modify or convey a specific copy of the covered work, then the
+     patent license you grant is automatically extended to all
+     recipients of the covered work and works based on it.
+
+     A patent license is "discriminatory" if it does not include within
+     the scope of its coverage, prohibits the exercise of, or is
+     conditioned on the non-exercise of one or more of the rights that
+     are specifically granted under this License.  You may not convey a
+     covered work if you are a party to an arrangement with a third
+     party that is in the business of distributing software, under
+     which you make payment to the third party based on the extent of
+     your activity of conveying the work, and under which the third
+     party grants, to any of the parties who would receive the covered
+     work from you, a discriminatory patent license (a) in connection
+     with copies of the covered work conveyed by you (or copies made
+     from those copies), or (b) primarily for and in connection with
+     specific products or compilations that contain the covered work,
+     unless you entered into that arrangement, or that patent license
+     was granted, prior to 28 March 2007.
+
+     Nothing in this License shall be construed as excluding or limiting
+     any implied license or other defenses to infringement that may
+     otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+     If 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 convey a covered work so as to satisfy
+     simultaneously your obligations under this License and any other
+     pertinent obligations, then as a consequence you may not convey it
+     at all.  For example, if you agree to terms that obligate you to
+     collect a royalty for further conveying from those to whom you
+     convey the Program, the only way you could satisfy both those
+     terms and this License would be to refrain entirely from conveying
+     the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+     Notwithstanding any other provision of this License, you have
+     permission to link or combine any covered work with a work licensed
+     under version 3 of the GNU Affero General Public License into a
+     single combined work, and to convey the resulting work.  The terms
+     of this License will continue to apply to the part which is the
+     covered work, but the special requirements of the GNU Affero
+     General Public License, section 13, concerning interaction through
+     a network will apply to the combination as such.
+
+ 14. Revised Versions of this License.
+
+     The Free Software Foundation may publish revised and/or new
+     versions of the GNU 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
+     Program specifies that a certain numbered version of the GNU
+     General Public License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that numbered version or of any later version published by the
+     Free Software Foundation.  If the Program does not specify a
+     version number of the GNU General Public License, you may choose
+     any version ever published by the Free Software Foundation.
+
+     If the Program specifies that a proxy can decide which future
+     versions of the GNU General Public License can be used, that
+     proxy's public statement of acceptance of a version permanently
+     authorizes you to choose that version for the Program.
+
+     Later license versions may give you additional or different
+     permissions.  However, no additional obligations are imposed on any
+     author or copyright holder as a result of your choosing to follow a
+     later version.
+
+ 15. Disclaimer of Warranty.
+
+     THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+     COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.
+     SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+     NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+     IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+     AND/OR CONVEYS THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+     THE POSSIBILITY OF SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+     If the disclaimer of warranty and limitation of liability provided
+     above cannot be given local legal effect according to their terms,
+     reviewing courts shall apply local law that most closely
+     approximates an absolute waiver of all civil liability in
+     connection with the Program, unless a warranty or assumption of
+     liability accompanies a copy of the Program in return for a fee.
+
+
+END OF TERMS AND CONDITIONS
+===========================
+
+How to Apply These Terms to Your New Programs
+=============================================
+
+   If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+   To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state 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 PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+     Copyright (C) YEAR NAME OF AUTHOR
+
+     This program is free software: you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation, either version 3 of the License, 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.
+
+     You should have received a copy of the GNU General Public License
+     along with this program.  If not, see `http://www.gnu.org/licenses/'.
+
+   Also add information on how to contact you by electronic and paper
+mail.
+
+   If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+     PROGRAM Copyright (C) YEAR NAME OF AUTHOR
+     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+     This is free software, and you are welcome to redistribute it
+     under certain conditions; type `show c' for details.
+
+   The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an "about box".
+
+   You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  For more information on this, and how to apply and follow
+the GNU GPL, see `http://www.gnu.org/licenses/'.
+
+   The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use the
+GNU Lesser General Public License instead of this License.  But first,
+please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.
+
+\1f
+File: gperf.info,  Node: Contributors,  Next: Motivation,  Prev: Copying,  Up: Top
+
+Contributors to GNU `gperf' Utility
+***********************************
+
+   * The GNU `gperf' perfect hash function generator utility was
+     written in GNU C++ by Douglas C. Schmidt.  The general idea for
+     the perfect hash function generator was inspired by Keith Bostic's
+     algorithm written in C, and distributed to net.sources around
+     1984.  The current program is a heavily modified, enhanced, and
+     extended implementation of Keith's basic idea, created at the
+     University of California, Irvine.  Bugs, patches, and suggestions
+     should be reported to `<bug-gnu-gperf@gnu.org>'.
+
+   * Special thanks is extended to Michael Tiemann and Doug Lea, for
+     providing a useful compiler, and for giving me a forum to exhibit
+     my creation.
+
+     In addition, Adam de Boor and Nels Olson provided many tips and
+     insights that greatly helped improve the quality and functionality
+     of `gperf'.
+
+   * Bruno Haible enhanced and optimized the search algorithm.  He also
+     rewrote the input routines and the output routines for better
+     reliability, and added a testsuite.
+
+\1f
+File: gperf.info,  Node: Motivation,  Next: Search Structures,  Prev: Contributors,  Up: Top
+
+1 Introduction
+**************
+
+   `gperf' is a perfect hash function generator written in C++.  It
+transforms an N element user-specified keyword set W into a perfect
+hash function F.  F uniquely maps keywords in W onto the range 0..K,
+where K >= N-1.  If K = N-1 then F is a _minimal_ perfect hash function.
+`gperf' generates a 0..K element static lookup table and a pair of C
+functions.  These functions determine whether a given character string
+S occurs in W, using at most one probe into the lookup table.
+
+   `gperf' currently generates the reserved keyword recognizer for
+lexical analyzers in several production and research compilers and
+language processing tools, including GNU C, GNU C++, GNU Java, GNU
+Pascal, GNU Modula 3, and GNU indent.  Complete C++ source code for
+`gperf' is available from `http://ftp.gnu.org/pub/gnu/gperf/'.  A paper
+describing `gperf''s design and implementation in greater detail is
+available in the Second USENIX C++ Conference proceedings or from
+`http://www.cs.wustl.edu/~schmidt/resume.html'.
+
+\1f
+File: gperf.info,  Node: Search Structures,  Next: Description,  Prev: Motivation,  Up: Top
+
+2 Static search structures and GNU `gperf'
+******************************************
+
+   A "static search structure" is an Abstract Data Type with certain
+fundamental operations, e.g., _initialize_, _insert_, and _retrieve_.
+Conceptually, all insertions occur before any retrievals.  In practice,
+`gperf' generates a _static_ array containing search set keywords and
+any associated attributes specified by the user.  Thus, there is
+essentially no execution-time cost for the insertions.  It is a useful
+data structure for representing _static search sets_.  Static search
+sets occur frequently in software system applications.  Typical static
+search sets include compiler reserved words, assembler instruction
+opcodes, and built-in shell interpreter commands.  Search set members,
+called "keywords", are inserted into the structure only once, usually
+during program initialization, and are not generally modified at
+run-time.
+
+   Numerous static search structure implementations exist, e.g.,
+arrays, linked lists, binary search trees, digital search tries, and
+hash tables.  Different approaches offer trade-offs between space
+utilization and search time efficiency.  For example, an N element
+sorted array is space efficient, though the average-case time
+complexity for retrieval operations using binary search is proportional
+to log N.  Conversely, hash table implementations often locate a table
+entry in constant time, but typically impose additional memory overhead
+and exhibit poor worst case performance.
+
+   _Minimal perfect hash functions_ provide an optimal solution for a
+particular class of static search sets.  A minimal perfect hash
+function is defined by two properties:
+
+   * It allows keyword recognition in a static search set using at most
+     _one_ probe into the hash table.  This represents the "perfect"
+     property.
+
+   * The actual memory allocated to store the keywords is precisely
+     large enough for the keyword set, and _no larger_.  This is the
+     "minimal" property.
+
+   For most applications it is far easier to generate _perfect_ hash
+functions than _minimal perfect_ hash functions.  Moreover, non-minimal
+perfect hash functions frequently execute faster than minimal ones in
+practice.  This phenomena occurs since searching a sparse keyword table
+increases the probability of locating a "null" entry, thereby reducing
+string comparisons.  `gperf''s default behavior generates
+_near-minimal_ perfect hash functions for keyword sets.  However,
+`gperf' provides many options that permit user control over the degree
+of minimality and perfection.
+
+   Static search sets often exhibit relative stability over time.  For
+example, Ada's 63 reserved words have remained constant for nearly a
+decade.  It is therefore frequently worthwhile to expend concerted
+effort building an optimal search structure _once_, if it subsequently
+receives heavy use multiple times.  `gperf' removes the drudgery
+associated with constructing time- and space-efficient search
+structures by hand.  It has proven a useful and practical tool for
+serious programming projects.  Output from `gperf' is currently used in
+several production and research compilers, including GNU C, GNU C++,
+GNU Java, GNU Pascal, and GNU Modula 3.  The latter two compilers are
+not yet part of the official GNU distribution.  Each compiler utilizes
+`gperf' to automatically generate static search structures that
+efficiently identify their respective reserved keywords.
+
+\1f
+File: gperf.info,  Node: Description,  Next: Options,  Prev: Search Structures,  Up: Top
+
+3 High-Level Description of GNU `gperf'
+***************************************
+
+* Menu:
+
+* Input Format::                Input Format to `gperf'
+* Output Format::               Output Format for Generated C Code with `gperf'
+* Binary Strings::              Use of NUL bytes
+* Output Copyright::            The Copyright of the Output.
+
+   The perfect hash function generator `gperf' reads a set of
+"keywords" from an input file (or from the standard input by default).
+It attempts to derive a perfect hashing function that recognizes a
+member of the "static keyword set" with at most a single probe into the
+lookup table.  If `gperf' succeeds in generating such a function it
+produces a pair of C source code routines that perform hashing and
+table lookup recognition.  All generated C code is directed to the
+standard output.  Command-line options described below allow you to
+modify the input and output format to `gperf'.
+
+   By default, `gperf' attempts to produce time-efficient code, with
+less emphasis on efficient space utilization.  However, several options
+exist that permit trading-off execution time for storage space and vice
+versa.  In particular, expanding the generated table size produces a
+sparse search structure, generally yielding faster searches.
+Conversely, you can direct `gperf' to utilize a C `switch' statement
+scheme that minimizes data space storage size.  Furthermore, using a C
+`switch' may actually speed up the keyword retrieval time somewhat.
+Actual results depend on your C compiler, of course.
+
+   In general, `gperf' assigns values to the bytes it is using for
+hashing until some set of values gives each keyword a unique value.  A
+helpful heuristic is that the larger the hash value range, the easier
+it is for `gperf' to find and generate a perfect hash function.
+Experimentation is the key to getting the most from `gperf'.
+
+\1f
+File: gperf.info,  Node: Input Format,  Next: Output Format,  Prev: Description,  Up: Description
+
+3.1 Input Format to `gperf'
+===========================
+
+   You can control the input file format by varying certain command-line
+arguments, in particular the `-t' option.  The input's appearance is
+similar to GNU utilities `flex' and `bison' (or UNIX utilities `lex'
+and `yacc').  Here's an outline of the general format:
+
+     declarations
+     %%
+     keywords
+     %%
+     functions
+
+   _Unlike_ `flex' or `bison', the declarations section and the
+functions section are optional.  The following sections describe the
+input format for each section.
+
+* Menu:
+
+* Declarations::                Declarations.
+* Keywords::                    Format for Keyword Entries.
+* Functions::                   Including Additional C Functions.
+* Controls for GNU indent::     Where to place directives for GNU `indent'.
+
+   It is possible to omit the declaration section entirely, if the `-t'
+option is not given.  In this case the input file begins directly with
+the first keyword line, e.g.:
+
+     january
+     february
+     march
+     april
+     ...
+
+\1f
+File: gperf.info,  Node: Declarations,  Next: Keywords,  Prev: Input Format,  Up: Input Format
+
+3.1.1 Declarations
+------------------
+
+   The keyword input file optionally contains a section for including
+arbitrary C declarations and definitions, `gperf' declarations that act
+like command-line options, as well as for providing a user-supplied
+`struct'.
+
+* Menu:
+
+* User-supplied Struct::        Specifying keywords with attributes.
+* Gperf Declarations::          Embedding command line options in the input.
+* C Code Inclusion::            Including C declarations and definitions.
+
+\1f
+File: gperf.info,  Node: User-supplied Struct,  Next: Gperf Declarations,  Prev: Declarations,  Up: Declarations
+
+3.1.1.1 User-supplied `struct'
+..............................
+
+   If the `-t' option (or, equivalently, the `%struct-type' declaration)
+_is_ enabled, you _must_ provide a C `struct' as the last component in
+the declaration section from the input file.  The first field in this
+struct must be of type `char *' or `const char *' if the `-P' option is
+not given, or of type `int' if the option `-P' (or, equivalently, the
+`%pic' declaration) is enabled.  This first field must be called
+`name', although it is possible to modify its name with the `-K' option
+(or, equivalently, the `%define slot-name' declaration) described below.
+
+   Here is a simple example, using months of the year and their
+attributes as input:
+
+     struct month { char *name; int number; int days; int leap_days; };
+     %%
+     january,   1, 31, 31
+     february,  2, 28, 29
+     march,     3, 31, 31
+     april,     4, 30, 30
+     may,       5, 31, 31
+     june,      6, 30, 30
+     july,      7, 31, 31
+     august,    8, 31, 31
+     september, 9, 30, 30
+     october,  10, 31, 31
+     november, 11, 30, 30
+     december, 12, 31, 31
+
+   Separating the `struct' declaration from the list of keywords and
+other fields are a pair of consecutive percent signs, `%%', appearing
+left justified in the first column, as in the UNIX utility `lex'.
+
+   If the `struct' has already been declared in an include file, it can
+be mentioned in an abbreviated form, like this:
+
+     struct month;
+     %%
+     january,   1, 31, 31
+     ...
+
+\1f
+File: gperf.info,  Node: Gperf Declarations,  Next: C Code Inclusion,  Prev: User-supplied Struct,  Up: Declarations
+
+3.1.1.2 Gperf Declarations
+..........................
+
+   The declaration section can contain `gperf' declarations.  They
+influence the way `gperf' works, like command line options do.  In
+fact, every such declaration is equivalent to a command line option.
+There are three forms of declarations:
+
+  1. Declarations without argument, like `%compare-lengths'.
+
+  2. Declarations with an argument, like `%switch=COUNT'.
+
+  3. Declarations of names of entities in the output file, like
+     `%define lookup-function-name NAME'.
+
+   When a declaration is given both in the input file and as a command
+line option, the command-line option's value prevails.
+
+   The following `gperf' declarations are available.
+
+`%delimiters=DELIMITER-LIST'
+     Allows you to provide a string containing delimiters used to
+     separate keywords from their attributes.  The default is ",".  This
+     option is essential if you want to use keywords that have embedded
+     commas or newlines.
+
+`%struct-type'
+     Allows you to include a `struct' type declaration for generated
+     code; see above for an example.
+
+`%ignore-case'
+     Consider upper and lower case ASCII characters as equivalent.  The
+     string comparison will use a case insignificant character
+     comparison.  Note that locale dependent case mappings are ignored.
+
+`%language=LANGUAGE-NAME'
+     Instructs `gperf' to generate code in the language specified by the
+     option's argument.  Languages handled are currently:
+
+    `KR-C'
+          Old-style K&R C.  This language is understood by old-style C
+          compilers and ANSI C compilers, but ANSI C compilers may flag
+          warnings (or even errors) because of lacking `const'.
+
+    `C'
+          Common C.  This language is understood by ANSI C compilers,
+          and also by old-style C compilers, provided that you `#define
+          const' to empty for compilers which don't know about this
+          keyword.
+
+    `ANSI-C'
+          ANSI C.  This language is understood by ANSI C (C89, ISO C90)
+          compilers, ISO C99 compilers, and C++ compilers.
+
+    `C++'
+          C++.  This language is understood by C++ compilers.
+
+     The default is C.
+
+`%define slot-name NAME'
+     This declaration is only useful when option `-t' (or,
+     equivalently, the `%struct-type' declaration) has been given.  By
+     default, the program assumes the structure component identifier for
+     the keyword is `name'.  This option allows an arbitrary choice of
+     identifier for this component, although it still must occur as the
+     first field in your supplied `struct'.
+
+`%define initializer-suffix INITIALIZERS'
+     This declaration is only useful when option `-t' (or,
+     equivalently, the `%struct-type' declaration) has been given.  It
+     permits to specify initializers for the structure members following
+     SLOT-NAME in empty hash table entries.  The list of initializers
+     should start with a comma.  By default, the emitted code will
+     zero-initialize structure members following SLOT-NAME.
+
+`%define hash-function-name NAME'
+     Allows you to specify the name for the generated hash function.
+     Default name is `hash'.  This option permits the use of two hash
+     tables in the same file.
+
+`%define lookup-function-name NAME'
+     Allows you to specify the name for the generated lookup function.
+     Default name is `in_word_set'.  This option permits multiple
+     generated hash functions to be used in the same application.
+
+`%define class-name NAME'
+     This option is only useful when option `-L C++' (or, equivalently,
+     the `%language=C++' declaration) has been given.  It allows you to
+     specify the name of generated C++ class.  Default name is
+     `Perfect_Hash'.
+
+`%7bit'
+     This option specifies that all strings that will be passed as
+     arguments to the generated hash function and the generated lookup
+     function will solely consist of 7-bit ASCII characters (bytes in
+     the range 0..127).  (Note that the ANSI C functions `isalnum' and
+     `isgraph' do _not_ guarantee that a byte is in this range.  Only
+     an explicit test like `c >= 'A' && c <= 'Z'' guarantees this.)
+
+`%compare-lengths'
+     Compare keyword lengths before trying a string comparison.  This
+     option is mandatory for binary comparisons (*note Binary
+     Strings::).  It also might cut down on the number of string
+     comparisons made during the lookup, since keywords with different
+     lengths are never compared via `strcmp'.  However, using
+     `%compare-lengths' might greatly increase the size of the
+     generated C code if the lookup table range is large (which implies
+     that the switch option `-S' or `%switch' is not enabled), since
+     the length table contains as many elements as there are entries in
+     the lookup table.
+
+`%compare-strncmp'
+     Generates C code that uses the `strncmp' function to perform
+     string comparisons.  The default action is to use `strcmp'.
+
+`%readonly-tables'
+     Makes the contents of all generated lookup tables constant, i.e.,
+     "readonly".  Many compilers can generate more efficient code for
+     this by putting the tables in readonly memory.
+
+`%enum'
+     Define constant values using an enum local to the lookup function
+     rather than with #defines.  This also means that different lookup
+     functions can reside in the same file.  Thanks to James Clark
+     `<jjc@ai.mit.edu>'.
+
+`%includes'
+     Include the necessary system include file, `<string.h>', at the
+     beginning of the code.  By default, this is not done; the user must
+     include this header file himself to allow compilation of the code.
+
+`%global-table'
+     Generate the static table of keywords as a static global variable,
+     rather than hiding it inside of the lookup function (which is the
+     default behavior).
+
+`%pic'
+     Optimize the generated table for inclusion in shared libraries.
+     This reduces the startup time of programs using a shared library
+     containing the generated code.  If the `%struct-type' declaration
+     (or, equivalently, the option `-t') is also given, the first field
+     of the user-defined struct must be of type `int', not `char *',
+     because it will contain offsets into the string pool instead of
+     actual strings.  To convert such an offset to a string, you can
+     use the expression `stringpool + O', where O is the offset.  The
+     string pool name can be changed through the `%define
+     string-pool-name' declaration.
+
+`%define string-pool-name NAME'
+     Allows you to specify the name of the generated string pool
+     created by the declaration `%pic' (or, equivalently, the option
+     `-P').  The default name is `stringpool'.  This declaration
+     permits the use of two hash tables in the same file, with `%pic'
+     and even when the `%global-table' declaration (or, equivalently,
+     the option `-G') is given.
+
+`%null-strings'
+     Use NULL strings instead of empty strings for empty keyword table
+     entries.  This reduces the startup time of programs using a shared
+     library containing the generated code (but not as much as the
+     declaration `%pic'), at the expense of one more test-and-branch
+     instruction at run time.
+
+`%define word-array-name NAME'
+     Allows you to specify the name for the generated array containing
+     the hash table.  Default name is `wordlist'.  This option permits
+     the use of two hash tables in the same file, even when the option
+     `-G' (or, equivalently, the `%global-table' declaration) is given.
+
+`%define length-table-name NAME'
+     Allows you to specify the name for the generated array containing
+     the length table.  Default name is `lengthtable'.  This option
+     permits the use of two length tables in the same file, even when
+     the option `-G' (or, equivalently, the `%global-table'
+     declaration) is given.
+
+`%switch=COUNT'
+     Causes the generated C code to use a `switch' statement scheme,
+     rather than an array lookup table.  This can lead to a reduction
+     in both time and space requirements for some input files.  The
+     argument to this option determines how many `switch' statements
+     are generated.  A value of 1 generates 1 `switch' containing all
+     the elements, a value of 2 generates 2 tables with 1/2 the
+     elements in each `switch', etc.  This is useful since many C
+     compilers cannot correctly generate code for large `switch'
+     statements.  This option was inspired in part by Keith Bostic's
+     original C program.
+
+`%omit-struct-type'
+     Prevents the transfer of the type declaration to the output file.
+     Use this option if the type is already defined elsewhere.
+
+\1f
+File: gperf.info,  Node: C Code Inclusion,  Prev: Gperf Declarations,  Up: Declarations
+
+3.1.1.3 C Code Inclusion
+........................
+
+   Using a syntax similar to GNU utilities `flex' and `bison', it is
+possible to directly include C source text and comments verbatim into
+the generated output file.  This is accomplished by enclosing the region
+inside left-justified surrounding `%{', `%}' pairs.  Here is an input
+fragment based on the previous example that illustrates this feature:
+
+     %{
+     #include <assert.h>
+     /* This section of code is inserted directly into the output. */
+     int return_month_days (struct month *months, int is_leap_year);
+     %}
+     struct month { char *name; int number; int days; int leap_days; };
+     %%
+     january,   1, 31, 31
+     february,  2, 28, 29
+     march,     3, 31, 31
+     ...
+
+\1f
+File: gperf.info,  Node: Keywords,  Next: Functions,  Prev: Declarations,  Up: Input Format
+
+3.1.2 Format for Keyword Entries
+--------------------------------
+
+   The second input file format section contains lines of keywords and
+any associated attributes you might supply.  A line beginning with `#'
+in the first column is considered a comment.  Everything following the
+`#' is ignored, up to and including the following newline.  A line
+beginning with `%' in the first column is an option declaration and
+must not occur within the keywords section.
+
+   The first field of each non-comment line is always the keyword
+itself.  It can be given in two ways: as a simple name, i.e., without
+surrounding string quotation marks, or as a string enclosed in
+double-quotes, in C syntax, possibly with backslash escapes like `\"'
+or `\234' or `\xa8'.  In either case, it must start right at the
+beginning of the line, without leading whitespace.  In this context, a
+"field" is considered to extend up to, but not include, the first
+blank, comma, or newline.  Here is a simple example taken from a
+partial list of C reserved words:
+
+     # These are a few C reserved words, see the c.gperf file
+     # for a complete list of ANSI C reserved words.
+     unsigned
+     sizeof
+     switch
+     signed
+     if
+     default
+     for
+     while
+     return
+
+   Note that unlike `flex' or `bison' the first `%%' marker may be
+elided if the declaration section is empty.
+
+   Additional fields may optionally follow the leading keyword.  Fields
+should be separated by commas, and terminate at the end of line.  What
+these fields mean is entirely up to you; they are used to initialize the
+elements of the user-defined `struct' provided by you in the
+declaration section.  If the `-t' option (or, equivalently, the
+`%struct-type' declaration) is _not_ enabled these fields are simply
+ignored.  All previous examples except the last one contain keyword
+attributes.
+
+\1f
+File: gperf.info,  Node: Functions,  Next: Controls for GNU indent,  Prev: Keywords,  Up: Input Format
+
+3.1.3 Including Additional C Functions
+--------------------------------------
+
+   The optional third section also corresponds closely with conventions
+found in `flex' and `bison'.  All text in this section, starting at the
+final `%%' and extending to the end of the input file, is included
+verbatim into the generated output file.  Naturally, it is your
+responsibility to ensure that the code contained in this section is
+valid C.
+
+\1f
+File: gperf.info,  Node: Controls for GNU indent,  Prev: Functions,  Up: Input Format
+
+3.1.4 Where to place directives for GNU `indent'.
+-------------------------------------------------
+
+   If you want to invoke GNU `indent' on a `gperf' input file, you will
+see that GNU `indent' doesn't understand the `%%', `%{' and `%}'
+directives that control `gperf''s interpretation of the input file.
+Therefore you have to insert some directives for GNU `indent'.  More
+precisely, assuming the most general input file structure
+
+     declarations part 1
+     %{
+     verbatim code
+     %}
+     declarations part 2
+     %%
+     keywords
+     %%
+     functions
+
+you would insert `*INDENT-OFF*' and `*INDENT-ON*' comments as follows:
+
+     /* *INDENT-OFF* */
+     declarations part 1
+     %{
+     /* *INDENT-ON* */
+     verbatim code
+     /* *INDENT-OFF* */
+     %}
+     declarations part 2
+     %%
+     keywords
+     %%
+     /* *INDENT-ON* */
+     functions
+
+\1f
+File: gperf.info,  Node: Output Format,  Next: Binary Strings,  Prev: Input Format,  Up: Description
+
+3.2 Output Format for Generated C Code with `gperf'
+===================================================
+
+   Several options control how the generated C code appears on the
+standard output.  Two C functions are generated.  They are called
+`hash' and `in_word_set', although you may modify their names with a
+command-line option.  Both functions require two arguments, a string,
+`char *' STR, and a length parameter, `int' LEN.  Their default
+function prototypes are as follows:
+
+ -- Function: unsigned int hash (const char * STR, unsigned int LEN)
+     By default, the generated `hash' function returns an integer value
+     created by adding LEN to several user-specified STR byte positions
+     indexed into an "associated values" table stored in a local static
+     array.  The associated values table is constructed internally by
+     `gperf' and later output as a static local C array called
+     `hash_table'.  The relevant selected positions (i.e. indices into
+     STR) are specified via the `-k' option when running `gperf', as
+     detailed in the _Options_ section below (*note Options::).
+
+ -- Function:  in_word_set (const char * STR, unsigned int LEN)
+     If STR is in the keyword set, returns a pointer to that keyword.
+     More exactly, if the option `-t' (or, equivalently, the
+     `%struct-type' declaration) was given, it returns a pointer to the
+     matching keyword's structure.  Otherwise it returns `NULL'.
+
+   If the option `-c' (or, equivalently, the `%compare-strncmp'
+declaration) is not used, STR must be a NUL terminated string of
+exactly length LEN.  If `-c' (or, equivalently, the `%compare-strncmp'
+declaration) is used, STR must simply be an array of LEN bytes and does
+not need to be NUL terminated.
+
+   The code generated for these two functions is affected by the
+following options:
+
+`-t'
+`--struct-type'
+     Make use of the user-defined `struct'.
+
+`-S TOTAL-SWITCH-STATEMENTS'
+`--switch=TOTAL-SWITCH-STATEMENTS'
+     Generate 1 or more C `switch' statement rather than use a large,
+     (and potentially sparse) static array.  Although the exact time and
+     space savings of this approach vary according to your C compiler's
+     degree of optimization, this method often results in smaller and
+     faster code.
+
+   If the `-t' and `-S' options (or, equivalently, the `%struct-type'
+and `%switch' declarations) are omitted, the default action is to
+generate a `char *' array containing the keywords, together with
+additional empty strings used for padding the array.  By experimenting
+with the various input and output options, and timing the resulting C
+code, you can determine the best option choices for different keyword
+set characteristics.
+
+\1f
+File: gperf.info,  Node: Binary Strings,  Next: Output Copyright,  Prev: Output Format,  Up: Description
+
+3.3 Use of NUL bytes
+====================
+
+   By default, the code generated by `gperf' operates on zero
+terminated strings, the usual representation of strings in C.  This
+means that the keywords in the input file must not contain NUL bytes,
+and the STR argument passed to `hash' or `in_word_set' must be NUL
+terminated and have exactly length LEN.
+
+   If option `-c' (or, equivalently, the `%compare-strncmp'
+declaration) is used, then the STR argument does not need to be NUL
+terminated.  The code generated by `gperf' will only access the first
+LEN, not LEN+1, bytes starting at STR.  However, the keywords in the
+input file still must not contain NUL bytes.
+
+   If option `-l' (or, equivalently, the `%compare-lengths'
+declaration) is used, then the hash table performs binary comparison.
+The keywords in the input file may contain NUL bytes, written in string
+syntax as `\000' or `\x00', and the code generated by `gperf' will
+treat NUL like any other byte.  Also, in this case the `-c' option (or,
+equivalently, the `%compare-strncmp' declaration) is ignored.
+
+\1f
+File: gperf.info,  Node: Output Copyright,  Prev: Binary Strings,  Up: Description
+
+3.4 The Copyright of the Output
+===============================
+
+   `gperf' is under GPL, but that does not cause the output produced by
+`gperf' to be under GPL.  The reason is that the output contains only
+small pieces of text that come directly from `gperf''s source code -
+only about 7 lines long, too small for being significant -, and
+therefore the output is not a "work based on `gperf'" (in the sense of
+the GPL version 3).
+
+   On the other hand, the output produced by `gperf' contains
+essentially all of the input file.  Therefore the output is a
+"derivative work" of the input (in the sense of U.S. copyright law);
+and its copyright status depends on the copyright of the input.  For
+most software licenses, the result is that the the output is under the
+same license, with the same copyright holder, as the input that was
+passed to `gperf'.
+
+\1f
+File: gperf.info,  Node: Options,  Next: Bugs,  Prev: Description,  Up: Top
+
+4 Invoking `gperf'
+******************
+
+   There are _many_ options to `gperf'.  They were added to make the
+program more convenient for use with real applications.  "On-line" help
+is readily available via the `--help' option.  Here is the complete
+list of options.
+
+* Menu:
+
+* Output File::                 Specifying the Location of the Output File
+* Input Details::               Options that affect Interpretation of the Input File
+* Output Language::             Specifying the Language for the Output Code
+* Output Details::              Fine tuning Details in the Output Code
+* Algorithmic Details::         Changing the Algorithms employed by `gperf'
+* Verbosity::                   Informative Output
+
+\1f
+File: gperf.info,  Node: Output File,  Next: Input Details,  Prev: Options,  Up: Options
+
+4.1 Specifying the Location of the Output File
+==============================================
+
+`--output-file=FILE'
+     Allows you to specify the name of the file to which the output is
+     written to.
+
+   The results are written to standard output if no output file is
+specified or if it is `-'.
+
+\1f
+File: gperf.info,  Node: Input Details,  Next: Output Language,  Prev: Output File,  Up: Options
+
+4.2 Options that affect Interpretation of the Input File
+========================================================
+
+   These options are also available as declarations in the input file
+(*note Gperf Declarations::).
+
+`-e KEYWORD-DELIMITER-LIST'
+`--delimiters=KEYWORD-DELIMITER-LIST'
+     Allows you to provide a string containing delimiters used to
+     separate keywords from their attributes.  The default is ",".  This
+     option is essential if you want to use keywords that have embedded
+     commas or newlines.  One useful trick is to use -e'TAB', where TAB
+     is the literal tab character.
+
+`-t'
+`--struct-type'
+     Allows you to include a `struct' type declaration for generated
+     code.  Any text before a pair of consecutive `%%' is considered
+     part of the type declaration.  Keywords and additional fields may
+     follow this, one group of fields per line.  A set of examples for
+     generating perfect hash tables and functions for Ada, C, C++,
+     Pascal, Modula 2, Modula 3 and JavaScript reserved words are
+     distributed with this release.
+
+`--ignore-case'
+     Consider upper and lower case ASCII characters as equivalent.  The
+     string comparison will use a case insignificant character
+     comparison.  Note that locale dependent case mappings are ignored.
+     This option is therefore not suitable if a properly
+     internationalized or locale aware case mapping should be used.
+     (For example, in a Turkish locale, the upper case equivalent of
+     the lowercase ASCII letter `i' is the non-ASCII character `capital
+     i with dot above'.)  For this case, it is better to apply an
+     uppercase or lowercase conversion on the string before passing it
+     to the `gperf' generated function.
+
+\1f
+File: gperf.info,  Node: Output Language,  Next: Output Details,  Prev: Input Details,  Up: Options
+
+4.3 Options to specify the Language for the Output Code
+=======================================================
+
+   These options are also available as declarations in the input file
+(*note Gperf Declarations::).
+
+`-L GENERATED-LANGUAGE-NAME'
+`--language=GENERATED-LANGUAGE-NAME'
+     Instructs `gperf' to generate code in the language specified by the
+     option's argument.  Languages handled are currently:
+
+    `KR-C'
+          Old-style K&R C.  This language is understood by old-style C
+          compilers and ANSI C compilers, but ANSI C compilers may flag
+          warnings (or even errors) because of lacking `const'.
+
+    `C'
+          Common C.  This language is understood by ANSI C compilers,
+          and also by old-style C compilers, provided that you `#define
+          const' to empty for compilers which don't know about this
+          keyword.
+
+    `ANSI-C'
+          ANSI C.  This language is understood by ANSI C compilers and
+          C++ compilers.
+
+    `C++'
+          C++.  This language is understood by C++ compilers.
+
+     The default is C.
+
+`-a'
+     This option is supported for compatibility with previous releases
+     of `gperf'.  It does not do anything.
+
+`-g'
+     This option is supported for compatibility with previous releases
+     of `gperf'.  It does not do anything.
+
+\1f
+File: gperf.info,  Node: Output Details,  Next: Algorithmic Details,  Prev: Output Language,  Up: Options
+
+4.4 Options for fine tuning Details in the Output Code
+======================================================
+
+   Most of these options are also available as declarations in the
+input file (*note Gperf Declarations::).
+
+`-K SLOT-NAME'
+`--slot-name=SLOT-NAME'
+     This option is only useful when option `-t' (or, equivalently, the
+     `%struct-type' declaration) has been given.  By default, the
+     program assumes the structure component identifier for the keyword
+     is `name'.  This option allows an arbitrary choice of identifier
+     for this component, although it still must occur as the first
+     field in your supplied `struct'.
+
+`-F INITIALIZERS'
+`--initializer-suffix=INITIALIZERS'
+     This option is only useful when option `-t' (or, equivalently, the
+     `%struct-type' declaration) has been given.  It permits to specify
+     initializers for the structure members following SLOT-NAME in
+     empty hash table entries.  The list of initializers should start
+     with a comma.  By default, the emitted code will zero-initialize
+     structure members following SLOT-NAME.
+
+`-H HASH-FUNCTION-NAME'
+`--hash-function-name=HASH-FUNCTION-NAME'
+     Allows you to specify the name for the generated hash function.
+     Default name is `hash'.  This option permits the use of two hash
+     tables in the same file.
+
+`-N LOOKUP-FUNCTION-NAME'
+`--lookup-function-name=LOOKUP-FUNCTION-NAME'
+     Allows you to specify the name for the generated lookup function.
+     Default name is `in_word_set'.  This option permits multiple
+     generated hash functions to be used in the same application.
+
+`-Z CLASS-NAME'
+`--class-name=CLASS-NAME'
+     This option is only useful when option `-L C++' (or, equivalently,
+     the `%language=C++' declaration) has been given.  It allows you to
+     specify the name of generated C++ class.  Default name is
+     `Perfect_Hash'.
+
+`-7'
+`--seven-bit'
+     This option specifies that all strings that will be passed as
+     arguments to the generated hash function and the generated lookup
+     function will solely consist of 7-bit ASCII characters (bytes in
+     the range 0..127).  (Note that the ANSI C functions `isalnum' and
+     `isgraph' do _not_ guarantee that a byte is in this range.  Only
+     an explicit test like `c >= 'A' && c <= 'Z'' guarantees this.)
+     This was the default in versions of `gperf' earlier than 2.7; now
+     the default is to support 8-bit and multibyte characters.
+
+`-l'
+`--compare-lengths'
+     Compare keyword lengths before trying a string comparison.  This
+     option is mandatory for binary comparisons (*note Binary
+     Strings::).  It also might cut down on the number of string
+     comparisons made during the lookup, since keywords with different
+     lengths are never compared via `strcmp'.  However, using `-l'
+     might greatly increase the size of the generated C code if the
+     lookup table range is large (which implies that the switch option
+     `-S' or `%switch' is not enabled), since the length table contains
+     as many elements as there are entries in the lookup table.
+
+`-c'
+`--compare-strncmp'
+     Generates C code that uses the `strncmp' function to perform
+     string comparisons.  The default action is to use `strcmp'.
+
+`-C'
+`--readonly-tables'
+     Makes the contents of all generated lookup tables constant, i.e.,
+     "readonly".  Many compilers can generate more efficient code for
+     this by putting the tables in readonly memory.
+
+`-E'
+`--enum'
+     Define constant values using an enum local to the lookup function
+     rather than with #defines.  This also means that different lookup
+     functions can reside in the same file.  Thanks to James Clark
+     `<jjc@ai.mit.edu>'.
+
+`-I'
+`--includes'
+     Include the necessary system include file, `<string.h>', at the
+     beginning of the code.  By default, this is not done; the user must
+     include this header file himself to allow compilation of the code.
+
+`-G'
+`--global-table'
+     Generate the static table of keywords as a static global variable,
+     rather than hiding it inside of the lookup function (which is the
+     default behavior).
+
+`-P'
+`--pic'
+     Optimize the generated table for inclusion in shared libraries.
+     This reduces the startup time of programs using a shared library
+     containing the generated code.  If the option `-t' (or,
+     equivalently, the `%struct-type' declaration) is also given, the
+     first field of the user-defined struct must be of type `int', not
+     `char *', because it will contain offsets into the string pool
+     instead of actual strings.  To convert such an offset to a string,
+     you can use the expression `stringpool + O', where O is the
+     offset.  The string pool name can be changed through the option
+     `--string-pool-name'.
+
+`-Q STRING-POOL-NAME'
+`--string-pool-name=STRING-POOL-NAME'
+     Allows you to specify the name of the generated string pool
+     created by option `-P'.  The default name is `stringpool'.  This
+     option permits the use of two hash tables in the same file, with
+     `-P' and even when the option `-G' (or, equivalently, the
+     `%global-table' declaration) is given.
+
+`--null-strings'
+     Use NULL strings instead of empty strings for empty keyword table
+     entries.  This reduces the startup time of programs using a shared
+     library containing the generated code (but not as much as option
+     `-P'), at the expense of one more test-and-branch instruction at
+     run time.
+
+`-W HASH-TABLE-ARRAY-NAME'
+`--word-array-name=HASH-TABLE-ARRAY-NAME'
+     Allows you to specify the name for the generated array containing
+     the hash table.  Default name is `wordlist'.  This option permits
+     the use of two hash tables in the same file, even when the option
+     `-G' (or, equivalently, the `%global-table' declaration) is given.
+
+`--length-table-name=LENGTH-TABLE-ARRAY-NAME'
+     Allows you to specify the name for the generated array containing
+     the length table.  Default name is `lengthtable'.  This option
+     permits the use of two length tables in the same file, even when
+     the option `-G' (or, equivalently, the `%global-table'
+     declaration) is given.
+
+`-S TOTAL-SWITCH-STATEMENTS'
+`--switch=TOTAL-SWITCH-STATEMENTS'
+     Causes the generated C code to use a `switch' statement scheme,
+     rather than an array lookup table.  This can lead to a reduction
+     in both time and space requirements for some input files.  The
+     argument to this option determines how many `switch' statements
+     are generated.  A value of 1 generates 1 `switch' containing all
+     the elements, a value of 2 generates 2 tables with 1/2 the
+     elements in each `switch', etc.  This is useful since many C
+     compilers cannot correctly generate code for large `switch'
+     statements.  This option was inspired in part by Keith Bostic's
+     original C program.
+
+`-T'
+`--omit-struct-type'
+     Prevents the transfer of the type declaration to the output file.
+     Use this option if the type is already defined elsewhere.
+
+`-p'
+     This option is supported for compatibility with previous releases
+     of `gperf'.  It does not do anything.
+
+\1f
+File: gperf.info,  Node: Algorithmic Details,  Next: Verbosity,  Prev: Output Details,  Up: Options
+
+4.5 Options for changing the Algorithms employed by `gperf'
+===========================================================
+
+`-k SELECTED-BYTE-POSITIONS'
+`--key-positions=SELECTED-BYTE-POSITIONS'
+     Allows selection of the byte positions used in the keywords' hash
+     function.  The allowable choices range between 1-255, inclusive.
+     The positions are separated by commas, e.g., `-k 9,4,13,14';
+     ranges may be used, e.g., `-k 2-7'; and positions may occur in any
+     order.  Furthermore, the wildcard '*' causes the generated hash
+     function to consider *all* byte positions in each keyword, whereas
+     '$' instructs the hash function to use the "final byte" of a
+     keyword (this is the only way to use a byte position greater than
+     255, incidentally).
+
+     For instance, the option `-k 1,2,4,6-10,'$'' generates a hash
+     function that considers positions 1,2,4,6,7,8,9,10, plus the last
+     byte in each keyword (which may be at a different position for each
+     keyword, obviously).  Keywords with length less than the indicated
+     byte positions work properly, since selected byte positions
+     exceeding the keyword length are simply not referenced in the hash
+     function.
+
+     This option is not normally needed since version 2.8 of `gperf';
+     the default byte positions are computed depending on the keyword
+     set, through a search that minimizes the number of byte positions.
+
+`-D'
+`--duplicates'
+     Handle keywords whose selected byte sets hash to duplicate values.
+     Duplicate hash values can occur if a set of keywords has the same
+     names, but possesses different attributes, or if the selected byte
+     positions are not well chosen.  With the -D option `gperf' treats
+     all these keywords as part of an equivalence class and generates a
+     perfect hash function with multiple comparisons for duplicate
+     keywords.  It is up to you to completely disambiguate the keywords
+     by modifying the generated C code.  However, `gperf' helps you out
+     by organizing the output.
+
+     Using this option usually means that the generated hash function
+     is no longer perfect.  On the other hand, it permits `gperf' to
+     work on keyword sets that it otherwise could not handle.
+
+`-m ITERATIONS'
+`--multiple-iterations=ITERATIONS'
+     Perform multiple choices of the `-i' and `-j' values, and choose
+     the best results.  This increases the running time by a factor of
+     ITERATIONS but does a good job minimizing the generated table size.
+
+`-i INITIAL-VALUE'
+`--initial-asso=INITIAL-VALUE'
+     Provides an initial VALUE for the associate values array.  Default
+     is 0.  Increasing the initial value helps inflate the final table
+     size, possibly leading to more time efficient keyword lookups.
+     Note that this option is not particularly useful when `-S' (or,
+     equivalently, `%switch') is used.  Also, `-i' is overridden when
+     the `-r' option is used.
+
+`-j JUMP-VALUE'
+`--jump=JUMP-VALUE'
+     Affects the "jump value", i.e., how far to advance the associated
+     byte value upon collisions.  JUMP-VALUE is rounded up to an odd
+     number, the default is 5.  If the JUMP-VALUE is 0 `gperf' jumps by
+     random amounts.
+
+`-n'
+`--no-strlen'
+     Instructs the generator not to include the length of a keyword when
+     computing its hash value.  This may save a few assembly
+     instructions in the generated lookup table.
+
+`-r'
+`--random'
+     Utilizes randomness to initialize the associated values table.
+     This frequently generates solutions faster than using deterministic
+     initialization (which starts all associated values at 0).
+     Furthermore, using the randomization option generally increases
+     the size of the table.
+
+`-s SIZE-MULTIPLE'
+`--size-multiple=SIZE-MULTIPLE'
+     Affects the size of the generated hash table.  The numeric
+     argument for this option indicates "how many times larger or
+     smaller" the maximum associated value range should be, in
+     relationship to the number of keywords.  It can be written as an
+     integer, a floating-point number or a fraction.  For example, a
+     value of 3 means "allow the maximum associated value to be about 3
+     times larger than the number of input keywords".  Conversely, a
+     value of 1/3 means "allow the maximum associated value to be about
+     3 times smaller than the number of input keywords".  Values
+     smaller than 1 are useful for limiting the overall size of the
+     generated hash table, though the option `-m' is better at this
+     purpose.
+
+     If `generate switch' option `-S' (or, equivalently, `%switch') is
+     _not_ enabled, the maximum associated value influences the static
+     array table size, and a larger table should decrease the time
+     required for an unsuccessful search, at the expense of extra table
+     space.
+
+     The default value is 1, thus the default maximum associated value
+     about the same size as the number of keywords (for efficiency, the
+     maximum associated value is always rounded up to a power of 2).
+     The actual table size may vary somewhat, since this technique is
+     essentially a heuristic.
+
+\1f
+File: gperf.info,  Node: Verbosity,  Prev: Algorithmic Details,  Up: Options
+
+4.6 Informative Output
+======================
+
+`-h'
+`--help'
+     Prints a short summary on the meaning of each program option.
+     Aborts further program execution.
+
+`-v'
+`--version'
+     Prints out the current version number.
+
+`-d'
+`--debug'
+     Enables the debugging option.  This produces verbose diagnostics to
+     "standard error" when `gperf' is executing.  It is useful both for
+     maintaining the program and for determining whether a given set of
+     options is actually speeding up the search for a solution.  Some
+     useful information is dumped at the end of the program when the
+     `-d' option is enabled.
+
+\1f
+File: gperf.info,  Node: Bugs,  Next: Projects,  Prev: Options,  Up: Top
+
+5 Known Bugs and Limitations with `gperf'
+*****************************************
+
+   The following are some limitations with the current release of
+`gperf':
+
+   * The `gperf' utility is tuned to execute quickly, and works quickly
+     for small to medium size data sets (around 1000 keywords).  It is
+     extremely useful for maintaining perfect hash functions for
+     compiler keyword sets.  Several recent enhancements now enable
+     `gperf' to work efficiently on much larger keyword sets (over
+     15,000 keywords).  When processing large keyword sets it helps
+     greatly to have over 8 megs of RAM.
+
+   * The size of the generate static keyword array can get _extremely_
+     large if the input keyword file is large or if the keywords are
+     quite similar.  This tends to slow down the compilation of the
+     generated C code, and _greatly_ inflates the object code size.  If
+     this situation occurs, consider using the `-S' option to reduce
+     data size, potentially increasing keyword recognition time a
+     negligible amount.  Since many C compilers cannot correctly
+     generate code for large switch statements it is important to
+     qualify the -S option with an appropriate numerical argument that
+     controls the number of switch statements generated.
+
+   * The maximum number of selected byte positions has an arbitrary
+     limit of 255.  This restriction should be removed, and if anyone
+     considers this a problem write me and let me know so I can remove
+     the constraint.
+
+\1f
+File: gperf.info,  Node: Projects,  Next: Bibliography,  Prev: Bugs,  Up: Top
+
+6 Things Still Left to Do
+*************************
+
+   It should be "relatively" easy to replace the current perfect hash
+function algorithm with a more exhaustive approach; the perfect hash
+module is essential independent from other program modules.  Additional
+worthwhile improvements include:
+
+   * Another useful extension involves modifying the program to generate
+     "minimal" perfect hash functions (under certain circumstances, the
+     current version can be rather extravagant in the generated table
+     size).  This is mostly of theoretical interest, since a sparse
+     table often produces faster lookups, and use of the `-S' `switch'
+     option can minimize the data size, at the expense of slightly
+     longer lookups (note that the gcc compiler generally produces good
+     code for `switch' statements, reducing the need for more complex
+     schemes).
+
+   * In addition to improving the algorithm, it would also be useful to
+     generate an Ada package as the code output, in addition to the
+     current C and C++ routines.
+
+\1f
+File: gperf.info,  Node: Bibliography,  Next: Concept Index,  Prev: Projects,  Up: Top
+
+7 Bibliography
+**************
+
+[1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect
+Hashing Functions Information Sciences 39(1986), 187-195.
+
+[2] Cichelli, Richard J. Author's Response to "On Cichelli's Minimal
+Perfect Hash Functions Method" Communications of the ACM, 23,
+12(December 1980), 729.
+
+[3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple
+Communications of the ACM, 23, 1(January 1980), 17-19.
+
+[4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal Perfect
+Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27.
+
+[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
+Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58.
+
+[6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal
+Perfect Hashing Functions Communications of the ACM, 24, 12(December
+1981), 829-833.
+
+[7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect Hash
+Functions Method Communications of the ACM, 23, 12(December 1980),
+728-729.
+
+[8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect
+Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532
+
+[9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator Second
+USENIX C++ Conference Proceedings, April 1990.
+
+[10] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator C++
+Report, SIGS 10 10 (November/December 1998).
+
+[11] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions for
+Reserved Word Lists  SIGPLAN Notices, 20, 12(September 1985), 47-53.
+
+[12] Sprugnoli, R. Perfect Hashing Functions: A Single Probe Retrieving
+Method for Static Sets Communications of the ACM, 20 11(November 1977),
+841-850.
+
+[13] Stallman, Richard M. Using and Porting GNU CC Free Software
+Foundation, 1988.
+
+[14] Stroustrup, Bjarne The C++ Programming Language. Addison-Wesley,
+1986.
+
+[15] Tiemann, Michael D. User's Guide to GNU C++ Free Software
+Foundation, 1989.
+
+\1f
+File: gperf.info,  Node: Concept Index,  Prev: Bibliography,  Up: Top
+
+Concept Index
+*************
+
+\0\b[index\0\b]
+* Menu:
+
+* %%:                                    User-supplied Struct.
+                                                              (line  33)
+* %7bit:                                 Gperf Declarations.  (line  95)
+* %compare-lengths:                      Gperf Declarations.  (line 103)
+* %compare-strncmp:                      Gperf Declarations.  (line 115)
+* %define class-name:                    Gperf Declarations.  (line  89)
+* %define hash-function-name:            Gperf Declarations.  (line  79)
+* %define initializer-suffix:            Gperf Declarations.  (line  71)
+* %define length-table-name:             Gperf Declarations.  (line 173)
+* %define lookup-function-name:          Gperf Declarations.  (line  84)
+* %define slot-name:                     Gperf Declarations.  (line  63)
+* %define string-pool-name:              Gperf Declarations.  (line 152)
+* %define word-array-name:               Gperf Declarations.  (line 167)
+* %delimiters:                           Gperf Declarations.  (line  24)
+* %enum:                                 Gperf Declarations.  (line 124)
+* %global-table:                         Gperf Declarations.  (line 135)
+* %ignore-case:                          Gperf Declarations.  (line  34)
+* %includes:                             Gperf Declarations.  (line 130)
+* %language:                             Gperf Declarations.  (line  39)
+* %null-strings:                         Gperf Declarations.  (line 160)
+* %omit-struct-type:                     Gperf Declarations.  (line 192)
+* %pic:                                  Gperf Declarations.  (line 140)
+* %readonly-tables:                      Gperf Declarations.  (line 119)
+* %struct-type:                          Gperf Declarations.  (line  30)
+* %switch:                               Gperf Declarations.  (line 180)
+* %{:                                    C Code Inclusion.    (line   6)
+* %}:                                    C Code Inclusion.    (line   6)
+* Array name:                            Output Details.      (line 129)
+* Bugs:                                  Contributors.        (line   6)
+* Class name:                            Output Details.      (line  41)
+* Copyright:                             Output Copyright.    (line   6)
+* Declaration section:                   Input Format.        (line   6)
+* Delimiters:                            Input Details.       (line  11)
+* Duplicates:                            Algorithmic Details. (line  32)
+* Format:                                Input Format.        (line   6)
+* Functions section:                     Input Format.        (line   6)
+* hash:                                  Output Format.       (line  14)
+* hash table:                            Output Format.       (line   6)
+* in_word_set:                           Output Format.       (line  24)
+* Initializers:                          Output Details.      (line  20)
+* Jump value:                            Algorithmic Details. (line  63)
+* Keywords section:                      Input Format.        (line   6)
+* Minimal perfect hash functions:        Search Structures.   (line  30)
+* NUL:                                   Binary Strings.      (line   6)
+* Slot name:                             Output Details.      (line  11)
+* Static search structure:               Search Structures.   (line   6)
+* switch <1>:                            Output Details.      (line 143)
+* switch:                                Output Format.       (line  44)
+
+
+\1f
+Tag Table:
+Node: Top\7f1237
+Node: Copying\7f3374
+Node: Contributors\7f40915
+Node: Motivation\7f42108
+Node: Search Structures\7f43240
+Node: Description\7f46799
+Node: Input Format\7f48757
+Node: Declarations\7f49902
+Node: User-supplied Struct\7f50490
+Node: Gperf Declarations\7f52105
+Node: C Code Inclusion\7f60897
+Node: Keywords\7f61740
+Node: Functions\7f63688
+Node: Controls for GNU indent\7f64226
+Node: Output Format\7f65177
+Node: Binary Strings\7f67972
+Node: Output Copyright\7f69148
+Node: Options\7f70087
+Node: Output File\7f70876
+Node: Input Details\7f71268
+Node: Output Language\7f73107
+Node: Output Details\7f74526
+Node: Algorithmic Details\7f81793
+Node: Verbosity\7f87050
+Node: Bugs\7f87761
+Node: Projects\7f89357
+Node: Bibliography\7f90489
+Node: Concept Index\7f92504
+\1f
+End Tag Table
diff --git a/doc/gperf.pdf b/doc/gperf.pdf
new file mode 100644 (file)
index 0000000..0e63e4b
Binary files /dev/null and b/doc/gperf.pdf differ
diff --git a/doc/gperf.ps b/doc/gperf.ps
new file mode 100644 (file)
index 0000000..cb1ba65
--- /dev/null
@@ -0,0 +1,6356 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software
+%%Title: ./gperf.dvi
+%%CreationDate: Sun Feb  1 12:20:28 2009
+%%Pages: 37
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentFonts: CMBX12 CMTT12 CMR10 CMSY10 CMTT10 CMSLTT10 CMTT9 CMSL10
+%%+ CMTI10 CMSS10 CMB10 CMR9 CMMI9 CMMI12 CMMI10
+%%DocumentPaperSizes: a4
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D600 -o gperf.ps ./gperf.dvi
+%DVIPSParameters: dpi=600
+%DVIPSSource:  TeX output 2009.02.01:1220
+%%BeginProcSet: tex.pro 0 0
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: texps.pro 0 0
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMMI10
+%!PS-AdobeFont-1.1: CMMI10 1.100
+%%CreationDate: 1996 Jul 23 07:53:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+/FontBBox{-32 -250 1048 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321
+990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E
+6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB
+DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721
+59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823
+D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF
+8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808
+6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9
+1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE
+03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909
+95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1
+74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2
+3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8
+47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19
+AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8
+42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8
+40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837
+B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53
+9560176676ABB71BBD0EE56B4CC492C0652750227CEC6CBEEE374709231B00CD
+0DE83AFDE295B314F6C8B1FFD32251C1925D96A64D739FF1DA4926460B28B3DE
+E949AA0BA3DDB16534FBA30C32092D5F712B5E8C8D5142F35AF2906E6C219D2C
+7FD9A368C193E0EB9C7E25FF03C546B6ED993F964CEDB1B8537C617170787F37
+88D6F2AD02384B01067FE3F98257BAB958BB3BCD1001090A4502DA0638080EC6
+DB784CC8AC37CDC01B29BC481D6A05ADC6188785262358C1BF1D694BBF31C1F1
+AF117C1ACED44AAC6EB4B9A2511A6762DDE8FCCBA5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMMI12
+%!PS-AdobeFont-1.1: CMMI12 1.100
+%%CreationDate: 1996 Jul 27 08:57:55
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+/FontBBox{-30 -250 1026 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5
+5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC
+4391C9DF440285B8FC159D0E98D4258FC57892DCC57F7903449E07914FBE9E67
+3C15C2153C061EB541F66C11E7EE77D5D77C0B11E1AC55101DA976CCACAB6993
+EED1406FBB7FF30EAC9E90B90B2AF4EC7C273CA32F11A5C1426FF641B4A2FB2F
+4E68635C93DB835737567FAF8471CBC05078DCD4E40E25A2F4E5AF46C234CF59
+2A1CE8F39E1BA1B2A594355637E474167EAD4D97D51AF0A899B44387E1FD933A
+323AFDA6BA740534A510B4705C0A15647AFBF3E53A82BF320DD96753639BE49C
+2F79A1988863EF977B800C9DB5B42039C23EB86953713F730E03EA22FF7BB2C1
+D97D33FD77B1BDCC2A60B12CF7805CFC90C5B914C0F30A673DF9587F93E47CEA
+5932DD1930560C4F0D97547BCD805D6D854455B13A4D7382A22F562D7C55041F
+0FD294BDAA1834820F894265A667E5C97D95FF152531EF97258F56374502865D
+A1E7C0C5FB7C6FB7D3C43FEB3431095A59FBF6F61CEC6D6DEE09F4EB0FD70D77
+2A8B0A4984C6120293F6B947944BE23259F6EB64303D627353163B6505FC8A60
+00681F7A3968B6CBB49E0420A691258F5E7B07B417157803FCBE9B9FB1F80FD8
+CA0DA1186446DD565542BCCC7D339A1EB34C7F49246E8D72E987EB477C6DB757
+99AF86CEBCD7605C487A00CD2CD093098182DC57B20D78ECE0BECF3A0BF88EBA
+C866DB19F34BBBED6634AFC0F08D2AFB2A92578A6F8B4ADCD6594737FF6EED7D
+5B536DA9E3E2CADB40DB7C600EA4D100D33C3B92B1CF857E012C4EB370BA8295
+55B50047CC8911C98FE1A7BA6CDEA82D34476286E710776823690AD333DD3A49
+335002F4680DBE1C21174BF016B0DF799B01EB9D6988479A8334BBA2F8DC7146
+BC0DAE9DE3A6453B181808E68A89E0C02DAC6264D002B422EBC1CF14F65D9888
+15EE6D514D3457F7F3C6A3D17EE1DA076F73ECC392D349174DA9E4680F29CE10
+0157E42CA35F5DBFF56BFC3AA07E61A78DBE882C5AB388220C19750D3643E7C8
+23D6673027CE568A4ACCE1D12B1D9E5A43507F4AF9BC873237F65A6B95078DD2
+378007CF0F0DE7CCEF760E19D6D1D7B412EC5D4972
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMMI9
+%!PS-AdobeFont-1.1: CMMI9 1.100
+%%CreationDate: 1996 Jul 23 07:53:55
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+readonly def
+/FontBBox{-29 -250 1075 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935
+86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505
+DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD
+67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF
+6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554
+FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7
+22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD
+730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F
+449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7
+97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A
+E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C
+AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA
+A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599
+B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B
+9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E
+759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3
+5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2
+BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680
+3435E9C9445A59A7C666418C4F2512C32058B1CE1EA46C7839C6E372F6CC60AE
+2CF46DD2F130B532DE8ECD42D9204500E413799E298CF6426F28D23BB7216BEA
+1A618B3ECC61B44DDEF0BB22D640B47C09AC0DF378CE68FC9CD88BDAE9ED89CB
+431A5CF9C3E9528FEE7A9936C2B1CF7B38DD2B95773F0EA0051607BE1B0B3588
+A8B907A5EF011B4622C5093A7B107DD1EED6FEE9536DECF1CC96E65373D0F433
+30AE3C094654ABF4698C07F8C74E71D023DFD242EE83B1306786124DD8C6BFA7
+801E66CB944BE7EBCB3FE803EC97067AF7AFC8A4E9AC9D11
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.1: CMR9 1.0
+%%CreationDate: 1991 Aug 20 16:39:59
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 44 /comma put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 70 /F put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 83 /S put
+dup 85 /U put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+dup 122 /z put
+readonly def
+/FontBBox{-39 -250 1036 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835
+3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203
+046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E
+C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A
+A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2
+A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D
+731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B
+09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1
+49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B
+5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B
+54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C
+C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F
+11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC
+D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A
+109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40
+3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343
+C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7A66D8E9C810
+49CCC0D35AE00D3669EC7D8ED957EEB2105BDCF7408E0B04A325495D38BCE845
+E96329244411EAAC14D3ABDD2BECAD7D391ADFFE3F7565B14FD29737EAAED3C0
+7F3981DDBE07D4AC09F6C1A32369BB88852CCE980C1E950E27EF3CF8A840B393
+9792FC1A510BCB4A2976BB640EE4510EA2BA3C7B5FE02F5F0F845B6B00F617FD
+EB4655CED34B0097F22329071DE7738CA994BD0F983C5C4599AB9161F3776023
+9AB724F231D9C38A76FC8F6A2DD4E6C9FD2B8061CDC814442CC69E94D437AC78
+B2DB204A99A3240E1123E0568F6EDFE11586FD1056FD547B7CC477D8D32796D8
+A37A1D4F89A6371F302C421EB4279D560D645BE186DC504CA606DE1EBCE98358
+0B8C800A25D76755E1006164AED015712653A9EF8DB0B980E8A2E6D30E9CA40B
+433989DAF8A217D2A70E1F2C2B994615FB279E30AAF8B978895F1CADD9259DFE
+03DBC2D65ABBC25560ECAD7F743FCCBDA16EB8AEEDD091BF1DF8339DF57DCDF6
+7CF63057040C0FD028EDE603C19448D1CA4AE12B15DCA284FB786B144A2D7E8A
+82ED6CC0CC8A43E5CBB660231928EAD80834F2F58311DB3FAC75D071A496C3D6
+24AEEB63CA0697CABD7A59C526C125E26701094960851D4EEC73E4D03E2A3B63
+0518DE30A8D56C4CE6C892A4CD61371739DED0C95474D1DEDDDA5C83480C8023
+B3CC77CA3D2DAB88A020873D02EF2B242555140A908FD857F37F704FCE3A45E9
+E2D02C68F689F4692664CB4C60225D7D19A2A3D88A7F2CEA66BFE06F3D9CF622
+676E384A983406A25F80588F1BEA3CE41AED345303458308C476FDA857E053C9
+E17D561BCA03FB7C35D8134C01E2209F2A9B8D25529DE43CB6EF0AC872C99C79
+CB7D9144577C4F939B4B2D8F93543543A4161B8209D38CF073963A78A305D9AC
+7A9F3BC2350D3455BE94CADFC7F4BC01EFE76BCA10F3F35930BEBADED4F650A6
+71452586A3C29A644F2F25BDE14053F5CBFBE26454589967297FB9791D108832
+3585A2F66A42E75B3DD5B1536E457F5DC3EAF69C3C5E8ACF4F32BB5118F503D7
+8D328212074424E6B2E83BD26E73B0FFE3957D5CE744067A12229451A17082E8
+E7AA765FCE539C3CB34D5185F381894C074AC30E906773F2FF25689E488309E5
+28B3121DBB2466B3A07DD8119635F5AA790DD87A29F1E0184F9B811DBFD9988C
+5E7C698AADBA838F81D63F61022D8F28FD942AC95C59AE5C710A6D1EB4913078
+6215204C63019448ECEFFFF812B33014B6BC5FB22F4DCA7817CB0E21747E574C
+B98762D02F302896B17FF8AF44E95832C7C08DFBEC1B1F33E16704FD27EBEACC
+591A81AF3AF9E0668EA64088ECBC4317136D895BD030F8C5A3C4218AECD86388
+FE4775E057EDE6251F771EA5F125E6026697B0741729BF8DE0B542AD32B562B8
+7F61E71460AA96E414FD4ABD7D23D4C7ECB122E7DEC30400BFE0E7C19990506B
+F27B5F316BA18F35C7AF31422718B22FC86E9310737D2A638E02149A3758C681
+700987E99FD05EEA921AC6E6E5C785FCFEAC82FCD9D5FB2CD3699D8B1C81D11C
+5EC87314EF4E837D6548554C11D3D21E847405E7FF2CEA029E48046168B3E08E
+2CEE460980CFDF59491A35F10D15A68E6D06CDD3BC51037F68C0502EBD64393A
+89157994982EE9EA6926C64EF5023A0FA334D2414C2839B12D12E03EA51AD687
+3F9E7BD9D355AF773648FFDFF6E21E944CD26C6B8B0592B1A925F8C0605A6E45
+DE3E637307EFF7027A98136B6F93B0C9088743DD8DBE1CFA3F87F06A8434FFA7
+4D9468EEED7FEB9F4DF36AA6E872F3FDDC253AD795EAEB294BEEDF6EEE1EBF96
+4571274E142A5BBA3E68EC6857444B708761CC7B4ED0FF7410AB69F93DE6B46E
+8EA7D1CCAF79EBD23CA34879E0865F6D1CA61D6FA3A1E0B37F19EF5FEEAAD250
+052B463532465EDE2C010E58E4C56D3C3871128400DFD07B9AE06CE5CE56D333
+85A22A76BA0BD255D47FF4C9A8528338E08B9E37A22230563C22B57D732C40CB
+A8596ACECA557E3D8F9C842B47BD89ABEAF9A0FBF45399B902AAAFAAE45C13D2
+7673A789D91398C3365C9F42D060C49459F9C0F8119BDFCC6B712323701C1B3B
+90E59BAB047F1A2A3C2028AA427E39ACC5BEC9FFBD9AF2EF4977069E9D12E18F
+2DF8AB7CDE5B40232CA3D1A65AB7C995A4BE80B2575372C757C38E3A6B014DD3
+743CA81177817AA76C527DC9B4AD429DC20558C5E1D195547B1A86EA47B8363D
+B6BAF78AC5FCC2A345768ADF8E1D4473199B5BE29FED3561B249A48CB2D1D295
+3628EF6305ADCEF41706DC434EABAFC3286A5C538F61DF8AB76778A5EDC39BD6
+F33DC9E580152F032ECAC7D3000B97E9C0B4637486CD11D2BF47B5DF8844319A
+AFC9E4B0000EB1EC745CEDC6D052D772B5325B656C1DC7D27F7EB0586094EEAC
+AF339B7E2B056126C9796F68659650D0BDC4C456931DE0CC79560771D6374EBD
+8C8DE881E78D31F1F5CCB1597602D07793EFE2F1B991C8FD05F35CE2168CC1C9
+9815DB43C9E19662B27AA40B7F2ECDB5FA6EFF7C1C4AEE23230BF80C352FE320
+1D8F3E59158E52A32EBD691FD5BC0D1D5370F90A0743F8E5BCD1485372F001F2
+2DDEE60AD113AA36D9A2C830098E669838958588AFBBE457D008A089E7A1DC17
+8ECC91F8509FB5A0B7935928EE72086B5BF92C10F195B1183DD282E2F31AE6DB
+4B660B0224C907BEF3CD0A45C9B1C92F3915608015C9D4178DE9A1AF2621A214
+E3975C1E95C5F7315D1E91CF055B43141583650EBB8D570D8E88A545899980DB
+E07C092978AE0A295E80F888220DC5EFE60BCB534B4CAA13D56892A18DA6784A
+456386E6B5FDE92E0880FBA74BCDE958BC6F1664156288F136DA69DF84AE6E6B
+F04C336D08643F64F579C8865C8100DE1139AA75B0FF349ECB193CD40FA60319
+B24B825C9DE6CCF7BAC2D722B93D386D19170D71F81FDC33AC8CEABB5125E50F
+0151E113EAFEA48C1C05C113952BE0ABC5B2A3908192397FC56A1F4090751BAB
+D409CA4AC0091866D114B9FF10AC90B6916ED111EC224F294BDF8CCCDC3E9336
+B8CB13A695887B8A893BBA7562E054E7BC2C4AA4CBB96542B0137F091B7578C6
+73B34C5149D939F8590ACE8CC083F63F8F239175513255CB4697E7E7ED584401
+A2FFF58723043A7F046FC9EC4C70E835FE80B07D4EC11FB14D16793597A09BF3
+292A8367AE4A8A279CB92FCD2EEC083A75195178CAA4A1D93D67A2C6A98D408D
+A7C145F5FE4C6C7CF2A4CFAFC02DDD631B745B13FEA4A5710B4F0D7E992D18DD
+A5BDE04158D7EC4DB9DCE3E24558FD74C2599E4EF16DA1C33991C7D27FC1BB78
+4E9865C28A75075C4609D08EDCD4DEC28522043E510F637944C3BB8AA67C2CC6
+9E3FD5B528A6744F4E0DF4D924809D1FD627F4B6031D85E13E3B07C7D710A0EC
+86BB8269797E745D7A7458F7D15D1810616EE9699BCA0D366FE106D60BE84D24
+DFE7AC0FC125A70D7FB057551E737C5675D165E3DBCEC1E053987D078AEF7839
+2F73428EA2F6302B6313E162DC81D93FE0E981F859DFA4CAD80A78515BCD48F5
+708D332B4A621D8848561893987729CEDC45EF4022E1D2A6A6BD1048201D28F0
+AED64DE459AC4CE272B170103D02AC44E3646396B251CB5D70A418DAC1E1663F
+890F510F215C03092C96639523566C20957E98EE44BEBEEF04D7E9FD33D8356C
+468579E018AB336E18EACD06ED8273F67475F6A5C732D75F52703D019F40D53E
+2B26C34D5C91269F987268BD26A0AE63325228771650091F9D1D8E15A4210255
+C38B54E8EDCD23FE74D1B92108892192B274B7181F2B214310E37DC5557450F0
+B6020D9375A4E11BA6C4F476B214CEA60741454170AC24F1DAF8C45D07D81E16
+E5229C27886C32BF404B151602A53AFE13485BA120940C9BC32C87C3125D6B60
+60136D024377C404D34D5F245EB14304C78BFC2C2E4769250DFA386A171395D2
+FCA9752197E38E568F5FFB81DF03299864ED405068792837A14D23E4DAEDB8C9
+90EECDC45C21B5273F120F1E2F8960E62FECA7903A9AA3DEBC031A5D3FCDB717
+2C7B9F627D7B76F47AE0905810B0EF86503EE4D747EEDF560B3BCFE17822D496
+C77A335466E6C7CA4C5FDDA4523BA7B2AC8D438C554B9378977D64FBD56FCCD9
+73ABBE4CD4FB36D7CED8F6A0D15B0D1C15311E5D77694AFCB14409189DD5E386
+4026AB274BA33F6032E4937B1D345BD4FAD3C2BF0904E5A246E9EBBBF1FFB7BA
+789726B9D7F39D64A29817C40C9515551E19775E50F3F4BD1EC47E2D8FDF830F
+54CC5C4371CC30B0856C00DAB9B1ECEBC0AB17BADAF8E2E2EDEA95EE74938E09
+B3CF241B9E09C0DA8E0AC696F4C98A2EFCC526F1C75E637B8A31CF9A8BF52280
+91A5543D6DFBDF49AFAA51CC6C7B50F6DD1958121EDB2A0C653C3A32F08696D8
+93A61A7969C35E6127BD7A2FA1055014A10286DEB8422C9ADB8765A11082C7C8
+DE96F0092F3637466C053BA316379B3CBF21D84A7B01D174DC5BE1415BFEA654
+2E693BFD946BD7569733B0FBB2C5D247735A48A7C841BEDC92CF8A799C07A478
+E7E398817A355F875789A28715AE0C95B58DB0F1F27572D16AC7BA72F98E5895
+68848616B25441D0E1269033AAC8A6C997B124AEF387D72F0F1BFFEB5D3F345D
+F6A5DD7FCA0CF5AF676C62F6174340AF7DA870B6D406359A7B294A818442472C
+799EAE9D7D9C388F2A302459D30DA7D5470F8CCEDF9486B4F387C5F50DB4E409
+C74A09BAF62217004C0DBB83E3E73E169BF945253F42DEA5F568E28463DF7328
+9FF0CAB049BF700902B78AE3ACDABA17BA4B0DC6D547FFF45818D34B7EC699DD
+290A420A9DB5567E5109FE8646CC874E057EB18AB1B298A5F67012C0D297F76F
+26FFEFF0F02CF4D7E2E8A25E1D99E5207EC9C9BBA6AE7E6D198AF2ADCDC536D1
+A784B82ADB0278740BBFEC9A8634AB35DE798A23699048CDD5058F0BA64E0D4F
+906D8869054D22948931BDB65F4454567DA31B3B5E60C8201CBBD7F05339BCE3
+999E22049BFD2660F750778FEE6D5294FA04D74B7AD092173C7EA8D77C44F6CE
+F37D47B42CCD6623EF57806EB9D752C098FE656395A77B5DB10B910979B7ED1A
+CA360887161F01EFE8DA8B7F6E6F08139977AF1959F6525A73D019714F5ED0E1
+9349D5B3EC3A26FD8D7C3AEA1A6747003C24C5E23551816CE52EE19EB2EEB486
+28DF30EC3988A852F002B1ECD24DD29F1B49D6F3223270AFBC25800DB1693656
+203F52D11179DE90012149A324DE96E6096B6FF7D15BF3E5DC51D4E8B321E232
+77E14621B21A103322A4ACFA7C4B76CFCE1F631B94AFFA67EB0C2BE1AF4D91F5
+B9DAB5DBB40C79B54FE2C63D5DE4C59E92E7C976BC6A085E81A3C63C9CE9DF55
+8D54219F1362EEBC67839B4293C2467827A9FE0B34353C4857D75EC231AD9ED8
+659F3B608F3C8FEB8F94C5FC60D6F9E05752FBAD0DD4F6BC6AAE8462FA9F2F4B
+F6CBC08120BE84C15BB337D33B20D6BFBE8093C08DFB59CBC2CE586B6216A81F
+A34605C0657706309FA7D20B11E97AF4120F7DC50947CB8A11F9294CCEEBFA48
+FABA56438EF8BA3E09CC74AB561CB299E444A3546E8F230FCA5CDD3420B65D0E
+39770B4AB697A0238C51EB51083C4650E7546F5E7B6FEE147546E4D679EFF14A
+A19622DD442741D296B470B9AD458E50EF4F8D3024B7ED91E65619EFD0A09621
+83B4F482AC70945077C1C7543B76BBA4D4D131D3FF755DCB3839FCEA0FD950B7
+394E68521F744344B2348EA92BCF46A232EA96D1F3374818E66D9CE066F30CD1
+BD1F455F36FA1DF4D09D9A81A330B2037BA5DA8B3D511876B1C37BA3790B5C1E
+D29072290C558FBF170CB6296E052313801BD9F45ED2226D11A46640A10D4F9D
+8F2ADB5AA691CC3BFEAB8E0A658F03C42902DEA8244EB9F6DCABFF415E7DF538
+60562788DD8017210DE0F830BF6E6082A6381AFAE03A7DAEE1A15D0BF16321F7
+ECA7EF7ABA8813FF7DBA12B78034C64DAA2BE22A5905D8C27C1B705C9FAE55F6
+D9599694E3688E6A2EAE40F585BC5568EB3BE264CE97DD016BC1C763B6C11638
+70C159E839EDA20BA075D84762C9CE8232A32A6888A0ECCE7459309000735CE2
+A4646D8E947A0ED36EE490BC472EED575D05D4882A0A104205D2CABDFDD77134
+71ED6C39A01FB5FE23D3DE562BA399DC34F869FA8DFF1C781FDFE1B5E1C9E467
+6333B433FA29679252D93DF71977CDBA50424F3E97D84CFB7F555A80B0705B2B
+4C0ECB9747597A32D198552D7705EF4263818BF6FE9F4B2D7AE1A6BECDA40945
+C7AB6E19BB324B2EBB38D003F49B01598111BADF7A03F4F006F1604072BF72F3
+C2636D8CAA5D98EC25F7D9B3E0E3C99F4A79BE1F144BB11C7D8BA4E5726CEBF3
+EEE5B37D234FBA35917D724BE0B4FF9E8C85DD923A486364FD44CF2259F0313F
+8BE916E7370DFE34CC3CC6AD44460CAF739E24E5308FA568FBC08552B643EB18
+D86EA125D4EE98AAAD884D2BAB1D5264D45346F81556FF310D5DA1BB667914C4
+6272DFE61BF3BFA30341A21A6AF4681C4099CEBD51FBCB3C43F2E74AE7E262F0
+38682D6C78B016A997E4FEF8959B05ABEEE29E00BD3F86DD98FA3210E1691080
+374666B5A45BAB3A3C8E231DD5DA433CD5C1D5DC95378C9C6EB6AD10801C27A3
+76A1EEE11A9D1E086DEADFECE2C039DA804BF4C647381F0A0F7FFA9B70568710
+183B0436EA4AB0ED9A68D829C1DC77292512DA2711920831E96FF2D7DEDF7CF7
+9E075702E1D9155ECE859AD5C28A10C3F1A5576ABB2196E562B588EA9681B9DF
+378AFC9F47AC346E10ADE9508FCF5F208AB4063151349CAC48C6B1B1AA77AB24
+358E29488FAE43C44CD4393453E1733925FC34E4A32B26E23AF0F9A73DA7C373
+B1FFBF09D893E83B08675B4D2A05FD34999973796EE078DB227354822E55E3E9
+7DA31FDA41AD4693B9219268DF50B81A75713A8D8202574E6141C27C56A2ABDF
+AE040853FED550A96B86A1BF802597A987D15AFECC5DB29D13DBC0DB83605B5C
+F4DCDCBC7FCA89FE7573491D94FDC06607DD8E3AFB4F37816B755131DA7A5F91
+20AD2409A7BF06ABF0185A8ADF5570D85615113105C9F2DCECD48E5DC5E63D7A
+B22275DD560B3F908C6800CEB8FE2CC90D7D0A474F5BA7F5547C570095AB1DF2
+CF2CF8C0198B4DB8F63056BF3B22850DDC5AE22C06236DE26CAB01FBFB817060
+CB3A0FA3F266571910D117A3203D28A18117B91244DD3AE911461FD73C9F78CB
+C9BF436DB0B6A7B99F4D2574B397AF876BAE65B337BF7D882279BB1F61D71E11
+3B2A773945AFA21E13C9F80D91656A01B1EE0E1BDB739C215BC2203D7AD28456
+4FB7ACDE59ABB24DC49E9799ADD8F7B092002ECD40A9DB0C46CA4B74AA21BBAA
+4C715DB3CADDA99F79A7CA1149F2D24FFB8705C60EE84F258F023412DC042F00
+9893E3C2F10AFFFF9FC08143564FB7E99C885589F3A9BB4DBB2D3207F2C715C8
+E3147793DB25BDCC2CED771A606CDE35B95B261AAB560BD6A6D7380CD09EF766
+F069EC63E0C98AE637A8C3A6E3021F0488DE5D6D97971D82EBB3DD9FFDD4457E
+FE1C9C9BF09602500EE7C45767A1E8126586045CDD11A397448961DD348A55E3
+5FF7BD0B3D1DF585577B9115BBEF9510E64F47F2B6847F04E117FB59AE43C512
+7EAC910998069FD61EC937DD2F58E4EE2F5B24A79623E8AA5C515DA73F6436BE
+4E94772B0053E8C565961E9D767C506339867BBB18CB833FF42A8703D676FEEF
+F7668BFC9468881A006C10436FADEE8EA4E6C5593CCACFFB740D0C6C31D6FE8C
+77EB8DC51A69E671BD4562B815111E654279331D97F535A23E6B771D857251B0
+563420B8F29F15C5AF357C73792BE4358667753A7A85E80A1D4FFDFA38ABE03C
+E5D21F22E02522DA4D82F50BB743FDFA58E7A435D4D1047CD38F3703F3F20EE6
+ADC9957EDCF47C852B7B030D0BDAFEA6863B1043C7DC2CE6EBBC62B8BBD26E32
+32C79231B4F48575752865FEFD92400FEDFABD13248257C912C930FB26D440D7
+CFD294F626C36421B0FCB03F2CDD880C66D0402DBF548C6A3F807F4DF4DCCD6D
+272AF53B21899D8C5C0737929949753F012B8D07E21F043663928EF17DA51681
+2066E48F5B1C9117F45F0010C512627A327F99493699264E6AB69ED86DAADA54
+A100036B079CD4882262FE22BEC5BD9B701FB077FB970123E009D1065AF4266D
+EFAA3B6FA0333E4803F81E6495D8FCF35A16532673F71B7EA505F05B569DD75E
+0B3F39F5CFAD54AA5C80F8F082C312F952222AD409FC850DCA1ACC78B7992A78
+939EA3A4B51DD2DFD10FC59F049619FCB40DB92A9D6B16E93093C994488F6F9B
+EA42C3A835E0CB93F0C1534BC9C1F4E33EE345B4FF54CC4FCA7B641A8F155006
+CE79BE0B6D0B8CB74170B6667B5949C6F9BA4CC90FF6BCD2322B351894035934
+CAC8BAF06677832E40BF90313CFCC979E6B8581F6986F5D5A9529A5778F4927D
+ACE747DA8705058D22F03697EBD239A4EA64D77519EEAB4A72E719545E3BFCB8
+4317217726052E32239D2A34C0D6B29DCA53899B4C930B5B2034D0E6894F5110
+9EF709BABB60B8C65616795F40C62B611CC0703B8E9F394A61B5EF1C14129357
+261984E369EAB3CD2B58536E84333D9F80946BEE12F342F0650F2FB184DE6165
+42BFE4432E3AAAE9341D8068FE446291F12524B2A1B8B5A4D60150C642B18C0C
+0E5D74B2C4B508652729E342F27497D769ABE54E45EBB0D8A2E01F90393C6F59
+8E4A6C278C755ED6633D9C8FAF5C30BF86DBBAB912FB22BA4F30912E8E9699AE
+8CD0D3631AE3D192418939D959257CBE3B39404C0111AFE56C81F5932478CC4C
+C0453C2D30956DA085457F43F079E94ECF6BC61914C63E240DB5CCDDEFCF3EF0
+CBDCFE02344129A8DA0B9F986F6686DE8E52280401460019CABECEFEC7E8F98E
+8AE135A5E05DFF8E62E75BFCC7EBAB8EC380C1FD1D48FECC229441C4CDE93B8E
+60C96E6418A9D286DEE46D0D82AF9D2714FAE2A30A4D9B9D2E5B34D5368B39EE
+266B2CE395CB637EF2676610E303E83A0CBB53FB71D5FE08633FE3207970A864
+48F03997798A209D930B8A92338D177CD0C3FC7520FBB7FFC4E776009AFF4D0D
+9FCED078981ECBBFC8B0911F830DABEBDABC30A42C9E60FD5DD4672AF1048621
+8E3D98F92A6156D31B4A7079FBF1639BE20B24D1439007C200519E3A870BF5BF
+98C2A9962BA8449FC5E48B9677EBBC4CDF8070BB6BFFC4FE1A6635DC735F4801
+DC0176C98495B2AD37791ADA6C1FB8264CE0D27BA13BA315D08DA1213CCC6748
+E9673881C4183F20A8B97FE13ED651351E5D2424386962F578205C1F7653AC26
+D83239B66A9C567CF1606CBA9CE574320107794F9229ACC234987FAC848FBC49
+4D1253649515BA36B93A1A09FBBA2849F20A4F5C6F8AC8B4EA054219D21D3849
+DC6D1E148BB0D1E83AD1FAF3BEC996E016C32BEBAA421A94FE0E64D4E2239E42
+5CC7AA4590643357472F59DE1D25276F4E8A6DF2DC832AECAED359D2EE0DA6C9
+AB1EA510DD4656656EB736D8B1AEE07197BCADF408222559E39409D334A2BE2A
+81B7E652C20CE6435A11B9C03ED0CFD3F9EC893F74FC4899E2359D4D2723E0F0
+89595D06DEAE8E448E268ABCCDB833CCA7BA37E2FA9E2A827CD381EBB2F5BC7B
+03718C4A68DEC9F9542E2A1181FD444A1E564462FB492F10F290CEB56386B141
+F581E2BCDFD93A47EBC7D6763648030CA866EF24DABF14BFE929E70B4B38B605
+22F9C0B7724371EAA474B380FA5CC0DA0410FF931BD9CFCC6F7CA04EF1A3CCBF
+B86F1D1EC3FC26CB85E3F07B0E833828922D03A347267805D279ACF38943ADD5
+7390121B316BA0F20654FF0643E241F78BD48AAC1A4E511514EF1D63BAEFCE12
+C78FC9335044190E899B70781CC02FEB37262C76DC73B30CD60699CF8AD070F3
+C3409DD6242709E18A452AD935ED9DA19F3FDB7F5F2009115D2BA0FAD270D183
+5814B26902689058081D48DD84BB2B9B3D76099EE6856CFC9556BB88566A3F7C
+09A2D66F5BBC5A3120FB7804E958F29452A26EFFBDD0D774614FEBF45136710B
+CDA86D589241D213BC7B27B440C7D60901BA9EF08DC84421BAB0874686E13D33
+2805DD8836DEEDF7C9995320B9F22091D30A1A176B516C71B67A92CF365E31DC
+AE54B695714E16F85D16C80189B5A8EBA8169419077742AA0A150078A5A9E902
+875CD4E59AC0CC9FC1AEDEC76D007FC53EBF36D746153960272A0998EA05AE4E
+447B609AB48451DA178661D7B4F6C40F5B2D40D0C7D08EA9BB55D82FF6C26196
+9EED42B13F570453E30F282C1FFE8E9F0231959682A39B8EDB3DBE83BED1714C
+862E92C0A1B5F96538B8C14F06BF040B387274A27EF0561DA0B16CED92E602D7
+C221F55542EB8E712A48861E64830260D1251C28B124425D37C1BDF671DBFE45
+89DDE5CD60D9E592B5173C210699B12F449CFFD9FC2721894094B5143A58BA84
+3C45A4CBD1BBF9782755A91C3B006DF983A543005BB8BB89FD72453A4DF16E92
+F9D2C6399F401360D475C44DEBCC18F61E8429ED28178DD8BE8F74014A4DF429
+4F149489773120F53DEA4CF78849B4025057677B47D82B8130D2583B51E576FB
+1D3D5C7A90B820D6782AE44DB08D1609C9415686FEBFBE4D0882C03DEB5F4899
+AE0F205F2F31F96FD55FB7AA3B384A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMB10
+%!PS-AdobeFont-1.1: CMB10 1.0
+%%CreationDate: 1991 Aug 20 16:34:36
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMB10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMB10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 97 /a put
+dup 108 /l put
+readonly def
+/FontBBox{-62 -250 1011 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82
+7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378
+77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18
+2DB0E39996C010F3024A5A3C69C8485664A4E3AA81348AE21A30280D0E3B6542
+A770F048F31907891EAB8B57DC70FF775574D6CD26B8AC9C3E64C3631325BF0A
+99AB413BDADAA3B51A3E168B03A856EC7D346A38BBB0A2700A23B2CA91120B9D
+2AA5BE5A359C60CD78F055253785CC9701F5D670ABE4967D74838C3B267C6563
+C9651AC41D8684AD5E913A5C9C547CA225A74782D1AC62020FC38E29C356950A
+00E8F2B0752CDBF81EE4ACD59BDEBBB9523AE4764B995855F3A401EB4B04EE56
+B10758196CB661448A3617B83CA88C41756EF131CFCE0C968B94B6C69AEC1E9F
+BF8B21837BC422D766B5089D81CF35A807394A026FE3160580695B1213968D90
+8ECD1611E719A871E15C6085A17906F77B5B2DFA6AE670976758E67F8A4FC362
+FC7299D85ECC3C0BBAD4649B9DAB4A2FB248D6481CF0CCF274634D37A5AA4DDC
+31F3138AAF10998FD66F3817B77060E71C6D8F17205F9C098D81D952E0FE3831
+2264C55D73215176470D8D75E7BE6E44514984B9D20208DB3ADD4767CAC09D41
+9C8DAB6EDF4FA1AA2CB285CA28E30972B3BFA4F8600DB92164865738B015A331
+EA9EFDD478132047DAC28DD4FFE419F94CF5FCDE732E53FD332ADBED32F76B2E
+69531BCE0D461BA3F41A528DB0CCEFF9663FEB3EC9CE0F760604F835699D7C08
+CADBF7AA3DCCE9E813D66BC62C6E452FA02FE7E5F4FAAA527B4567AA4FACE790
+87910AC2498C0999866614C90AF7DFD65A59B9183FD8AC5DB9AA81E8E8477F07
+3501D4BFCCBFE32C964D3549B42070D43977640A289060AC0BDF951B78ACDE58
+D95548DE8DE75EA7A6F5922BB463FAA93487253414EF4233C8BB976B280E1A92
+A77D2D907599AC9302D1143597D4CD494045A0261DB9245A613EE31DF8994568
+F7D0FB24D761F5B4E8A96B5AB339418462C29EC1DE163980AAE4B6190A1AA91A
+D935859055FF59BDC9365F825C409B52530DB59A099FDE62E716090B6B14D2D7
+28662E609B24D00FDD9F092F15D94C0726B1D3610F20A7C658F19D26DC8B53D6
+8DD06EA7E45A8150DCD2DB3AEDD9239A029FD6B5344B0FF779CFE958A5889AB6
+E941B9BF0464CB0FF3247F17290F82825313C171AAB70BB80D21EDCB7628B5D1
+8266B3E93852BBFCE9CA6D38170F6CE57219A301EE8B989D66852EB7A48A8177
+96722414CF3B147E046617BA46F6F1439F90B6B3812D61619904CAA0B7CDAF29
+D6868D7F8346CF4164DB12015292BFBCE474B05BF886430411E8E937B6F09D74
+42A2C0EB14BFC76003DFF172AC44D730214DEE512BF257C8688FBED139C01604
+2C34B2E4C33219B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.1: CMSLTT10 1.0
+%%CreationDate: 1991 Aug 20 16:41:43
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMSLTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 45 /hyphen put
+dup 46 /period put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+dup 122 /z put
+readonly def
+/FontBBox{-20 -233 617 696}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0528A405DF15F03DB1C3DA8B850431F8
+0E5F73DAC973450D1ED0530313057E971FC7E7CA88E61DA6DB9A5CD61F0F76CB
+4DE9105D0627B8DDF51A655098229920CF429CDAFC3F7788C95E7AB30E84F840
+8CED52E98DB4CFF161D2E62B0D28CB8B0AC82E7A8D2C007953BAFB3056D66079
+8064956E257D31C13509FB81A250D9E875C77A4E91CC49E9FB3C0718B2F691D4
+B4A64F351F4DD68133DED7629B0D96E5124584A16FD2AC7A3EB244A934FF059F
+ED7297B0505F3C2994AD66A3CA5D2728B034DE94B64A8AFAF341601BD4DB5858
+C9950A8BB9C598B8960609F48116ABA8C007190AF0ED335EB5BF61BA6871FA5F
+EAB5A26AEB5C7C352EB80799CEB983F19EEFA801093F62086AADD0B80BB6580F
+2CF61B1390FA56DFA1A0B61C58DEF96BA767A8A37EA44730783C600706606C60
+4EE74EA99B7C0F8E2525C8847F3D31907C3C483EFA98F6C416B6B2C343DE6370
+52FAE423008D086A76A1FFB327CC7FD84B1C66B203A4F41582F4599A82F8362D
+38108452EACCC937FFC4F3ABBFE3628DF51367DA6BA3F6826FC6522D6AC5E8EA
+00BAD300FFB6DEDAB93237704202BACD030AA824B1E97C0AFE17FCE8C75F4FA0
+B8A74329A6CF1788C7EB34DA7307411E9AD7ED8D6582884456E06E033B4FFE7D
+CD4DD8B06AD01340CCCFBC382C18CA451E4C886B01D082FF8CC5793F4727C3DF
+B52B4F1A242F31D1EB79D1E39A1D4FD13D6C5E2A42AD4B4D1CC4EE7BA0E5F80F
+802E5AB57EA15F4DE44D82AC408AA86D4BF58EF967FBC6497BBC7F017C0598AE
+32CF865DFFF0FC7FF9E6DCE9B5F2F4C7491AC674F46E8E7660452CE0A77C1EE8
+00DE382ABED85350033F8ECB97398E4E0A75D4877A107F6A909D0C76D14F9A96
+8A6CFDE3FD9D79B6FD82693A9F354BD2ECF30C6D99F7AC522F8D6C93EA214F7B
+3D0ED77F042ACDE9414264C0698E86398562E2C640DEBBA0734AB4C3ACE3907D
+CC79E6B2C6C3C3F9B01526E8CD98237D4A9B403FF8CE3132222FA60C196A19BC
+A2393AE6935C0F8B67FC1D1A1359BE7E7BAF694B91B61BEC6DE6C64356746771
+0CFF188ECA9A543A49A39A046F96E819B541E5208755E19B080CB0FD9B42B72D
+855FBEBFF32292D435852A14BB713396782BA940E05F38593D288F107CC0BF82
+14A204A7CD65F00AB44D48036E58F687DC2BF6584C410AD4A58F5A7CA173FD74
+244C7313B0268589293A261CC08460EE65079539F5E68D4ADA3BED2AB983A354
+3D653F25D0452DF9C3519A0FC8CF71AF81BFFB48CBBC8B04AA3F9B3A60D933A0
+40299CB46697044F849FBD7847BBA0F7D5CED705C8E4D74B83671F05E5098857
+E87FBAE522995960B125E2B91D1A565DC09646FD83955162C3A583467C792D2E
+C98B830FAF360BDFC63AC345EC6F1A79006953121CFA26BA7B164A1125BAE4F1
+2C2EDECDABDECC2F8D94B6F1DA48E3D1C4B1D914E14DC08AD7E67BDFBE327092
+2B48B134784FDB084B654398A1037BD95483F8873FAE68C9F31CA1F90284ED16
+951B2AF75CC16F2597E0A72397554CD53CA9541B09B2DC1A45C6FF503E3528E0
+22D2C1AD257C5E564FC4F4F39236FE6AF9F1421BCAC7C2790B2A855CB7669D42
+752639F74EBFCF234E570EBC7F2858144D17CF17D6A16950BC6919C73CD4AB11
+E948284006DFE50A754DE8217B23D9FBEC052236F8486448A6D3F9D03B0FC959
+56471B443DDDFDC012BB881C15AA0F03A34225364CDEF2FFC5BD9452B3179174
+90FC3114D948E15FEC13B03D08D15ED8DD4F99A97237B46EEE8BC7428FE2F3E3
+1737E6D8DBDA770EDBC95C27317191CD77DD1961126D917125BBFF006F7B96CF
+E84E90D56EA4AB1A0323FAB001E835A90DC5349CBE9AC0FB5FE253DF6ACA2571
+EECFDC1256C947C29455937094F5839D5665EBC1F0DB67FBFADC836A09A82FAA
+B38C9854BED9DEA3B4A1118A382B2DC930D896716D9E1075476CD91E6FE77940
+4EE4A8F2B77E8465E0267D0FD471667CD258DA593CA7C6C478D178F27848815D
+1E2F429ECE1015C3805B9BB5A94D288D5169D2DA94016B71B5276FC32B336576
+F7CD75D2B87107F7B50C5A328FA139D42359C3AC6627E689C02161A8FA5718AF
+EB2D49598D96C64A963C1DC630B1B1038E7AFD48DBAFAE5E0C185D312BFEDDC9
+96D8C394D73CA89E7C26DE76147F46FA239EC275F1F4E17278F7F8C3846032C7
+FE805D50242EBE4B4D60209C414A1FB50489D532E1937CCED646DFA4A8965C04
+4F2B5DDDED79977D93B8BC10F89E22674947E1DCD565E0F71EA150F5525A228F
+523770127908408EA2825D9FD41B6FE442B1BE570EECEF2539A10D07E6A0FA1C
+9ED9054606FB92312C353DEB64F9F99C52C7541A4284BEC6B04D8BCB19BE7D47
+B386B2CBC7E2726B7906DF2B9C60BD0EDF02F7BBDBBFC77A6E923B2627AA48EA
+D25F60AFD1DAE1EAC5BE8A5BB9E9F8A6A71869B75E5C09C43D7C7A42B3E48351
+72704E1C990989D63839643504DEB3AB1C65EBA7F034926D26AEFE92AA8CEEE2
+D1C535BEEB93F5E671281F6C20435B4A873B4CD9FC8DDA212A289ABB97932DE5
+C12B848AC1B0FBE149D0AA9C5A0FEBAF15248D56AE6CD7E306BFE9C21876159E
+5ADF792D6335A5BD308692C674167E08A02FEE67090D58BB2B2D9EC6FD598DFF
+DFB6CF6B78F8E1C8D4215CB33AAD5E897C75A7C8FE63ECC17EF941B33766AB2D
+2C295DDABC784851BE6FCE8EB6E8DC24B332CF836D2AB3888B85E1DEE331060C
+D7D3677489ACEE8D77F64D9A833AADECA12191611163BBE545A4C75E4CB1BED9
+95F2C06560FF628CAD961838DF4B03739E1C946F9E5F369FC86CCBA63DD638AB
+67AD4A40EB009700C2FD6CED16BACC301F27C12B797F480E73ADA18855876816
+DD85E5E2AD2C5BC9CB59E7F26DAAFC5848BBE7E40CD9E334E97F80A7461CAE07
+6E92B97CA810486F696F2C8BA8912D19F2C0D434011F66554B7599517A2FBD7E
+F442B85BC639C49614363A126A498365435C4398CA0151DF8EF87A81F5282EB3
+EDDC5C39F2BDEAE08555113F9B4C61A4A7DD1BF8BAB286AB2E971DBC265A6A0A
+931CB6219FFB8C04E8208225E3D686315EAF39F674B63C661B23EC073E82605F
+1FFC94BCDA637C86574319C41CDDF97768BA23954406741B9134FBA45155F390
+B18215B80BF01BE86C325E612D50DF2F0879A2DC24FE71C9BEB77C42A67361B0
+D9DD197A80D16EDE3AECFD703D1257F9433EB845C9E7AD81AED36D534495EDC9
+D68C856231BD7DA9010A0E6AEF18B11C0B392A4440A8F56FC28397C1A073B618
+B0AA06543507258A3C63C24BF4E1BA06BD3F8C3930269EFC2CC42BB4BEF7E363
+78979A2B8456784550F744513D8BDEA6A946A3F4FE5E48C6766A2DBFE4BAF29F
+97231EED7F9D916B4545091E974CF0129AAAF6B285F81CEE555D5ACFB8FCA47D
+235BE102E9305D4D0290651BBB4037887E1AD6E08C01D13C182109DBF68AD805
+C67C792D7D3A9C099FE4419B70F6D932F325EFBE94931D5D28C79402A1C6837F
+DC6E1811168038A342BD5B4F5371C9783D0B74940633D7B7B8F8B8C32BF5C71F
+A06112A87225B4270ACCF383AACBC983DA29281C395D7F2342696D35197D4CC6
+661DB9FAC95FD9EB4C77F5F83159604185AB162347DAC0EE51E65C8C5098F7B3
+3E8754211B44EE1C16DF2B59923CB8FF64283B5C01106A978EE3C09AD5AFDD64
+A881049FF8B17FCEA0B0CDD92A9B366617167AFB6D18FB19DF70BBB6DF205536
+5C1D58F8459FB03319F3B5F4D43DDA15C8323B57CB2D5686BA1A4421625F47D2
+006F73993BDFF70C7FA63C0C3B3B038AA907711A2958116895E75C0C99ABD2E1
+F02AB43861FB0AF5E493471102BA57BA6E3995996696107D1537F9B92F5B0767
+0C3A5E374D3B34D7A67AF8AA012E9BD904033EE95FFD412C14EBD51FEE69009D
+EB8F4194E21C596F529243F6A31F1A5631C42990D6249D1EB330033ABBA40405
+2CE62AB60FB1AB122E9A40FCA88D97410DAFB017153D37EC4AE4AF13701752EC
+387EA20846202187C1F4F853B6D4B6179E7D0BB9C0E208845E975D26DF1C2B7C
+7EBE4B2DA5ABAD95BCDB294E50B42FC032D8D973626ADD10142D69B4DABE2C89
+DB817C2C1AF9EFC62DD501A9C91AE35EAFEC12CBF66DB9318DFFCE7EC3C9246B
+569A2DE8A523BB6337D9828EBC0E639179C94E067835F6D345731FD98483DFD2
+549CF02C77E1C4262860DA5F182E248850A90F5C23E2BEE1F6321482F040E2A6
+8B83C7B2502702648694335B177504E757553050DB684A254C924A5C9B8D20B6
+10CB6D8D7D495E473C09E271E8A315D7E3829A429B085C803BD6EB1BE5F1D210
+C044B15F104EEA05CD5D90078BDD975A8EADDA67721895774C477A8913B4E97A
+34939CEE30608A842313D30BFB9FB4846EB87A939C84C2BA314EC87AA8655183
+F5F42F7489E067FF643F159384EECD7B679C6F34F8AB537E11D39E5D897AA913
+6037E8DDF13094E0A9EAA04AC7D70F9684E36813BCF872C39C0DBA7B0AB54870
+9D1F991B684B058662CA8C8A7D57F38ABD15CC50C71BECE67F014BEC61FC5809
+407EBBA0263BBC1C7C1642DA4E76029BDC9D8BA94F527A11BE9AFF27A87B91C9
+7E1C0850166433609BCEEE28EA85DA21E1F5E312B5992CF94452946B525EBEA9
+658D1F1CF8E0CB6A36C6446F70C4EEA466CF85CA50B051A73998CE1E9E1E308E
+36B04F3D129BD618BD671C52E8CE6C8EA7CA47C68D9864107413B6E8D0113BF5
+6A076BBCA316114C7E3C0EFF2BBE5348A80D09C4F8BA51BD544BB23F554511C0
+9ECF91F8C6BB507003AB73C536DA96FD4BB21A1E0D23DC3E754D9AE220A88944
+A70B01A8E4565C4E8FBB9FD6AC5BDA3BD91F896CB8CE67BED7182ADCEAFF58A1
+8441452D10A158832F40BE2214197EB41DE2F0ED9E407A0A0011ADFA806B88EF
+B3991ABBDCE871996F0B17D61A0C76C6E9BA926ABF8BD3752DA7D757B84C1845
+D864C5C6BD8FDAF3740CEA2D0300D53605C9861D4D86C188FBA84F1281C4DB96
+E22D31A7E218AD251111010B0DD4EE7B32745542DC1D4FFA6543CEBA105A63FC
+59F8DE4578B263901E38787E0F4F197F1BF90EFD29684AC0965B66357C1F778D
+60CE61BECCC65BBC134D6A77EAD3E498C3B8639B7A4D95B08353104112107862
+85CAB073714A7211F36E2923411442210A3F063340CFEA003D6F85A0C11B5469
+581BE31AB60EA5247D3E5739393058710F0DDA36CF53256110AB08F5B422A291
+4C402CE894FE9EDB5BC468F379CF47258518A01D28ED3E3941768124F5C71A2A
+AD7AA8BEC0D8358EE389CE8EA9AB646D4B9D55E588879AA8566C6723BF43AFCC
+0045CB2075EFA3C33B9D2838D6D0E99F3A1C0068231D585B4CC7E81D44F5D04A
+2CBDEA50F302603C1E5C67D5570DAFF1D2DC87D5D85C977085FB505E48CB425E
+35EEC9E447ED6AC61B28CE95F33ED271D2BF80067D4DD723F8B719AE06CDB75F
+68844045767BB1C7356974099CAB81522DAEF863ECF0F0FD272C7826E66BCD41
+2234F07E08E0B0FF5499D0BF2F7277EF2FF8C2BD85C5BABC56B7AB26823F7C4B
+D0E53B0DF1755FCDE48804EBA05DB62AB79705B3B2C53C981855C6094D304878
+F6284149A86DB115741C7E6C5CD1D8A0BF4A0BB1BF316A8E0928B9656F0B6733
+59F2516A1F70AF77722D8F4AB51A77C19CD627A7B784C9C24914DCFCCFC64176
+7576B4DC562906781880F6C1560E62584C781C998DA2D127DC5003E8D1DFF54E
+541B4AC0B7EE8CCC0C9489BF39B03556B97831028C842E9F20B3510766D8432E
+6BCE9C543E887E9D9A6C092887A443C677FE7E900BE4B1313996B4062304ACE2
+ED7B88B8861154A0C216F7EC643C7226414B39E4E6929BB826E02D8CCEF08B80
+006ED1FC42D95E24D9B031915D350885B3E5AB465FE01232D2F27C4A3FC92D46
+DF76B2B123D29DDFE79ED5E0EECD1D22C830FF9BC789BBCAADA52BABD7B66C10
+A658251EA32AE3AE94F98315461A29BB044AD943D7432CBF48F725B1B88A5501
+431F2E748ED9DB9D13FEE67ECF01848424FA21B8FE8BA16577672545D175B37B
+EC018BBFC6CCE8C4FB88CFB8D7FA37FF627F32D426A574F58DBCBA705A7798DD
+AB6704393E10362110FCED17EEA2DCCDF84C5B449D689E74E7AD7D98618E29FF
+3509A62E807669BF1F7F95FED4B1AA76026D656E215D084C7ABAA01E420EF290
+D4ACCBEF1881E199529966845F3182B6233749B0CEC2F7B391783BDBD36E4202
+6A274DE4B2FE4A4BFC9814FD6DA28E9336D01DCDCD574DDFD55E2E444D283128
+D3AB410158380922B04355D6A602C9C90485C0E85BDF27323BF4564FAE8CDFED
+5B3AB5829B57A7829B86224096D5F5463486AC860C86C1F2F7DB3B6C94A5652C
+FAD0F54ED6EB58255695FE737A235D38632D78F456CFF89FEBD32C37B5B6A5F5
+16FDAB471003158BA994B284051A7F597B42D10EC6236947C5B54E4D7FC7B011
+3940AFE4F4CAB864A07A8962F5508B7C2BFEF24E89F38759C1A024858C44FF0A
+A4D4223A416FFFE7B852221936701DD392DDCE8A1F2A39D432A1346B20C5A8C5
+AA6052F7C99549EDD81ABE45BC03CBC6F3BA94CE9682F3923EFC7D564E3E16FA
+A765B61A0CACDA6D0DBB26EE38F16670BD31F3221FBF040767CF6D5686971E1C
+ACD791939837A0917804CB320195E99322FD79A03CFFF2EB313B9ED7747B55A7
+E8992B0AAABB424BF295C185D4DAA77AF41D0D7D0BEB29BFA5629B67C1C48174
+DC2280AD1E80ED5E429263E9CD6292219AD5B4117166FCC60E675172C335150C
+B35DBF4FFDD7EDF7B646C8E1E8BC00255664A2548802B4D33A5C26790658E4E9
+6F3F75A64A48C26F90F7166B48D3FEA6CE661AEAA28D3EBA7611C9676411B1BA
+F49EB8E02E41FD3F9B69C76C843DE849696EFEBF9E980741A6C05EB7645F1946
+1FE7B49DBEF2B29F808D99BFBDA0E85089CBA26F5343E7ED1023830F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSS10
+%!PS-AdobeFont-1.1: CMSS10 1.0
+%%CreationDate: 1991 Aug 20 17:33:34
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSS10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 40 /parenleft put
+dup 41 /parenright put
+readonly def
+/FontBBox{-61 -250 999 759}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BDCEEA888D07B439DBD4E8B4C9
+D198C03874B5E6F8FBF4922065A92BC3E66D05DE53971CB1424510E892442858
+D69CE1F76E4DA76C87C763A4B2FE36321E54B1328C9155B8ED6361855A151723
+3386AEA3D042B8D89C8C0E9A33E5DF3B466F7BB8C2C8A4ED4CDAFF55FC6D3EE6
+0AF2CEBFC1AC3A6E6692F8BB81F82D86BAE85016AD62FCB05467082C2E5AD348
+44D1439C2B59F65590E57CA0DE481A7A34E79931B1513C4C30156170409A4BB8
+46D412D1DAF88AD30722F12DBCA1CCC6B4BCC28D06B0D29149DDEC520C8FBA13
+6B82E2E1790F00B216282FF122EF0D47B70A1B29514DDF7C0435ED238C14BDF5
+6DA243117FBEF7398F97EB95597707ED63C6797EBA1B46EA19ABB1DABDA171B3
+16CD500F5D64CBFBE4F9CBC3E66A34427D3C4D0C432710289381F9BFD91B4FF4
+1E3A896C3EEA2F3105C218877D6C0C6B763760FA364D00065E1CAE9DCB5676ED
+286A9ED0D1C946DCA6A2A670EE0936FB4706CC62E234CFEED34AA615C48D2872
+A087F30990C85E64BA68F3D5C117123467DB411C9F2D6F6858CC70C1E352C477
+713097321B4C4FD4C5CDE305415F998E7245908EEDE6E056A736EA77BD8C639C
+3A79FFD0B74B3D28F0494A115F2841CF8A8827AB5608F96FD8998A5F40FB3DFE
+3AA0C7696DE4E1D18DC0D6E84B943175FC38FFC42A9C0CBB13A908978C98BFE5
+034F88480F32B9DEB2FD228FF6CB0B89B045AB02020C82E3F5716DC640613185
+9F597CE262729BC52132F43922B9E28BB71A30AC8709634561B22D13C4FAFE0A
+12C4451969226B220038AD8DDA990A4E2CAD53DBEAB698898BBD3046234EB4EA
+901287E71CB41296C431383AB85F18882F65BE36923F6C0FD6FADAC5B42FDB68
+64C06E047434FA7A659EF7F3D1AA8E547939FBF9C2ED7AC829F03CA59AFFBFA5
+A7AD2E0FC7BBE619961AE1785D09444B333993199FFED007382B54DDAEBE21E0
+1E75E0AB6D309DBE53BC7BB9F95D342F51798574D70B95021FA40163A86BE6C9
+342536A5730837C522D5314B1289D9B7E4EDD108BE7F35A20AB2A16608F6F007
+6DDD702A5A9BA1325CE2C1CD020DF677872135CF04F4E4F1E9AA6B494E2BC22F
+107C331A7E80718B030A1103804D144802E3B03EF7CB083BCCDEAC7B43F1B4F5
+C1BF6016741B741CF7E12B4BF95221A72CC9F4657264771AA69C73DA1DA29102
+65D01A0E61F3024E672AFCCBE13CD0B7F54AE1418B72E357A0BABB4D03073B1D
+F4EB54F899AD4A41A9F94DC200880A0DB99D67235A2451B25F710C29A882865B
+A922E56E9FC16756014FA5CBDB1C32750BD6835A70EB715CEA19A8872041905E
+8C660BACDCA26C8247D6B3C10FA5DC240E433E479AC6AFCF57CF96697FF46BE6
+44748E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 64 /at put
+dup 65 /A put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 75 /K put
+dup 76 /L put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 90 /Z put
+dup 92 /backslash put
+dup 95 /underscore put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 125 /braceright put
+dup 126 /asciitilde put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19
+38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF
+D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204
+EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727
+A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593
+F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714
+4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA
+6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E
+A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B
+E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F
+1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438
+452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF
+8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369
+5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA
+DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9
+BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19
+741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79
+E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712
+E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7
+D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE
+C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA
+726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227
+CEBEF0C9440DC034DAD9C19FB27DB399BDAEE22053591D6538587C768C1B7B0B
+7D1E222D2D8AF3A6473CC4C0D6C3E0DB49068CEB8C9BD1C5CD486A50DAA10BC7
+7D6286142355E3F21DD254E27C00C442728A0BAEC9D3F17AE9CE320D365152E9
+EB0D5E3874F2BCEDA98521D23FCFC30B4B69DAD2ADBE80E5964ED0ABEF6C73B6
+DAD30E2C5061E3747FE536E1A5D190D028F2130AF608F5DDF9DDDF1E77DC8437
+ECB3EC93B33505DF47884DDBD1DC6BBE4098DF04A29AF6FA3AE344600D0AAB53
+B3820DD7ECB600A3B8001C51AF2CA7A39AE1485A0FCD5D16F0657F61E9655AA1
+B8326F1813FEB669F4E88D7C1F3AC239ABDCD32171C7377F7EBD25E7B38A2A2D
+CC6F434D57D1F1E4A22F381E957EC31E2211714A3A438A26AD3CB48F0463CD4D
+3C0B6E5655214FF177BCEDE954490428D1ABF0CE50C21797E455D0C97803A32F
+DDBA51C36537C0B104011AF144043D0FEE36BBF1959020769522A015B3A4F77C
+D4AC56294BB989CFE5BE6EDA938B4850D347DB0724353AF84B14EC964B9BCD59
+1D8BD34EE86C37A97CAD9DE966B6612C23069B547004CD96B116E4F72E75AE37
+D506D9FADD61696418EAE950995A0A401135AEAD81CAFC6035C51C38E7ABE815
+CA5D91B363F99E41F567FCEF760C57EABB51EEEC484AB72ABC7E6D2370999714
+1E5B9B8292424474931AA278F716A9314EC34E7468432DEC2EF2F54639BBAABB
+ED7216DAA183A57CE0906AE4FCFD17D58C24D5FCD2A2DFAA6BF09C0206CD22E9
+C690E58F9ED3E42F4171197F2A5436A906955B6859FC02527328EB346414A822
+A022439DD30559870FD88BA50555F481DCA6D4FDD3A0086577262F9D73970E63
+E51F78D2372D0EEB83478AD15F449FD9F2A740F61BAFF20CB34950ECBA703C18
+188F61C71220FE9D6EF6AE399AF0A0DBD5145F0FAEBC437AB87E300E3F30DC68
+5C9F034A31E1B2208A0B9EC2ED38FAE85644B1EEF3318B83B65DB758A8F534C4
+587F975B83727DDE95D037DCF497CFCB87A8B0CEF46466826F3AF1C20B6248FB
+B41FAFE73DDAAC1F28D9DF2B4B96283DB5AFB0B4BF4BC77963CFBC4030DEB130
+9E95F6085A809C1C55CA7528CB18AE5659B97CE789191095ACEBE4DE36E77BAE
+62868382DA764B7E37E26D998B0F1B11E702A222867ADB96A95D2D0B48013158
+CB5B61831BB5360220322B06B40E83B547BC3422AB94BD154B5989A564B0C242
+28C6BB5A72D2E81F0265B42FF6E9C80D2FFEA7262ABD942B5DFA28026C213ED8
+F7188BF6A9697EBE10738FDA63DB75B9D359678278B0A9347C56B1874FCA6BBF
+336684C315493454C21A113A8536694D3788080E17745964EF9AB781BFE4E300
+DC9FFA8593ECC54626085F0CF4C29A58F0CB4CB3FBB253334A1CE99B1005D474
+321A9FCAF141FCF33C8A703714F4AE0D13CC2E3AFE4EE2899664CA159B7FB652
+157A0A1B9FB4DAED19CD969AA216961A83322BB5C721A0D3045BA51ABFC42A5B
+562312C71A1194869785E52B95F4FB6E05551172CA5723A225D247F94B70ABC0
+E36EC104DF35EC9D3B828711D1C504E3985B66151A53436F7F2D34A1BA5390C2
+249DE9E1C1774FAF61D33F9C93ED13A7C39F4FE175A5855507D4E5BD34293E4C
+0B2DF8716BE8B2471D22E1223F2886EFBCCEF6307A5B89F4DFF342EF03661732
+F50E63310BCB76DD35990B51C879333AEF0A866B620B28F1DEF079A303BC81C7
+980D145314ABD0E7D86843AFB41C2506071A845FE3AB31FE4A6799377A1CCC04
+418E44564114157401C86633E565D28CE20708934612092F35D711150E57062B
+778F00F9F767B12EBDAE7C18565D7C58580DAF4712A191341FE9421E50900CCE
+88C29297090319473CFAA9C1C6F0E35D7FC6CF9F10F44AEBBF800DAB64302F72
+5759BC755BF27BC7FB6F02082A0541C7033BDFC30D8D42B80EA15419957895A7
+65CD33EB1CA613B9A8FF77EF032B58AD8EF314238C7FE95F1B679AB74326E651
+C068F3CA9D2F203AD8D9BB78328D79DE98F511E74F1E414086FE9E226688791E
+B7560E6875B5071D3933E1359AE9C9B5651AE3E3E146EC413DF143208ACBA46F
+3286BE9BF866F762B9BAB698501FEF48FA9A446DE48509625E452E28A5C3D479
+637B8822F08996105488333826117B10FE03148E63E5449D443F312F1FA75F59
+205E581C337E4FC0873DEBC65DE03068173FD29DC102E2BAAF151AAF0133F98F
+830B0E94CE4E88038920CB2BDC3A62BA1017FC5C2E9A018C4174DFF94A82ED65
+1B753E8346315320078D179199F7F3E1BD405D1D7016634157A905FCEB1DE060
+A2B191893D00B070533DC64C6867C36DA6098C236F72C0658A1236DF8CA8792F
+3728EB1007F2E7BDFDB4181DD0BA60B400CA843F03DD7A13AA207ED3EF09829E
+0BD28A2719C9B02946487C3F2AE4FD533D1997170D4A2DA1CFAD5842621A7D1D
+E90764878E5FBF38480E31E46E93B04D43E4B7C999B074E2E81A1A033DF6C055
+DCAAFDF409CA61BEE8C73B0B1772022469D3092F0FB36C72B0F72E0DF211980F
+5699E5C49C931A3DFAE2EE88F8B2AAD459765E717440A516CDAB76A9DF252DE2
+A2DEEB02D6E33484C674FC96957D485E66FD625E5039F0C3403B29AF9C64DD61
+645010C7C2B9A6CE8ACAFDEE5DD8AE20265FE8D7C8FED619AABB8B038B6F165B
+4E104723948C65CBB0BF5263954A297A53C6ABF631830F9136104CB0AC30FA7A
+DB482BAA1100EE9A61C1F8D6522862F80739DC8A32BC913A0BA6656A377A1A27
+F96993C0AA6381A1AC741F3964239CB8DBE83937DDD1F19B5724A444F3CE569F
+DFF25DF2C3AAE4B7E05C8B8A57417F21DCD326E230A723C17ED0D368EB6884AA
+279F775C902D075EC47C80549C4F92E2227B120F901A5024C51CD3221C21DC03
+D6B380DE7150CF00EEEBDC9E9DA24755B6EBB322DF923807A6864ACFA24A4690
+93E6A9DF113303DD59993CC57452D2DBD33C20B12AAF506EED17A40D986F6F64
+6F0241AA13009825827BBD20D860ADFA572C82B92DAC8C34CF8A730EFFEE9D4C
+A20F8DA47FAA3D317A31B5AC22B1D70CA6228B13783524D6D691EA04BE00C5CB
+18E3785BE3521DC4651270FBFB28DB2B11EB3A339B308A8FDB54DA6A83AE6545
+D672C8D3E706B46F71153991807E88F3292F01A7E1B6999A45492189E2251F5D
+FFFA554257E2388CF8F286E80F22275B743CDC9E886E4D881EA445A5002730AF
+BA5AE30A3AA5F08C28EB2A87FB1882DC649D9FF31B80680F8324C4F9F8ABEC87
+24411FC65DF5214F02CA47560F970DECEF3383EC36F4CFF7E2656EBDDCD824E4
+F55140BEF34F501820476B5A52A93A6DC2E6C5BCBC3FF23A9697C447E7C37199
+AFF2BD00D8E89A3B2D48E9B8637E35A89EAE4B168B4A4980030CD3A86F66D425
+B22AB1B57912CD32B5DB582D1331ABB2CD414285A7924535DB49BC23EA3CAB29
+2BA13CBED6030F7B5832351374DF51571CA2FECBE5A1350D3066B71E6D01D499
+133D0B554A6427756935877FB01ACA4FF74B937F39AF455CFB68B7E839BF4B7A
+B2C81A989C299677EC5357B8DBA8D4D40599B4FB5FB5A6D088B26261DF6A476A
+BACB78C7BDA294D6D41B74DAA6C03ABFA6C8D26CBAEAB428633CBB8532DC4659
+4BF4B97B4591920D029E36C5410AED024950D093049A988DF9C196879171BBF6
+FD711F98502C975AC26C7BBCDF239D69E71A8C642DDD96114DF03DD473BE5E76
+AFD77445F4C1F7A432B85C741982CB82E5096C61C4243269B6A3618EAB43BEDC
+31C38F15F09D85EE1BAC19C2DBB5BC03C8FFB21065EEEA0737A2E0B92450DC58
+707B5576BCE4E89689C5AF2DCE7FB3DC4D2B592AE161159FEF9F211228089861
+31C18036B63B11EC60545D482A43AEB754509097C3082687D430DEAB90D117C7
+0BDC910CAD0D70B6878EC6A10DDD6E38EB4516D8403C382D4C41223CA7B43FA6
+08D278D1DEB314CB03C2CD37FEAFB7B551E76255B69E8D2211DF32B233983B9D
+E81E5A484DCFA8E36ECC4442102C2E13CFDD7ACC518C144FA06B44893A6B5B00
+5E1525B5FFC203A8FC62F11694700E2A4A2A229C0B44BF5FFC7E7E566AF8B055
+C096B8FAC47D09D857AD239AD6A0E10E36011EE11EA7191FA593E59F95180923
+280E8BB7CD0CDE4707649C0A08B22014266A5532DA92A84A83449D3C31DB030B
+F543F95780E69CD74E4EF523705495F48B903E85DA098DBC3FB850CD059F71ED
+6AE0DC9D17180B7DEFAC1E1281EBD468A4A8F654CF2FB5E23572CC195FE14D83
+8777A436297D3FEDBCD7BC627D223FD586D3491FFE3592D3E802768510DD3A7F
+A422E75835D83D10874E9F4B1D7DBBBA0AF639492366B56770A635A7C25202C4
+569B75C7293545C46E7B371D8FE7B22AF4B1ED670067BD59FBE74F7283E3E56E
+D455003DD54BD626CD77F806627F2518E08745F7FB5605A7152EE0F08390AF33
+47821BE929E621CE3DB5CA7244462D83F674BCF47C87591202C389D427B37A1E
+36E1ED9EA23E24A086812F239938BE4C19D4150BAF6A9F04BE819D5F404ABF91
+519CB7D81C81E2D624ABA46D40C531FFE4219D0D631A0D375757F95D96327216
+F8F795674532AA64D8B32020F8FBD5F092E6785A669B9D5923C08A8F900BAF1F
+56E90553705F35D12188F1104FCB390FC29ABED2E0FC9B731C4ED40946C544CD
+E26AFE5DEB68912A5B532C8756640AC31087E7D4D64139898D2E6F69596DE462
+91E664EC93C9A5C22774AC592F8BAFA074558604D54484D9FECE8CEFC67CA421
+49227640944C67371F12ECD524FF392A71826494059657CAF454FC870F5387C0
+3188725BC7F25DE5383B49669AA4339CB0021788922FE0C65C7374D3D2F2A1E8
+400D59551C6BF5F603DA2396FB199656D58304EC8AA7C9AAD8F056AFFDD2C453
+7245001DB1CF6550816E6BBF32CB30E01B15E299A35D55D079E10BF2AC459E14
+1D9DE4DE1643DED4C142B81AA48E28BB11BF478860101A4A4067BD5AF109B9CF
+90CE0370184792EDFF55BC58A95EEB80AE685FDD80DF1727D141232ACB248697
+225658511123C3CB048CDBE11E1C6E7CE2A5AA350D29F9EBFAA3913C045A55DD
+F64BEE7FED3CA1C5EC310E50E8522F3C1E4FAB3EBEB73B66A57C3CFBEE29FA99
+5EA2EC693D0D0E4B3BBB7456FA27793A65CD19A04437C582CBFC7001E2917501
+C62E2742A24CEDBDF9D305BB9C963D500A330464C346880632D6F5BE93DCEDD1
+AC943CC68D0836DCCD345F786825A522C2AB7C296CF72C8DB96C1A16F8B0C621
+48F546EBC38A5B3F125FF8DCCE82FBE331672E40781F44765D6BEB98BC5F56EF
+365A217C72728A96ED69D0C80BE128941357C1E9149A0FD5A3023054F12C9CAB
+A087BB08CB9FA6842B4C7721DE3A9C199AAD120DAF05E388D8B7A73800146B08
+9B0ED26E7335AAD093FBB191716E877F78A12E971D17AC3EC33B8A66B18F7959
+D7AC7757A06AB638AFF519DBDD13A35373B3F6702FEB07AEA752C31AA23E6E94
+ADC876DF120FA5F1C359E94B5C090C3E865FF59CA439573A5AA49F0EBA152FE7
+595EEBBDE95968EA675903DF8FDE3964FC26F46FA5DD206E486151BFE3AC88A4
+AD6D5EFB678E6D8A8BBCDE2648F812DA3BDD7FCE3112A091C66075A360FB8BA7
+D59207FAE2D599030BB4C21F5246E69A7D2EE02365FBE9D0CD1BC02839681F50
+9B2E222A117C99F26F271F3E416583FC8BD968419EC92CD7C4FCA2B00D31BE83
+F81A69D97764CE9E5628B82CE4C2F071344C363C2DCDAF071D83BEA3F76C72A8
+243DDAEF2DAD4E483A9313938B8148179EB0E8550B038DD746F868A6A5990BC6
+B87BE72A4D814A74CE993CF39120F18615A71EBE5433B3BB36B6F8237CCCDE40
+65E8D9300BA9E587B37E201570F08FA9E2721B843682C4475AD4F21960CDF6C3
+2A75BF94B7CF2ED1DA55C3102178E12C19E996B6295A375C8EE43AE06A92EC8A
+1332AA683BC4C482A116961B151F17FD79D9A5DCE58DFAA03F8EDBAB45501F12
+C4211851344ADE9D1EFA5A2A207A7240F8C908A46F64291006523244E58D359E
+827AE19723DBA28D81BE6BC801CEA57EA324F2221EFA51CD299207E7B387B6D7
+B66C036874A673EF5243AB21A02BE1A393B1FE4955E264CD967ABD1B487F79BF
+2B387A2B47C16938BD3B77D8A43F6429F492A44426FC16E84D845C093B60D2FF
+D0A79A46D01C22CA62BB7E09C24F1AF8D56AA6A11AF916905817C052339CCC40
+48286A871FB787C7DDC1D9AF7AE66B8E7667B289A4CCA798352391ADB9708201
+E251F9DF6CB4733295E53CE5EC5EEC41CBC550C7BCBA80A2BCCA1077910EB375
+5442F341653133493DA8FEAC695135355AFD2E64E60D175AF7C9DCD309F09C13
+8B3304D30CD5D7C4104459C20D81E2E69EAE8A2EA9E4E37420F3197DBE6DB0AD
+398D5426847CCD123B598D1CD01F84C148040D41EAA7D6589206D9B84CB533A0
+155587C14FA4DF9B24594B485C4968EFBBD55AC7D971734E41FF2BE9FB4AA5EE
+3536B421A4F0CFC06359ACFF92A57F9992B9E871F35D2A2EC854BCDD077CB0B3
+501FF0EB2432811E630AEAE51944FBC370B568F4D2585C0E773056D1CD0F516F
+AC1A02C8EA3CD2A8ACC50125B02A8D72B5950411CA46C0ABA6F71015533203A1
+94944681B76CBCCDECB62FD214FA405E24D413F4EB7D86BD914F505F133CB409
+1B93A35F2FFF59EE10C16BD76703594D7AA97AA8C6894A4C13F53EEC597BD968
+DBF9EFD7F25BB20273E21F145350BA1E5948F0279D5D13F315B6D9A4C90BF3E3
+944E3ED4F94635A75A18267546579D67D382E3A86BB2CC8EB2708D2A185A52AB
+1C2A776131DB4B1C0A158204555D81EAD0A7753663D565D0F8FAB8AF65CD0571
+7273A1B5D5C48FF093D25215C7801FE36EAC417A66AE1B6DE4C9E58306FC0308
+F39A29896D86E1F539AC06DBB4DDB3A38877793B1BA87B8FDD7D56735181D18D
+4C7F72091D269F3C064A571923BF0965CD83999FC15C826DC0FAB85526BB8BC6
+56C737A6BD970EA5483A0457D9445AC8532DF2BDAFE1B3A560E1B3B8ACEBA811
+C7D09E26E1CC7BABE9A1DFB6FF4CC2F06422D39C340C75C4B48DA31A3E904381
+07259E70A86F80C53F4114AB7CFC26984A1E42024FF29185554D99B7C80227D9
+CF1670E12D4C428E2A590ABDF6A30D209111C8E84469303B7E887E20BC153306
+B4920E9135E38D1ADF227CC7C6AE369BD2BE75B8B5EFC43CFACE91E77BF29F95
+0006BFE766A925A71EACE1432BB7A32D48963A6D47341906E6D1599B4DE5183D
+4DD62BAD06DB145E17E316C16873A310AE2F37C2B6AEBFAB8F740E293B868080
+1F7B1B61B88257465F18D762A96A1706587ED0D32201010D7C2C9A1E10317804
+17CAE6BAB1B82E4B158C25D46BBCD3D71D79C00DA53271A5AD1FD8B9383B8765
+50769DAC5F9A39EB90523E6D16B5FFDC97EAF49F47DD21DC62F981BB7C9CF11D
+47A74332980E6A8E61BAF0DFC4D359373FEFEF52A7F633A06DCC7671E843477E
+5EA865D2B9870967E1CF67722651C9D74FB64C45BA2A8EA73656D76B38A5B189
+491E84A948BA65144419F40B3352A2835B170F42C58A0F333FCB1D271C0A4BC7
+8FBC64C387C7A26339EEF291135C8B2F1F670C8B14B920EE77D00F37AB0CB285
+87D47C102062933A40BB8E11D4ADE52CCB9AFF7F64C21B0CA8241D88AA4330BF
+B880775CDF71FB4923F0E43DFC64B240B1195F2937D4BE746208A219E0549184
+ECD33BC0A20D8BDDBDB6126D85FAAE8ABD5452FAD1617A42446BEFCF339CC49A
+EBFC20FF4E40555F07A9C81CD3E890158FD6A58BAB6ABCF08D1EF2BADEAFEABB
+5FD05B061C8C2347BC1A5AD9F6A653CA34B925CE12E5F5BF1696EC1C44D3AB2D
+C8E18134A7D937ABFF3BEF5E3211F4DB70DCED73DA1FA2A89EDEB8CE17967424
+5F2C26106E3546B9D9ACC389749C48BBA619393CE649E19493B918B81B6B6E57
+D65A97C464E038C46F7AF946877052D9206D8CAF1A4480EEFC6D95B805670A39
+BEA382487050F25DC205B3572C64CB87288EEF7E7B458024D55F96B24E7A74A7
+87DC524E5A7E3B7F147E2E79A0EDF219E6E3B7BE8345946D742774F983F2EC9A
+73F5B1D0E4D4BCF5EEE3DDFDCDC08419E594843FE5D5FD41C72306C6AA43E4EA
+93FA44F2AD5E0321533CA468E6A4E086D9A6CCA3BAF1A7C5A96C2E65FD966650
+448BAD418CBE74F12F6F670858FE6E362D1AD40CA5DDAA7DEA5ED5AF2F6FE23A
+6A43A1198F2C026E8C65C7F1614165401C484AF0BB292EC25A651D1B359C019F
+43E21B2F07239CEE4B864C2B818EF7B7E49C3CFC195AA104C75E72FC46CFF69B
+ABC86A00A2FAEF49924FDE58F117484670B655D60404D999E2AFEDAC3B59F52B
+5B1DA087243458A85A8711CCAAC382EE27E727CBD90BBCD51414B2698DDEC5D9
+36E21D3B50D897F78760E7EBB39B957DC044A1557C7D5912E57B23E82ED54860
+6E2DB6181FD8C19A3403C2E57C9F71B904DFD85949010310458D50B23BC39B13
+D0DA4EBDA698D75C9743B36128F8ABAF389B19C0F5CC71CDA37E722209250D36
+742A8DEE4F994D1D71405C5855B2CF8B18AA5F2FFF9D4B9737BDE81B62EFA298
+2B6FC900B708F08D909AAB33857FD9C06D7312F7EFC3DDA166A9B0B110FA42C5
+3DB57F5C4E39A534D1088FB0826B81EE5B672033A5210E5CB9F478750DF96626
+34A9362965A7F51F7C00B5664A95AA517FBEA5EF2F9088ADC2447DA282423BB6
+7540FE63C61B564F60F98CBC3464E77AE8845FD13C349E8836A01BFC83924E49
+757C3CAE8240573B3E194E5CAD718A8D43B28CB6770AA4C89D5D7DF98B1FE6CA
+3B03DF561DD85A0DB4F165AABDE7636EB7B3177055609FF69D0391F7F31AD816
+0EE599DFBC9B9196F433155EB21077A222146C7B1FC54761AB32DCF4DE556C2A
+FC4CA42E22FE5ED9A7C225EB82A070764928655CE7048E6BD62EEAC38143EAD4
+07F325CE53345968BCB486988B3ADF521A440272E6A0BE7AD000D9134F758DDB
+470351DC64D38E8A405E4BDD3AE550F1FE889B708F368D85E2DC65D59BAC1E5F
+854EAC12D773978D2E46316671D8BD27EA45F422B74113C48353DD2600EA686B
+CF20AC731D9A7E7FB7649F1A0878685F5FCE8A9E3E4705B2D27ADDFED696FC1A
+EE7BBAFC660A41812E422C4712EFB79F3A29E21196FB53987C706A15EAB3C986
+0353D345BAF4645B12B441F35BA9AB46BE7C0ACB3E84E0A066EF1B44E76F7264
+E548F7022424819EF56C7A917AD5DD80268898632FED22B6057CBA76A0275E72
+69A3B27ECF7DEE9C1D43F2E15BB7A18D24F1FF9C02F1BB5A737891BD4252E142
+40DF98670F0897B9BF3C60E02BD243125C28E177C19A18639F581AB7C5713D0D
+618BA5EACEF18947E5849BBD2CF752696436D222A4244B1C713FC4AC9D0FEFCB
+2C52B26FA451A61FA9D770212E5371EC2E52A39B8EEFE2967F15504A19ADCF3C
+BB25EDBE61CECD1D4E0A9DB5EAF6EF54071A624161F0113E0FE525D83180AFAF
+8CF5D27D08B51E2AD43B22539734540E8460D1905A6236E07EB2E383DF6E6F84
+6FDFE96B5EEC8759B0DE0F3EE2B4F984BA6D40CEB8654AAF7094F71C51134E38
+9EFAC887361E885A3753650686E6C6797227211ED0D927DC8ED6E9006D4C5B0B
+6EDBF506067E9D237A42C7FA41640A0E2CDD0A71A887BB2745B103FD3941F9C0
+1B1092FBD68B12FD6BF6AD32814CDC85A0AAA9DD55D7243314AD90918F9EEC5D
+C0823FC5FEE0D593627BEFF2DB78157570692E6A849FA0DBAA77AAD8EAE7DEBF
+336AD33663ACD6FAA6355BC80BCF9F8643A647376C973F8497C6EAE0D4D5CBBB
+A8A61CD10FD528775BE2B136C526070BDCA15269375F89731E32A331F33EF1FB
+CD242AB1B191E33B532294EB1283CAFA53F8CD8730982BB4265C89FC674D1A78
+E675AD20F8AA1C1DFFB24F78AEAB8BA223F0E31DDE797032AC643E330AC79895
+3EAD5E107EB71092AF2774E0C3F23824E2DA94F4529B473AB6C0081FCBCBD9B8
+45BD11869A86E267822589F4A45EB799BB613DDB85202DD5E305E3D172CD605F
+30D089E3AE70A158089469899C13BFB769958C8D37BEF2F9ABD085A40ECB5C43
+9B2CFFB9AA0036A962072C282FC27D8FA9BE1F0B0AB113E80F96A455949DCE7D
+CFDEE414406F7798BE6BA284FB860A694E2F81821EB4A95F456ECB407D4504A5
+B0D47152E95372EC6E81B2B91160BDF996614873BFBEB361FB8FDDB22090FC29
+D5A9EAD120DDA69EA88CD80300AE2DDE878DAE1694F46F590BAAF718FEFB083F
+A96FB65C11FF4CDD7BD821CACA9A360C2084F96D15C33827CFEA6C6C36791B6E
+2CF2CD24269128FD7FFBB32AF1E345D5DCC768CA3101404BE06A9DE762A051B9
+C7D1D87BED457E65C244C8E257451C3BC65418E77256516A9AC64FB58882C525
+E1BC1A58CA5E99702F36C368C910156CAAE4118C12CF1DB5B7259011976E93B8
+88CE0FE1F0B203B3E40E4BCA7491EC69860A25E8A705D3DDAF0B9ED24B30A0CE
+7E9BEA705D6D7C02D78341322405F0A6D6E1EAC98C4A7108F9C3A8D10B76B1AE
+5F485BB6E359FCE6EE10F346AF7008B5532B05EFC7E4F0FF5580E9BA357F5ECD
+5D86E6240E0A0EE3432DA7CFE2D15B957CA669C2273F61F8F92709FDEAD7EC67
+420939BAB8EC9B7BF52D8F19CA81FA95D58AB5F19727157018C2AB45CF258FA5
+BADC36BF706D5B191E11E30C1F4F5178A0C5681DE932C2B37B1402FAE1125F58
+0BEF22CCB84A9DD65EBA52FAC12A115CF3B0CDE54CD88833769ED08DFD9F80FB
+1D97D4BEC3692B287BF34BC20E8FA407C675C2E150BE17FF1A0C4008EF3FC950
+BE7A656297838C5737255A18C39CDE6A53518BCDDE82B6A8A43A4685C9350B80
+7F167931298612330A36EF38625F86F8D563A111F8BB3B02D5CC032386C5AA5F
+B2E6AA5E791BD1FE540FF315E6D07947A9CCDC04EDBF967E01BA02CA8E8AD66D
+C693752CB0F1A4BE087D63FBE452048F2513243ED607BB4541767AE959EAA325
+D0DD64A5A55C3CCE1BFE2467DC08E90A1D9DF87B44E0F0268D0B1368997D671A
+5AAB40F7DCC697124C62623466FB10909990A6724A601E76FAC0668C06953C02
+C8289FDBCFCB07A532DF65F562D4FF7FCE9F5166E77A0D82C7F5EA434507BCE5
+0204881294D45DB905DC353EA802F6251831BCB3A874E2E1797061395233055F
+AC844805DAA79DD8402BF902CFE23E6589F50295AFDBFEBD6D37CD0B82C45693
+BD22B4C566B99BC8CA4C46B7089E46BA087FB380BBEF1888938A3A554BB9CA2B
+45E206614D29DDE153C3A5CA8EE3DBBF1D77D2F9905AF06BFF7660CD63D92C96
+D311734AD82D249B249D30EE70D76824EF0A7C7646DCE9A3C337DA87B582A74D
+1B30AE0C5E822C352FF3C5DB0BD0F367275EFFDDB50011A5C39327ADC6A951DC
+A4C80510E7D96ACA191344AFE2D1A5EAAAD8007EEB8A51F581CD7EF460C87807
+0D274570F8B651EDAA317E1E50B2E194B6F762E28CC7D4B1477EB9D31B46F78F
+0C73762DE4A83B9F31CE2AAD9195712562BC40628402843328B1E1AE8D6F4298
+AF7C9C0DEDA42B5481BBF1AAC4E6B3ECE92E6AB4CF48139214187BC609F3B6E3
+D4F1F909E24AA654954B103BB89BD36D9F76C48CE7A0B17C6BE9D8E24184833E
+391A96DBB44B1C9583B8EDF7287A52BB43187F651E4848649EDAAB1DEC3C25FB
+79FEAD19E901284D1E84311DCBF128063973A32FF6FF386B46AFF18BF1E7C64C
+18B069DCB3E5B96EDFA17AD846496F69C1F00DD9B81F4D46B004DB63FCE9E27A
+CE9FCED4E121B8FA784FAC3A49032621CD2BEDFA831B42F73814A97D22B11E1A
+38D3FB4540010715890707828B3CE11B17D1ABD42417238A5AC472D9C8D8DEE4
+AB6736D60759A1003A38AEAED363C71FBD05B51DFFF7D8782B0F1382E9C6660B
+5E35E1BCAC6C69A64CC0B62561DB8C47FD8A9269969B9E6CA02A1D18C0456D65
+C24DB4D14377784EA7490A2C054F80C7569FF90AD1E264B1E1EB3A9A8E0F24E8
+E31C4D63ED7BCE3E6444F485278E4451DC1CA432CB51083F22183FD92466BBF7
+FA4B6535AB0DF6DE9E4894A9B4F135D6C34A16D4D03FDAED260AF506117A66E7
+FA012B2A97EFB0F819B2F579B99C9867D97AB6E6997C908C7D4CA2B8F305533C
+A4358230F2F1D1CD48ADF1C0A82F79DE6419A1ED438759CF1C103A830A1C1D77
+F188FCE9B55C8E17109B9CA82F2DB0ED325FBD1B06A84F72EEAAB6D8D70189EB
+CB5E4CBC49FC1CDAD7CC380D54F7A98D62FB841FF387356FE397293CF0BAF503
+33B992EB79DBC524868D2989CB59CAE125162C1396D8807F02D84CEE97A3DA5A
+18D432F6FDFB91CA7124C135565BB5CE067CA968DD62F8F19733D7B246522D01
+AD892793950ABA979506F15AAD043B4BA66D6A434A74AE41CC84F181808620EF
+165C9C02AB17C9944EB9BEB185215FA79E1B3AFA7E1D5DFE062E35A0939D041D
+6FCA58CDBAFA993EA430DDD3929CC16A75C7D667DC6AA302C24060CF8F9890E1
+56B99508CA4FF83053C9EF6AC3FCA0322DA0E01C9C15560363DBE82CFC54F35B
+5C436943AE6F16C8E99AF94FF64EA384AFAAC1ED0C2A966924BA4CBDB5BF6ACA
+45541DF9F9755E0D5CB9B48530A49427D82201BE60E1CD3BDB389F48447D3BEC
+FDE1D3A32DC028A457215CA2A3EFC1F2E4853291825DAA8FA9DF148FF67C3299
+3C03AABE7A43133D07726A6E98FB8D4A1726AE3A142B5032A7A3597197B47604
+3A3EBD6CF2F410F7FB49FB6CD0D6772D9152D0328DED242054F11B0F2EDA6831
+E36F5B24A45CBB204E884BCA15928615B2397AA1E564E30F15A495C0CFAE9079
+186C2B481F7DE57E3CC324525AF90C7382A6C7445B4BF2BA89F65C4B14889E19
+FA79BF4CECB93C5940A8F1C98DE3CD9E73BDE466A6D8A804B732B526AD4BD51C
+3BCE1F2A49D7F96D4017F9C79BF0E7528E6EFB666E14567E5C60D35D0ACDDD32
+CDFE5D1CF0238A9744E66FB66D5680C24694A88406BF44422DF27E4B2E5C25EA
+C4FB115E0FF66D6A646131FCBB4F2E621C5AD9EBDC5BB04CE4E029C957152D8A
+2D7941E84DF4693A8F588047D70EE69215B0B0434BDB60C3BCA352C507394522
+4B8DA22531827260666D1A719973713153F5F071C0F2EE18AD6A65466F414C78
+78CA9535DCC0E1E56D01F59AAF961D2275EA14DAA97B873994D98C1133092BAB
+589012509E648CC303C60C82F7346F897AA20151397BC47A4FCA4EB5224418E8
+F877A5CE3267AD3C3E28865600649459D8898224614157326BB6C731B0812895
+6D09851A2CD0AC24E3564EBDF859F795BE32DB1DB06FA2601CCCFB442885252D
+565FF2F2CD53399BCCEDDB5552EFDC6CE6EFCFAE5077D7E2EC26FA50E8EF83FA
+07331406CB529C10C2E8834C6DF8A03BFC4460CEB7B0A47CC3A2E5D3F7D4595E
+D19E181443CE00C992B97224B5F044EDD6DF15CDD48CA29F6976E41A67FA94CF
+312D7B5F3FD4F1AE0AB22444DAF14A6563A557E0AD3BD32EF135C8D1281CB608
+15EB09CAE15F4FC36E3A4FF5CB55DD29CDBA97EC9F0A480BA4D809F389F2D8EA
+CBAF9FC3CBC1BC601122823A2E095D5F46AB81E10F7D6E9E6A41FF12A7467079
+E0CC02AF9D4F50F6CC53C16F183EBE4FA08C6C8D14FD51E1D4FE329525647F21
+201FA180DF3792CD3CD5AEE51340B026239B9AB2643C921631C1111712621C78
+C016FC996D1F7EB658A496CBA87EEA09C23020D9FA3D467BF71D6AA1C1D235CB
+BD4F5F76D7631C4A104C91233764DD7805CCEA7D07C7564F2DCDFB03BBE9431B
+BAC79C9FB93002787873B8A6936375F317CB3A2E4BA3E989FDBB2A0321790997
+0241621DD47916EA28415178B127DC9058093250D6E3730F8C57BA3C04EA5170
+7A327543C9BF4A8161334F2C4C1DA720DFC24AF5EB127E38067A12022AE64034
+32DACF7CE8E25B2B6DFD0896F509A89668198D67FCD7472E903FA33501B9A32F
+58491A9F669B98A25ECAD38523956C7EFA01E79AE208F5444B12314D37CE7EA8
+EE90E036A59636D687AB9F56578D9E5A184447A638284289AAC1315B80DC3B19
+1C8D1FF53A5FCA26655D2E4BA6D8779F1E88EC3BF28DDD22140BB975FDA72B78
+02E69808E8607D93584F4CAB6DBDC1789534FDFD6B8719087D6C77992FB5B640
+5BDE8C8BFAFE1F9B691B2137BE874B1A98DBB76576D40AAD985F8D745340BB89
+F95D3EB90ACD2AA4FA63E47DE606E16A78762DB1533F04F0AD55423C2DD5EBFC
+E37EB91C7413E95520E9AF74A85B6BA31372CAC89A91DAF34AF9EC87C1E5C19F
+7EAC8C50F30CC681B4ED75C08197F7AD6C4A6C95C7304FA56732491A4C667631
+8E4B6FCEBB9C8C186536B7B382B10210D157ED4F3FC5A4F040EB9EDC43C0D70E
+829AD7297BF6514FEC0ED86504C192AAC7EC3B57B190AB635B95B36C168A4D1F
+1C7F2CC2E90664D4F0F69DFEFEA54D903D12CE3121A9767C14170FFD867D3D48
+42C6826642AE5B6A5180E3DE0D42170256735CAD47B26DF5068C74310D99F9BC
+04EA14BCFD1F1BF51DDF86B4566D89AA583709340C7BBC3665EA29AB1D061938
+D449A03AA7EC41B595BB0885ABC137B0EBD834EC4691AD71FE0DF9D30996FDFB
+C359A5E109C5EFD0152D4AEF651389BDBDE763EE2C1AA3C7897135F8FA97F171
+E3FD9E1D95AEA8F2D31A4F2F18F45250B452AC3768B1C7D728ED1F4D27BD0467
+CC6991ECD1C2525EA4BA1D9ED5EE70C7C9BF579A6F04F12E34AC933276D92FAB
+F97D45AA75F1CD0C20701F5A9480FF5CC6DF6C8553348EA0A241B44738646394
+DA236F88F53D1A183382B420F6A0D3F7871A39E578BE8F883BD0C6B03BD7EA77
+24E3791D1D6BC2753F1F84EDF2B242A7DE30B354F1CFCFC3A429C427250D2057
+1E879577A62DE28728F96F1BEC12E1BA409D66435D587711CBBB87168E5FD45D
+4C405B2D61E223EDBBEC483010D21D8E6733E6314794ABBF19917A8506B37183
+0CD6931742F24D1589F27EE6CCE04360E0B1C43E440349A731CECEBB62AB59DE
+94E738713F87322E6F4B5F4D403426FEA0E45E23F32746F37B7E0E31A69F6EC0
+DAE7AE4C3EE7DE93AB54DC3325AD405F389814F7622BBBA247A3CB858EC62AE9
+D2489E2252E0D1C0E7AE7C14E5B72E18DA81B4F14FA56AD21BD645FBF3334591
+9956F9D4DB6018FCA070FEEB31E6CA0638DEE5442EEF99F9F0CC4675EE3CD551
+8004B682A1649B050CC874DF5FF1BC5DB4D33A5C6CFB4E529D33A45983047778
+96E38BF80BC18CEEB6CDEFE2BA8F65E51EC9BC43E15E17CD9C64F45820962B40
+0A91ACE263E8B78F440637FA55F506163C8553FABF89662703C094F2EC622F27
+F1D83ACBD9CB18FD179B172DDAF278625BA1CF5C2065D25733D9942A851751FA
+B2A9971A050370B56215C98925E74AC36B2AE4B013CBED8F23C0458EE99C9D11
+B86272D90D984E6C05CE153BEB0C5C2E7A66D8524778C31D82EE325B514F237B
+7988F1A94394F498288B4401D4B639E4E819469A35FD4764BF0D0354EDE9E046
+DF7932C34420471647FC91AF39588AE076987CF39145C28CDF3C82987E7DE26F
+EB20F52A9E2050CA53B8EF1F78B846C70FC4FB7FCAC52D5BED0287B01EF7394D
+08E96544A175405D0C2BE4F443006D1D9348346CB2AC9FF48646709A2BF61BAE
+0059DCC94DB11EF0BB3653A44D8CB7B3275C01B8B6E09B0B389CD7EC5148F2A8
+7AFB64F0E4DFF01DAF8B29E628CC2137924CF68BB433E064FAB734314784CA6C
+AB3771A5BD98FA71DFA8806935C14C9016F3D8674182E3DE603B02D20348F876
+A413255AF23080DED1D288549C4685643A3FEF2E16D05A93CBB7F5C69DED541A
+B3927E22DD1632537CEA77ADD04633D7BDED8C988EC6770CD83F48B74BB32149
+9BE1F4C5364617BB1635336EC1D442DB160A51ABBF8AA3DFB9C93E20D9BC0951
+98AAA43E29527FD9BC3DA340B7585EA73D5180969EA00BA4B393D6D88D33F7BA
+E4B2736AF1FEC5F24B64D6C64428CCFDF53F1CBF3DBC36035708C593258CAA8C
+14611422F204148981A15D01FEEDB3D98551DA34357751C5F47591656C118F5F
+BA3452E7CB4F08F7CF7F1569B37EB2B64E8CAE7BF42E06DA94B3B261C01D8523
+141E1BBE5B1491C0E6968C4337515DD0C0CC523D6E1852695E6EA5ACAF98BBEF
+120E44166FBE2F0EA02EFCC6AB694BBF56A522FFCA2F3C2D43E5533A6890F217
+99498AA38260AD3A4FDDC0521964534A74F99075934086F01E761CC37DB5DEEB
+DDAEB22354D17F4DB58F502BD23D04C2B23410C359E1C0B5B6AE4C45D929D734
+33F500E907D9FD913E0D174C5B01FCA305E006638376E8E2791C39D0878EEE91
+A72942E0F4637169DBE7A7089A7F9C0499CF1AAC87BC8F676980E0B99AC4ED8B
+33F0F531F25392C6B35B5C91C649BBAFFC7E3312B2DE35ABC74C6E52BC042B6C
+A013F7E6B73FBC32E12B2A24CE86FE30D727E7A8F4D70CC52971398E9276315D
+58D5F787068F3AE820A5FBC0EB7ECCA3C5A5C316CFC77DDD23BDDEEBA20239E3
+F3872B6934C4AB3FB522856754143708E6D8BA83493723494329E7B864891A6C
+5866AFE1AFB3E7B1C589795D073A5FCD201222A848C2044E5DBA03A154B6D992
+AA0614CA56BC35D679BE120AF3EA4F5D65C9DE663917897D4001305735D8894B
+C4F92096450CF3B47FB0B0E4E6B703F70936CA5F86CFFD0DDAC00AED05369D2C
+5F0FEDD9438242D96F5CB8B55BCC9BCDEABDA9BD33194200C4C4B6BDDB84732F
+DC9B6D4340B9D1CAAC41097CB74F0DB903F563BD0F83EAF9DD3F72EB33800B9F
+E03839C6C8F58A554F2A6AE4C5D87DEC7554A923E31D992E582F8FA3D87AB199
+E1C9485F60C453126A28F9D713B0703B2E5FBDC6FF9E43DE0042152F81EA13B5
+9F87C01DB8AA4DC7A79A1A0C10F953E284D51990849E20C5F5830C940FC96BE4
+9E8B8A4B478CE51B1BAE7E4F37126894DC9BAFC200EF9E366A4D054B80500867
+31E8911B0B75E16E690638471822B07ED3C230845ECDA423D7AF521BB5A8D230
+29E019DCA98DD25A0E3587EB037FEC117966A28717BD96EE6BBFEEABB437453C
+9563CACAF9F3F0BC5FF1805A596B1BD178ECC82AA33B31A0DC874F31159A64B7
+58B8714958F49B334C285808E051FCB293239C364DD48EF3555D0E442D60517E
+168F8D4480DD284A1B8916130F7A3CC9BBAAB9F95E43C59F8A21FD739523BF98
+D5D851737E3CAF0E5439FF63BC9051BEAEEEDFEFCF491F586B1AB7D8CFF61BC6
+0901EA7E4C9E770A4BFBF6CE909E8A6DCCB3819438D70088BB3F1C87B776A4C6
+A90D03F224851A1480B468E249DDAB7DE3212684B258EE29194A26873ED61318
+492C8C9091F3DDF4094428FEED2B39E9667E8344CEE8E93A7C89137EC66841F4
+51FA538E5733606B1998A7EE5CFD4267A1CB0C01500503EC8759A825B395172D
+DEB3CCDA35F921175EC34A414718813BF9875D1DB7CC6513026B0A9D4D851183
+DDF5E88913EEC31201F22F67773D1DE48DA44DF515A9AA924853E73ADCA771D2
+5F2AAC342DB76EC44D23973FD8CAEB7E1E5303F42872AC1904F4EA6790CABE65
+151EF130A25983B375E9BF4A5E5514B56CF5563AAF41BCC9F5A8DBDC9E3EC344
+C387D43912FC70969FC7C0B6BE5DC1E0BFD0CC1264DD729931396E99D9BEE3D3
+2339B4803BB8185697820D646F8CC15451EB9D8D26124B5CAD7389A8F3F5DC87
+2DE9B3F5A6E4BE87AE282E8B8FAA9EB0F559A369683436E6369AEB562DB3231C
+ECD34DCFE68E8B660A3ED80C0CD85E4B29E56C93320B4434F59F9D36D6F9AEF7
+1001305EE280CFD4C7F84B0CB42C8F1A2838F78C08A041B3827D277831A8C49A
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT12
+%!PS-AdobeFont-1.1: CMTT12 1.0
+%%CreationDate: 1991 Aug 20 16:45:46
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 105 /i put
+dup 110 /n put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+readonly def
+/FontBBox{-1 -234 524 695}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E
+C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E
+3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B
+426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D
+D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161
+E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32
+6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5
+A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE
+0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC
+85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF
+F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4
+C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC
+12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D
+048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8
+0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725
+741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB
+9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE
+306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371
+CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666
+1353CC1FC512D59DFF847ACCD3D03959C548F21BF622A6C3224EE815E753BC87
+E0364A12A1728D0762C266515BFD30F7711A9F1F796BC4BCF679918151320681
+D3202FD01EE5901981E7EC55F58812978105DB71D10B0A5A39BB69F703B11160
+71E527862BBC00736D616BF295EA94ECB611548BE15829EEBD0909514403608D
+4C7C220B61E9F004D1CE7760F7D96A75029244E5505A2579171BFC831AA0C18A
+5D09BC573A582787ABBCF9C680DC4A5F41F6D7208A4DE3DD4E566675781B86D4
+7631FB52070FBD290AE6DE90DDCBECF4A71A9C04A88F4DCF468E3256B3E240D9
+86688B5DE5C0EC734599CC85478045BF32033E14B99C532D3192440F4D23BA99
+AABC774E8978CC4CC681102FECA5969C404FD82F9A0E9F772ABA32D9A309E140
+C33E65CD55DA1973802702A9D38953F95734097864C045690EB370F9600CF504
+1D8C256C3F54789A39130AF465468B2EC43496CD305352AB5C50B19B6D025C0A
+8D85950ED3DEDCE064098AB2EFBE0E5470B1553AAA691B108AC28B169609B244
+B9A4596E9DDDBB5017847AE359E7CFAE76951CDB353ABB5EAC83026FDD24BFA2
+40899B9A904389B04CA8EDD18D19574585FC843F2D8459EDF6A296FFA0047F3A
+7D08570D877CCC8AF22684DC4CC7BA11F5E2296FCE728087D5394F3D2E4CD157
+399E3BE34CC8A97E4D9B7AE8A54747C945C23C3A2E3C07307815EA77E3DB8F02
+FDB2E31E2EFC2F4FB10A6CCD14D6C5121AD7DE0BC201BDAB24998DF9797D7F37
+8C00252AA9783E54023EED68AF1D0A7C3DE94C0D51DFD79F6D1CECCC35FCB852
+C7F523D4CAD562FB00A60835EA49753F176913C4B79708A071CF88E1757215F9
+4844D934D0F0DE9E79A4E68328C9AA900C8351B7A51B5504C651FE9C6832AF05
+72A710A16C7693C544D585311E6F81BEC2C33BC8BD3FAE4E82B0DDFCFB1CE847
+B4BF65F30AB480B329774BF6BF1246E2D1F402FA72F4298B90887DDE0AD09DB5
+4CAAC75BBD2437B7B50A9F42206421D0AB69DF3DEBA9F0134BD699BB223EA67B
+B65E5BFD4575E7DDEF810B768D568387AD94DE8A6673134B824C78AE36D0922B
+E21F10BA2267BF39AF9D7C06E64A467D96A0F8C4B6733BC9D801FC391D426B46
+7FB6CEE46D3C2DD27770565774258E5F2C5773D82F491039976FC29DB4E86213
+0A4D9491E5EEFE362AAF37F6C0FC0BD6C285CADA011201809FCE904F0C558834
+FF6EDB62354EB38795A4FBA53A670912FF984A2A702B9898D4723FB993AD10D5
+E8A3CC543EDEC2D6CFC69E6DB0321010D6A7FC357B9B6292A9F6D5BCA1FC5B62
+E769CB1BD40E7711A0298D1A425DA896B11A68DB14795FFD9FCBAE6C35DD3FEC
+6F914A57C65068473594716B2CE171E7B59270B129233571D0A5D6D477907286
+70057B799C2BC43735E2807CF34BD920C25B736BAE8034A6B8CC5E39EB4B7989
+84626CC8667E5912BCFE3C9FD65DA80D6CBAAFA6795E8B9AB9895EFBA2C46704
+64FFB18CA92B5215AFAB89876C41E34E5C1F14118714F73E516210C21D44D038
+F860AE5512AB012BA7931B8411359B63E6013B3599EA007B774D6B6D85E872DA
+979837435B5EC037B756A26BC1DACF1050AA7884F3D694CC4D829688D599C994
+3352EF1436AACE4E456C6C8E1DCF29BC276D6B2130EFA0F2318B7904F3391387
+EA5650743E6CB1768F4A9ADEB48378D1B86513FD8BF92864812921D262407DEA
+276AA0A2ED0C36C7678DD04C5975A8D9CA8A315FA127DB1DE6AEBDF79375543D
+654BE2B92AA5BBC5461CEA72A689751C884E7139AEEFF88BC589DFC285CAA007
+FDE71A258B28A382967D314721B5D29A2D31444C9EC9A3481247E6C878D3BC6E
+43FBDE0B6E18B7540600F0060455FDB2294C88A0C67D635103151F8FB91696DE
+D372C14C3742AEFDA7DB3A5719CAFC7BA3BAE587B239F2D55F33C70347558225
+1C2A16490B20E00C8976A27FDD326D2151C6FF53CC045D2EC1DFC9E01C169FB6
+AD694DB6D8CE3489977471CBB867AACDE52F245BCDEE90C3A23F07BE0E7E2094
+7937446BC05A1705D86BB65AEAEE557E4B922C542EFB6172DB59FB9B49785C7E
+9DFE1F47B9FE21B6C0D6436EC7E8B1A057B8AF5128E5B888589EC1307734D22D
+C2B20BCBCC3DE667F067B44E9D0C9BB639B054CE402EC991B5B12F1A8E2E6BA2
+E50CF2D44A7C4C10EC7DC93C472B75ECEE779FCAD56FB7F293314ABEC48CCF74
+B04B2AF9078D0E57E936440867CE1BC1FA8FBD944E3EA779BD89977B7C0FCE9B
+6B2E4F4895D91654FBB5788FBCA84985E90E92E5366CC32DC874B51ED2281CF2
+2E6FE6BE3B206CC18FE73233F014451BCD5D8C2F4873DB3EF2A393F62D5CB2F0
+B98CB8D8E19DCC6F885C4E8F7BE5F96BC34661DC6FFCB457F3642866D393DC45
+FE66B8AB77F95B02ED26A9D550860BFA4AF0881BBD5D0F01F035FB466CDB8C9D
+B6406B2679EFEC268CA1AD8D4CDEE2D47D6EB641D13AB7F3151722588DE3E2C4
+3EDFC0BE4B9A65D0CBFA0F369C9900CC105216A86DB6FC9338910DBFBC4F3447
+531A32AD80C30F83BE7183E30D9C49D00CCABF3C615A94917851D3145F7FE82B
+B62C60EDD92FEC634274679B1BBCD979F502CCE2D76A7A273D071BFF9A6EE664
+D88B56896613CEE8617A239391A3140C55D8EE40DB0EF84E1E6F378CA62073CE
+D0C24F98F07BC80875B0D07E8D449344826CB71659AF33E196C925256B11A737
+066C9A1FF0BEF8C90B068024B012A25E605F1CAB88856FCCBA52F23ECEB9091C
+368D3616332718EA80A122C74089B911DA55F7AB3E4BCE1C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.1: CMBX12 1.0
+%%CreationDate: 1991 Aug 20 16:34:54
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 37 /percent put
+dup 39 /quoteright put
+dup 45 /hyphen put
+dup 46 /period put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 89 /Y put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+/FontBBox{-53 -251 1139 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26
+7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF
+20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390
+B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D
+68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809
+D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E
+26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D
+F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26
+77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299
+BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E
+C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8
+30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5
+148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C
+E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D
+E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23
+337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598
+0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6
+472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E
+A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26
+30F19E1BCE69BC499D860F9B17E6A78469F652E1FC6991A91F9978B9BC027D54
+369E4A59EE1C03C9B0F21DE425F4D56FFAEBFE015BF1C1368DD77C7AD0C015DD
+B05A6EF47AA55E82DF783AC53A410FDDF14211892D18481CFABDEDC5BDB93027
+4CB70E6274C41C2BAF35E928CE449181BA6E7B26F0DF1B397DEA0033C1923E1B
+E269D731456CF82C1518E140455451382F5EA496D0DDDD571BF2DD94843DE64E
+F6E73F9748288C2BAF3C59CDDF0D83BF7A36C90963E08DABB212A738BBF4066A
+AC8CA286A0ED2094A19A22D3A9EDCFA19D855E8471EC346255D502520FAF6C7A
+1E8C11240EAFCE3BC6D791B01F27BD942963524FEC6A61223871D8DB2CB89CCC
+E139DF92AAB0DC529D47C74A55287C5A846F7DBDC633D3B2F3E1FC9E3657F8F2
+E53A3980D2731E05D4A590A5F7F31F6C2D8067D40BFB024A8F97A1A8FC6A593F
+26A6857FC8D7F50A962FDFF66658248FF36EAD6D024419BB101E0CC0F543CFD2
+12CBEE8D9F44D3F8FD5A4FF70626B462421D831E09DBA3E54738A6F17770002C
+AB138BDFC1130F8BDE9D34A3FDCA988EA810008B2F374290F3836F8E08AAFCEC
+77F78ECEEDA7813AD79824026D20FB106DF5A508330C82371BFB2EC25D24E409
+014A288ECD37145E2BE9B2FF823E6EF37E2694EA922CD758E639FFBB70E10D71
+CB4F0FDE41384220D7FA3F32AA91EF012B1B1471E993566E73A40505EA2E42F9
+9E88EAC350E5CA9E3F7B6D616B17C007820F4269D6C3DFD25BC8E592EAAAEED5
+8F720213E94A15876B206E6A1B2E999697BA23250EAF883556D6A226B9B762FE
+F790243B977887442C7C31A81A55A056C88A971BA41B3008275B021AEBCAC643
+3008834007A66A7923D0CDF62E492E47E3AD8E852B0780F7D449BB0F96650F8E
+8443B9426ECEE46FF25F2A9FCA4E5EB5B616CD6C68E4B84E2B39EC2FD713CE67
+BD7459A5567C08ED9BA05F1DBC9C535DA766265612666DEFC3DD11F7C3FEC3B4
+0B78322832C7984B4379AE0EC025A27F911FC4F0386774985C96399C1E7355F6
+99115DA7497132CBAE3C9F87A9748225744CA4603AEB70A5987C0A2566CEBAAC
+49DC3B4C5CBA09DEF0AC0F07127AB83666D0B35D783DCCC86E858F9393C0F52F
+C9D21C22B383421404E7D8F5C2E421610D1B48F46C7E97D2443A596C158567D2
+5F6871CA1D0D01DB0C423A86C50826A2C052DC01B8E7AF94D44E30433585124A
+E07F813A15A23A9D8CD5840228B74182BAAD3F7B1652A1B30340B9D65388C7FE
+F3F5AD7CA7E91074125404607BABC9B04B8EB76E61C4B1004FD3D3B97290DE56
+0053B51112AD71094C1FEB4C7A23A07CE32FBA8AD35FEA07E3EF3AD81CC10EAE
+64D84FDE52992DB2B3BE9B4C2C36D1896B55A7848210C4A010D864A3FA8A3579
+0874AD97935317B618FF13852F48BA817E2619749222A030899A70B13F4D180A
+8DE07BF7682E5F08B38F95FBD8ADCE85521CDE3B2516F22F0E321FE0AE2B9B58
+9D52147DED77F651EF8BA7C9541CD79D9F0E84AD5AEF9EA592068AE5771F20EC
+DD03C25845ED10DF57F33D2A5D0AFE9B7721E4B4CCD61858D9F52D6CF6377EB4
+5295F861A29F568C14DFAE32126EAAC9F83694B83C2B7411F9CA1F52F99FF2E2
+CBE734427CC372856C18C6678EAA8E7412448FF0947B03266A9999208EBEA70F
+A60DBCF81DA579A49CEF39A8F7942CCF4B53427585F4F7810F28E20E921DE8F7
+9D39675C943A554BB613F16F3EF64062BFDC7A99E3C9DF5025A877095480DA46
+9166288C7172D8FAFB26CD89CB7D5B1892AAD1CA865F2273ACEFBA32C7D7E72B
+78B863B0B9FB7FE3A707AC1A88B6DD46432466B05E417ABA7C80FCCAF63E9B43
+14E9B98DE85292362B235DC195238B468EC5AA1969892F2C3E0D501742ACC8CF
+DEDF269DA4E5C5D9DCE7F5D939EFA5D3064305D0C2F867F0D22C17A56CC7F8F3
+74895BF8071D352446877A1BAA290A3B97357E420713886E17ABA1BA76C504DF
+DA93A9B2DAE9A5A47101A20A359976806DF926E46895F8937E132658BAEE64D4
+256E739938AF703B05CD268FB98F86206134543B73E191337458A4AFBDC8601B
+A20664ED640B95F5A2CF4AD52BBC3D81747E4B619E6584A11B7BBC4B3804DFC3
+205EA47AB5FDDF018DB9824B447BA99E290426A8105F9B6E11E1644671483AA3
+8645D62B6B07F1C5D27C69E3147B09722012B2A56CB41643205ED7D9D00D7932
+FD436F2FA0F736C99C6AF7C539DE2F458C8B3514C5DB64A78F0A0C8C73CD67E0
+EFAB859D00DAA765C13D2FABA83097A05877E937BD542623F392F8E1128557DB
+E401EC34EECDEB59EA1CAF3C8CCCE400968DCFC952AFB7C008D1ED6A6D2C818B
+39A77A22E8EE72EA118A560ABCE819D9F8EAE383132093669D7D0DAEAC591DBF
+DB7805B5E5A04005BE920843271D8130870E3E6910DB62497FEEBBFADE456CA0
+1F31519DBB7578A9BF3345DE30A2ABAF83A81B1C6058FD328F655062AD58D04A
+7B21A4961991AE7A26BF3FDF644AA1606D4196EC9BE4E55C590FB2061A767B2B
+831B876084D8052F4AD711B06277A92435FD2308D26C8A0473B599A19B6D5F02
+FBC09157D9518EAAFFB6E8126ADAD815B28328AE89208F03177EBE3AA0B971DF
+C32C33BA930AA726F777548D33ECC7F47015F9B2E25D93657E840F46D4F209A3
+D3F5A1C682DC2B1AB4AF7FD9347EB1018FDAFD9C4402FB4F5643319243B9E98A
+85AFDE9EBAC815FFBA85F8E8F87A0E3E0C011258782399D05B621E9744C828B1
+5C30FEB98092C4158EAE6F3A104A9CBA33695502788DCE4CBAF736A36B4DA40C
+40A29CFC4FA95E861DC9041E955A1688539C4468FC059ED1D6D3F8FD64C1B405
+0D11B4EA2E0ADA8D09972AE83B61719287C7C8C7BAB7926563EE59E79A7C6958
+C413D135AD43E4574893F8EE9EDE8E8979594FFC509D0130010B233B8905F440
+C9C6A0FF1BA97899F2EBACBD98E55A9A192AFF23E070BCD4598F09779F2A5EA1
+8A749DAFE106BFA4803B9FCC327E9C9181C525BC8914D17814AF08CE5E861A48
+4266AE3330FF6EAFF4A1CAD6886FD4F216A6CB7664EFB7D6BBFC88DDB24ADC14
+C0EA67F3B3EBCF9AC242D1BAF8D0F13BC23B74EEFAC85D77BFBA4799F61D150B
+FF6E20D1D4A3C554C2DDCE0E09E78FD93A9C918D9C2395E440F38015541185F7
+93E496FFF81B4E71E322CE850DD92E81BCB326005D3B7D77B01245AC631D870A
+73F917717A6A5377620FECC0E5FF5D3315D4621EEE65DEF2C3B9E5C3A9C771BC
+35E7D3066C836B87771E171EEB2AAF21DD79417F1FC8B5A920CD277713BC3820
+038F87F979D52500CF36B783AF02E9EC2EAC7BB285F81D45A34F92EE8E5A4189
+35D8B2D290270293A3EF3E4CC39912F2776B2FE2A4E711BC481773113CB9B9D4
+1D7387458BFE25C412E1EB4E6DE05371325841BCC75122776B706AC6A63AFC47
+00946468EC67AFEE6E6F8F9643238F80E39F2995405D850FCC2842163DACDE1B
+A48238865B68D82E80F6415E33313B77E9F6203F143C05FDA28893F96C65A119
+741AC7F2911A149EF804EC845CF1616559AFBAA824175D31B385E9851B3779CB
+C182F25BA5EF008C67C61B422226F9DE470DE590EDE30962E7BEA93BE1CA59D9
+5653886029F399431C11C6805053D93BFF8CEE4B53958EB6E14640370C1E1BEF
+EA5758D169239BACC3D3A6E7A3DBE36FDD7BD3F12F64E5BFE896D8388FF6ECB3
+561724E1F66F5F95F21B33783A4ECFDB6107B172198104F38F9A9C34CD41D396
+E6F6292C53429092D1ECAFBBEFA55187510A4FE01D9AC5296F17ABAC96B5AB69
+C5F7DE27CD510DBDE0B889C1FD0F896EECC111CF40E92E37E96564B7CE3F0ED9
+212178D6B27653CB412CBAFB6E24C6834B5CD4BE2A76EFF5FEA4C818B0A99961
+64860AB302820155A018E006D72214F5765C514621E3490279E09E94C34F91F8
+3745875D9CD03AB430E59229EADE37E1DBB9DAF7DADC7E121B7F072B1CB03300
+663EA733D6BCF6F647FC3688242ECAB263D4DB751A4D35BFB61225D1538382BF
+A2634F378DAC2076E415D82AABF67E6FFA138CBFB37260DB5FA41ABA1CEDC05C
+1A1A049F0721645E7C96C00849887CD5B0DCA715307605DB92DDA5B968CCB0B0
+894B5C0E4117857373F886A5E99AB0A152EB37CDCB0ABF42FF642747F98B5F22
+3247AF6874892D1435C5C83C435762B371D808BB40B6A3EAA72529DBABD167AC
+A29BEC7173CAE80E199756B1FD49ADEF2D9253DD7E7C991C150F3EFF7AEDEB09
+BA787D3CC7369CDDD87EED4017C0B42BCF644D9058CA6AD8B436422CB87ADE12
+F8EFC558E2E43940F6B69C2811D3EEF0D7562F455566FA57518B8F8984A58772
+EECE76024C630B1345065144C7A921773044BBFDA029CB1B9612AAF872E87FB0
+946851021E24AE2EFC0D84677BDE5FFEF6C55861B15035DC06E2A941FE802237
+E1CD0AF81192DC69492C81BF8503BFF377B3C12199B30717F1A1E81020F4B385
+31F1CEA123464F7A9B8A33E6C9B1E836DF6A7477B9ED9AA5A21281B4464C5791
+9203113473218B0B5C1F2EDEEC257A31B5B0286A4158BD7166FDBFDF19B7F294
+27BA3968A1812B9C20CA8724BA005150117146B9A9532A7FCED73455A3CD0579
+28DB7764DE2F0B5A9A907B5EC2F477C3BBAC430301BAE4E615646FB1EEB62890
+BA0268D1BE1DCE7F845E70146CFF852CADB4453EA47DD6341D1F8434BF19B4C0
+1942F870AE6E5213724CE2611254A101E346D3492326E596A7C0B984B630BD6B
+5145C5E91C3875F3244DD4965A3B56D759050B3B37ED0D2F168C99C804C52570
+D83382FFCB4D06399DD3A0A102752E3050F111500B2B0D075A5A18DB72E76C2C
+D6FE1F028FE2B689FCFE089B49F3273143CAE314C986E6D1F56D7C5BF580C7FF
+0CA51006B1F044436DFA4B45C21B0CA9E9887525B6F88FCBAC59BFFD7504EDB4
+E6B8EBB471F80CDF4D883FE75CA3743C57546AB890ACB7815D8CBEEC38825F82
+BE33E462C79C9585E909FC987FA86205ED2478E8D1B0D7A4DD70FE5A9F8ACAD2
+E70B049C6FED63FC48E3D5BDBAB67282A66E07109272505BB63C480FA9B2C753
+60F58761F294154498B8565BDF8FD01A3676D39B8BD373A12CF298F281929260
+AB2B5E1DBF2817D15D6FF4B57638ABAAD031DD3EFE44DCA5F2DECBA4DF397EB0
+83B4C9DEAB025C75D8F65A339F3FBB9A70B0D786A836E4FCF2F42A54CA292929
+A431A35CB7DF6FFBB0F9679601270AA19C992F7B95114F461054B38ED9FBD6A1
+2EA3B221DD2F357BAC157436A537B37168FBDBABD738539D16216D9DAC15EA6B
+ACBF9072E209817F370DEAE812247391DF38FC245B803EEBEB2838C3BBE1269D
+8FA49A29EA9AC18E12D122605FA5FE2ECFB65F57D03047A09BA5E0FEFE06699A
+1A078CA7CA4BB6AB935248CF6392B6677CEC876F86E434FCBAE20629B7E78997
+13F4931515FDDF9865097788B3047C0C3172CA0D8B84B2C27FB1BA5B4FE5FA1B
+FDCEAD06D4459E5BE0EE94DFA465109036B3A49DA6359A33A7C965D4BC834356
+4EC4C21B58212EBBEE3D0B0F70573E2D35CD5410C3A6B233639B0919BFC95899
+D0DE3B347B1026817CA0001AB441358606F664738244E0CB8959F9503EB46D7B
+944BF6B80E4C1931BE88E813CD360E13122511167B560CDAE652469EC7F61AC9
+A68402D951AA93E938DB6CBE3019D8EFF62F9F09D148C3CC3C63F45A1AE229BA
+9BDEB00033EC9BAAD847FF6F468AA838A62353A5331D7425ECAD924C3939690C
+6E7AA3F888F9FFB41FD42F0EFF4784D442D82BA5B3647189F8FD292689FCE630
+5331D2B45480038D37A223C9BE0F9C3F051F7F27E953CD343681E9A8049437D8
+5198D7634E3352771FC06BCF51010E0BA04F318BDFBA1D90DC49898D72949F8C
+D212F1CBC219C7377E51B2E01A60049B3DEE629E91198709703F027E258356B5
+5AEEE1E71EADD63D43FBE0F09F564C3EC9C321BF23C07C541D3AA214E57EC8E6
+FBDC9F0ACE3DF926FE5B4FECB8743A2FE52A68ADF9910B2ABAA072B137A0D83F
+006570B4C31972993A3352DC54A05BABE799D315AD54968023CED4C033BF1242
+9BABF562FC3168175AB0AB6C191640A29624E0F42E716095E631EABA67D37B96
+F496FBB228CB97C089D844F6D6AB7379ABF982D1C62187B15F37333F749125B5
+4BA7DD4E63699BBF4E982DB65824411020B0E414E0C8432F0E1AA737B55EF0AF
+46213A161E4EEC0A4011185E404A4AB5231D3CA295ECE626CD4846F539921E5D
+5061BC58D6D1114092AF8E3A1F704A2EDBBE43638955798AE058B94BAF7A5893
+E17DAC82A6CDAC9FD46A41965C73E91CD6120D137281C4AA37477B5366477B92
+985BCF335E802747CF7F261664C47AA4181C551CFCA84282668E37F7DB5EA45C
+6E7D583D24F2DFBCC3A1A735B51833EA222918765A8DA94484C8B51B6CF2ACF4
+89A3DF198D7DCBC46E9176C84EB3DAF0062E721F84CCFDF4CF6963EAB0E02F17
+6488AAEF7D896BFDA94D99E6EAE2CA90BEFE6A43E346D67703A82CEB5B5FB013
+A53A6E880C5DCA893D90AA9629F46B00226539B76757E703E83AAB03D2847FCD
+A4B433C722FCF52E5ED51372D4E2CD4FF94AAF6C2B6064A12BD5733813500274
+9B571AEA311AF69F6CF9F940B9FAA34F4917FA97C09C3C2C93CAF2E1713FE30D
+B5A2D1B9D5F28D9F0A3F195AA6BE2B91BD8ACCF5095F62E474982D872121A430
+87A9877149ED68A11E61DF7991C50E185DDA1BC88B209DF3464F06D4282037D9
+EBB745D5A0D5C6BE0051E5381B6B85D415A81F936458BDE11049E8CCA0768536
+7EC223F6BC86004770B18A0670DA9A137745CC2B794BD62DF93EB5EE077DDDDC
+88C132C0A99BC7D3BECF242C384C61A1979BEA575C4BBC7041E8E5A7B9DED402
+5472A375FD386B2A081F3F49A3F10B66F018F3A05BA063E41382B472491E2DDF
+891635A8E49E5EC0F9CE94081249DEB15D8037A01A41FE2AC505390945A920F6
+D877BD927F2CAC2CE8EA5EFE2504DC46D57F555721D278D8ADE95AFB502030D8
+5DEC5354166941CB96DA86BF00F1A8C52AA988F5E09C4644F615EDA7280574D5
+9C7CE7D6149D520B917236E87F5ED1194C6EC70223DF0DA086B111BEE5E3F7D1
+9EB4ADB52C35C084222230F7C924FCD2F47911B8ACDF27D10148F5947F068946
+C69264CC93C2F0D76FFCF64645C30A5B18DD5C2EC4A702819458915CFE982E77
+95ADE2F0D067B15D4C31B7A1E3E278A627DA7714B720754E3FDFCE8A02B2189A
+8A288766C242D23C2ED78E2355798E21BA67E90C205F740908F3307420AC8CA4
+12B7C27D285A3B8412BAC33F69B4AFE9D0113A391D83E5E5D5425BABF1105D86
+BA7768352D7CB3DC4A72A71C636151E314B83443FB7A84E35344C4B6F3DF3505
+9A0108D3841CABCBA8D5D32A1EE34DA9EAEEACC3C236ACB198933E8F5EBB0395
+98BA4667953D80FF1D78C204CEED88669B06A157EF0C0FC137EBBD82EA2D652F
+042CDD45A5E120AFCE799CA85BF7BF610CFADD91BD92187F7E2AAB0E24013622
+5F078CE0CE9673B4F6CE5ED7542C2F41784ED2A1C763F721569CAB3A436FC46D
+F10CB49945C096E903ACB895192E3A2577E81832CDCD52BD00832711ECFE9677
+79342E0A921FA4BCAE2D1EA79AC6FD946D818C4C58699CB04FC349A0CB5272AD
+5A4A4D777D1728F79E26EC9717FEB258788E54186FE30F2E9108992B522E5D6A
+AE97E4BC589340D06A28BD597723E8B87E8F2B99A84B63BE0AD0FFA511CDA1FC
+53F198D2A66974EA3DA147EA6A68B2DC2F120B44F8101B724640D08CBF77047E
+6C99CF1D0CFC2FC4A52F0A715B224FB81058829D0C0DDA4379B668C342D13690
+2ACED593F76DA482DF8D9A9DC92A4A69E2C3606FC8BED180A7D22A1075918161
+95CF0FA1AB1BE6AAAB1820A00511F871E0A3E55A036486EAD548894DF391969B
+DB87D0FD1EBDC8344667321CA472A6893BE7B59565479EC85D21DC03A7AA09F7
+F998EFFEFA2C6FB93D0FBB8B4F897C08A61435776A24719471CF0A0C22240C6C
+17B3FBE0EF28FFB9AB574B7D38BB11CFC62E0F4ABFF8006F94DE250706DF133F
+C97317ED9867045906F13B1ADA637E858D105423C6EF3C28A633DCD75308F80D
+93889B99A89DFFD792AE7ED5579D0F2A82FA45E41FC6C0ADD5B6C2B9623259EB
+849C4A4D82F88CBA96FBFB2ECEA6AC67F15407688319991E3A426FC440496877
+3EB7F526F755F6DD3FF941A6A2F1AFF6B3A6A9DC60C48EFE924A54EFA164A3AE
+20FA2448A41464B3B1E9D16249B4D861A8C91670B1F7994C81D014A25D35112C
+4B34FFBE0DDA3F3F50F26F1E9A6E793EF026C0966E0B036E0C5D5CBFA5117D2E
+A00EA233035DEB0A9D80B0D63EEC8F78A0FF0B4256AC9B2F47F1224C4816CC65
+B518DC59F5CD4264B88372ED513B3CF43011C48B4D1BCBFE342A73D647992FF2
+B1FB8F398E8FC21F1F0A4C70D8A505B10E452B273C3167EF909C44472F55D464
+DFB683574220F379D350B9195E409C34EC39F35E468D32DC1A6E47BAE822F77D
+8B12A221EBFBC19A70D128251EB8D3389962708F82DD6B7408372BE6565139D7
+A774A3BBA0258779C62C68F941C29C36B658386EB7DAFA96B659E983FC7BA3B4
+C8EE0CD927CE9DCDEB6F3E4EA7E53112899CA7A3D08556557F227919291495E6
+639615687F2D8BC26E10BCAF72E6DD89EAE218932652833735BAA71BBF80ECB3
+C924002EA55127010EA56694ABDFC964B90CB9F2C33C9EF78701AECD00B23693
+02A009CC3F8FC6FAB8ADC30679B74C19A985BB4D6F3D1DF3F3C5C09DBEEDC9D7
+641275E1AF7B1DF55317EB3ABE4B9BA16FD41F9A072C7AC928BF7CF3EBAB86CE
+464B6DF5FEB568C459CAC53DFD60D991F09F68206D9DF48752F5F1D073F014C4
+06C627D70F22498CE826899C19FA15212ABD0CE18DBA483BC6A2620F390DBB37
+422AF4A36FF7BC786E36A16CC0B29A8B4AA28B866263580058E1DE25E0E53223
+B97249E8DF3498ED768FA5A39049ED70443B0E8F4F6A9C4E582AA710B13C91C7
+AAAECA803F0C908656134A8253BA7FBBC55C85240CA3A5747ADDB7B8C01C6F6B
+2B177226463DE6E4342C2CEC1872D384338CBEA3714B05540EBF7381E112FBD1
+90526616F09AEBF836C16CFEA24E5B0EF78F2D97A856E2DA8C8E9428E7A15FBB
+9DDC4F97C7B7C5FCABAB63CC9C96D059B2BF54BCDB4F32873D6F932A35E1BEC1
+856700DE2AC1F6ABA2024CC733F5AA0B218E1D7415D22A5E4B1082547A3CC7F4
+F474AA19A3838291748E4F49EE98869C0F01B7DDBC977A3B8E1D879C0BFC9260
+70283E9FFB6650661623800E0E1514A160CDF3DCB5C305208A1243D8B6CA5D0E
+D135C94E5155DE8A89FC859B211EB26849A167CF9EA8660FB9E2E2B19F0158EA
+D00356F52E52B81C7F7E98D6D3D1827AFB9EF8C83C9DB91EE6E5767FB1A3BFBE
+EE596310848A822F323F421927AC215F7604C86486F560BD1DDF585D371FC54D
+898BD493D4E49E1118CF3488A3122441F709B6DC4A44AB95704A9530938AEEDC
+4A7F50E45C246A2BA91A7A9DDAA6B6CE2E9657E56970D0E5407BFBBC9A3AAFF9
+A32C8EF2904F0C3E85AD10BE2456B8D2BFDF8913C718EF11E27B7DE368202FEE
+D6A633614A6FB095D544ABBF7F015B530A92E29843D5928FB74901377C4E60C7
+84BE89074A79634E24FAE41EC7EC18C4652A915F7EB067C469D730DD5BA3ED92
+9B0C11EBAAE911D207687EB0DE2438FFF5B5FBAA361E379B7B9E55837AC94D0E
+98931C9345E4B3536F1B01F037BE24582795D547174F3EF81E656C5166510AC1
+72F973AC5E3BBD242B7332C88A2E09129AFCF06899E549268AEA6F26098989B2
+1E40B71F50A9359A84B8A571AAE3E9A46DB5BED194E2476A14077E11C4ECD532
+2DD2CF8744A5A685E3DA650EF9357377C3906A2339E4A47A18521BF479683882
+6617F607BC23B484318F67B54F04563656E17DB2278ECB617D6700404E137256
+339C01DC0395246DCFA612534E721C0062527CB0B8FCC7B17E1D12F11B880251
+7A34B2F04EEF3C459F34E8D12F79DDD9372B62E214FCA738D19D7EF0EA98C207
+6C2DE95E4C910862EC793060B2617435592C0F97BDC46B7A271817E20893372F
+DBEA1627F24FBC77E180DD978B7671E473E8CCEEE8899727BF9379AA7D55CDAF
+BBB0F5AAD672709D529B5692ACD5C97439F3306AA0414FEE61E0D6B5700373D3
+6DE8006F00FEC8F67BDCEEDB2E2B49941784A5087C4788C16973AFFA33D7173D
+4D0F7F302C55765B4C4E2F42E7F5DC865A5154F73A7673173AFCEB4ECF23BAC8
+20969C981F60816C13CB7221068F9099C9B80F179A45B85EAED3E7B211A53839
+6A10AD15E2535EC1716345058F904B7351A023F7DC6B71B289A1CB8E41444C23
+450B9FDEB1AF3D622707F92949317707AFD55332EF155DC1945073C95792C782
+96261B3921F969DD7BA9BB1DC4B6061748D29A255D411B612F020292535B38D8
+853030FC48E29C8896982894A2C49187940B5CA455D83DF2F0B5281AE3FABCA1
+330BEF053EDF7B77295A064268304502B6270EBC50EAE1565325C88CA331EB02
+FE8CB6FA22FE89D8ED81FE73041369FB8918D4B6D50BC160625DFDE9CC7F3458
+A577891265F78157D57428C8E99963EB9878D9C7FC040BA3A5EC8AF488DB20FC
+833ED2AD7F5082177C4FE884D37E3D5436C4BEE9C8B82FA2737BB1B92EF0BED7
+F01564C45822537C5E73BC2D79D783F7C715987E89ED0B78D730B71152A338A7
+BA661DFF0E0EC5EEB02B861392217777A569C41B80973509EA942B9622E55CD3
+B4EA00FCB0440DE4D6F7889084D680F931F2B828176880088C610050C45E713F
+8451B180205728742EC190DA46F0380670D59209211E45C91935450F0725F07D
+CD183F1FB8414F8356F37389B61FFED4F1DE6EE765FB265FEBB71D5DA6374D07
+882ADA46F2A891A24FDABF57C08EB2F595521E911C75240F97B836FE62AAE7D9
+9E886370D986E2F2421F18FE7FE4782BC9B6CE3744756B7A3B3FEB94BA3D06B8
+5BCF61A18DABFFDD9B9982244B53BA48532F73ED8F6D696B303FD210BC0C3E2F
+BCD8CDA3C6BFAB7392253E967371D092B9AC2C10EE25532C1C1A1F322B122D32
+CC0740CA5C65FD9BFF103F6A19B9D51A8AB42EA04F1C873F1699B6958AEC1239
+DE30D6FD6CF8C22D0B2593692A39D6949EA1B0B53E6581EDCB1CD0A95869876C
+5CF0BDE9C90BB5DC921E24D994F1B52AF67C041B5491C07A65A3F235D962061E
+F888F5EB9B54BEEFCB4203EE3DE6C298CF3F41AA7636A25304B085B150000E6F
+1F65ACE847E85BC188E810BE698840BEC394BA6909BFFA99E0A76317F5725444
+A7C91A27621DDB668E1408A4B42B0AD158FA4D1313B27046C40E355D1014DBB1
+9C24EB133B3B32908FA4859BF391133EF71813FD63822808966239FFC96F6F43
+AE7D089CF57C1AFBAA4CDB6B57ACDE095F46E9C9892B799EAD90067145792E0C
+E614C6CAC3629C2DB9B53943D7EEA84A68C549A13119AFB6BD1B609E4ED00D6F
+7794F30A7C142D59FFBE6601961F0A184ED53CB07843204C1F58131F83C72F44
+5B335FE76F5EEC8D4D322C64AB345615A50BD3BD1FAAA49AFBECC5136048BD4A
+4E2CA4CB5CF2456A1426656D886325F989331DDB60F6BF9A7B9057C025283E93
+6AE95B08F872082FCEF59097EE9709821BD16C198474C4AA76CEC70DDC916BF3
+B12EBC8FB34411199F40642A9E5558073C63C379781293F7CF3EFFD6D0E309BC
+B7D49A606187943E6E75C0BDF39599C998A9B4F61D72F448F29FB1CCD49AEB12
+14C7B83CF066742E65887DC8493EBF905092FEECC09FB1688D6F7C6B196102E3
+372A138AFC23D7520EA86D64CDFAB8CCD41BB1F06578C62CF125CE83CFCB4D2F
+62F7645C51CD43058906DF9FC59BB7B5745BEDF719E6F5BC0C43F78358B0D49A
+6FBE10AE9E7C313444C210B14AA51A7783137448F21415B1F7A16099960D92EB
+5357742C16939C7B1FE492261AF3E28797CFA336A12DD1FDB793FD845D37AA39
+4A739F6DAE90498C21EA73372949B0C486D028DA7F2407513973835D864A0853
+A63EA940D96F17142ACF1B5486FCC8D8AE40CD79D55D4557431C31D85797B1CE
+7E113C1A0302C68052F0AC9F2616F85201F8F58E2BFA539D7025F289BFEFD3B7
+72B6884368984751EEC27F1CA26ADAC6F7DAAD4BB4F28B39C657AABDB7487F52
+AA973A22796EF8EDD70E6AC0722BFE2707675865C90A8F13F02C78DB32DBC23D
+2D99E1F07FBD493752528A6E5C2F4E8F83B2D1051AD3844EAB7A27260F19EDAF
+D05BFD824C41051AFB18893132C749AFC43C264D924D42B60FFB55E29F591FEC
+43EA5C1F06858B8CE97A75EC7B5787BEECE0896EA46457BB26B2D2C65C17A022
+B1E870D92C74C799FAE25EF4C3E87587B0F435E54DBA42122C0AA21A08F9C7AC
+CA423BFDCDD252E20D08151A637113C3407276B41134BAF14FC488BDD9087613
+A25CF4F8C4861C62E1EFA6F92DE91368EE171CB610793A06C978E1B0D641901C
+0F310716DBFDAD1CDA7DF2975B6F5F5ABC05E331878B09C114E974E9C57CB303
+2621D41ECC898B617485D7645980B35CF84CE5D28965F4D3273DB7808EC8C0BF
+7AEC58BABCB0A4FD528E21E0ED3C41A81DB12BC0348963B55598336141E2B647
+A5CF81547CA5E5EB9E04405385AD3F165A50586C7F9076A1983D43FC60ACA6AB
+144803547A48D54477D3B4517A4FCABD360EA2EE9B5E3BBDF8C9D9C68743DEA6
+6AD2B9628DF2C5535066E703E8272543DA07DB2AD7EBBDE49AAD5E37B92451ED
+85EA239A42FA517D2D85174325FEA940407C0F88E8508747F3EFD7F25BBA4CB1
+08CBF027E16BC316CE1DFF875A622A5EC59C6ACF8F4D7DAB4011841DEF0D4AF0
+D93B84AFDF60433E095F1C8FEDA88961365C80E3F36C1FB345809522DA01539E
+BD8DE4C8FAC28A51BE1F43288AC5F71BBD3C05A9A30DF0043906668ADE23311E
+4504153DA865AED7267CA45E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.1: CMTI10 1.00B
+%%CreationDate: 1992 Feb 19 19:56:16
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 34 /quotedblright put
+dup 39 /quoteright put
+dup 45 /hyphen put
+dup 46 /period put
+dup 58 /colon put
+dup 65 /A put
+dup 67 /C put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 92 /quotedblleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+/FontBBox{-163 -250 1146 969}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F
+21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6
+06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF
+55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5
+B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86
+0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9
+1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961
+7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A
+7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402
+356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B
+19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2
+C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F
+244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B
+AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95
+5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC
+D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D
+993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363
+2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B
+E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3
+309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513
+F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7
+E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66
+AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9
+17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3
+05965AA02B8A67AEB04D915DADC1B84A531A1D672AAA06E9F720BA88419A3183
+63D1F9A3BEF8CB2E23CD1F9C003BD7849F093D3B4C83C153A5A790C1F9E37948
+5799C02F004C61A6FFDEAA1F9AE884DDD40DEB1539CFE3C3BE03C7C33CB54D56
+2C2A0F467049797B56D407AA43EE6B8C3F978A7D945A80BF711C12D6BFFA3DED
+35FA8B22E68BBE4FEC59E4C56D3C57E14995A8ADFA51CC6C3A84D3D775CAFA87
+A1A0F45C0283139FB485B8FB0BEF5232494C0CB564F966DFE0D0566031392619
+3FE8F0BB6747BDA591DFB26132947872D3B209FFD838A17EB1D5047FF880E7CA
+28BA81889AB0DEC353C3435B95D95C2F085D4137A62F570CDEB16C44DBB361AE
+83DE118ADA0DA5161C826F65DC8323D7D8C9CC860FDA7ED795EAA20B1CC97FA8
+AF8EA786924702E9D7923D38C729D4CF51F3FA68583E9CEFE4C7E2C46F7E343A
+78D6B6DFF1CE99695B525932A36FCAE65CBF8CA33F19B5FCC65501732575ADB7
+75275A8B076C41B49F6B9DD98CCEE4248EA55F396FF5FD3F2C535A291657FFAF
+9F8670C5806792CAB5FA50A235A9D2E5357D8D8A0E05A75A790249CF09AD48B6
+05FA7E9A8751BF2EF4D2AA0222D20E405D2471F19DE6D58FAEF624A437902362
+5D81178CD62290E4B519BB1C5003AD7D7FE7A42A48F04D640C744AD138C159C5
+0F88C3FB95A0E541777EA35C392F09182FD45847263DCE59588AC86D95FBB79D
+BCDABA5CE37C217572D6E450C20DC0E84E25EDE104ED8B8E840530134214F0BF
+BBB2EFE76225C286D3FF468E55477CB868CA563C7D28C94733A75DB8947B510A
+3F4699FCE22CBFF8C01FC6286CB0F64415BD65CCE6A80B84CA751BCEBF315BCB
+A3675338D53AAC627C2DAB1F230D056CCF017CFC0DD87A3A47CFC0C126D408B7
+4DD99F2DF57DB3330681F0F9E215366B38CF48284DECEA833DAAC926EBE5A535
+86F0EFA4474CB1AC1DEE03AEA22D5AE1484355BCD2E6B5A715F1BE34FFDC7E25
+5011233239AEE2C49A61AEE7B63068F3FCCE4D8C498E120BA9B13DF0A067285E
+49887B2653BE88CF91C6239FEC6192E9DB3A0EF33095056CB4D28588028D61EF
+16D171D79CC6A01C4C8983D992C72179D08666AA484F8842335B3F348373B5D3
+4284A7168B38B18DBED86BB8E87569A61337D79303F889DE30E1E3EB8A9F59E7
+A5FBE8AD4FA13CAE431276AA758B55DAFB8087E3B4B5BDA6F4E491E32010F7DA
+1622BAA5796897149FD7A0078B9736039D38E61B3F45DFB9A59791207157B4E1
+A9B7A6ED061DD169A3DBE6AEBB360102A01A4A9A939D5B1B4D88354435384C01
+D90646D9FA33F52A6F51AE7BC3C20FD35400B7EB9E0DEF902DCD5C683A812E0C
+317BCE806452BAF0B635924B29155908F9E398DC842325E7A805CFBBECC780E8
+858C4E651DB3F21D7C2A7B0A136320959B4CE6648C443AD58D8940E892160AE4
+EAC7A410773E0447C1AD979935B5FCBD2AD2A4700E60F5C7B2DC3B6F952307A2
+284241E23617650AC6F7D4699032B7AE2A33429A74EEB3147CA630BBCF023F57
+0760E9EAE801D873707FABFB28F845993C74AFC7DDDA61616273420E40D441F0
+87E195147C084FD24F5ABC665BC8404927DE8C7FC1AD3905336D6B5C270AF89B
+E30DC11A608A6CCE6BCBE3965B99462E74F4104B025134F94F9CAF6355CF48EE
+36A0E6E93B01C8A47B6E25801AC20A70055EA99BE72E82781EE7762CECAB33F4
+5D2D49CF6A3762310C0926D9EB6D02EFCAE6AE0F19C90F9EADEE2147665594A1
+61D1F4BFB9F9F026638A63392DF68995369084E8878D0DDECFB9014051A63949
+10A7E2EF46B2E13A6156C7EBC5953AF095AC1DD4D0046E4C5BD5AD4AB5551DFD
+FC79F4B1CB623F49131D78C0EBFABA072734D63AD9060418DA63E769B555D7C5
+503DE5766C2E8E58F18972DA3A971E059D617B6C87BE20C0D7F35C6DB48A87B9
+479E2DC34D28F52E7581E1500ACE5D297FAD917497329D2C861DE6CCDE674AC6
+709F1560B9A3815A137C94B3656A9530C94A8E93F785D1F3D3C6D6B572249C54
+8096B03616551E37F33EEEBB6E8F51487798BB139BF82DFD0B920F30FF3CEA03
+9337A75AE908C570BC7DD9BA08C06A580DC513383EE610E916988B2CE823374F
+24394F119F5CE5B07E764FCBF963378288A5250EDDC7D91DF02F7D5B46F45217
+F7B52D7F80F82E0C909BDA40B366D02E85D35F2C3165B5D13BFDA6C394093EB9
+22AC1D7417C2D8AF50B8EF4C4331FC7C1966BE7F1F9F50847A52CCA3607BE7BF
+6508E15283A54B1532BFC2F35597A006CE5427FF7C114B80BD33B58FE42C811D
+6706A12A615F4B7BC1CB26E1D686ECB4FF2A962F76D5E946EA5C934650BF0816
+988D09E7B49917BC4B33F68982A6D6A0C91A86CF1ADF26EC250FA56FB73813B1
+79475C929EE854F49CB11190E94A9173E7C78A65ECAD54643127F8D64F84FAEA
+A6E31E14C146A3A3C6DC59D0C29C4C7916E6D2B60B17650AA80EEE170ACE051B
+7AD90FED27278C197B82954E63C566AB102CBDF0FA581117782F3A6ADF241ADE
+7826CFEEF17961FF5C4EE4BD84C45047A300648F4EC19FDA8212292DBC54B027
+901EDC9AAB0D6F5274A1A20CAF591A4B2598409676C9DD3522515458F226C946
+7C05F4D88915BD2C149A025027281C92C6EBA700B57EAE12702BFA3D03F5D079
+A58999697C16E18F99865FF93ABDA0EA4D01AD8C14BFE3944704AB250D9E7D58
+B4E2811DA6C1C1AD351EA15A23AC406F2395F1FD1301F23AEA6CE23A8EC34BB6
+032AB1C4B6F3E748FE852BE0C044E07852579E6D0A84B72CDD725ADA718AC14C
+DE1FF077D87D37D7282166BE35BE1D6AC4D0C40A0C11852F3F9001BC78E2BC78
+35D0B4CBE6965C515002320BDA2721D4968C1835406680A72A0B02B6D83329BD
+DB81D24FFA508AA58C8A509C18D9854CB4645A7C05460297B32A2FF9AD1D2F57
+4828A85DDD879B7596564425611A023FEBA4859F1080B4F4AACF4565A152697A
+FFE891139F18DB6691D2C9CC4B10DF957FCCED4CDE00DB326382676C38F25E8E
+759955441A70DE8F722915822357183302742447D892C56CDD3E74D007BCB5B2
+27B25D0507053F4EDB0BC66289C83A47B4633FCAB7E626AD5AAD6D24BB252F52
+176F6F32826442D59D2195B2A7F5DD540599229A6CC6371D4D94422E31A64047
+029DA906D2BDB4B267851488C22347845B0BB402C8A97E7E5E133D8917236A1C
+30806D41551582E7C728AC0FB480C255EC810266DE7B46E52A6423579CBFC06E
+C8E2FF9FF00EF9FCC51FBB22DE4428E280CE1FD5241CCBF81070486A0DB9536F
+B6BF451F7C706EE44D37A0D78793D24CE9049BF285C1DC9AEB61BEED88C4CDF5
+D3BFFED602B26D4B3788E171579289859313C918CBF70EF8F655CD4FB73C514A
+A34BCFB555B6BD835FA0B80997608E9F938257050F1673AE03E6B4C6F96045AA
+A8FE116B8A9C0295D34802D22528B80EDCA6AC2C5CFCD57E12F12ECA8C0BDD0E
+EF7F3B6F4EC14C3A9C68ADB70B6454CDDDCD3181DDA00BB3A9DDE3C64F162D0A
+9250AAB836AF3F3C71589E1DE6B542E9D82B1266E23046AF5A57A7FD5A3EBA92
+B137FA2161E97A54B5C472BD23CF56F3936DAF5C468AB88A6B587226829516C7
+71BCD7CF1D3DD40CEC1A6F7895DC95C9C9BF1A571878036428A9A42E9B363EE8
+64FE7D1473CF558A246F0921C3257F0EDC4EC2C1FE4E342011AA9CFA4472204C
+CA1DF74F5BF01A3D0F518FBD76194711589E02F3F5290599E0F066F617B8F0DF
+6C9196A71F091B8D7A8FA8A72E907EFD9821E1A023FA4583B1BFE762A07CB409
+FE74B4CE4A642AE77B5FFAE5FD7D65A1C03EF6FB31264EE51BCA46A8927907F3
+AD83EC5B5337F738F44E204BB64FE063A8C7738F217BA319F23FDC8A65610014
+D99A05449EC21CECBEB27602F66708B1207810BB167AD4D4FA4AF54767A35B1F
+B17454FD0D82F04386A595397E2246ED339259A4B70854BAF3F41500CD1FA69F
+799BEB5C6FF670D4E0623B2385D545E2F46436FDFEE4F37DE68308BC86551E26
+0DAA88D7A8E54B4E5FAA94B88E322EC04542C3F8C9AD3DB9954CC32DDA1A7002
+8793B4532A5D6D31DA33470BB6D812891A52EAF966AA1629461C25930BFC4C8B
+6B03832F4AEEA5D0B27EDA93F980E91B5493B9618F143A4CBD26B4CD8F0C3D16
+5B2F27AE628D9AAFD99F4A1677557D68AA42A8832A7D44092AF20DC586290685
+48BC89B6DC4734F8E13F714A54742DFDDC2C85EC30E53E39206594DB51BDCD17
+5A68BD85E351CF51E86163748D3AD70555FF1D5F7B0E556E54744181F7C48BA1
+C2C56129EBAADE51F7764AB181B6FBA1828107F61E8047A5CE36B58F5D6C2C17
+61990478D0D44C23B1BE2BE6CCE369DDD14AC25BBAFEB3E33D5D50285E947EED
+3A23B5A8698CF9F42F75A514D7B3B0EE048B2F2A4084912CA66A14D1977AC21F
+7B2A332F41CB33D48E09F8F0AE912170F6019D655DE6827277CC043E001E37E0
+88C7898F6ED2FDB215E4D4EF79787DB95777151B1951A2CAE8A9528D7E2BD15E
+37F3BD6449856E5150075B92F10F9615F66FDDE2111A4B7BB546DAB5536B9437
+2290D2405C5152996CB1D4B217FB16D6628A0FAA3DAE60943C98F4890D18E18D
+3E2740F42CE9151E388827AAFDAD7CE9F12C54A932837464336B5575F0E2FA55
+15DE03FD73C73060E4AB72F7BB3B2FC23D1691FD104F0330193915910A3FA534
+B4EBE0B42222AF6F1F8E2657D3CE8AB1E8CEB40686CD6953C233E52C3D1534E9
+A7B5EC22ED0CE565CF1B414FF50B6E3D6CFC342DE97F723B674E63CF67D8AE5D
+C786A0F6BDE30587A1CCB7BB049B73559AD44CC0BF2CB3934ADF7401E5A8F327
+9D701A04B88CF62B6B57FEEB8A36ADC12DCF241AA96C019969BD00317C36D0CA
+2642B811E7611680AC3B4DC34B1E98426D7F85043A042B74D8711F587EF31CFE
+3AC4F7FD9CC6CCCBA3522AE22809395B0B3BB1B4AB9CC1A5D1EB982E9F8C3F97
+2BF975141C39AC80AB0904EAC1BE6A2C7F97A9AF3B32ED276373AE4D9FED44FF
+4F1A91ACD26F957F9E50E1D4940263BEA65E273B926AA3E7DF828A43F54D9A49
+7AA151A70ED55B8B5717527339C2A468608C1A5D665D0541F53B5386BF6CDE9C
+E07FE982E83975D173824F2CE58A357A1EF179483CACF1C2E95563C2E60345CC
+21556A26D49F40B84A4B4F00EBE05FE36CB920F65FDACB38AE6EA7734BF35029
+9865BF659669E1C829199BD232A128E494B1D6FBEE9D92681BD7C0E430C6F958
+2054B0587017126033B6696ACF3ECF85A90B3894AF9FC37D65A6A8853DBBB25B
+1E016D3BC01EFC65C13E487DA69A7399F57D02FA6FC3EE6FFA7EEB7186D1AB77
+493EB4A36D0FD86592DCB7F28617E4EAD22AB1601138628F521962C978CE0D8A
+384573776F31625C13F19D35CC396DFC57DC36173DEB95F8A86C3870DB90C065
+70481E6DC8F7980CD49C6A2CFDA7EC07CA76FF8DA24E7B8A6364F2B734E1E645
+1829B8652B838E7C55FF037DD51C13B2A6867000D3E8C6652DAA087170804F66
+3F9E437FDEBA6989464E9C03528EFA9D82D5C67B80A06892B23F6DBC7FB79988
+FE00769CB542ECCDC42FA28F34EBDE4C37152A6C6419033854C7351FFD8DFC69
+361909D977C3E8CE7E1AFD26FE2B8A7FE5F43058233310A63B0E11F28C516A4C
+7B82A552BB84C0294DE50E6969628C96A9506B1EA590E02D199A6174C0CDDC50
+B7E822C9312F3534030FD1838B843375F0B30DBD4AFBAA0D0E3A49495971AF2C
+E98061E422984F585528EDC16DAA7ED05B4353424554AD2D6345D6767AC69675
+2151A3A2B5C28561DBFEE99CE0C957E8BF045D790BA25949E2B9CE6F63BE452D
+7786129389D5314E1A0D6EFE59139FA6583DFAD8C130C8BC8C5D4B9D77E778CF
+175CFCA392C7D49331486E34C4A934969F61D00E32750170C7B70CF72983E39B
+79C07A23D10937CCCEC01186C028E704BBE47ADD015EFEC387B6419F6E1CEAC5
+56E182CC28172FD62A1CD65CF7CB008C637CEE19FD4EFFC27E6BE2ABCC70C5B1
+C98E9E4975B21FFF757DBEF194AA8266B0D62FFADC903D525766B90D94F3ACD3
+A7FC9C32DE3F22F4501B952AFA043A333C7D4F5EEFC8B8733EC891B1A8737D06
+867EB30136155DD70E9843E5E240BE2A27B2A5FE49E681CE09FDF95580D6EAE3
+005674C7DDB1F9CCD71599383B145B25B0E2F8D97A257CEC5CB815B87E866C4E
+C5742D0259F6ABE53CEB7F99038C604C3F975E43D8549C79C26BE9D90F3B7E8C
+D4BDF13BDA5FC962ABDD444491851D4C4DFAB33BA07ACFE9BD0FFBAAFE053379
+E2524F7C96C62E2F32A9FF6ACCE2377ED03DEA4C75F4872E9BB2971DCE61F2D6
+5E40EB4A94B72A99D95D10B1EA7380DE2D290F06E6A63F50F1C942AB62371FBA
+E81128E0B72132BC5967C2AC5863B8E849A57A4A9D21635DA15150B3A5F68E6E
+A64170777942B04EB0B06033F5C37CA43F00D2C513D6572370E16B8E381652B1
+D4F4270B1ABA10CD543C1CA4F8B86E4A8A41B75733223D9F7632019B86EF650A
+FC8290993AF5B2AB365A600B766738BEBF9E9653FF5FAA418D73D84C60056D98
+06D94BF718A217725D0EB7E2983DF02FE8D17FB2D3F269A0322839D5B0252A07
+EB950B64535EAD9AD6DF3A623855983B92803E98A5B15AD12BC1A74A439B9C1D
+9374691E7A77F4967AFA1B84034673A932B0DC5C8401347F5126E2C91F775310
+84CC81A0DCE7F2F5B6C94FB0154BB6FF0B4AF290AC3E47AD945E5D5F2E1E094F
+1FA125199DE39E768166F35BEAFD4F013E46E91BD2F3A43B1313AAE36DACF9B7
+3D930CD6196960C6CCF6AC5898F4A74F00C641BB654C72C8F6F4019487892314
+5D7BEA38D16CB807395999F745E89C2C0AF226CB5B4A37A01228457DC91FF7BA
+768300416FA88230832FC3E5DF27756173824D8C4B438974947DCDB17FE523A6
+E26822458D3861C4E3D94679FC72A3E54C11E4FCA8FAE335DEA7D9F09F3EB320
+1DC5E1B69CDAEDF6D01999C3B48F27428FE44CD0EBD9BD2F21D7FFB99EECA344
+83DDCA627C2B934935DB8C6EA42C40194F84581FEDD784F1305B49917EE2D745
+CD43006AAB08048202F11D0461B6B6917E54717A8FCC254A7FCB525167519DBC
+B3A261DA71CA704743F06FBD3BFCFF50FDD815E1C31D3A07BEA05D8FEAA4371F
+968D5593D20D351DEF6829F95A89B836D6F67F43C5A969A5495F8142B3527AA3
+A8B0B484A7082985804922DC8704C9863C30A798854725D31716115801E440FF
+37E1C000A901CCA9316C327F4C5CD651E24629A9D6DB57FF174619AB1BFADE6B
+03F189C1121F12731A0BFEB2706E2E49802AECEB2C869E8F3916808FEB82893E
+D9102140B95BDECE891EBFDC0877CB05D5D693595BE1744486199A80D2F299F0
+1532B5B51D44A81F6630285B775CAEC4219484AB679C387736AB657D2FAB5FF4
+C1F38955043568B0923EED7871A79EC0EBE857CEBFEFCDC56BB88B8DF95A5955
+B1B5C6C3758EBD3961A9AA8EB80F727587D52F520D9C2F3B16D53D04373C40FF
+8B43EF30AA6905E7954B30F8CAC576C961A97D017E38333401D46497F464C58A
+6F6DAEA14796130F4207C9A2C915FD60987A4FADCF15B1CE028E19D84741A4CF
+E92F14975B22E90408636EC2C6BEADBBE2F700D9C52DAB85A8305314D0E9EF86
+7FE155A21200C540749897BBB8446DB0FD9EA6ABCF1EE1384401EDFBC56780F7
+BA296BC9949FD913A6C1465F372FBE8A94ECEEB080DE004F68CA85D8E14E2FA3
+C2C9F25A7AA3107560737D89D424415F4519CD32C08EE537ED3C1D868FD9E959
+B7EFAC23F9A3391952F82B64900A8E823A2C151A507F13B5B8494D969668D5AD
+18E616740BF5FB4FCB456948366D740DB5977F1486ECEEC222BA34275678D000
+E72627EDBA485B582B3D0B8D39A84066E9EC9AEA514C99A610647E8EBD15002A
+2A06B2B774369115542E5819FF5CDC8EFBB376FB8848BABC2A9FE36FE58664CE
+ACC537460646EF5BE3E27AEA3EF1B448F483352A74BB076C6C70F26919DC748A
+8F8C8F00D17DA9BA1A2C6B2EF2991820AFE725820547C323DC5D881A09951743
+CF93DBF69B34DB77E5179489647F10AE99BE1A397C3E9F867E32A41D5E648D37
+D2A23BB0BCEE888C27357C184545AEFFEEDFD381F02CDF27365C2F6081A9F130
+6C093331619FCD8DAA5785ED724C65C750F68AA4F0DB9482ED5A9C7AFCF992DC
+C7E835150F6FB2FA3B7ECF0EF9E2DC3FC4B662A39BB4E6647C970729D6C4AB8F
+CE91E89425D5C3A7CFF43E0DE81B4010EBFD6F4B59E6974D8ED78EFAF93403EF
+2546021413AECAEC33F23DD20C120A352490BCB429609877704A5283163164B8
+36B1F3C515F58DB0539340A6063F88E2846698593D5518413D76184212A1DF22
+DD13C9CD8251056A988A0054F340A7A69CA5B946BA01456FD45BED04A44158EB
+89AC05C4E21BB4CD9D1721250A8254B62795B4F723DD561ACD73A975B84D387B
+FAE002B7854DE9284C72FB4E32BD70F440083A990FCF0B35A7DFC987DF094D8E
+31700EACE3BAE2DF2AF61E8675D5A55062426268A169B24CE0975982C76D36A8
+BBE2559A8A48F3B022DA0E3339FEB3357B83EDDEA914391DF8F6E80EAACF0742
+B31348E509D17A4C02582E854D3838AAC88AA0C0906C8505FCEAF8703970A3B4
+38B0579D7AF0E0283FCBEE979A3E08AD484F0C1171E41F58AD8BA063FE85D248
+60EA777285CBAC139159875E82165494DC8A35E3A67A75D8B9C8CCDE9805325E
+39EA26FFF3BC9BC99BF2D2D70A5F00F410E50D759E1CA678492DE1072966BDE3
+6469C249BC34CD048FA81F3241D36839491656C95313E1BBA617EDEEC4ED9703
+DA7A345DE172C2760FBF66559ED167BCB696C93FF085D81987602B193E87495D
+2A2A19DC6FE716765861A94108BC65FB38DB6EB504E7E351B9347B68886382DC
+B872968991EAE65F67B8FC8DFF6E3E97E94AF46EC98C89D877EBE2A9793CA763
+EB155FF47A65BEA3D5D23177D8CDEED3523026E9B5132F6342F1257225F087D3
+BF2C1177C097AD32E23138CDDE0F651AFB6F10FD173A3B73042669C116081E80
+2A4868ECBE26189E358956839C56678FCBAE2D1705A1E5928A5967596A4CB329
+AA02488FB3E2EE9E52C67FE4FC7D40F2030E7072F160176BBBD66DF7B2AFB1D7
+2A5AF0F3564FAF8049C4B7397D1DAD17A1DC4E2099D3D8BA176FC81EF20A0A63
+C3116BFDC1F0700720DC16B6C58259582B39D00B478ECE899951E5B8084E876A
+ABB69C19482D66277AF4323FAB7039AA9CD3B17539E75FD7EC8AB8474E9BD4EA
+423607C7FAA068A9339ED9ED7B1C67EEE03AF3F3137CFEE8FFE71FFF275D900E
+AC82CEFF1A42FF1955309E22E006B69967452AB7F01A2C3ECC090AA180CCAAED
+EF42CAD566B25CEF7BB035E4C6F50264BDE376609389EBEB3EAE245555F49F1B
+C67BE891C11FE7A4FAB4D9C62974F4E0655A72B36A86AFF1634B6F5E5B569BA2
+3C3C5D9E133A4229C4597D4B767C3F55009E29FEF97A003D249E1DF465C73A41
+6BC404CE79CDE12E861E8455E88A5C8A92E325192599261D99C319B561B54931
+518EC86D45D7BB6F19CC3C66069E597E1CC055C4A3BBDAB813CE6813C6D8BA2B
+DE6327582814F278D91B2BA37035F322B921A22EDF9D80DF29C0F6DD0D81C17D
+7DA05D5668C25720338B7DD5D71683926279031B8F1C3A6585726F45B173E405
+2ACF6F97355BC9856D0597990EA6A35DB3B1EFB83CF1009882AF73CC04FA44A3
+5F4B1D9C72BE9F2441B09AF179D154D7964DD71B0F9469525D314330DD1C8BDF
+0B2312D6ABF64290EC0B24BCD55294BF719A222D945ACEA9E427A42F32F5F5FE
+D839F6378F381BC8194497A8A3B4F042EE1B960DAAB4148B5F1DEAD2049D1726
+F28D34283E1F2A2CE61C3DA6E3D1B25F21A2617377C4C5B3B275678A158BBBF2
+430A7079B4FC2873DCA92DD3B3DD4903C71E544302E76AA5B855A51FFC17C7DB
+D11D7906E024E2F193A10ECD6E74CEC5B1ED8A6A494F4E79E2269AC55A26EA8F
+02A6901D66FCD03C338FC6614B892D011DC089C36236AB07DC5104B8266790AB
+D464B1775BDEDFB991A9015DA95A6BCE1B3E61B71BDB2C08D3C58108929F1E6A
+5BCFA64BBF4E1EE1DC873492B686DA569873C0EB51DF8CFA743FCBBA2CCDE3D1
+F4DFB080A258BB14081593ADA424B77DFBA348CE11E723F091AC89C0D25F6794
+5D0DD2D1A78CAF3AA1DD692EE3D76C6750B1104A0D6512FF293E23CB895D3285
+F9B4CFAE9F4B44129E45102104786D8EFCE9F00B15AF914D27CA7332886D68E7
+F32963740C6ED8D1934EDA3A3BC3D16FD3121E76040657E4C917AE56512E46B1
+B3E57AD1A83FE1EF1A640E9D1F532A30515CD527153C9A597C5257E6B1DA8018
+63A379B4B36F7C0352E184A30A581CDBEDF325D9D92CF9FE2EAF2B4056ADCC46
+817C75FAF27861C519C2EECA730EB6215EEAEAFF9E13E9636E356B24C1FF32E2
+BDDDD4CAD0D46769E3A4CBF16C9AF3D2C739723CAB2427464A9B5FFCF7BC5318
+8365C834564EA5B11F1A22CA59575D07C25C30567983467499F27352D34457F0
+DCD55D488CC9E5AB42DB1AF140B73EA7FE27CD44D8E610D9012FB57EA1438F85
+5DA3A2ED40810B23A6A8F814CEEB2320CE5E1A9A1BB117EC249E409A06BE8BC5
+A37EA89E74B99FBD237917F62EF1CDFFC3893CB8D1BB527779417FEB0351C69A
+06231B2BA6939CC21BD9414B9C1C1295D6BA5745B2F6FFA498C20964AA73DA93
+F2BB60822D88A77C029C81CBC8118F1369AD883B16CEE5E59E892A027681D02A
+D67B1389B10A2A0ABF8F22B6F8382F06F3CB90CFDA91AC45FFFD7AD3A192DCE6
+14201D03D9C5F6331137715B6B10D0547434E4E129EFD3ED59C5B2134356F265
+E2DFA95CB62EFC4B820966A9A172E5B2A134D359D777B68186704FAF7DAF575A
+D201A26C6194B9FA36D41DC291A62613B5522552D2CFFA81D276009A8612212E
+293FCC8A5C85EEDA263009C4FB50ACD7B65555A9174AE37B1DC8264A15225426
+C43F8A6ED11198FF1BE2ACB099D3A03197696AE50238E20ABB729E5E52571C77
+191CF13CCC1401723756C86B0A420A0B906EA5D42A64A44E519F55E03AFC0661
+751F9A3C792E69FC2C33129196534A91F1F939092789965E9477CD9BB709ED4F
+FBE00A1C99CB740844686E0376C00AD3EAEEE30EB00722D4868842EE0892E746
+9659A2100DE024835D5CEE113295339BDDF6DEB2A98A0AD1BFD3B14F635D08C7
+AD869861D8996F6D62C1E427117BD63D64EA42D7BA83524496C4987056CFADC9
+63125C0FE0140ED103B5D6B0E1AB36A0B1D4CBF91F4169A7D9AFD33DE1797C81
+9CE9D164F82D8FE0A418F6C507BC58553625BAE9DBE8BC9C32EBCE696D794999
+0CF08A51E382D9D61BA9A775E65AAF66530FE0EC1AC59169B9BCB4639D7BA735
+3F2EC8F2717E3FE8D5DE9FF5455B965D020917253C4D2547F2181C4D654D212F
+3FC05C4228A594B7210983D1CFD275B1FC3ED531ABF2ED9C2D7DEA0A76803647
+F39332BEF79D7E9BC27B37DB13A0FB28589853079C450D5CA4DF04DB318C960D
+99AC8299307D088A4FE960B7A9825996C0DAE4D079B7432BE00BE3F7464A964C
+5C3C3CAA002B275224F74A1D321C88B5B5A1C75E4BF4D6CFA08A5757A9170235
+D6FC628111A061B5BE909D9DFA94D2C9AAF14485C29C8E989E4AC62BFACA48C6
+1446A1815C66E27532A8C4739EA1B66CF6C2B1958EA6A4D5050437EC38EF0611
+8029D9239ED52DD578381676619C50EA37B607B850897BD128127EEB1E3D309A
+C639B8EE8EE137E869CF4A7ABD7A95C91A92843F10695BF222727E1468E3C441
+8EA028EF7DB486CF36F39B3FF362C8B1EC317F3308593E9161D3344B0EA7FCC0
+D2F9DE79BF85D1FD4E99C08C739F6912D31D564D6CDD5259CD1C4F8A6CD880FA
+61B17D640C53D0FDA25243FE24145E591D5AE252F5FFA4D915F7D5A276F24734
+C1871202059121ED1925B364F6CB73BC01ED20F15C2DE3B8A57BEC3573521A9B
+983424E10A5912C522B1C3910959709D1CA6059BF5D62CD29F839E8990DB94A0
+D2F2F933E6222C7B7D2AD2CFD06A7BE46A88D0AF8DAACDE46F75D49A34C4F272
+AD93FB97BE8954A737C1703F7A0F838F1D0B3D5087ED11B65E48EC276C768325
+A3BE5EF5D572A248068D9E620412F1B3AE3B7946A213712E31318D888CB42AFB
+1747CE163ED1CA8A3EFE18FD59ADD9911A8D8106104514123440BBBA69E5CEF5
+08B630C56C95328280FD4B222DF082439F36A30FA69D24901879298B98925255
+7CAB87C2A1B917A1382E2A7B4253A9FA3A72A7AD0236C9D75910DB3902C6D3C5
+2D81416C240740255CA5703A3EB0DBF6BBACFCA8A76EE8C5F5F00D71234556F1
+5EA0C1FE6AF7D11E5AE2430405A0031F82BC23C50F689D5521205D6188FE143F
+C120F809C26E1628F32CC760D4DA7A4781DC7EF8508ECF12E141F2D9AC668E8C
+6E6A41E979AE5CC8488B365F78C9CB2C9B0B213AB9A57EDF56E618B189129E95
+DDC72CB8A9DA836D83A01C5909BFCEBDF3C696E6DE0D1144E0BA3DA3FA20006D
+C5C73BFE3DEEC1FA9504F2F09B34C269635F6FB343FFFD7BA1562539EFCFB33B
+7448C2A38564FFE17B1D9CA7048901FFD113163499A42776AE0A30947AC65D75
+4735A13414A2A533A0F1575CCB273C435E78398D74A731E940B750CD4F90FC9E
+E03A7A20C25141BDC34A5D729647939D4D90D583CBAD8DDD432446BF28D60362
+958F81E6A99F0CB2DBAE71D6C17BEF29ECD901AC4344F3BA01E631467A9938D0
+A1188EBA5C2F40FD98466EBFEAF7D4BD6E7FCB269B0992FFC5BE3AA4F1FF7AE1
+6A5CC0D5D4E1DD0EC2F1B9B879785048BF5791B06F628482A44159BE758D62E6
+E52911494CF6F0E8D0EB25ED90D0641990FB7A39230B47580A34D29F2A900476
+A515DF6568B93E22C53C98F7C36DE18EA8B4D501C16190A7C4C91EB7BF7BCB60
+74FC91B34B8A6536FABA7E00E0955F5E7A8D382123C7A01D480C8CA3D67B2D74
+10BD37407A3CB7F5304D5B79433FCAF67A27453A29467C231B4C96F0A5244EF8
+66939723C6B14C7B8B12EABAA8B71920FD550DC8B709333C8680EB548DB9734C
+B3759DB19C0AD15F16D3558570A1B2CC7EE67800C4AF664886EFD5198862559D
+7294CA27D656B76DABB77A757DAA94E81AC235978E29AF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.1: CMSL10 1.0
+%%CreationDate: 1991 Aug 20 16:40:20
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSL10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 42 /asterisk put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 49 /one put
+dup 70 /F put
+dup 74 /J put
+dup 83 /S put
+dup 87 /W put
+dup 97 /a put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+readonly def
+/FontBBox{-62 -250 1123 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142
+08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C
+30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF
+C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A
+BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78
+5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D
+43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1
+374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23
+DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4
+B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83
+63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B
+89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A
+5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2
+C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5
+7B6DF50EE617C00966B9A2828882804DB7477F4A8CF5345B7F3568B4F72BCE73
+2E2AA5BC4B4C70E21F3AD9AFC3B8605A00D67EF9ED1F4D13DDAA920D45B43CE0
+0941BF17CF05D2B777C11D4D844AB20C0693D1DDF00B27D9E1AA2D98A4A06CC6
+D342AD8F644F4787B66CA7D861E7CE13FCDA85C1B0C9F94009768EA89838EBA2
+7818F40A3CBAFE9BD3ABDEC16E56A061E3D8BDCAA7496A045A55DB3EB2D2712E
+AD9D0B0A01072845B118D703585D7178D2306EC2D431C59708D066FC0631D814
+0166966BB1D20080DB10049D1022989E3BEA3E88B7D448A6E11CCC2EF181C85E
+07BC7C52DCF06C10CDFD186FE1571EBD33A7320232BC930E1C24E2474128885D
+9119E6EBBAF80BD6015FEE94A5013A074425D65740F1C9B139AFDBCF7AB843E8
+41F9A080CC231064EC885A5252649C7E9FD78E314D50C4DD9A43BE0CA22E1950
+2221EFFAEC3B0D83B1BB3E35F871077622C8B7B2CFAD7DAE3BFF0E3814836083
+8FD3C852AAC0B0728EF54E5F9967C494636B5DC17C6D539B1E72D248F3064B26
+8386B3844794F26DEF6853DCA972E15324CB1D2119D7011C1AF4C3D7B6591EA7
+80883658E0A6807C052F42B61638F650C15D427C253BCBE8F3830B4617014488
+15700EE0439C5CDA4F510DF3465E1AAE17887771B35439B699B3A7A9EEE6CA14
+D02EB76AB25B5B7381415BF4A2E730E0A80C4F72E8D7007D5113FCFC7A9F445B
+01CCBC45E99F86239D840FCD3D588E3E128F6F613618B50BCBF768FBD373DCED
+42125A459DB775A40A7F76E39B0AFC77927EFE9F159E3D1CFD11E41CFF83F737
+28267F4A3128934429DC0309DE53618F51AFB0FD58C2D978C193F1EA19D16B47
+F56AD6643D37F7DA9C396E3C8029F98E65F6A6873537A0B57A852D1F3EEC36FD
+2E3952266E6325BE4196686CA4B7EA75F4A9DB06BC97AD99F948CBAB2EA169DA
+D079DF5C2F300D86CECC35AACBB7B49C1057A70E61886623FB98E25BB3A92320
+F2D77F8A3DDFA2D6FA3D598741DB8DC28367703373BFCBAE3C3009E1D6D39B2C
+C6C094A761C61D7F4723BEEC4F0C9458A528FDFDC344C23F95CC1E26D0309F2B
+D1A2AFFC9B952B3EFDF90E9D645A4B45D63103A8E8D88EE21218D63AD5AE2BDB
+A46653268D12A154DB51C7A58FA4B93E7A5937D50BF187845CE96B248DFB19C5
+99D55346984DA6173D893E5DAF138E16952C2FFA39549E7BBFE927AA995E6A27
+42EF88CD074D779B05670F9171967727DA9CD41ECF5936C45EE71167C9DCF17C
+4C40F46C8234AD63CD79B485CBF4DABB79AEBDEFDFD745FC580B2AC65682965B
+250591B44B95B2FCACB8435258EA75E395B74912F4E5A811016277FEDDAD9C60
+0E3F69F532024C9D1B85C67671A29E46CD6BB7CEED4536C17C583B8A2208CBB7
+C8DF9587DF51921AF0F31360B3391E6D316C40D3B92BE722404AFC3BC2F0D75F
+149637A5DA2585020DC6790E0F415639FC789B5AF7B17ABBF2B9EBC517576FCB
+7E16C10DE1577BD4FFBE1C5654EDBE7BDD6FF6D18348C21393981C1C1E3B4C60
+FD0C2F99719E87138CAC9994E346591E3879BAB9954AABF8B1171FE88B4B461B
+7B3B9594AA33DD598FC1881635FF90CB605951FB20B6726872D82777B37B739B
+9A372D9162E4DB72EBFF4E7D691F24A9751028317AA20DA5B7F463D79725D596
+D3A6203DF5D51D96A82BDF2C62EF925F45B3AEAF135408AD0562972EF01DC686
+8BDE1BE3072E5D717FE9F4623469BA557C33866765D4563FACBA00E615AC0750
+45321E8535851BD89796FAAF929CED94E57AE67F7A8A1163613EE205F6D8005E
+5F7C5D4F2CC25AD3776855F84D827F96FE80103EAEE8B740FED39149FB8162FA
+0F9E76E3213327E7F24CB055FA327C4827A2252375FEBE6A501C45AB528DC658
+6ABE430E25A972A5DEF700730334CB58E54C983DE5A56E41B29B76BD3E2AD1A6
+6C10520A7C651DE43A525E7535E4F4E6A81FCEF5A4DAD2F2541CC26432AD8713
+C09B16FC4A305E44A1DD538803D5936AFAE28BF5870A7585BF40EB36E24A3650
+B464E673FAA258DC6F41BC844EA90EBF80C39B7FF7DB328A394EEFB37E12F011
+BA2A8DBADC26A19B7B818CFAA834F479A182F0AE16F1898D0511A4076B8DE1D1
+3E9BB210FF930779431C100768DC92CB2B981F46387BB7B6B6F9C9CE775CEB9E
+E51A8AEC07B799D58748E7C64A1C030ECDDC4C074B4E1B4AA4ADCF24D8F785AD
+D342BDDD1D49A5071B37EC734BC91E06A599F2F96618916DD73C6722FAA39E92
+03F9F078E0A1E5EEC7D85771CC85D38C0A5D835B3D10C2A57A14D1847F6568D8
+1E0B6C2C34A29ABD213DBA1EFFCC2C0EBF82CE289E5AF8CC1D12325EE22DF17B
+F9F85333A859D69313035A7372EBA717C94442D84E76C517C856AFCAD46B7B86
+5991E71EA0193629440F31D731B0AC9BF1946002872CD75A681080C8A3F9722E
+17840788EB6953C8CC6C8C07079EDCBA9CF1A490E5F21C1F97D73CDFA69A85FF
+624C979CD37CB39388CCDDCC4A9AF90A733A41B4A2AA19B7B460369447F77B95
+80F977981D0AF2FDED3882D2EBD87B4E61003B8A3EEB50D4AA59063AC2B095F4
+455B0E3B5223C50EBCA6726BD030C1B361816774B62A6544C0772FE4B172CD79
+22EF2842F2454B949F1E136F4ECA260522D4BA3B96C360274CF4A53338D9EF3F
+CDA148123993CD1446739DD3A91D8CBCEC2641B18F517705E5DD104942713E8D
+41D9B51DAD6647925A8DACD925CFB31B481978E25934F126EF8D07E2C0528103
+A52AAFA322F93C1C6C7B762870FD4AE5C66DD3CE7092BE49C16CFC9A6B58C2B5
+127B04C953FB1F1D03FD15D93BEE09B2272A2D173A8B8EC6FDCAA69D0C32BB8C
+67B9D2EEBE97535AC420BCC58E3F9BF055C57B4400A58DFE2D240DBD978D09E0
+B464522DC94EF44A0A443B8BF2D73ECC08DBBB49CA8F984D8FCEA9A40B284281
+09E4C0D7EB58BBC0702386782A8E22C6071B23BBA92489973C01D7D77F1A2A98
+D7E670EB64124AA8C09C2550C944E922427071C453880CB1700647F94B194B15
+EEF7F2981EDCDEF3591CA65BB912FD6EAD258A68893D0277E9B5E718EFCBA5C5
+0ACC45329E6B108BE3352CA15EDF9A6ED489438FE8C4A7D193B8D9B0E1145917
+A27E6ECC57F3926AA6A882AFCD751897C4B22A6AD3C6AEF20C4B05F2162868E5
+FB120E5F8D971952B727015499B534C6E56AB71380F78BD93241DE5DEFBD0633
+39460803E947A3BAD8A1D6E2E884899581ACE84137ABF87A595E8A9850B4ACDC
+F61CD5B284DDD28780C24D2941A1062CD433E715D6F4E238CA8CDBA305C3FE5F
+82D6D34B1B368046F3E894CEBE62FBE58CDA9B9B4E04D0F991307BDACB09966A
+EFF08ABF5A2F4B12399CA62EB3E4CE3BF2E47D6BA9B53C5B6A4A2B55BC54022D
+7ED98B399B40B9A702614098D4FD6584DCF539346DC3EBDC15213545BF4153A8
+D5EE8BBF0FF20D54FD738BAE955E2B6F96DD0343D259532175E1B67C4852D31B
+0638692C1E7B49746064F3708A9E09EEC84E93069B0A0AFAC2D5BFA420072568
+B73587F9D160B1344AD7BC659B35CBC02E1F5FB9E94ABD1598A90FE8A1DF3F0C
+95F942395351C765BAE3E4E993EDA98AD3EEA47F248CAFF122C0EA1802A36F56
+A1E7E92246136BECB2460B01F0BEF6915F1C2FA2B377F1857644D79CAC458E7D
+1CD55747511FAFED8863D8FEC568105FE3320C4C5DA5816AE4310449D412E86E
+63C19EC6EB57A782224DAF30C864101287CDA0FDAC83CB837EA787016B40CAE8
+F81E96E186AF5BBC9FD43AD997D2BDE0DEDBC7BB3D77406946B4A73A15D246D3
+98686A1D69AA38D8EDDEB1A950C8F19999BFFD0AB4BF22C855945A76E91F407E
+93218BCB50B407A7A3BC467D386C5178E8B7783CF67A07B2850655D6B02E82E4
+6F7A5A75FC7C5F4CE07DCB94816627F38531239A0333A6E9B5C52A8FDDA9F4EF
+11C9C069AD5E91FB140BAB9F743CB4AA42DE249B99012E73F01562319A45B4DD
+C0D60AE5E829E948DB38BF14CFD8C4FA83D3C9E28B537F704D204806EE161325
+44E4E73D644820539BD992085508E1E7EC278C78804D52727FD40A4A0AD86B1D
+5CBE493941DCE82BAAE014DCF85D7893103726DB2CF7524808336221A97043B4
+7E08671801BA2DC8032424F362E545275462D1C0212F64E439F3027DEFC8FF7B
+27488C5CB42464AE8A289E759CC1431D669B339EBE31B65043BBB9856FD6414B
+CBAEB80F47FDC1C64931DFFBA0B6C552230115A30CD88234E460DEF77583A467
+A67B2B01F6263930F9DBE5DAC38E2C98C340E896EB4DD6FEBE14A5573DDB6D64
+36FFBC63EBB55728873E2F1B0F065A7475DBBD17DB489C6D0BF8C85F94C8D71D
+CF2F8EE428079980742606C4475F475EAB5899C9E80E072134394638428B4FCF
+A9D136A96DCC1D554F3E178016194E52D2AAB4A743D0928517C2D52DCCB645E8
+F2FE55F48D59F328D36ECFBDB21AE2F549588A165358BEAAA0F8D1D9E74AB145
+554E0E5B18D0A547D7EF59D991C56DBCAA96E5C082D7EF46D1C815EAD659A0C0
+601C579087853D66004BA58A818D65891D455C4CC6AAB94B0589BCD9DCF438C6
+08B177F032DEFB683EE5900084FA33DE563485719D632DD7D0D432660FE871E8
+426545ADBA1140CDEDC5F9801C378C534E25CAB24F3331973DEBF97ACBE84C3D
+B56026B0A3D73CB2874B97E7AFFA512C2EA5DB509602ED15D57FD768AF6FFA60
+CB210D64B02284DBADF03C6C15F7F581FB8368A20F9B30161FE79DE03796D59F
+974CC627E9B7BFEEE51EB74A49350B2630EC51132DCC3FDBC157AB39427A3342
+DCF4B032600077D071B600AEB396534C128082A50FA6EAE7D4A8F0F72B933D99
+6BEC6BD8655502AE0D9B23E6D3C49223855320782CF9C5F6386971E314E68F03
+71F7E44A8702FBFB32C40FFB94DE1B3D41C98C85FAF8F9DCFC7E9C3BE042E298
+4369EEB3222DA615FCED23047A9DAB956ADCA061F4B90B2524392CFB9C3C704B
+D2AE92068543F51D68DFA4EEB17D3EBBA2D7C8BFE8CFF1015AD696067CD0760F
+F889C8B0DCD0830FF2095A220E674F32E3EE8013D5408A28CE3367C3CCB260EC
+07BC07D33B327CD80D4A977F10CA839D5F1E5D969E9BD8F2B70A4DF954132F8B
+9F699F4A5537855D2E9176FB19B8FF90373FDA715505F87BF2E03DB6DA2DD906
+B7B31D43B21106898048238BDD2FDEBCBD6F500CF3F52D00B9E1AF28081C04C2
+D3B2AC5EF946FBD2E217729BB37938F8621E0E29682E50AF217D784ED2380786
+B88D30703444C9ADCC2B8DB6E00B703B4FE2817107805419E7CD15D66DFC2C96
+3B11441C1DCF7CCF4D2E7DF6462D9146C02F9C754A0F6D90426C72CED69DF0D8
+75012645B886745241EBC350EB8499F69D1DDCE861C1492692E7A7ACB548FE87
+ACD4D9A014239ABA8F086B3CD16412CC4E2195E51C6E985EF3DB03A98B74A8B7
+F2440C9DDBDA65BB020C89C6DB704BCBE120178F79B1859491AD6D43CB56EF81
+330D3A8126B91F09F751E6E29A06654C3DE21B68B86D25FB93087997267D4EF3
+D46AB3339481306B932583A55066F3BA8A4BFB5822EBD0AF82FB6040262ED52C
+E0505154B618D164F658D8ED4A949CB989004D2CA045BE1B6C13A67E8EC1B524
+EB432FD100858C7054A519FB470C3A5269FE4C25BC000A326E310E8CE55DE50C
+6D9F5C9754E83FF5B08822A01A0753F316E25AF68E4A875348890485E1616274
+2808EB2E24D75580074E9977B8057E406DDE63D54F3405551FD4A57315BC40D7
+9DACA854A6A568EA69FC252C9D5308B177C91F4DF6C43DF1256F65E67449E1A3
+AFB063720152E69A513209CEF8B9DB92F3116CF3934DC71DD70DC84BC93361B2
+C6D6DC275A84F775E25FC5BDC4F1B039A69BF843D2F1799140852B0BEDD56B76
+0ECD00F47DA42000035ADFFB9627443445AFD17845E4C1F140A66D511626857D
+60E264D0B83AC96B1C48D44E41224911D7F115107647E70E1840B49A3C696860
+736C7CD905129FBE0D3BD82AF2AC51E34C920BB8BBB403B1FF14DFE7324354DF
+B6164FF2706C40A80D1A3861BDB1E8C876704D860484FC5F3B9D10CD7A72618A
+10FF7AAAE8803FF3939D99C1B8DFE383BCDC411847D557D2F5B4E383B94BEDF8
+597C8150D4C0C3330951CB09BD2CA5616E4C75583C9C67FAB14F18269A3A215F
+87D7E4A87158F77BCCB230787D7F31C6763B9C320B450C74E526616AF9E5AFC3
+CDCB8ED572B536118C774BE285EAB3B2F50630ECB34E5E729A25BABE4D4B09E5
+59C11EB1BAC23CD74EF2595FE0C39BCF1934E6E16557CCD789AF2C8D248008E6
+CC693CB89FC05A586B96818F5CD4624C99D5195EB585CFD0AB48D2307FC769F9
+46BD64068A370186510415A37DCE005B3CDC993C5E5D44361A8F6D2BB449C3DD
+2E12F12E417A6D9F933F375A66682E6B68C8D08A793795D8E687B1AF330AD61A
+0179974C61BD9352AB4AAD22B5C3A520B777E81D6D3D0EAE03801BF449332D40
+BC6483013BA052AE034C6E74E0304562C4029052DCCE18A4B4BB962B4252BF03
+A6FA16241D5F47E3D31670B4C034619DD64BE7456C6236796A5BB5C05DC4FB20
+A2E1065F3B98A749240BF97C982679D07F2C74D06BE6F4B1BA3F63EFD82B1CF3
+EE2BAE71542E9E7403AD59ED0158CFC8D7D9B680528D8DE3CC753A4E3B350E03
+A90580D592846C0249C8D0F2D24B8D26085821758425233492DACB8A5074B1BD
+E5D531F2610DD9243BED758B000E9BED44113A2D82BCC31E718F4BE8E9DF494E
+5621BC341B37DC790DD97E254F24F57B668B3D6A2562F3F705C27F6F9B564063
+B1952888D847AA7F5701C649C62CF5B83142471715CBF81C4EF513C4260D5A5B
+980A2B96F36F37F52509252F0C8D87D802018C1DBB3768030848BFE3983B4822
+38FDC2A35163C44F7F55AB556C29EDDAA0146E9E66801B1780E86FD6AEB8FB84
+9D73CF495D800F2C09D99293F222272BD613172446EDAC65D131EE88E08362B2
+9270B016CF74D059EFA44B37497C2D694CEAFCE06AFEA6DB493BCBD4CEFE8F03
+30628DAB9D2C720AD94ACFAFF6692DFE5C75D9DA1F09E62ABB647798D68634BD
+AA3EF0208EC3E1F42BB7A7F77617DB452CD7DA99BDF6742742AD6A4FBFDCCB03
+2AADC281CC6493738A45040A20EE8FC7DABA5612A12A4A1C14A2E85A58A8FCE1
+AAC9814F69507D49E458A18321A0A4BB97B38BA3B5A7C2C07240019BF98D2BF2
+1A2DCA37EAFD96E69BCD773163729172E52B33B7E27A56F57BBCB25298FDF85F
+8BE3E9286469CCD28F0875E9550E95968BB46D9546D4C0B3F35BF776AEC9CFB7
+818FD280955293EB672A44083D3D724A2D1445F3E5BBBD6811F38744185928D3
+64BD78F9B5943F9FEF1E83E0E98056433263B4A1085018C332DFE5082443AEED
+318D97E14B48860EF380DA1AD90D4885D3E9D6B10E8686A2A5B3D6EEE8EA26E3
+89A1CD93C51E4C5A26943D86664551E3926B06176905EF00597B71B0D2816313
+63702C0C0CBCF117CAC0A0667D8399ABFAA0E1F6A531FF8A2BC43CAB660A93F5
+8F26550D92F9203E404EE4F45F2B472F5ED9C2A8E18A89383330A3E2EE42FA4F
+B3532CCA28910FFC74E3ABB69CDE0E1B5D2AC466BC52883AE14C88C780841BD8
+4F71BD470B26D17E6E8FD96252BA1FA4DF9516C762A28D659A877F79E23E5D75
+B1DC530905C9927BEDA9AA5289A167EF6BB4CD26FE2985DA4A940015FB15C87F
+230DC5A1B25F40FFD7F4336F9421106873FA7ABEDA96AD82C9E37C9BC7CD3FCE
+2999994F1F213AA69CFFB74CEC9E6A94AC0D579910C7C015CA8DA8F37B34D2CD
+126CDF54B815052E46AA3DFE319167CDDDCF12EF6E71CD663E8B0D782CCE5851
+B82120513461C30820777ECF1C721B5C0884CE48E4E9CA79445FD6FF125ED099
+82B6E10EEF47A8025DD6CFD0CCA8B06BA591984F99AA06F5202127FF29D47F85
+91FAA2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.1: CMTT9 1.0
+%%CreationDate: 1991 Aug 20 16:46:24
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 37 /percent put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 51 /three put
+dup 55 /seven put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 87 /W put
+dup 89 /Y put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 125 /braceright put
+readonly def
+/FontBBox{-6 -233 542 698}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E
+2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279
+650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35
+F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A
+D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E
+F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1
+4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A
+438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD
+BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B
+A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641
+AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74
+D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB
+CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A
+082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980
+9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0
+4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A
+9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F
+B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D
+42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED
+F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328
+A2C69F817061D6C60B121EEE844CA5008F23DF098C1DEEB7C8525A11FBEA53F6
+98A9BCA2389071966670E9607563B3CE7E25AD67D95D4927F6AD572015F4A59C
+8C618A3E7BA431403BC01F92F345DEF735A30ACA3B55B48B04258A2E82F69643
+BB43967E4537DEB3745B4E276D6AAF0ECB79052F87DF71B2CFC2B8280DC2A205
+30287B658793532220F980F87CFF6CCB40AB0439297ED795BE38C34B19D438B3
+AF779CA633952D6F984C7A5885A627D4578BEA33A4AAB8AD0AA20B3F497E103B
+64F8A3DF99B120CE03CEFD4F53945CD81BA0711100E332DECD15712080E13635
+5EF2AB4C6BC0EF4FAA879390F71E7CABAB22BB3434E03CC272E68638810E4213
+3E5F79D2202097D3597C7DEA0801441AD4ACD6737D8931C161CE677EC7B62D8D
+EFCBD4196B31E622FD652C9AF3219E3695D95C6EA2825456272BE77F58E6C550
+47284D40234BAACB41CAC991BAC730396AAFB42342230DD6CBE47EAD192D0E9A
+0891BF77AF840FFEA18F938E8B8C8304AA7EAB76116C1BAB98577E86F516EED6
+5CB3E3C923DDA90A0F64B612F61289DDB52BCAF6AF0C29EF0CBC9AFF87414078
+588FC1E8CB1A7C515CE7A2C5BC7A192E0A8E0F3162292FED4E663CEA07551CEF
+82487875AE849504645DA2C2A962DBF82374D85C1BC9F2CC46F501A29A58853F
+2FAD42C68AAC9E9EE68C65A47461A6466884E059670099A8CBDB54ACF54D60BA
+BB11B4D4578CD7574EF90B0C03FCC72691A04D73AAA2302E853A93654DBBA8EE
+BD619E82C7D83E77E0C932C2E7062371D8F2DF1F6DFA9E2636C863B83B4F2CC2
+090BCC3925B4682C9C8342708EE6F1E4958ED3F2D926CC2EC3CDE8AEE0BE7578
+D3A9CA50ED1E981D426C1145732D124451183C2E9B3BE6D92337A8DAB42EA95D
+D66F559D7500BD83F1534CBBE228D59CE583260524958EEDDA92C518A08A2F8D
+D3A6C9A663F6F178300A3D1E106CA4368ECA4DC3F1654CAD459D492C612B89E7
+A73B0D580DBC2D8C2F1C4DE9466154B6AFA3D2FD6080FA409B8D57BC805B6F4A
+5BCB9F7117A10A9A62627E8785F82B66A9CC2A6420F57A2A84EA372161B0DE45
+2547D2E2B6100AB054681C488F421FEF1966E14072D65571FE2E17A2DA53F97F
+2AB479094E10827D09E6D93799B071F2358317B7AEABF10A6F32FAE751970043
+AC4EB6EADB7AA211F02803938B8C668250060C961039CC61337CA7B18A5CBC6F
+B0D73CAD8214D70B51BFE9A6F5AA2134F3EA364A5849998963EACA4060437EAB
+B7B1B0282F689C220608E90FE9A48E94EFA1EC325E519E19F1EBDB2301204629
+BE170567DC4ACEBD3C9E77F58A18C9E7674E74DF14C06C9B79F214B1D9D68FB6
+7B00556467E1ACDD873CF9C69B9E9DE4CB6C38385545D03463EF413652DDD8FA
+546186B39AFC9CABF1C03988AF99E40DB41D78DAF0154816B06337C0F548008B
+A296B2C72FEC96D90537F123E349FC71F5FC3211ABF4204A392974F472AB1B75
+BE473257575CEE78B5954B201B07F84F49E3CBEAE74F2344356D1D18C8DCDD50
+3160341232C5C64F6EFE6DEF4366A077DD56419BC5E5AAA46204583282DCAC06
+EFB9ED502FC0630248476D442E4EBCA78A6528D56251E82D1435B537143F5CBF
+9B4D50C8FD5DD48C3404770471A4EC244EA3E1A29712FBBFFE73582AF4B91263
+EA829C0AB264AD1B13419F571DCB6E8FB68F643C4621A68B9EB46AC0A203CF7A
+4DFA6439EB79289099D6150138A259D69A88298F40EC9DE6E0C6D0166CCAB106
+22042C8717E6699746A4E4500BCAD2CFD962BE58BA90D2F3C324899D795835BF
+517AD51325C84354C799ACD9312FD1A68BF321DD1C570A64DA73F09D93F06B14
+3C71FED756E583D7E62651871532A9A9DA08BCCB45AC9DCEC095060017D7BC0B
+F366446AAA9C5BCB400FED24E9029FA9C302A2FD1BE1F1623E0542598D631406
+72AD661D5543C8E155BE180EEF97927F7D297C7891F116FEA273864B4F34D015
+A46D3D4C1B57C3F0147585C25F59AEBA6566D2A1FADC2A2BD501E7049F4B948E
+8C48A046F894F26E401A2947793C431FF80D5FD39411E2FFDCD1CF240446F62D
+E1147CED8F14D7C228EA87C84DFD1091580368000A4C7D72C522D7E8F00F5D8E
+4228568FE0D0B5022E156E78C2FF712D6328AF0749ACBF204AB2733999017D4B
+DD3FA855AD1E814FD22D2000BD82A09DF349A6B04FEC243FC16292CD82A73075
+F14E7C349A61E2902334C21DC5E6BD1F43892A0E293C8D23EC732BF0B437ECF9
+284873394803C28728D538A3EAF598E877A3B6D45DFF61AB8A510627239775AD
+9EB716DC52FBBC941B624BB6A811D1F1E0499032AD1EE979D81F933D83C4F01F
+239F7A51191E747A776262260C606426DB43F5FFDF7413A74C4838D370AC3123
+B888D7557335D205AFB531F4A731E708DA4AD6C6DEC091F24A3AF33F1F8AA506
+3C2E1CE8C7A5893244C69DFA95DA70AC6415AB9D8650DA4A6E9C5AA347159DB2
+ED57F24C7EC875166C12BB7C9E0573F6FBB499CD454D596424E3EABB80C39B40
+1EC7CEE366DA4BE6EE8CB8B36BCA1B7861C9B6E2721163E81BC2A6D87D5092F8
+069D41A0C2036751BBE07745D745836461688E7DB9623D58E01D0E9FDEA88130
+8E7352684D89AFE8DD9E011BAA66598D777155CA7B465614E253B13B63204093
+1F855288C0B98B0D3190ADDBF5E87204455F44556A8CA5540126ACA44639017D
+4AB89665FD51F5B29709B987C7C6F7099FF107BFE7B164D2E875A85CBA8A088F
+D30E56836EDCB684DC803CFB800724B0B5556D2A7C018552BF7AF3056DF735E8
+870FF3658D757FD8F2177FF787436C6198026CFC32E9BC779C0FC5DD1E45F354
+CDDDF4CDDCC822B75CFF4F0F085E9908AB9D645CE8172B1ED969E2B58568BD2F
+BF2263CA6E814BBB0EEF1AD56BA8B3338A707E45F1F63B88BD13048A550852B6
+67DDFCA53B34EC224AD5D318B7DEB4B716B4D7E839865495B9F02C622DE9E7B3
+3A5122936AC6CD85E5E820813B96D5991EB331CCC07ABB27F0610D5B8D93C6A9
+C212FC47EE042D091EB967A16C3B856CE98A6D77925CD90F7CE00E0EF6EFBC07
+092DF61D15356B1086F69016194CB500FC4E78C68026EB5690AC583A39F3BB78
+89CE6AE85B7399531281814566F305A6CC7EE4C23351547970DA591552E55D44
+667746AB7B69A7B9F72EF84CA05C8B55BA2F2813B8A7168C12058056D1C004BB
+3C590491F07752F21889BA6A304C0ACE9E018C533BEFB136A14470D42F2B1702
+CA899800A832B7D169FEC902AD96AC59010F4E760FC708DFC25CA2CDCB18FD1D
+B1CAB76A54B8010A7DBDF8C8259E5692714C9F6865C7E1DCC3DD36D5AFCB3308
+2BC00FFC4AF0FC58390323A7CB5471FFDCE3D0F0DA0C90532768EC4E75B398F1
+1A6A3598CCD0CA764A52DAA7B904089BDFFDE26FCA6C8D79839B59E389BEEEE8
+A316542A1E34FB625D02D53D5CB45C85E992779105FDAAB72336D9A090290AB9
+E1A1CBF308D6F9B4E809A9C9AC6C884A07DF64213C8D11D1F68336E05C90B63B
+F19A613B7325C078816896D24BA0AD823BEF5DAEBCF36A0D21526D997ADAC3CF
+2AAAFEC6434BA32FC483E3751061CDF66956B246314FEF9007610A8D3C5FBB15
+CB195E5DA0BE543ED914D7D8B3A7F91302E27E1D7FD20AFEA563A89BBAE5F5F6
+8446592AAC5798AD1E12A6645A376D1E2A4A3D7A642A21941E08D962C5A1C65B
+A7EEA14033EF11C2141D334F3FB706B8DD973DF78CA023C68956EC70311D16C7
+232918F103B72CBBD6AFA52B332C01A2D70CD4E8115E59756C628A3F90AA2183
+53B362FF63AE235B2B3735FF54CC0AE1B6F9228A63A7D26D37DF6AE0198E67ED
+F582A3D86791B83838D5B6BA78D0EAD90E000DA0091B5E3B0847B7EDDBE024CA
+9B59283BE3A71B3E598CEA4E663024E6C6B91D8D14090D3DA7F9B11C447E92B6
+E88DE37D38A3DC0D054CD58703A849C8981C9446B638FA6077193975B7763E40
+E01E9F64EF040D5215309DEA22B76F428C9DABB4CB0F3C6B0D84759EF1C9AF43
+5388D9E06EDF2034BF3C044CFF55AA4C24C260C6F14905E664BED7BFBD608231
+3163CF949CD4DA8E5804ABB3932310853D79B245CF21023631DA0031F22D0DD9
+B0B888768BA4A388D4E1B7CA211D905E495A5253369C38E8BD55CC440A660856
+49792716D6B133B7DF6C2D0145FD4D0C32E82B36F8D3C4083B13AF8D536C572E
+C44B0A22EFB895B27FEDA2B4F8849722822E6ACCD47D4E7052C61C3AACFA0F4A
+C469446809295E4569C3C8B3E6FD162DDD09E86B78B6F516592497D0EE7D5182
+B50DDC3C8DB358C713956721D2EC1490D535B0A6D0C2511916B34FB6757D4943
+21918A1567DFAE0CF38C8A78E6F0F593A4E0FBE058C3FE7F9ECFAF3AD5FE707C
+9EB61C58EF5224EBBCE0C59C21B8E81A974A45FFC728F139A6598C1DB4B65753
+3E30B21EE83722B6590D3EB07BB0EC5576B078818F9ABF14D4288F78512986AA
+601C898AE24B1F9A234933997A7419C08158F741AB22F5E5EBF60D92ACD46500
+32DE53B95EE857F07CBCCCFA0D6AC16C55084EC3FEE4AE2339582E7BD09C1BAA
+C1037000E1600991E00B56DA3BCAC72B53A949938BAC1FDE9E49B812446FA936
+A1D0A1DFDDFA38D8B917074C93B45F98B57ED664ED8A26ED68CDDB0013FCD1CD
+4A0A7B83C456697039312C8F628BCF268D8FA47100B650128CB50265003F9BBD
+743270196DBAEB0A068B47EED0DFA76446DFE8D79AD99B48681E0A93090F7E0E
+765F44158F9FE895AA5729E9001F851A8CAC45DE0A1F4BD02035121A8A8AE1F7
+B26A243B8BECE53A8318DBCEEC458D93167547B3C48A62D3E72CFB61D7973716
+66F9C238083923289AE863658DCFF1AC7C8E0B63CE038FDBF4E7C3BAA1F04081
+9BA3F81A5874BADBA6D95A9CC8D48DF125BBF01AB7DFC8C829E3B24A7F661FCF
+ADD7D786307CEFA10998080D09C0A97DDA55F33E1DB26776993A3E8FDC11EF81
+47CBE6265BC9EA0769DEE0C82D5B49DADC978B39FFB09AE09DCDD22755B522F5
+BA877717D5EF3031ED6AEC7AA1EA9F1A74E76EF146C51351531E7934C487B5AE
+34A5DC732789CBB19D7D72BEAAF5C4C8270CF02337F8FE0751CC6D25BD5E3C48
+C4C89BDDBEB07E54113AFAD5F4FB7C4F33F84AD8DB5E34D9D64D6536171F6871
+6A67F70874F1485890CAC656C84BC92806D4903C0EC3F29108A936975BA12862
+73ABE73AC5ACEB5EBDF220B509843D658E0043E742BE67312A85039F4AE48157
+93961B153AAFD8CFC1C346A9A4F866CCD3751222388D9823C1B5A9ACDA1F2ADE
+84432734A85FCA3B28AA8F71B0E20FB9ED6BB4CE6D349207E3429A1606CD0A1F
+506AD97577E9FE13871792DE0EE1BB1EE78965442D47383B9079B9310D3C4C34
+9B98F72423D9B3B73A03DB56D2773C3C8689B27A03A1EB6182D39D0637969499
+0ED96CBC49ED0E96FF0176C092DF3C16169AFC5C41D34BD1739FA95D86252CF6
+024AB0EDA56F0CED192FF0CD3C67E65CAAA788C09D89760CAA7788B0B585F516
+437BFF42CB34A1758011A2D26764E510A6014758876D3F9F1E76759C79C8CED3
+9279F0A1B303C44B0350E66607397AD2D7D4057C1AABE8AF47604C867E433565
+1CE2B85A1924F88EF88A995063BBB236A8E6CC61F30E86AA35FC5D0B1EAC4FD8
+364554C9A449FAAE56681D42EC4C1207B4AC56B2C56DAAB9926A49762E189F58
+79192CD73C69DB8959692643BBA6BE6C6032820D1DF3357518C15F25D92A1A9B
+BE6EA98834774FD03067F98A43AC4440767EC905D6EF2AB7F06022755AD03E09
+66F03C5262FCA0B42EC237A238D337A27ADAC00CC7CB3BB364C56162A1355D63
+11B316633F1C77B4BBA07B05C3CB4ECE5F56B66F847AF2343F42E339488557EC
+A637DBBB753E1E7F8A1A26EDCA49A9801A560FB0CD23DE0C5EAAEE1DCA7CA1A6
+CFD18FE33008E5EB9D8A1EAF605F5F0C988830FDB51618D9DC751D2D3F681F1A
+4247942FE023B11B8295815926BCD8972D9A14AB832D01BCE0E9CD7B3F39EAF7
+A5D8B818D4EDF1D00DD24EF93E41FC2C9935B0151073AFF30453C9453B488D2E
+3164CEA20F8E53E7558FBAC9192F157BFF52055C1FD5572D0201B68290E05F1F
+4C12E7EF571D8B6834A916B49191D05F679830BA557F0BE75B0B81F6017DDECB
+FB9FD3668124D666EACE0D92982BF3FE60767BF43DD1BBB9DA49BF3033F0E163
+292ADF1A9C2E6984500AF8162001FA2A182818AFD57804CBF79B1354A6CD22B9
+9402CF3B52D49D52061B342DE3E053F7E87E789AAE0C6A321510793CACB37FE6
+F36D0AFB61BBD354F9FA51EB6E8A3EB87437474CB7C9A2D399A91D99C1D5C622
+4D1C461E309A6DBB534B34C29BAE2166E746C0B267E6CEE71EC9569C64C0B26A
+798C8B634DF3F7CFEB08050A0DD910F7DC3B978075EB23AFB72B46D4AAB8DC97
+9F23898AFDFAEFC96AFA47BADE9AAAA580FB90625A7B0F7C7BC8472CE99767C3
+F80FB3207453742B63B36D063A6CFEA520F744AAFA016FDACB11CE7269DA07DB
+7EAFD778CE065717512035C3ACC049DDE075E8724343C7720C217ABFDE9FAE77
+2395AFEC6A786BB0008015C77E2A124629103FEEF89B962D16F5A9EAA8A74D35
+CEF76CFB6FDA7F8D5A22F2D81308E90E3A51A83D18145057F70CDB171BD5DB35
+89E5AA27C97EB7C61F21753C1E21C9503660B3A1393EE734206E29F161694578
+292939A9967C6C57F9D1B406E890AAA3A3FA0E51D62D4CFDC42C6EB30B979F9D
+2700AA0AB9F5BD032439DA1D7E80283ABAF1621DA6744057E5B275424B1AEEEF
+7CD90A688A9FBFDF25F675B8989735FBF5A71878EF508701BAF0BDCB475FE2F7
+DC4E83B652C7472107AE84B826970DAD15889FB2FEC8C84FC4E382E5C6422EAF
+5F9033A69B2D7CE47559FC0DF1C967C28A140F7C135F21E26966EE00FA23B3B4
+BC5BBE5A48DE5BE5115B7B35D5347A46287C9CABB769F7232D42BC3991DE8159
+886B89B6C193177D72850DEC1271CB4C6E4B66C8C7A238FEF6D519F2CB656B8D
+3EFAD3ABC2712B4D791AA8EB182BE80D7C314EFEB596081FB473291A2836F192
+69117152F0DF4D152B97105B538260A2E8F031D63032C79880072164646A00D4
+3C4B11114B106D398F4E1118008688E28182796D63B190B9702503153B706463
+9AEE5BE245B371F1A8AE5C089DB1B219185B62460B700EC1D9E8ECED525E256B
+5C340E5DC616DA271E4558A411B669C05BE555BD209E89447382EC75EF809E71
+2149DF776FCD686603D55208D81583CFE66FC21B212030029ADAD999F4A2AF5B
+A69A93A0D305362BBCFB3607E06643B810B5361F7257220EEC801EE13BF568E9
+B1E43D1AF42B3AAFC1980329A1B76782D1FD1DA499510749C69E1DAE204C07FF
+B6033B4217C56C3DC59C56E3A986571200344FD8A7BF7AA5921D584E34A0134F
+BB3430FDE1647981B07EEBC6D6E3C0FE31BFCAE4F9D79922BD7FDAD1C947D360
+54AB08E7A3DFFF8EE646EA0C650ED778C601A42C99B1CA4820DB8E8129C6A291
+794FBC008E51A096033D21DA7E2C3BA027005CD698B910549982196E3927793F
+AC1B48087C7B71DFDE6B3BEE69F4BA8B85BBCF4040BC6D390BB0C67F753CAFB8
+F9D5406FD5C6CC0B239FFAD514AE5348C3E91E864CF944A2152BC183016ABD86
+899C2854E79E37423A2A6B82D3977CE545BE8138FC338843C8E3CE90D4488A30
+61D64C3852E5B0E614C290940CB533EED07638D301D295A5A3D0A2ADC1766588
+050722D7C56875941788C5FA73DF6C15AFC82EDDF1BD7D5F74D4C8B3B2A9C26D
+DFAF46E7D80AA4B75428923E8F8A0C7D76FDEBEB8B18B977169BE83F210177F1
+C48FCB3C57B166AE4881FC60D8BBFADBDBA79179E0201DA04ACCCBCF835B90D0
+49AF9BC25A34488811A0D8AC5C4CD30FC7405A7CB311980A8901DC335C100A20
+6D2F85C3F4B850E82B595D67333A4E19EBA8F8E3F7FC5AF6ABA6BE2ACE252489
+5A635F6A09080E68CEC7CE86290A1EE1917942F8215A6CFB9F325F44D8502B39
+9FE6C58494ECD32E3E24107D58F1F192D1EF6388C385550034FBF5F71CEE3508
+5E58E2FF3DF78F3D6C2DC680B4B635C0AF556CB21EE29FDB8837F4ED58F704FC
+210EF15DD2C7FBFA57AF9CDD22CCF4DBB14AF0240F8B5BA407684556910D7A88
+8DB22639BDF0AE9099FC1DDDD01E887F5DD40456412EEB4DC8B92EC01C0DF4C5
+AFA824FB2B49E5D266776007C54630D725885DB2580A0E4A2EBAB48A83F50FAC
+9AE8D4313D416192488B53DB7D1FC758418E6393B0A31B2EDA0B47FE639074AC
+6B5A103DD65912A9F3661F7C4B1C961831D4CBE95E56281C8F6B4802E0CFA812
+5E89E8A4E801C83B1E1E671C8C29148D9E66CC733C2FA909F01D14B22B9DE54D
+8D946D30B5BDA3D9D54BAC8DC0407B22E04844A426C3C4F850C6AC08969EAF88
+D57B7DFD591162A2CC3B39D3DE42F59FE1075B22C354A32CF5C18344CDB5DACC
+8F34E10AED2166FFFA93413DA79837BBC312D523048AAB5AFF710EC013187F08
+16BB6B81C989215AACEEE12E8B275ADDE698B525F558C7581E953834A190072D
+7F5AE1FBE21BAB680B00435BD48E127E66F0B1293E6AB6A739D313A3AACEDBAC
+F9A948D8806581BE8D786EF8092FFCB0F045E6B389621A779649225A9883984D
+6549CD8DF7CA2B9390BD02BA122BB88CC8E774D57003F5DB20C813B7C7682C21
+0B3A9AF46AB39C065F55CF8F5E82125BDF90AC23C65940DEF36C59140468D341
+86EC9135929C375B3A6669DBF35BBCA30FF06874C50F40F1BF6A9686AA3442D2
+60DE0B7E757D25F0C81EDE5E4CF20ADC257029D2A2973769326EBF823B814691
+4450BC52F93E8925F11580A6EBB7BB09C42DB8463D7A6B1AAC66A476F42615BA
+1B6F0161CED79859435C7B685F9832E790BE2BE87C4107ABA3B09A31BA69C796
+73E0E4850865AA0D6901E8F097C50CADDDFCFDA9B846D27E82489A8385517629
+3AC365917DADC0FBEBF882651C037EE822689BC241C382DF7E899ECB140217D0
+B17F794227DFFC0ADCCB5B21CCF23218462708F69649A48C08D3E0523F0D2695
+67185082444282FD6251BFDA4D9766546CA3735AC552E7A201AE5DC2DECBECDA
+039DDAEC1F6382A1C980FD579B89774357452859830FD9F1EADD31B8EA1972D9
+1A8563D85606421AD645F6AD1DA776420868FF06007E131C9965EF4CB6301902
+B3AA06AF96A0427B230C9A8239B48A3C9E67D5834B44B369BB7BA55F681D52B2
+B77532C1CFD4B5FD02569A0815EAEB358129790687BBB7883A11D88C4FCDAF2D
+8CE6F48D18E81E880FDF21F48874CBEFAD71B7F75F6E3608EE10B91FB2DA2885
+C58712ED9A73B2316E0B031C69C3E13E6DF414C7923DDB181130E648A72BBBE0
+AD2F8284C5F32A0DEFF238AE3F178717296120E0CBF85F17496ED4BEA82521C5
+7201087E18DB95380D29B7D41C71AAFAED7DC7F386A059F37CFC1C5E036A6DAA
+EEBA2AC35D8CB5513341BBA2F66A3A8C2DB5254D5865D2A09C28EB8866BCF77A
+C6C642792C7D5B8B98494B1AB50DC7B7B73F84C0D9E689B320EB3F78802CDBF8
+1932BFC97189065795665BA7D9C0B996205BBC33E7E953A942D436A848D60C31
+AA3EC00C9259A35D46D3AD72B12BA09FA5147FAAB88BF98AC03BECC111C92338
+E5C32B051A2338E3F7124B2C2331117F0E3BD538213ADA1E2BF9C67501846F4D
+CE12524A237A92475B151FDAF3FEF6EF44AF8D73DA89E4BF2F26D01497DCFD44
+28452968DA88F5EF37FF82DDE9AA2D26572702C95E300D6BCF8EE4F6FEE550AD
+2069E15A8B02336C72F3DB247E756700A873C15B22D0C678FC4ABB5FBC0E7BC7
+6AEA3DEDFC6A4D67BE32F32579C000CFC858419E393A3617F495806381D9C473
+459AB0512A4765B29D7339E1068554BE5514A31C65E9CBF6B137C7B6E6230ED4
+2AD4292E54237020C0D59FEA10AE705CB0D66F8C7162C10D2BEDA905C239B633
+48B63918C848BF07B5060B93CEF98638592CA1A1F378907CB3C119C8FA9F0AEF
+B232A578E97B1D219FC4A4E6B468EE9AC7302F315E8FDB75AA0DC7C5F4AF8D02
+063CB56BAA9081D337161644EFA77AADEE5B5FD0A9E23D1E6B2C993CB5D9861F
+F933130EC98C4997EACB99BB0651C0A62D00E6FE21FEA867D7BDC218A83B7F0C
+60707F0864651897C9A94777853989524E0F879DDBD37E0E16DA4193541C2A0E
+E848337BEE596177A695FCCDCCDA2815DC916C75ED593492D47941C0066F94CA
+D255773CE31976784AC8D96C42A8531B496BFFA7C004EEBEE2EEEDCE7C0D12E6
+3460E1A6A3A29C3704FDD436E4BFE9B392F4D039C5E82876196BC1C6EAB58B94
+6621BC406ACE07DC8EA0B966A7BB1152CC69C0B2C4201A3108D025229F444F04
+64D60965AC96C7BA6CAD1E384D21181D9F7C6BFE82AB2178BAB8C57146696F4A
+A314E37BD9C2D30328068FDA5196284BAE10588E1762FF179714AEA6E23B983F
+8D4AEC80B4244CAF00C08D799D71BB86971D21F0AE08C5D6B1547B49B07B97B3
+6329398A20DBBCD1631DEA7F1655C8772AF48E255EF1307878D648EDFDA3BDED
+A449846BD016F844E54CC83A6AF4C0351CCCAE7866A5605A75F8BC4863EEAF85
+8C4D4F2EBC3E68EECDF01D149F94EA59D6DE1E23457700099320B9CADAA2F25C
+1EE36EF641839E1C66BDDFA078F6C0E57531DE99D5B8FF93EFCD27BAB14821EC
+144398E095677BDCE884D08B77A43C3CB84898C2F47D2BAA047C39F747A9FB2F
+C2256A3D69A96E5556BB42CAB20A3479A4BDC264744C1D21D09388672F2124FC
+5ED76FCD3DB8CE9E83128DDAF38EA09C5F5BE534B7E8C763818967D6774AEFFA
+943F41D49E165FC6312D9A2919868F18FBDF421754807168F3D0B46D6FFD94B8
+EA4AA76745BB42783BC3D6E180E249BA2F49FA9EA93C7C803E6B60957FCE0462
+F37220D1F02C0609FC8F86B0BFCB36AB362D65FDC9E4006972F8827DDF0B74B0
+6D75CFBAFEEE0666A3E635D6BF6B82ECD59A0EC11A598ABA9C719516D40931E3
+B88807B0B97679EED2750DA89CE72490045ADAD93E2149B2F4DE824EDF4F589B
+BED47D1A68FA443B43B12627213ADB4A13955941A414298369E56C9296A08948
+ED824B5AD50BFFD1278012CBD25C2900947DD36C7BA84862BFD0D6E5C8804DFE
+A009520243BEF0FDE4E28A09308967AE5C17557905522070944642A61E0C3ECE
+DE6F930581CEA7D90722353094AF344FFB6A9AFD77DB33F5BCC4C389EE337093
+C729A8EBE416D38592E391419773533361AA40A4A069DD2E513E01529379A770
+CF1E4B6AAA04E6859C7767A7A8DABA86A47F00504D97FE89B9EF06C2215F3CF3
+EE4C1AF567E96FBE44DCCD55C5700D7B8978B02AD4AC66D75B444BD75DDE1694
+A63B83762C0E16096803805F6D0DCA0D860854CDF5EDF0505A9188358952F936
+76CD51B7C1B080DDBE0EE98844C63F603E8A20C30B82E9FD9666127DE42A3EB1
+8B1351970E27C4ED14DFF0A3B233F5CD1B0C29F83EB364326306509EE34291C4
+42F3131380CC0CC7044B27360733FDA81FCB46CE50C78671E7805DA1168E9E1D
+C0412304730716E52F48BD729E2715EC9DD491C30BFFDEBB47C8253430C3BDBD
+3A943C3E39DBF1063B33BEF0C9E6B8241FCC3255F76A731CF80EB31B57439231
+4A0C689379136CAAD5E640F7A40232B08538C6EAF28C00DE6D26100D792250AE
+669E7DE50FA71A511F3B9AA23DE99764999D7E04EA0B6E133CEC569E50DA13E4
+F8A6232646C3C501DCB6F11EEBF2C7027EC938ED135D3397C0EE21A2887F6D6C
+D5476A118374069148C7528B8F2F755CBB26FA6632CC5E1A63CFB6E54FFD685A
+0312B80D606D31B04EF73A53BE6A5389EE90A6E39A8AC664638C63DFF4454205
+2CA6F1D105D12E90D1D4022FFE7F80B7E14A300B94E31ECB6301CCB7F75AE168
+B4A38B67F5568BCEA87C4A4E39F9865FBD2325F7F1ADA633796A9853BBDE6A52
+A1427B9EB6E36F43085E5099F2955E3B26B4E3A19E888D7BF716225401C284DB
+5452653EDF68D540DE39065356267288D831AFF2507DB7F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 13 /circlecopyrt put
+dup 15 /bullet put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD
+5F3D998D8365AF76D4CF6A06FB66E1CBCFDB3A67D8880377CD677B9705EE853A
+D849F88A828E244FA5816B7D081D4D1975A56D771790C21AE05809BEE6613452
+953F26C39CE61F0E134BC35404FE2F0B7D244D9A6F66E4D817D1C65024013AD3
+5F242EDE94633B8E20EA42B07F83BA649F12B784B2AAFA542BC597C6C2C9AE9C
+39D60FBA6CD16AADB5DFDABF22F37E244DF3987FBFA55031CFCD46ADF03650CE
+D6CDFFD87BF7407FFB63F3FE4C29FE753896101B2CEAB9007B66E29D6A5B85D3
+FF91F888E445677157A5996FC7A3BD19BAF3A3BCF33F0719B992A0F013B1F0A1
+82E42DF6F651071FB407F448DFF37653E2A0569BDD8EABC3280B3582745DB98B
+644E5B341F531B0D81ED85F815B993C2B8B34CDDC6AE97606F6B3B1C5427F174
+362FAB82B935087B568E6F526347058C406E878F1CC2DD05C26D35565347C5A5
+7575891BB4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 11 /ff put
+dup 12 /fi put
+dup 13 /fl put
+dup 14 /ffi put
+dup 34 /quotedblright put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 61 /equal put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 91 /bracketleft put
+dup 92 /quotedblleft put
+dup 93 /bracketright put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 124 /emdash put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C
+295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75
+409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C
+4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF
+2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E
+0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E
+B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008
+24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B
+43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF
+D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575
+5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC
+96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3
+7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65
+0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830
+B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D
+AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007
+97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8
+FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5
+20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4
+0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD
+F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20
+3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122
+A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379
+5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA77428025D4059BA
+2988AC2E3D7246BAAAFB89745F0E38580546045527C8779A254DB08DCC6FB9B9
+0E172209FBE3857AF495A7F2B34BC893D942C145C2204CFCD6A5C69FEFC25B60
+E412CB2BEAE7F7FAD03AF46344F6A7D483BBB1E896BF16B0F4C363799DF23CE2
+E8127996DE841B6F9D8A9E56BD799B6A938582988AF87151BB8D3AEA85C49857
+DD862B5E10D9F33D57795D656FB616BC9B8397B3612131A2B0F472656700958F
+739A548F7C3A348698AF9F6F9821D7A9FD4131781ACBF7EAB885A3AC254DBF94
+02FA697941A0F97F048861788BEACC20DE829764413CA58F9D045A6B38BCD6E6
+E4827247EDF1171F64E3B041A69B244308DC07F66643FCD7D5FD37F36EC4CB5F
+957D4ADAF91850A3B1A765E0E580EDC77556593D1B2E1C22685268469298688A
+45C474C9D0472D019CE1E83F25182D084AD85A49C502E8D679C227DA8E32045F
+8055D1622C478F8FDA342685F858DE3F53F1CEA0D70BF3FE09037D981E9E7FFB
+BC3F896535D0DCF53F4C85A1DA5D0B632484D1F25460E3EB38E251D2AA17817E
+F3B25A2A49C0AEDE0B89E277F52CBF744EF0243C409FD71FB0C574640CF11599
+117A4F42F27D8D282D34485AD116F7E753A8DEBFDF7C552A1179C02B7A37782B
+743D0DF85C15A333BE9EE82C13DBC9CB007DEB5900954AD9309902E08B3D5BB4
+E8414211B971CE8B9F05A61C15F400D9297745F606C6419E8A8A9ADCBDC39243
+617EFABFDCF9F836D14411BD72EE19D0BDE89234BF7D52E7A68ECC952FB74FE3
+33E1A87DA39AEEE9E90406E2B1CF3799C63E9BA858D54F38918B814C0DF0B696
+839C820C26FB473ACC5C08E2056457A74123A398806EECDB427BB183F5458105
+2B66D7E1FC3529025D3243A045625E9DD9417FA089B3C7C394D2B65C0367FF73
+79F17ADEC6B5D27A5D3D3E244A0839E38267ACF07B2D994C2B4E7F30A416EEE2
+D1688F167D1641A72A795B1F4DA3350F75AD6D546AA118B5F8A5085F5794E6E5
+28256CD31D250D8328C9620B8ACAB03E4A33DB4595E959F4D0FB1C8CE85A710E
+22F1940067C036A7DCED7EA48F1EB81AC4735FB26A249A32AC2E3E7636B32D31
+7D76FBEBA106D6C67C94A3BD4256B786B71C6EF8D191CA90CAD8D2EEAD42C6DD
+8BB4BEA7DAD4ECB6E002F3B71C2955A5A401E34D55F755BED68178C270109BAB
+FA0AD848347EB977325530B27180661A59447D7DB55A62D65309DE24B6638986
+1D3A539BD37E74C2C00DFED3336B5C6B28D915AB7188FFBCE3ADB3CB903944DF
+1BA5923A1C053D4682BB8616F44E81E18DB2B58298F4B1A6289CA993DF3E7C73
+B00DEA3A9B747FEEBC4A11E5B9B8B05CA2709B8AA935A42159D3DE399544F5AF
+AC1CC00F6CB94AB69856078C9A2EB2046BB9055CDD6A0622112F7D3710143F1C
+20CD8DAB4109CD47BC00EBCB88314081C1D6C43132412F261CE0262FA28DB7A3
+C7D8534BCBE1A60488EA230DC558B73C72AE87539A9D7E28C2BE05FC05F58DDD
+87117FB7D26E271EE319A45AF58B5060BC504767962151AA0BE18386D7A6B067
+DB4EE68115AAD6C430A83684A650CAE13BDD3B2273062E649AF34CFB7A1E33CC
+4459B32357BCF9E9D240B4B49480E19266F35591878434DAA5C22547994C95C4
+24836FB59B23DB98769E02DA06763496C34278BB44E9ADB6B0A4F6F25513491A
+5DEF85F52B2AEB160684F2FD877B1C0C20AB9CA213CEFA13DF43E8430DC07E84
+AEA51089F7DB2D5A2DD2B41A09C6DC4C0E94DD1A1F9B5D4B948AEBB424958B80
+F1CF7424B30C9459FCBF8ADFEE2DA11544583C2A6D44EE145C1848C52E01EE0C
+7AFC55A87FB3A81657D41098685A17A181D0CBC519C1579B64E8AA9A56665016
+221DD4F776B39E4B1C7A6E06E92EF8586B9BC24692F3F850EC07CAF38D46F388
+07B36DDAEE4EDEBDA728B444B69CC8C86E8A316338EC254E0D39527A6BA0101B
+DC4A7C0C6B3A57325B671E16E7D565FE32AEC8F12DDAEABC4C0F5B81ADC4FBFB
+3058680581EF6A59BBB791A36D25CFFC73832385B74AA2909E2532E12C17416B
+9C753552C5CA9F257B49FA4DC9E18DBA9E74AACC73891AFA4EE5AE5270A49AA1
+F21534BEB46230E1443B2CC1BBD7C8A53A4F81A94917F2C8033B81B3A5147009
+6FDFBE24DDBA427A8710558A3FA56FC095CF43965471C12B7E0317A055181D51
+613B637F6DC09665B21627566D893D99E8FE05DB46054A99E9BD96C905457807
+040B91EA8AB82DC2B238DF8299DB9D96AC80C58EC470E44AB57563C69ED0766F
+4D7897A49CFF983CF4210633F5556ED3EC9269C69036DECB0D3F95D70C4160E3
+CC03EBB3EED2BC58FF82A1441ED504DD64141BFB1D9577D697123FFDDEAA86DD
+122B65104DBA6FA94273E11F847C3F6AAFB171F13C6A9CC35490A7059FA99C53
+EB841EECE3E2FC7293601E799851ABB94E61D5F9E19577B5C5D53FF307739FB5
+8AD96F4C982FBB42AAFEB06FB5B985CF3B5A94D347795D9BE05F0A2DB35DA51B
+6C6EE6F81B9A14A470FB8EE86DF5D17C4749F9C64F40AD82CE6F5DC2A0E61355
+FC3845139194F4F5009E8299E9FFF9EC7D12FD49E423874D41FA8737009E610B
+8ED0B8F4DA3D512635ACB23828E19A26307B7A2D3EF8345B5D8121DB386D8976
+AE7D6792C02EBD15EFBB17B514D4258A2981D64A800AAD53BF194F5167DEB3DA
+764499D825A23BDC6565EBD942063347874C34413B02569C71D90B785ED3F7A3
+BA9987350892CCB89A75A77A4CFD7DD6383E14CAD21FC4F7A73FF4271E57EFB3
+A0F543FD467E29B02115D124F47DCB3C02817123B4EE694B9AA846F7CA86F432
+03B64474879A2D94708721A0CC8FA8693A72CE3EE4AC1F4D6A47C5EC92BBC1D9
+A0015887829A47250A0B9B19ED203DA3231C66BE6056EC2495BE6DB3E8EFBC6D
+D47ADE79FC302ED199F8FA1385747D3652F5E3C3A311D4D6FF082953B3188EB7
+C7D3FE68B51DF57AC4697449E539FB149BF6797E0B14DB1BE89D97B0B93BFDED
+622694A35DEA11D8ADB4F117D9351F73BE0AADC51282F4DD00158D0DF10A307C
+6D20394A15C86CBA42B818F6A68A89ABE13A14CA4DFA4BCA19DEAC249F83CBBF
+7AB2074FE43424EA9E92BBDFDC3EE2CC7A8F3666D0D30452409D8DB80AD1EBDB
+A12846FCD4226A6B357AE6BEF384A58E2FAE1C79D43D5E474E0EA2FF1D833899
+6C386610786C056C54C826F99585E7296C4CDBC846AC36D94EEBBC0DEE84FFAD
+210AC51E2EF34126098AE612DEECF8EC4533EBFF700F9B75BACEA7B771CB397C
+6413830C7DB0E333151B30D32627FCEF266E170A4D4E9D71883DF60C4FF03D08
+8EE3EFC8FCF74EA015E7EDE94C5E9906A3AAED85DC255CDA01D9063B124EA9D9
+54F2FDDB8E05829C8FEE07C6C027732D717A9515B3417BF705870EE6364DD785
+A3203480FB548EE57AED6B3739B3F1C6C2CD68BD1A0A052E373C81D661753994
+7C751E6F15E7EE2C075F1C43DBED60E8FF8D7581EB2D2112F62F15A3C6893026
+6651E3AF5E655AB85C63F34360C4820D327F6CE24D5BF665355035972DA992E5
+3BDE376CE6155BF5C3BC0C05ECE69D824061D2BB29CE02307B6100BB8EFF7ACB
+87659656E6C175E8D064D4B9EFF87EA45E42CE881484809FF86A0DB01E783090
+81B04CAEB3D27B34ABEE1FF55F6E3BAD0F9D47DC8E2DD2D75599C17C187D3E9E
+3F0B2D57D03F42EBC7FEAC40D62DD2545A297F7CD1C2D3C28BEAB8F069937A60
+76AEFA5B77BCEB2AC85F000E046F4D9B009688CA306970EF923E9BDC60E4E9A3
+628AB4D1E0D643D1A0A18375000ED121B460ECDF65B191E43182FC69B62BB2AC
+991320BC421EFC03419AD216AAF307ED3A2222A923E57A43A13F18199D5A2393
+2C2779A6EFF51DB8A696EAB9E648CBDCF606654BBB7DC9CF5E05D64EC7433A2B
+23C713A4AAEE6044DF5231C866CB126CC8D179EBE944872FE00E5647FAEBDD31
+069C5BEB6DA336A45583C87856C0D8409D8A02A58F0C16D712665667CFAD187A
+DBD8CC8AD1962DD6494B792FCB6A410BDAAA2E1B9C8EA0B57316C15D17EEB68C
+080A43C5B803A58565E93F3BB30832496055E861F6503AAFF4B48BEEA5657992
+AA29F49F6E89AF9C7A16BA8F271E09CB0260922A3D706CA4E55946FF3DA900FF
+A8EABC97426188ABF8BFC2D85224F9D0BCA5038EDE33BC6EA20B1BC2C5B1A683
+A5AF575CE5EA826EF7D777F1824AEF9A456D8A1857E79CB21E75C1877CF7A0CA
+4E3E1943BE4F614CF9F8D422CE8BC3744A09A12BF2F0E0B9EA8412ABAB1050B5
+E5F423F3974EB0F2C323A9D5942BF0B52217B616A178B51DE68ECCDDF3D852BC
+3CED3FC00C8358BBD9621DF38709A7BC7CA7F507CAFAECD058416622C8A6778E
+56DD0F56D087DA40E09429600FC97DD913C31491AFC81CFDD915D2D3BF3811A0
+8FCAA9F7B9A1E800E4E3CAF640898FF358B3B3AFBF09594DE760D03B2B21EE6B
+38EC7B48A4EC277FA6E52434D9FEFC5C90CF038E7F8297592057CB484B697E14
+145D80B40B9FE18D453AE12272B4165DA8ACCF5D8161303CF8AC0C67EFEE09CF
+61EC2BB71FB74AE4936C20AD50F006D7818A1B5F6546385280062D5FE1BD3B92
+AA7B6D60AB4000F75D7ECA2BC27090B34D313AF755BD6E8D2670929ED5D9A7B3
+ABBB2130AC0AAA0552FBFEE360F0491964A823B54AC07DB43D526B1646F70C08
+C9B143A0092EFC0C680E42BE0C7104CC23ED2103678AB9805BE6AB0501010416
+22CA00A41D88E36048B3C871A917D8311B88031931DCD15F687AF5380CB73CFA
+933F9682D8D616DBCB68CA9E1FC7DB0CA94EB42E40673597589E4AFCF1313C67
+D0B6B2A380D4CA41AA89417B19E5B4BC2060CEEF5676B49000D717250D796359
+CECDF88AAF08B71AF8859BEE17A9BFD57998A6C66419232E7973F01E3E8A3B3B
+C4160A1F51D1AB8D21B32F8DAAC9653077F752CB0B141589F171B312ECCE4AA2
+A1ACE97D0825DAB81A577613EE062BBB62B3D75E3D045E8B0155D2A9325F6AC5
+29DEE4C20A015E03DE5B60DBE04E2BA16228F6EAE52913AEB4570044C0E817B6
+ADDD0596149BC6C429F46FDFB0EAC6FB4A1CF298495B59C8A70C2B9D240C6F20
+93B94A632BC46C7C2755CD234DCE75562990C0258C2D615DD8CD4092D10B0FA8
+A7697647846DD95794C141A571BD27295A6498BC8BD6B2ACBBA73D6239B677DE
+0701EC5B5994FD981017F5B314CED6070CABC53356880C6CEE6DA1C519198B7C
+D390CCCFD01B089375003D055B3D704D3F67CE6150BF41ED2CF7CD4701230728
+7F89E00C87705C76B3CE3CD1C3929EAB6000E193D01E9C7264BF29030E9EB051
+FBB094633BB51629DD1DB40CC5F3FFA9A70093E59704C129FE895152BD6C5BEB
+66E46DE52CE673316344555B00BA09F7B60455C10548EBBBF13D1FD485585A36
+00061D31B7DA74AEC16AB236780E004D8602B29120854C950F29FF6F15A4F853
+83A553319C5D2DE26011722C90563043AF87E0B851FD47C01E30A6E73546E0B5
+822A1C591AAAD550429CC1143584B3E827C0138A6AC5D24D3142459A996AF5CE
+8177F93ECEDB4661107DCC38BA9815D7DB51E35E7D9BFA11AA6D4FFCBC95DE64
+1A563634B42202994844A9D1D6CDCFC0439BCE6B058D8E902A279DCB44F36DCA
+186C5C15434D987ADE64331BAE39CC537D826F9803B7E9461E7415B66327602A
+83E73050816AD4B284B7F38D506A8C8F3931CF92B7774D3D4AAFCE1B5D2DED59
+E15CBC2D7CFCFE79664AAD7B4A005A0313403EF78DB7543DFDB0077C146E056B
+FCF76BE09EAAE4CE8C4C5F6B9A400574C3E02BEED4C40BD49BFB2C640042E6DC
+5B6CB5D793E27453B4ECC044D9232C3901DFE56A5BDC07FB95E6B19E431A8728
+6E2FE837973B10CD1A207D5F52DF1CFFCFECE436B4753E4120B6075B43DA9F43
+3D09EE27ADBB9E3461489F3F8AB70D85EA3D551521E208421390EE9B97F6C7D1
+FDA6A6B9BDD9C7FA025FB6EC31CAB096D467BC25F07BC0B9F064E8A02DBE0411
+233C350BEF9874B22C783B8290A6878D7475F6905AFCC9B20DF5D9453449B90D
+106805613B924CCB40CC607140C1D8CB4C66143DA11EFF15ED437B23FEB505B9
+62F3502C4CC0D8F2AA7E595C05BA4647CBFDE86238A9AE6F4AE3E616EE8EB11A
+2E57F499C5BFE242D1F4EF7E6AF94EAFA6F029D78572FA857883410BD42FE17D
+53FFF9CFA96544326F5CCE7A29379B231734F06CBE7921F42158FBE5D7D650D9
+618D4701FEBA560CA102DF29E9595B0871585CC8D810341987537EBCD0C003E8
+AAA0FFBBE730247E15DFE53E820EAB442E042A180E41B1AC45C3D35310049E96
+6619E36CC21AF0F69D6C0A11466FF49DFC0C5F30C5118CD95A8A36888C822676
+128015D05C755FA399CCBDD108FACF02CA2D66EAF830FC2D8A4413A18416C52D
+B87F9E91317BC5B1B50E8E67ABE67AE5F20B16364B0754B682BF918A9E8262A8
+25D1DBFD6597DC5B635A73395A20F310AD55D47059931ADBA6BE34BFC0183F51
+54B4A1E638D954589D823F65215D79264626E3A935DDD6F0F5070C2301F0CBA8
+7B51DA5CC2CE2993F68AB04A7C83155A4FDA32EB7B02475C2E0DBFBF65086E12
+26C5AB818E7108D6E275C226C5BA55D9BD89107BB73E4F3302AEA534C67274C4
+5AD6DDE7D1348799803AC6428F514688408069A6EE0DB338C422EE68A21D7CBF
+A5AD9AA7934C7C06639064B0257A80447BF9433A7BC0122002E45CF9F2032415
+58191AF9038449A4B780701834D1D93C4BF49AD18A2296BC2B4E43B425D34933
+110C63C8442A989B08ED916A97EFCB6B4363DD66240359C4E961BDABB9EF406F
+50B5E99461D5C8E133BF7AF81474AB31F8140B803B99370FF3081D80022837D4
+D3A3706E9B0B3972A81E4D2E7139E255AF691F6A4678D01DF3BD2A32693A588B
+44E3B60BB102DE737CC83D432FD76260355366E09A7850C4F269101EED46630C
+BD80499059F066A2BE0F3C83B0D8E0A7D6440A9F79291FBC4C218C57A3B6A487
+EC56CAFC64A6E517E2C4D3267CAE196248E6051FFB2824552D0FCF656A2BBA49
+8E8DFF9B3227D820CF942FDC5722A7BA220D0029C28465666B99132D551FE278
+C93D4E92FD003903CBEDE56E64D7DA481297409E5B63423D0FDA65431E6A59B6
+5ABC9EA077F0F08F26C3AECBF7D5F51317C4D8EFF5EE1CD6664DCE57022F2965
+8D3520633288A0442533C847915E969FE7808B485003FF34B3F29850F037A930
+583DE61E0C92E56EDF3F08227146C48545EAAA72975FE80C405D98E1634953C4
+8469D25036B107F3E2FAB78EFAC01F1A7C266BCFF7D4AD006FC21ECCA80A1F44
+8396C4DEEA7F14F7C051B24A76F0027B8AC80956CCDB9D86907BC6299484F168
+C20BAAF6D131C506AD51FB477118BE491E72283697DC88DFB1E5225329F3E7CF
+F0C061C3C8433C8B39B81BEA0396DC7A0CC0A9DCBFDB7E634CAD538AE4CAA055
+88E63B4D4CC99355DE2DAE6555BE3B4C633709751EE1053C35D59882B3F3E559
+0FB569FD4DBCAE28B2B415B444BA6746C0968ACE6CDBAC2A81205B0D7329026B
+E8F1133A3C02CCBC4772A8700CEFE0F4FF6FE5D95B6CE6329819F4370F3461AE
+F6CD85F4F903FB220987A51696D3C141ACFB90BE00C2A9263F42DA4AC7128E8C
+B4960BD94617A0BE1E9EE443E625C3A19F6988A52889424F52F10259CD191ACA
+DC0863C3F38A85EF445482DBCFF9BAD900E86A37F82B64C48D5C8B7EA961C476
+EF43151EC824376C450610CE2A3074FB84EA257E52E8CC690527833B70B08150
+DA3907DBC1645613B9F02C9E97AA3E46552528AA8138A9DD54CCED001FF3A0B1
+248C62BB75B842F56B7D402A00FBEC7B3660E1B85BD2B2149545FF83697EC13C
+0FB36D733FADC3AACA584E110B4C97B34D29E9F62A69BDDF8663DCFDCD7DD89C
+9FE559BA7EB195E27177B9E6FC4A5EE4E707749A0DCF391448D2B83EE91FD91D
+EDC44C2013C9444399BC2A49077AE821BC0A51494638B7307F4ED02A0B93F685
+765A2CE63373C2ED943BA0B92AC29F589A34391879D513D318E659192EB96800
+F70C097613825CC6F0A83BACB6128603D5D1DF74F83FBA4C55CBF4ED0251796B
+8034371CE0DF07D49AD6435D048C2B11F29B8F7D3D259566103E645592CE6185
+9532BF90BAC105F042466043D52D8E323E1C241BC7D2337F3E420153DAC45279
+902F35C33773C30327F7B1D5EBD92F4C6DC2002905DC00B9A60BF55491829C6E
+0A8D4B4BD39948DFE749E2CD13665E5DC253DA2DA9878B8C88AEF1CF492E6726
+0D7DCD188C5E8190F41AF40C81057C88A55466667296314A5A5C42C012306071
+15157E2EAA6A731AC77CFBC990F1193CDB767480CB4DC849B723E873AD0B888F
+4AC0D820357E1C5DBB0477045D972FB10F0053B967D6A5BB70699D5199BB9240
+4F69F592E637B26F23956C4FF9F0E18FD7D55BFE558F3E1D274845DA4F3F5F51
+6943DB48B2B5CF2987B0C11A76E1976F36FC46C6F2E8BD831104722D5E5BE602
+85979C654683172CF19B202C13F2D4DA2E0B6393CF9CCF0695A457E71EF6E697
+2607BEF44DEF2F2EC35A060C70C2C1021AF5F989B8296AD4A173EC092C49BEC7
+D60512EBAEBCD4D508B476694F13E338B574935626BE65D0B7388268DA6C569A
+571BADFA2F3A36A0F885689C98A6972397978A146725C8B4936A4CC9A78FBE66
+29208AF22F8A37942A24CD96C3D4C7E41882B73A874CFE293CC8189CDEE9086B
+94938576622FF3C92E42578037FDF6219768F3D4B3656E15C9829883BCF7C174
+D30D8D4C747FC1007B4280863DE13EFBC8F3381765AE9615551B9DF4F7506EE7
+058B18333AE4E956802D68C3F9BC72849912D2E167EC3FFAA0E8B9B61D29099E
+C735FCB73FDD8C73FEE70D45C266EB87F8D6A2D37E79EE369D111F18852836DD
+4287CD0DC39A1B8A4E4790D0C3E1CCB2148E52E53FAA3A59953544BCFB083959
+42526D744C7C4B6677779AF5B5E23FED05C286F311225365A87875586E4E54C7
+F8AD27A09D5BF5D7FD077B4034CA24C10E082F6A2E5FBCDAC348655DCE737592
+80BDA2B6BC4C38F81F6C5DC8CD5F01AA169CA580C78B60B1B2B7AF314FF226B1
+C9F8179B629259602454ADB36F176A188C667C5146795986CE173FFFB1081C57
+75664ECFB354A62A590DA0FBF09EDA7FA3B6D1140A9A67EAD3D73DA028C19C7B
+399AEED3CDDCD7C4419F4B64256190CF73B681C25B59323A1644E2FA58957599
+56478F8824957BE1A74F6687EAEA3530D45F09C2B8E2DE6EE6379154D02FBECB
+99EFCC22A17009272C905E0C3B8E9011A7398FEEDE844591189BCEC4C1142738
+BB8AB10879E20AFF186844C9CAEADAE55D9493608AE7102143535521968B699A
+14D9BCCED59CDD95CC786B3939CC6CCECDA720102533C05C18E159C18921C8C4
+05FC5F150FEF9EDF4D15CBED48DAE8822CF9BE839AA4CF75C62D45BE75AF800B
+83C277AF3CFC6A4B99C7978F942579F27258A42A503D970BD6BCB84FE984EA53
+2DFF57F083D6B339AC6B87DD15D50CBD6120330BF5D6926BB15365F494CC8E2E
+563B1FD178B9970DB6A2776E1993C787F8C10CFCF177566FDA26B32EF7D2A200
+F010F38C6B91A23FA6B1F96237C23F8F3436460792768F9E1A4BC232907F8583
+85A6A25FBC0768ACE15F2E116972224AF1836C3F543035786589A473C3D76E18
+70D2B01CEA0B390F0FAFCC543340E57163B9A8AB387B258289F260997DC22AD9
+9540088A6CEA5ED000950781F5F6389AB4BE7C6A8813BDAFE941056A7E083C47
+8AC4C0E8EB9DD42AD319F846B633E176769878AED838F0E9856C954B341D8A69
+63D6259E5C0B0E3B45066F57CE561CB24FCDB31ED2D84CE5EDA8FCABBDDF9DCE
+F4294C7D7FAC96519FD6BCFB938E327A231F8EB522052D0CC707067F7C71FD17
+822C1EC08784C04649108D75EA9289E6A5D7083663F44DA57FA48F72208D58ED
+B7817DF355FC52D7AF73DD0E06A2EE22EEA87A54FB92B3CB944733CFF5BC3FAF
+8E70909D392177C9BE87F4ABAF30F184E51F44442134599958FAB1E7C3C2A1EE
+A409BDEA1D48245C536639DA7F4D5D14F6485032070079F5A17C15C10599BAB4
+351E6EB7AB2147410D850BCAE443F2D8CE8F1122BC7B85B5A8C4893350381609
+9E2C0231E38FCAEBA2053756659D0AFEC1950DE731623281CF5D65ACF2BE8F68
+825D65A5714F26F24B588C48CF7B671D1720BF291A2605E9F7C7BC0C99C42098
+1813545D6AB190F3772CD1B7BF879F2D7FC1567EFE7D797CF7EAC1B82B693323
+B4D4CF2FF6F0EFAAC99A0C994438806413FD29766AE223940DDB26B1544D7D05
+A36E7202F2163F93E6F90E7BB0122A953A06480F44A5D281A703DA043AC524A9
+22DD04205F96750A1B64CDD7E046461E42A392D651F7FD7846D359E91354508F
+0779BF12AC1C41054E3896CB116E67F503061B38CDD987E8D29095A943506184
+F4B30302905F10A7491F4A9F4A35E0B30FA89693114CCB61DDC7E71E6BABCCBE
+AAD2FF8AD99D9029C205606FA41324B98414B5C797B8F431F31F50C68E224ECA
+5F2C70779CBCFFF6548928CB638697845A2EDE4B64BEC8063CB30E04AC983DDB
+1186CD7B88B2E37AA33493C1745F2932C0FC3E52E2D8F8DFB8187B0AEA11DB05
+74AF52E6ACCE06CC069ED62E4918623608AD5B68F0B82901CC6DEF80653535E8
+B73B0ACF9355A710BC55D945A5161A68EE0FD265BD0DFFC6276932507902F923
+6220C3A5C467EE1913B81204102515C90B375332C1583CB976FF9829004FA63A
+65F97D2A873B5ED0CB78F3C43D3B9BFA7A309F26530F71237BA2850405A30CD8
+224D4BA64880BB8676E41C6F9DC03BD7C5D1D12AD80F9C91F5ABC60D1BB1C24C
+EA4DCFA355BB75BFDC5079025F9AA783F346826594DC7502E816024730435C6C
+8BFE5CA1B52F56A3309593879A1BBFE764044A0AE0043B65AA05BF42CC8693DB
+A9FC848E9BB33D1FCF56BB01C68B3643A761351D048990F18B26039A5CF7E170
+BB5EB48AD76A9244F3D217039BCDBBC94A2C55B5170406D3ACB2072EC05199B0
+9A83728ACA69390C7FBBB3D51F51ABA05E0A2C3DB089EC8B3158C9EA036E2202
+B6A744EAD50EDFD5140BFCEC3A83F858E5167D99D692882175F396DDA828D198
+0ECE9559D54F3EA1BB55632941A22D04AF8B48C1357EAF891526AB55CD428637
+5FA1C3FE913AA9A3D638D44874CDD0BE614971D841F80F4E3D39C2003737B9A4
+5433FE9116B892B90DE2ED7F20FC4E37167E535974DDA396779D0DC00B50465B
+FEA6569E6826B258904F7F197E7781BF1479E39D6821EDB69F23733058F29A8D
+C384ABC7B82975FF67F193800AFB7DFD8D87FC587CD924D976788A3A36A273D3
+618029D11E9D78B299A8D8D125F0B3E47B53D8BF2E21A9C1A8AF80BBC0D2F1C0
+70F9FDE4EF23481255015F393416BC4482DE3E42EB0B6AA6383FB3CF99E27DFA
+3117798E6360680C83B4676C3811677E233EFEFF9E2969819C11F26CCDCA8786
+AC0AD9FF7FE358443D90A3198688614D2588594E48D5CD09FCEE5C4F4457470B
+7F92DBDB3F042313AA8E47AA6FB63F2363F88103D7FE34BD4A6BAA07B14E63C0
+12471954CEACB0CF176275C6FBC6A4ADF857C2F51F6D0D2DE2C02E03EBCFAE3B
+D8005D76954B140D067909E5CC0B2E4FBB23B8BD9AEB44DB233A28B45B031346
+E16F97552647FFAFEDB3A1A6EA3E64D27F8DFA9EB8B58D47D8B12AE4E5E29DA2
+898CC843DB8E7A909810C33E2AD1697423DAB1994B22FAD8DEF79121CF130D28
+E1700AA8357B1082E352A0A68244F663A0A9F37C47A90BA197CFE9FF7EF0CE60
+4D68434FBD743D877FD1D65CB33604754BCB1CB9E8FD760B3A0A506DEB55C186
+EE41E005F8BC980F83BEFDDA40CD0C88881D21A786434D1DBFBB407E1D081256
+0F37489E075C495840746627A1F0F77E7696DC850B3E3F54B3D2ECD09A35761A
+ABD9C648EEA41F399B8CA49469759667F1E2BBDFD1DFEB252AE7BF0C088CAFA4
+4FFAE41CC8916D70BF5DDD90A59D8B2AEA048832B0721BFDA97333D29C7B0276
+D4366A7C06F05932963443A78187574325BE8F86748AE61923710860EC7DD014
+22EFAA051AB129A6B8BBB38F528F3D21189A273022B43EC0086F09CC32C738B4
+2A3E846ED36696737CAD442A3FA8B9A7441E3803DB48B24E72C8B6F5E7092771
+739C234900D4C81C57F57C51DE7D38BE6CAE358F4A96CF2295C1A083D9B6C6BA
+B5CEB5DF8154C63E666EA04A336BCFA2B8B5194779BF09104B1992C7371C109E
+8C89A82225E2E88D078731946B58CB9D8F5BE95E2BEADED02E7A68B88570A83B
+98B6272AEF6FBA7BAFFD8BBF6503EDD077FA4244C2A1995576E796C7F324DF9C
+184DA0FC40E487F22F23D929C3A3F40A7AF4F83B298A3A96E31F7143D4B46712
+112F92D723AC14FA4E7856A1DD292E369B0C4EF9F87352C5B7DC9116D1E17D8F
+76F6661DC710A1158E8DEF2D2BB03899DAA6C307082EBCDD583C1CC060CCDC16
+3713F2DC8C1A5BAD6EE2D5DB652D466054539FBFA2468EC6B482D7712064A008
+5C86DFF6ED79996A0F02FE7AE3173B53AF7685C3F5DCCD27AEFC3CCE239E4816
+12B13D7A9D11F00699384D1CE947605EFF14997105270B833F828091B8F5D749
+F5FF4A8B913E898782694D5B8DE8F97891BF6C956C2C2454D664B9947D799324
+F488E9F4930D0CACF85AF21B44D2693BD6994C2FD9F0C0A23A1187566BFD309B
+43F7625447132894A4B5CC3162752BC890C9AF9115A925F9FD12E069B1447A73
+E01B55B9F2EB050ED0D6040F5023221F95D2DF816062C5AA1AAE0DF5A4E459D2
+3FF887B6AB8163179FBC3F31B64A59D76534290D9FFCF1307373238CCC379F7E
+4F847BEA63C1C66D4559E785BEE9DFAFCDE279CF37F306B6BEC2F1938F6187E7
+DE8BB11CA4FC0371D15AC3D9E6E46A89DBBD9F690AEA8887976B107F90BF38FC
+2C6C235569F568454C24EFACC58E7ACFE2ECA40FCA4734C3F4C4C614549F669F
+E8A489A0F80277C09061BEA823992C634AD1D7041A20BDA7DDC6FC2A44F4A27C
+7E0BF56A658ED3513CF151E908B40B1F7AE014E26D7C820D9A0D2FA4A65E4BFA
+0448FA66B4BC9775448EA7FC89CF3C59980D2E64BE4E8B76F26B987C113DCC86
+F999CF295532FB6CAFC47CEBDA3202BE846D80AB73739BEEFCA7C3228FC27F2C
+B35F6D205225ECDC06E0932641E9984CE3D53AB056D51C4C41EEDD6CC2A177AD
+8230F95DB829EEAFB51F1B888A67DFAB9D06B485C260ABC5B086BADB74DDCD83
+BC4E93A3B45639814CC7B7FE027E63AEE77D89436DBCA67562CC60C03749E750
+DC3A09FE290AA918F48805C57292EC7CDB0E44BCD7E736CAF27DC2691EBA3A7F
+84C38CC9C8395D17F20C5B198CD168CDAE8EB233D46EF930874C25F3B1D7F6FA
+69401DEDEE59D3087628C5AD0B6D1DD979A646B37693EC4F8CC44210F3EDCFB6
+B22BEEF692B3C2E4E71D87EE75D71A3AF0178BB8BB90ED8BEB5CAB7C763D3DAC
+67B426AAF471509682673FDCE4135181A09746377E398CC9BD28950E7400BFAF
+89E32A8EEC6B879AC6D9EE1D48359A2478EF7A1D3CA9D98B8BEA11AC6452361A
+4EE844B3152F6373E3843F58491D52615BF117081DD61154BD54CC524C98BFB7
+693FA7D9B96CF43E95A02249CD9259DD7515C78258A2CC55284CD5ED6E3B49D9
+2AFC2D5C0D984D02394157D5E6EA35086DF6AC26330FE2670F5695F0B1DDB335
+4F162E15D35E1E44A9D837CBAE7D1650A2B1540D329CDD92FFD3E1382A17B6C5
+023C14EE5B4CCE6A7128BACA9EFD6CF2E84C8F9B341620033F291C5A598F28CC
+A4D142EA99FE0572E657A3F6DA85A2551A968AB16A58A21465E24EC65457533D
+A3F08FB9C12AA161BB181D54AC7A2139615EDE6307EE24D10CE7BEC6D7752534
+E6E4A487A768FF6EB2525D7C9C55D8D3FDE99F659D26AF0094122E42A6C9747E
+BE331E26A7B5087E1D56859E67C461A513452ACBCDE8ABA296E76DFB171EA477
+4139E5920137834337DA64773E240DE83F8EB8391CDA3ED38478D9759BE53F05
+095B75D4B16F4241372856E37D038E5E3B1E10583CFF6C2AB9FBC1BE200F040A
+F20A314527D30B1F488A8F90CD82088F0FCFE8341653887E367EDA6E243E6001
+49FDD7D7F9DCA04536D02DA2EB209BE0517F7315764D7F9FA6CB90E51183C161
+3E9AC2B6BF5B3F1E6DC53239999E0E30FEA8B60EA1F63718CF53D446261883D1
+24D454DD505171EB522986C2A2BA9F765A109546EEAFCC2034710A899F200236
+80BB8CA61CC64BA305495AF2F4146761642FC4A0FEAE74865E05235C81EB1E6F
+00758DF5BB2256AEBD61899C476E2C613E44235FC01DBFEBD4C8BF1AC9EDEC93
+FC8542FE7667BF5BFF4F98CD568AFDC1B0CF7E5B874A217BF8AC214DCD1C3454
+E6D91DB4AAEA06A749CF084EC81674D420BC6D42BBF6FCACA805ED46978897F8
+26F2A56CDACDBBC059C2E343E662CFB4E52CA740AB9F74917D644184D15FD02B
+65AC2910CC284948F04EEAEE320536D7F682274FF77505F5BA1197E06D0A2274
+309B3FED9CD2151B9F75C0E2C36B0DB65374B707DA050D6FB5D074A3A3673241
+B48525013CBC16E647A50FAF625D05CC0D9725E6DCBB5F6A0A8F6589AD435399
+0C10184EF4FDFD1F53EB305EB64F1EC3604B4AA0B3D9C2BBC7905FACD16CDDB6
+1EA236E95C4E63E0A8410D077863F63B371AEE7F407AB462CB08E1F346A4FD71
+F0DC11366AC190C7808D9465A4B3E1179972251BDB5180E282CEA3B277459C93
+238D787EDD1CDD76FD70147762C42D339A5D8DB85ADF65B8766F342EFC00E57D
+497DD1929FDDFECD8CB01240D03E318820D669B8205B345C73EE5109B9AA7EB1
+71C8579B6F78A35AC7722AD682D35D8852F453A95E67B948CCD605AC3B6F47D7
+E7CDB2A9464A0B07D396D36D25AC402CC8E9BDE1E38F60DFDC677A95D498432C
+EE8BC8E957595E99161B03702B885E6302E23EABB179899C85097667CD5518F6
+40E7C12820B85A94D9FCF21B8DD01C65E16E9196650402B4E04AC72E99BFC394
+5B207552F71251FBCC365A9E2355F35C8E059423A8A0BB8FBA0D8E2147F7B5DD
+CF73E36063A501398CF9EAF08B2D783F66A06C4B660B928FE138CD3CEA3698AE
+DA23E6F875105FFD363B968EC3BE27CACABEC135849DA164A9D320471A7F60C4
+F5CC6FE898B1DA69525F6F3BA5CC70176B1F59BE78D655FEF04F1EDFF18761CA
+C25CE5A8F14CC617A837EFF994D269F30070DC58721DCAF8B84E12DC6DDDE605
+347E41FAF0E108AE69E9E0B71802F8F98282E0D8FB3276B6D9A33EA7417EADE1
+67500A498068810BA357213D6E90EA892F410155509B8CED08554C56525F9C4D
+2DCD9178BE3BC8CC6320C646590FF4925AB9599ABA8D8168CC4F8DE1FB815AC1
+D8031F9A3656D002E773459844DB987AA4ECF9F5FE8B2A0690ADF811836F2BAA
+F5DA7FB2A1D81E2C38D8E15BF3DF895BB2FE4AE915DE304C55567EA18D3CD1F2
+829FAE6B28447F589D82BB70A52918A5DCDE9587C50969D4CCF574144C1F8D9B
+4CADEBCB324686BB0937354013975F3C303F58080EE244A6DE2982E2970DAADA
+288C54D4C16FB3F8F5AFD591327109C298FE05240D6C361BA72D9044EF5E9BA7
+21146E4F107F7C4F408C04108CC330BE7EAEED969A66BCCDFE27F10F22C213CC
+896EDE048DC4DDCC1984117866F0CDA39E44AF09FA7CA3F29EC68F8A35D7560D
+3DFAD13A5D46682924A3C43B4FDE357D315343D2A192DC434053E6F22CD95151
+EC038AFA00E6C0639C36BDBAE0127F27E2DC2BF7DB7A8D6CB0AA5B0B194320DB
+2586D0059959EFECCA1677447CEC6C199C80A76788A61B3D1A4B69B051192E61
+CA528B0AD3EB7F2D37E23A04F34D54A2CAD84AE483703FA0B323A198A2B06806
+5C7630B9112BD7CA5C2032D1080E8F6EB7886CE7C9B864141D31154FD8D2B2FF
+680E1D255A0CCF227C4BF80C5150F371E0DA2C422E6B9CB4449D06606477625A
+56B0142F136DCEFE950D8ADCF88D34E305BD96D900D0784F44E40E736CB86C3B
+6AF394FED5AFFC61321BA9D511D7520BBC33AFDF2C4F53BE2B7CB11D8E1B419D
+9F698C305CFEFE7E391D190E608BD5E62FBC3E193DAC65F1B21EA0D535CDA3E1
+70781C4819F1B98165287D0A7E9F2A0AA9BC27D02218047A5D3247D41B387677
+FD5419E5BF713B9F9863C77EA0218E509B036B622F157F382093DA9F32DC1778
+B47FECF95A630218FC13AB09829A5D7E5A874ECF40F240FCB4177C7FCA7A6365
+76577CCD1E19CC6C9AB15542EAF6A4E8136222F29AFAAF520FA06C40E038B43C
+DB4C341F31AA25F3DD92EA498661FF852937D1146260D5BBBC7E627D84B31800
+1B362FCD6C631FBED0BAE0BD019FE4767A468A94E8E14400A0F5C845DE5AFD74
+280E72812F50457152EE943295A3983DF3AA8FDEB4A09B94B4A25BBF5839144B
+5C6C6E04BE342B7A744B3740D6E8413034F72E32FCB965232041229E432AF5B2
+F2F2D962EAF147ADC361D5F776783D59600EACDCEA4BF130D39B042C1F707407
+323BF1A510CF4B11631786C12805EE232CCDDBBDACE94BC3D283F5D0D3FDA65F
+AA3800A395044516773D3F596595BEA5ADED5BCA272EB0C5FAA47E091BC0C77B
+C12D502AB17F760968573E08E193445EABB202E0DB01175297C984EFEEA6B956
+B9C9A746DA9846B5A5862A82B1FF6D3D21DAE713939D089854106FF83C898E11
+58B9EB9DDF744E1C4AA5AB1CBE4BA3DE83921121D0E835406E7AECDC1C49F384
+A8711329BC7FF65A0D66E6852F681505DBE0CFBAFC357112665098CB7782DE3C
+2A3751A44887BFDCB414788FB7C5E981C2029F8F661B494761EB8048692FDFA9
+9C2AE1FB18F18035BC0B572BB5FF87C13779DF90465F66C9F22EE4F87177A8E3
+56E32BE71E9C4A05050BBA76849536267E3F49634D833FFE863857789EAD7CE4
+ABDCA696B0AB9064D4A9FBD592134972A9834C95D8C2D31858FAB6FE0D354779
+B5E0D44A2996F3AE1F4A1444E9A3BD944CE4D015F5DDFD4A6FD285DC5BB5B3D0
+02559620703CDC4502229532E16345D7CD7C20660347DA827CCD009D78819CB6
+6ABA23033E23AF8496452D058F04AD64BDD9C19AE91AE9DF1B3C72BF5C1D5AB3
+8AED52D9BC552E3F531CB676C6E3657A013D020ACDB57CC48297BA3CFF1096B6
+679C7040831AF0734655905D088850CCD3878513D09EA3FDA53F8FFF344906EE
+3661DA4B3F4A66500A5B9B7B2A18E48D7110A4375A9DCE3A7A7DA63FD80C2440
+5EAFAAA1C2F773E1C58A54E0775264A8BAD6EE25DCD32DCAEF4070946DD65558
+50CED1BE599AE6B444FF7CBCB68EB63D09E98286D14ABFA4DEA41D8AD92E9AA2
+98CA01111924E80CCC0427253DB78D1EDF14758CA5F6AF562791F2716951F03C
+A5907B3D91BAAEB7E5A08B9F9EA3172F32B2D6E1C7586079AA2B1E2FF31281E6
+499B21248EE2D344DFFFEDE1B7FBAD8BE06FA96A299DDF903BB844E961833FA2
+11EAABC22885A67896558FB2A4E315E02BBC24DD4B700174FFD171D824E6F32D
+E34AD2A210D5D93193DAF1CB368D5E83A660323D8B784543C9C3A3F072C3DB22
+5AEF8D3B2A4B05F54F28254845AE3C1F843C8C7BF098326939D8BDEE50D7A666
+25279CD08CCB9CD140B8E0A91CE26F7FD4290F46DE997B4F98A4C3A72431230D
+F236F3333BAE93805B0C6A757F37317BA8FCA78AFD2F7A9F58853996B9AC8135
+060E92184C4DBC346F285E1F2A094C41BD803E738A5E58840BEA4D6196C29446
+7FAD1A09B0E0FD587E13239E9576C222914092DDC1405F52BAB6B37F122E7F40
+9369049979105670716CF10CB3AE1E1A57A752D6E0EF8F4C08367461B7E3572E
+E5020E1C0A946777C0CF4700B448C38434C67C67DA7CDA01A3C01E145F107F92
+A817FD3762A07A8D6D08A86B6EFB6ACFE56E7FA99A370350038FC1AB1C3358A1
+FDE3EBA015EDE9CDA4A600401082DE3920D0EFC5521AB03140323E3A032DB577
+DFC16F83E7159603117BFB685637674DCB4E897065FFC5A44A56CBAFB42F78C4
+027C2820CC42FF5D8A6A8579E5B7E153955CA8443EE32F696F286B613CB11F99
+6D564F921C6765DE8568187B138F3609863D2A6E5D573E4789AC2E248DA97A06
+37A7F693180D51F9CC75E2B2D4A0ED4C1F1A599820C9FC3A12B7668198B5297C
+7E76C8F8885B7556AD4F31D705BD4DD482C7C6D28DC61257F486D2AC8C34CF8A
+6CEA8B398AD69AB6F55665CDCB9B2A743A09C9CDDD019F64D2829F76135745DB
+24C6926FD744EA9DDB8710CB029B9DFA7EE03FCB6E3263964957C1C634468B5C
+16A959326883F6D0D118346D12391C757889D54631F892EA7BDAB541B36E7953
+B4D6FB36FC4F2EDA95D35A01571C8675DC792787D06BB6D4AF3BD9C914F0EC89
+AACF7BEB5D40267CF8EB34C303C6851249A1DFE4BE30A79BAA95FF83EAF7377F
+6C361D31B87D0379B67EEB6260E6021C38A86793A00BC86F97F1E6950EA877FA
+514E53902891A9CE840B97EF393AA874E5C52AD0980640A8D7267E9DD1418C29
+63144AC596F880896EBA77C1B6287CE441747745A5DE244506BB48B1D938B060
+9F388E3F5041DDE6EA36A538BF58444C86DE6D1746ED6AF74119CCF81CBCCE00
+7571F824498CFB82BC86551E26330EEB918469ABC25781641F261CC395C52CEF
+9F65D9D7448FC2DFB35ABE03F203771E9830CE1D4220B6921549D2E089E8C4A2
+7C82ED52AE847B53A6675C37C77C26C33547AEA0361D788397FEC78CA3EA12F4
+74D04E6AD1DD70E06958D2FBBA37CC91C6243B58DB030B669A95CDACE3B1E5AE
+775CCD9FDB741059D6B3B7450F5DA98A92AE99394396DB92D96C37051C2823B5
+22DACD630ACFB1254B40001C3A699F75ACAC6BFCFA00A6C5CFA13D867E607C88
+5470214ADFE4295B643E57B3AD1DF8AC90F90B8D935F0D9ABCBD7BF46E58A568
+D829C02AEADE3435AAF6DD9CAFD7FD57854D9FB4869B681714238F9F2B1EEF21
+D48AFFDF33FD9C8AB50EC0F719C18EDBC0F876AF50840CB89AC517B8DC65CA6A
+03CC999ADB424FAC6AC907283B3BD3953002DF77C1E132E0BABFC0CF29E645C0
+EFC844A0E15C7D9494527CEFBFBF7E87F50E1AFF8C52C9A3D2A3FECD061BD216
+2A59DB2A6FD82B2557D384676A77AB1F9CE2674B2CAE1288566A4089689BE473
+D17825C17B5B04FE0EDC6242B102660BF2FEF961D8EFD908A933E42A55954172
+77D48159D281D0F5180164A974B8DBA5103D23966D971CC482608FDD49DF1471
+921AE08EBF2B43B37D60F7FA3808118421BD114E30AE0AC4407D3EDDBA22CB8A
+542D606DAF3BD3AE6FA4C9DAD9C0D44215D71D1E4C7EE32416991A52C001B9FD
+2FF0A566172A069BD6ECC90E17FBF0DEF8518D2048A1547A48AF50E65B767CAF
+0DF408E5123216A30D25103D7D9DA3A4E099C49EB05F23B351B23FDC78146A6C
+AC55A81FDDF51F477AFC7BC7FBD7E45793CD05B66A861113C03F7D3BAEF1C3AF
+59C0E89D028E1409218E6D75D0C9DF4030C96F6E7B8CF6054009000FE8D9EDE7
+7A6488621A69BCAB5ECB521CAE729F09E49BE076C95035BE44C16438943D3578
+499ADE9431651D3D38F95C908E055F40379B2D14580D7E2BF5C7FDFFA5E2D0A6
+59C6AB6EC5905D1053CD02566231941D92B38E585DCAF42DA4C86C5FAD2ACB44
+A4131F3A74F6AC0D4B135A05088B858D5073AF7865899F059A9FAB43B7457C36
+CDD0E5A411A083E4AAB62645FE71112C1D143C7CB838D092EDAC57393439A429
+559129E946EE237C5B4CB2BFDFC3D32ECD99A0360BC89787A38B0C57BBB3CDAA
+0960FE7FA232D95B888D195578601C30198BA517F526C8368D426D7B1049EDD6
+FC36C9CAD2DCE7AE87F007233F4F1783DD06FC306A55CB0692D0A668D0A8FD4D
+62D2BC739AFAC84541EEF28BCCCA352FF095BCFCD4EED4563350BF61A8F08517
+E5257AAE5C9A6CE12E6714653EA552E03612CBE4E898FB1D4D745CAF81813E05
+13D86F72F2175F9B72809CC01CC7EC3D57700F817028526AC4AD2B184F046631
+4F5F8E2840304DD1B90DF28A4F596374FCE81192C4656A0018AC6387886D85EA
+4F8206C8CE899D825669321CED0DDF9642522E3A3D4317223ED5CD24BF0D7D64
+6375E46FF7C8A440B483CFD6C9196AFB2D35D8EF2491BBDC5A22A7078F08585E
+5C05297B9A7C06BEE85810349F1675A24A3D1AB78672D4A633C8212BB62B84F3
+CDC1D5E350F30B08154A39BBC8FC28160A499A2B12D66AA6B8E5183D8201D4BF
+FCD8EA1C9597C33AB92C4F42B1A52DAE32B9E859616D2E4FB8D0CC127B03C14F
+3EC6A6923541FED895C775306DEF4BD8E1169016AC4846FAE80BF3F2CD21E65E
+49E325D669E9134375C597B4959A612864E585AF8634E68563B25FB5482BC5AB
+6AF17D9CD13FEC36C46AC83E0ECAABC6CEAB0599FD227A4BE2699E9B14773694
+FC0FB23BE139E9536614C4D97077FA48CBBDE26A776A7AF1A392167A7C66216C
+6FAFEFDADFC5621E81F6A4B70D291A3BCC7E336DB32FBE89020880FE1F242024
+5E550B3C5C6520D7B962CE689805125AFF169EFB178A06ABBE374EDD4DFEB861
+F3B4AE7313A01ACFA26315AF290365FBA57BF85D4DFD2334954BF8606FDC8D3D
+3E6EE8CC35C88BB350C8CA0843697710AC03EFA6597B0D1C2F832982CD8A2AF4
+9F5179D8370642E347B43C4E194A24B411D390A5EC83CB35269A2746ED576D2A
+ADF58236ABBB4DDAE6C0B8C8B0F5A556B8C41BF15461084D434C14C72BB8744B
+90424BFA46FBD91A07A5697F3A4189E1967D45EC7E829209340E846AB4F313BB
+5053C3B8372C1DFFF614BA4BC26AE1B607F97C2C0C9F25E812256B136609E913
+9803082AEDBD7961220DDD1A23D69A48A7D81087FE47049DF6DB4ED9095186E9
+4B5F70AE4687577E3DFC94D2EC884F0D61641E963A361266CD46CD42129EA6E0
+896DDC893ABB5A67433D0C368A08A486693B54E5A154AFFDB87AAE3F406668F6
+D0C454A7E3C2318549F06EE0ED9754D37A473BCB8AAF13510EC727FE0718A72D
+8DE699F09687C6999345C3DAE7F0E90EB774950D1B67F30807FF9D44F203B751
+DE2C383BC1BA4351C0277F5EC8DDF26FBAC7CC6CB735C501B959853A2B0BE03C
+6B245AC6357A5F853D007F704915EA09760E8A979B4D4B93279727D90AF79FEF
+AA2966B003371EEEAA21AF2576D8FB025D1346CF993D388D7D6895042C873B05
+26157A9D64E60788CBAE03B51A95B1B73C65BE645FA2F0C31C09F9EEEE9BF70E
+3148979C2AAB48B64DB687139F704EEFB00035D785081FD8EB4F3B1B1B86A68F
+012087AADEF617
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+TeXDict begin 39158280 55380996 1000 600 600 (./gperf.dvi)
+@start /Fa 197[25 58[{}1 90.9091 /CMMI10 rf /Fb 197[33
+58[{}1 119.552 /CMMI12 rf /Fc 197[21 58[{}1 74.7198 /CMMI9
+rf /Fd 133[34 41 1[55 41 43 30 30 30 1[43 38 43 64 21
+2[21 43 38 23 34 43 34 43 38 21 10[58 1[43 4[58 70 48
+60 39 28 2[50 1[59 55 54 58 7[38 38 38 38 38 38 38 38
+38 4[21 4[21 39[{}47 74.7198 /CMR9 rf /Fe 147[25 10[44
+97[{}2 90.9091 /CMB10 rf /Ff 139[52 52 52 3[52 1[52 6[52
+101[{}6 99.6264 /CMSLTT10 rf /Fg 214[35 35 40[{}2 90.9091
+/CMSS10 rf /Fh 136[52 1[52 52 52 52 2[52 52 4[52 52 52
+1[52 52 2[52 1[52 95[{}14 99.6264 /CMTT10 rf /Fi 133[48
+48 1[48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 51[48 45[{}25 90.9091 /CMSLTT10 rf
+/Fj 138[56 56 56 56 3[56 4[56 3[56 56 56 99[{}9 109.091
+/CMTT12 rf /Fk 134[65 1[89 65 68 48 48 50 1[68 61 68
+102 34 2[34 68 61 37 56 68 55 1[60 9[127 1[94 6[96 2[96
+1[46 1[96 77 81 94 89 1[93 12[61 61 61 61 2[34 41 45[{}37
+109.091 /CMBX12 rf /Fl 141[62 1[62 8[62 62 62 101[{}5
+119.552 /CMTT12 rf /Fm 133[37 44 42 1[42 49 30 37 38
+1[46 46 51 74 23 42 1[28 46 42 28 42 46 42 42 46 4[47
+4[91 1[68 65 51 66 1[62 70 68 82 57 3[68 70 59 62 1[65
+1[68 6[28 11[28 33 5[28 4[47 34[{}45 90.9091 /CMTI10
+rf /Fn 134[48 1[66 48 51 35 36 36 1[51 45 51 76 25 48
+28 25 51 45 1[40 51 40 1[45 9[93 3[51 8[47 3[59 20[45
+3[30 25 1[45 42[{}29 90.9091 /CMSL10 rf /Fo 141[74 1[74
+8[74 74 74 101[{}5 143.462 /CMTT12 rf /Fp 130[39 1[39
+39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 1[39 39
+39 39 39 39 39 39 39 39 39 5[39 1[39 1[39 39 39 39 1[39
+39 39 39 39 2[39 39 39 39 39 1[39 39 39 5[39 39 2[39
+3[39 3[39 39 39 39 2[39 39 39 1[39 37[{}59 74.7198 /CMTT9
+rf /Fq 134[39 1[39 39 39 39 39 39 1[39 39 39 39 39 2[39
+39 39 39 39 39 1[39 39 50[39 6[39 39[{}22 74.7198 /CMSLTT10
+rf /Fr 129[48 48 1[48 48 48 48 48 48 48 48 48 48 1[48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 2[48
+1[48 2[48 1[48 48 48 48 48 48 48 48 1[48 48 1[48 48 48
+48 48 48 48 1[48 48 1[48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+34[{}80 90.9091 /CMTT10 rf /Fs 134[85 85 117 85 90 63
+64 66 1[90 81 90 134 45 85 1[45 90 81 49 74 90 72 90
+78 11[124 112 90 120 1[110 1[126 1[97 126 1[60 126 127
+1[106 124 117 115 122 9[81 81 81 81 81 81 81 3[54 45[{}47
+143.462 /CMBX12 rf /Ft 240[45 1[91 13[{}2 90.9091 /CMSY10
+rf /Fu 134[71 71 97 71 75 52 53 55 1[75 67 75 112 37
+71 1[37 75 67 41 61 75 60 75 65 7[102 3[103 94 75 100
+1[92 101 105 128 81 105 69 50 105 106 85 88 103 97 96
+102 9[67 67 67 67 67 67 67 2[37 45 7[112 24[75 78 11[{}56
+119.552 /CMBX12 rf /Fv 131[91 45 40 48 48 66 48 51 35
+36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51
+45 25 2[25 45 25 1[68 68 93 68 68 66 51 67 71 62 71 68
+83 57 71 47 33 68 71 59 62 69 66 64 68 3[71 1[25 25 45
+45 45 45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25
+71 1[45 76 45 19[76 51 51 53 11[{}86 90.9091 /CMR10 rf
+/Fw 141[89 1[89 8[89 89 89 101[{}5 172.154 /CMTT12 rf
+/Fx 138[108 75 76 79 2[97 5[54 3[88 108 14[149 13[152
+18[97 97 2[97 1[54 6[54 39[{}15 172.154 /CMBX12 rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: a4
+/setpagedevice where
+{ pop << /PageSize [595 842] >> setpagedevice }
+{ /a4 where { pop a4 } if }
+ifelse
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fx(User's)65 b(Guide)g(to)f
+Fw(gperf)f Fx(3.0.4)p 150 1423 3600 34 v 2005 1519 a
+Fv(The)30 b(GNU)h(P)m(erfect)h(Hash)e(F)-8 b(unction)31
+b(Generator)2537 1627 y(Edition)g(3.0.4,)h(1)f(F)-8 b(ebruary)30
+b(2009)150 4958 y Fu(Douglas)46 b(C.)f(Sc)l(hmidt)150
+5091 y(Bruno)f(Haible)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 4152 a Fv(Cop)m(yrigh)m(t)602
+4149 y(c)577 4152 y Ft(\015)30 b Fv(1989-2009)k(F)-8
+b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32 b(Inc.)150
+4286 y(P)m(ermission)g(is)h(gran)m(ted)g(to)f(mak)m(e)i(and)d
+(distribute)h(v)m(erbatim)h(copies)g(of)f(this)g(man)m(ual)h(pro)m
+(vided)f(the)150 4396 y(cop)m(yrigh)m(t)g(notice)f(and)f(this)g(p)s
+(ermission)g(notice)h(are)g(preserv)m(ed)f(on)h(all)g(copies.)150
+4530 y(P)m(ermission)38 b(is)h(gran)m(ted)f(to)h(cop)m(y)g(and)f
+(distribute)g(mo)s(di\014ed)f(v)m(ersions)h(of)h(this)f(man)m(ual)g
+(under)f(the)150 4640 y(conditions)44 b(for)f(v)m(erbatim)h(cop)m
+(ying,)k(pro)m(vided)43 b(also)h(that)h(the)e(section)i(en)m(titled)g
+(\\GNU)f(General)150 4749 y(Public)27 b(License")g(is)g(included)f
+(exactly)j(as)e(in)f(the)h(original,)i(and)d(pro)m(vided)h(that)g(the)g
+(en)m(tire)h(resulting)150 4859 y(deriv)m(ed)i(w)m(ork)h(is)f
+(distributed)g(under)f(the)h(terms)g(of)h(a)g(p)s(ermission)e(notice)j
+(iden)m(tical)g(to)f(this)f(one.)150 4994 y(P)m(ermission)j(is)h(gran)m
+(ted)f(to)h(cop)m(y)g(and)f(distribute)f(translations)i(of)g(this)f
+(man)m(ual)g(in)m(to)h(another)f(lan-)150 5103 y(guage,)41
+b(under)35 b(the)j(ab)s(o)m(v)m(e)g(conditions)g(for)f(mo)s(di\014ed)g
+(v)m(ersions,)i(except)g(that)e(the)h(section)g(en)m(titled)150
+5213 y(\\GNU)e(General)h(Public)e(License")h(ma)m(y)g(b)s(e)e(included)
+h(in)g(a)h(translation)g(appro)m(v)m(ed)f(b)m(y)h(the)f(author)150
+5322 y(instead)c(of)f(in)g(the)h(original)g(English.)p
+eop end
+%%Page: 1 3
+TeXDict begin 1 2 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(1)150 299 y Fs(GNU)54 b(GENERAL)g(PUBLIC)f(LICENSE)1477
+521 y Fv(V)-8 b(ersion)31 b(3,)g(29)g(June)e(2007)390
+663 y(Cop)m(yrigh)m(t)842 660 y(c)817 663 y Ft(\015)h
+Fv(2007)i(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32
+b(Inc.)e Fr(http://fsf.org/)390 882 y Fv(Ev)m(ery)m(one)h(is)g(p)s
+(ermitted)f(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)g
+(of)g(this)390 991 y(license)g(do)s(cumen)m(t,)g(but)e(c)m(hanging)j
+(it)f(is)f(not)h(allo)m(w)m(ed.)150 1234 y Fu(Pream)l(ble)275
+1393 y Fv(The)e(GNU)h(General)h(Public)e(License)h(is)g(a)g(free,)g
+(cop)m(yleft)i(license)e(for)g(soft)m(w)m(are)h(and)e(other)h(kinds)150
+1503 y(of)h(w)m(orks.)275 1644 y(The)c(licenses)i(for)e(most)i(soft)m
+(w)m(are)g(and)e(other)i(practical)g(w)m(orks)f(are)g(designed)g(to)h
+(tak)m(e)g(a)m(w)m(a)m(y)h(y)m(our)150 1753 y(freedom)k(to)h(share)e
+(and)h(c)m(hange)h(the)f(w)m(orks.)51 b(By)35 b(con)m(trast,)h(the)e
+(GNU)h(General)g(Public)e(License)i(is)150 1863 y(in)m(tended)25
+b(to)h(guaran)m(tee)h(y)m(our)e(freedom)g(to)h(share)f(and)f(c)m(hange)
+j(all)f(v)m(ersions)f(of)h(a)f(program|to)h(mak)m(e)150
+1973 y(sure)35 b(it)h(remains)f(free)h(soft)m(w)m(are)h(for)f(all)g
+(its)g(users.)56 b(W)-8 b(e,)38 b(the)e(F)-8 b(ree)37
+b(Soft)m(w)m(are)g(F)-8 b(oundation,)37 b(use)f(the)150
+2082 y(GNU)j(General)g(Public)f(License)g(for)g(most)h(of)f(our)f(soft)
+m(w)m(are;)44 b(it)39 b(applies)f(also)h(to)g(an)m(y)f(other)h(w)m(ork)
+150 2192 y(released)31 b(this)f(w)m(a)m(y)i(b)m(y)e(its)h(authors.)40
+b(Y)-8 b(ou)31 b(can)g(apply)f(it)h(to)g(y)m(our)f(programs,)g(to)s(o.)
+275 2333 y(When)37 b(w)m(e)g(sp)s(eak)g(of)g(free)h(soft)m(w)m(are,)i
+(w)m(e)e(are)g(referring)e(to)i(freedom,)h(not)f(price.)61
+b(Our)36 b(General)150 2443 y(Public)e(Licenses)g(are)h(designed)f(to)h
+(mak)m(e)g(sure)f(that)g(y)m(ou)h(ha)m(v)m(e)g(the)g(freedom)f(to)g
+(distribute)g(copies)150 2552 y(of)e(free)f(soft)m(w)m(are)i(\(and)e(c)
+m(harge)i(for)e(them)h(if)f(y)m(ou)h(wish\),)f(that)h(y)m(ou)g(receiv)m
+(e)h(source)f(co)s(de)g(or)f(can)h(get)150 2662 y(it)e(if)f(y)m(ou)g(w)
+m(an)m(t)i(it,)f(that)g(y)m(ou)f(can)h(c)m(hange)g(the)f(soft)m(w)m
+(are)i(or)e(use)g(pieces)h(of)f(it)h(in)f(new)g(free)g(programs,)150
+2771 y(and)h(that)h(y)m(ou)f(kno)m(w)h(y)m(ou)g(can)f(do)g(these)h
+(things.)275 2912 y(T)-8 b(o)24 b(protect)h(y)m(our)f(righ)m(ts,)i(w)m
+(e)f(need)f(to)h(prev)m(en)m(t)g(others)f(from)g(den)m(ying)g(y)m(ou)g
+(these)h(righ)m(ts)f(or)g(asking)150 3022 y(y)m(ou)37
+b(to)g(surrender)d(the)j(righ)m(ts.)60 b(Therefore,)38
+b(y)m(ou)f(ha)m(v)m(e)g(certain)h(resp)s(onsibilities)e(if)h(y)m(ou)f
+(distribute)150 3132 y(copies)30 b(of)f(the)g(soft)m(w)m(are,)i(or)e
+(if)f(y)m(ou)i(mo)s(dify)e(it:)40 b(resp)s(onsibilities)29
+b(to)h(resp)s(ect)f(the)g(freedom)g(of)g(others.)275
+3273 y(F)-8 b(or)30 b(example,)g(if)g(y)m(ou)f(distribute)g(copies)i
+(of)e(suc)m(h)g(a)h(program,)g(whether)e(gratis)j(or)e(for)g(a)h(fee,)h
+(y)m(ou)150 3382 y(m)m(ust)i(pass)f(on)h(to)h(the)f(recipien)m(ts)h
+(the)f(same)h(freedoms)e(that)i(y)m(ou)f(receiv)m(ed.)50
+b(Y)-8 b(ou)34 b(m)m(ust)f(mak)m(e)h(sure)150 3492 y(that)29
+b(they)-8 b(,)29 b(to)s(o,)h(receiv)m(e)g(or)f(can)f(get)i(the)e
+(source)h(co)s(de.)40 b(And)27 b(y)m(ou)i(m)m(ust)f(sho)m(w)g(them)h
+(these)f(terms)h(so)150 3601 y(they)i(kno)m(w)f(their)g(righ)m(ts.)275
+3743 y(Dev)m(elop)s(ers)i(that)f(use)g(the)g(GNU)h(GPL)f(protect)g(y)m
+(our)g(righ)m(ts)h(with)e(t)m(w)m(o)j(steps:)41 b(\(1\))32
+b(assert)g(cop)m(y-)150 3852 y(righ)m(t)38 b(on)e(the)h(soft)m(w)m
+(are,)k(and)36 b(\(2\))i(o\013er)g(y)m(ou)f(this)g(License)g(giving)h
+(y)m(ou)f(legal)i(p)s(ermission)d(to)i(cop)m(y)-8 b(,)150
+3962 y(distribute)30 b(and/or)g(mo)s(dify)g(it.)275 4103
+y(F)-8 b(or)35 b(the)g(dev)m(elop)s(ers')h(and)e(authors')h
+(protection,)j(the)d(GPL)g(clearly)h(explains)f(that)h(there)f(is)g(no)
+150 4213 y(w)m(arran)m(t)m(y)g(for)f(this)g(free)g(soft)m(w)m(are.)54
+b(F)-8 b(or)35 b(b)s(oth)e(users')h(and)g(authors')g(sak)m(e,)i(the)e
+(GPL)h(requires)e(that)150 4322 y(mo)s(di\014ed)42 b(v)m(ersions)i(b)s
+(e)f(mark)m(ed)g(as)h(c)m(hanged,)j(so)d(that)g(their)f(problems)g
+(will)g(not)h(b)s(e)f(attributed)150 4432 y(erroneously)30
+b(to)h(authors)f(of)h(previous)f(v)m(ersions.)275 4573
+y(Some)e(devices)h(are)f(designed)g(to)h(den)m(y)f(users)g(access)h(to)
+g(install)g(or)f(run)f(mo)s(di\014ed)g(v)m(ersions)h(of)h(the)150
+4682 y(soft)m(w)m(are)34 b(inside)e(them,)g(although)h(the)f(man)m
+(ufacturer)g(can)h(do)f(so.)46 b(This)32 b(is)g(fundamen)m(tally)g
+(incom-)150 4792 y(patible)j(with)e(the)h(aim)h(of)f(protecting)h
+(users')e(freedom)h(to)h(c)m(hange)g(the)f(soft)m(w)m(are.)53
+b(The)33 b(systematic)150 4902 y(pattern)j(of)g(suc)m(h)g(abuse)f(o)s
+(ccurs)h(in)f(the)i(area)f(of)g(pro)s(ducts)f(for)h(individuals)f(to)h
+(use,)i(whic)m(h)d(is)h(pre-)150 5011 y(cisely)d(where)e(it)h(is)f
+(most)h(unacceptable.)46 b(Therefore,)32 b(w)m(e)g(ha)m(v)m(e)h
+(designed)e(this)g(v)m(ersion)h(of)g(the)g(GPL)150 5121
+y(to)38 b(prohibit)e(the)i(practice)g(for)f(those)h(pro)s(ducts.)60
+b(If)37 b(suc)m(h)f(problems)h(arise)h(substan)m(tially)g(in)f(other)
+150 5230 y(domains,)28 b(w)m(e)f(stand)g(ready)g(to)h(extend)f(this)g
+(pro)m(vision)g(to)h(those)f(domains)g(in)g(future)f(v)m(ersions)i(of)f
+(the)150 5340 y(GPL,)k(as)f(needed)g(to)h(protect)h(the)e(freedom)h(of)
+f(users.)p eop end
+%%Page: 2 4
+TeXDict begin 2 3 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(2)275 299 y(Finally)-8 b(,)34 b(ev)m(ery)f(program)f
+(is)g(threatened)h(constan)m(tly)h(b)m(y)e(soft)m(w)m(are)i(paten)m
+(ts.)47 b(States)33 b(should)f(not)150 408 y(allo)m(w)25
+b(paten)m(ts)e(to)h(restrict)g(dev)m(elopmen)m(t)g(and)f(use)g(of)g
+(soft)m(w)m(are)h(on)f(general-purp)s(ose)g(computers,)i(but)150
+518 y(in)h(those)h(that)g(do,)g(w)m(e)g(wish)f(to)h(a)m(v)m(oid)h(the)e
+(sp)s(ecial)h(danger)f(that)h(paten)m(ts)h(applied)e(to)h(a)g(free)f
+(program)150 628 y(could)h(mak)m(e)i(it)f(e\013ectiv)m(ely)i
+(proprietary)-8 b(.)40 b(T)-8 b(o)28 b(prev)m(en)m(t)g(this,)g(the)g
+(GPL)f(assures)g(that)h(paten)m(ts)g(cannot)150 737 y(b)s(e)i(used)f
+(to)i(render)f(the)g(program)g(non-free.)275 881 y(The)f(precise)i
+(terms)f(and)g(conditions)h(for)f(cop)m(ying,)i(distribution)d(and)h
+(mo)s(di\014cation)h(follo)m(w.)150 1128 y Fu(TERMS)44
+b(AND)h(CONDITIONS)199 1287 y Fv(0.)61 b(De\014nitions.)330
+1427 y(\\This)30 b(License")h(refers)f(to)i(v)m(ersion)e(3)h(of)g(the)f
+(GNU)h(General)g(Public)g(License.)330 1566 y(\\Cop)m(yrigh)m(t")e
+(also)g(means)e(cop)m(yrigh)m(t-lik)m(e)k(la)m(ws)d(that)g(apply)f(to)h
+(other)g(kinds)f(of)g(w)m(orks,)h(suc)m(h)g(as)330 1676
+y(semiconductor)j(masks.)330 1815 y(\\The)40 b(Program")h(refers)f(to)g
+(an)m(y)h(cop)m(yrigh)m(table)h(w)m(ork)e(licensed)h(under)e(this)h
+(License.)70 b(Eac)m(h)330 1924 y(licensee)43 b(is)f(addressed)f(as)h
+(\\y)m(ou".)76 b(\\Licensees")44 b(and)d(\\recipien)m(ts")i(ma)m(y)g(b)
+s(e)e(individuals)g(or)330 2034 y(organizations.)330
+2173 y(T)-8 b(o)32 b(\\mo)s(dify")g(a)g(w)m(ork)g(means)g(to)h(cop)m(y)
+f(from)g(or)f(adapt)h(all)h(or)f(part)g(of)g(the)g(w)m(ork)f(in)h(a)g
+(fashion)330 2283 y(requiring)d(cop)m(yrigh)m(t)h(p)s(ermission,)e
+(other)i(than)f(the)g(making)g(of)g(an)g(exact)i(cop)m(y)-8
+b(.)41 b(The)29 b(resulting)330 2392 y(w)m(ork)f(is)f(called)i(a)f
+(\\mo)s(di\014ed)f(v)m(ersion")i(of)f(the)g(earlier)g(w)m(ork)g(or)g(a)
+g(w)m(ork)f(\\based)h(on")g(the)g(earlier)330 2502 y(w)m(ork.)330
+2641 y(A)k(\\co)m(v)m(ered)i(w)m(ork")f(means)f(either)g(the)g(unmo)s
+(di\014ed)e(Program)i(or)g(a)h(w)m(ork)f(based)g(on)g(the)g(Pro-)330
+2751 y(gram.)330 2890 y(T)-8 b(o)31 b(\\propagate")i(a)e(w)m(ork)g
+(means)g(to)h(do)e(an)m(ything)i(with)e(it)h(that,)h(without)f(p)s
+(ermission,)f(w)m(ould)330 3000 y(mak)m(e)c(y)m(ou)e(directly)i(or)e
+(secondarily)h(liable)h(for)e(infringemen)m(t)h(under)e(applicable)i
+(cop)m(yrigh)m(t)h(la)m(w,)330 3109 y(except)34 b(executing)g(it)g(on)e
+(a)i(computer)f(or)f(mo)s(difying)h(a)g(priv)-5 b(ate)33
+b(cop)m(y)-8 b(.)50 b(Propagation)34 b(includes)330 3219
+y(cop)m(ying,)39 b(distribution)c(\(with)h(or)h(without)f(mo)s
+(di\014cation\),)i(making)f(a)m(v)-5 b(ailable)38 b(to)f(the)f(public,)
+330 3329 y(and)30 b(in)g(some)h(coun)m(tries)g(other)f(activities)j(as)
+e(w)m(ell.)330 3468 y(T)-8 b(o)28 b(\\con)m(v)m(ey")j(a)d(w)m(ork)g
+(means)g(an)m(y)g(kind)f(of)h(propagation)h(that)g(enables)f(other)g
+(parties)g(to)h(mak)m(e)330 3577 y(or)k(receiv)m(e)j(copies.)50
+b(Mere)34 b(in)m(teraction)i(with)d(a)g(user)g(through)g(a)g(computer)h
+(net)m(w)m(ork,)h(with)e(no)330 3687 y(transfer)d(of)g(a)h(cop)m(y)-8
+b(,)32 b(is)e(not)h(con)m(v)m(eying.)330 3826 y(An)25
+b(in)m(teractiv)m(e)k(user)c(in)m(terface)j(displa)m(ys)e
+(\\Appropriate)g(Legal)h(Notices")h(to)f(the)f(exten)m(t)h(that)f(it)
+330 3936 y(includes)k(a)g(con)m(v)m(enien)m(t)j(and)c(prominen)m(tly)h
+(visible)h(feature)g(that)f(\(1\))i(displa)m(ys)e(an)g(appropriate)330
+4045 y(cop)m(yrigh)m(t)j(notice,)h(and)d(\(2\))i(tells)f(the)g(user)f
+(that)i(there)e(is)h(no)g(w)m(arran)m(t)m(y)g(for)g(the)g(w)m(ork)g
+(\(except)330 4155 y(to)e(the)g(exten)m(t)h(that)f(w)m(arran)m(ties)g
+(are)g(pro)m(vided\),)g(that)g(licensees)g(ma)m(y)g(con)m(v)m(ey)h(the)
+f(w)m(ork)f(under)330 4265 y(this)37 b(License,)i(and)e(ho)m(w)g(to)g
+(view)h(a)f(cop)m(y)h(of)f(this)g(License.)61 b(If)36
+b(the)i(in)m(terface)g(presen)m(ts)f(a)g(list)330 4374
+y(of)32 b(user)e(commands)h(or)h(options,)g(suc)m(h)f(as)g(a)h(men)m
+(u,)f(a)h(prominen)m(t)f(item)h(in)f(the)h(list)g(meets)g(this)330
+4484 y(criterion.)199 4623 y(1.)61 b(Source)30 b(Co)s(de.)330
+4762 y(The)g(\\source)i(co)s(de")f(for)g(a)g(w)m(ork)g(means)g(the)g
+(preferred)f(form)g(of)h(the)g(w)m(ork)g(for)g(making)g(mo)s(di-)330
+4872 y(\014cations)g(to)g(it.)41 b(\\Ob)5 b(ject)31 b(co)s(de")g(means)
+g(an)m(y)f(non-source)h(form)f(of)g(a)h(w)m(ork.)330
+5011 y(A)36 b(\\Standard)f(In)m(terface")i(means)f(an)f(in)m(terface)i
+(that)g(either)f(is)g(an)f(o\016cial)i(standard)e(de\014ned)330
+5121 y(b)m(y)e(a)g(recognized)i(standards)d(b)s(o)s(dy)-8
+b(,)33 b(or,)h(in)f(the)g(case)h(of)f(in)m(terfaces)i(sp)s(eci\014ed)d
+(for)h(a)h(particular)330 5230 y(programming)44 b(language,)49
+b(one)c(that)f(is)g(widely)h(used)e(among)i(dev)m(elop)s(ers)f(w)m
+(orking)h(in)e(that)330 5340 y(language.)p eop end
+%%Page: 3 5
+TeXDict begin 3 4 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(3)330 299 y(The)24 b(\\System)g(Libraries")g(of)g(an)g
+(executable)i(w)m(ork)e(include)f(an)m(ything,)j(other)f(than)e(the)i
+(w)m(ork)f(as)330 408 y(a)k(whole,)g(that)g(\(a\))g(is)f(included)g(in)
+g(the)g(normal)g(form)g(of)h(pac)m(k)-5 b(aging)29 b(a)e(Ma)5
+b(jor)28 b(Comp)s(onen)m(t,)g(but)330 518 y(whic)m(h)33
+b(is)g(not)h(part)f(of)h(that)g(Ma)5 b(jor)34 b(Comp)s(onen)m(t,)g(and)
+e(\(b\))i(serv)m(es)g(only)f(to)h(enable)g(use)f(of)h(the)330
+628 y(w)m(ork)c(with)g(that)g(Ma)5 b(jor)31 b(Comp)s(onen)m(t,)e(or)h
+(to)h(implemen)m(t)g(a)f(Standard)f(In)m(terface)i(for)e(whic)m(h)h(an)
+330 737 y(implemen)m(tation)g(is)e(a)m(v)-5 b(ailable)30
+b(to)f(the)f(public)g(in)f(source)i(co)s(de)f(form.)39
+b(A)29 b(\\Ma)5 b(jor)29 b(Comp)s(onen)m(t",)330 847
+y(in)38 b(this)g(con)m(text,)k(means)c(a)g(ma)5 b(jor)38
+b(essen)m(tial)i(comp)s(onen)m(t)e(\(k)m(ernel,)j(windo)m(w)d(system,)i
+(and)e(so)330 956 y(on\))c(of)g(the)g(sp)s(eci\014c)f(op)s(erating)h
+(system)g(\(if)g(an)m(y\))h(on)e(whic)m(h)h(the)g(executable)h(w)m(ork)
+f(runs,)f(or)h(a)330 1066 y(compiler)d(used)f(to)h(pro)s(duce)e(the)h
+(w)m(ork,)h(or)f(an)h(ob)5 b(ject)31 b(co)s(de)g(in)m(terpreter)f(used)
+g(to)h(run)e(it.)330 1212 y(The)f(\\Corresp)s(onding)g(Source")h(for)f
+(a)h(w)m(ork)g(in)g(ob)5 b(ject)29 b(co)s(de)g(form)g(means)f(all)i
+(the)f(source)g(co)s(de)330 1322 y(needed)35 b(to)h(generate,)i
+(install,)f(and)e(\(for)g(an)h(executable)g(w)m(ork\))g(run)e(the)h(ob)
+5 b(ject)36 b(co)s(de)g(and)e(to)330 1431 y(mo)s(dify)39
+b(the)g(w)m(ork,)j(including)d(scripts)g(to)i(con)m(trol)f(those)g
+(activities.)71 b(Ho)m(w)m(ev)m(er,)44 b(it)c(do)s(es)f(not)330
+1541 y(include)i(the)h(w)m(ork's)g(System)g(Libraries,)i(or)e
+(general-purp)s(ose)f(to)s(ols)i(or)f(generally)h(a)m(v)-5
+b(ailable)330 1650 y(free)31 b(programs)g(whic)m(h)g(are)h(used)e(unmo)
+s(di\014ed)f(in)i(p)s(erforming)f(those)h(activities)j(but)d(whic)m(h)g
+(are)330 1760 y(not)g(part)f(of)h(the)g(w)m(ork.)42 b(F)-8
+b(or)32 b(example,)f(Corresp)s(onding)e(Source)i(includes)f(in)m
+(terface)i(de\014nition)330 1870 y(\014les)g(asso)s(ciated)i(with)d
+(source)i(\014les)f(for)g(the)g(w)m(ork,)h(and)f(the)g(source)g(co)s
+(de)h(for)e(shared)h(libraries)330 1979 y(and)g(dynamically)g(link)m
+(ed)h(subprograms)e(that)h(the)h(w)m(ork)f(is)g(sp)s(eci\014cally)h
+(designed)f(to)h(require,)330 2089 y(suc)m(h)k(as)g(b)m(y)g(in)m
+(timate)i(data)e(comm)m(unication)i(or)e(con)m(trol)h(\015o)m(w)f(b)s
+(et)m(w)m(een)h(those)f(subprograms)330 2198 y(and)30
+b(other)g(parts)g(of)h(the)g(w)m(ork.)330 2345 y(The)h(Corresp)s
+(onding)f(Source)i(need)f(not)h(include)f(an)m(ything)i(that)f(users)f
+(can)h(regenerate)h(auto-)330 2454 y(matically)e(from)e(other)h(parts)f
+(of)h(the)f(Corresp)s(onding)f(Source.)330 2600 y(The)h(Corresp)s
+(onding)e(Source)j(for)f(a)h(w)m(ork)f(in)g(source)h(co)s(de)f(form)g
+(is)h(that)f(same)h(w)m(ork.)199 2746 y(2.)61 b(Basic)32
+b(P)m(ermissions.)330 2892 y(All)44 b(righ)m(ts)f(gran)m(ted)g(under)f
+(this)h(License)g(are)g(gran)m(ted)h(for)f(the)g(term)g(of)g(cop)m
+(yrigh)m(t)h(on)f(the)330 3002 y(Program,)29 b(and)e(are)i(irrev)m(o)s
+(cable)g(pro)m(vided)f(the)g(stated)h(conditions)g(are)f(met.)40
+b(This)28 b(License)g(ex-)330 3112 y(plicitly)h(a\016rms)e(y)m(our)h
+(unlimited)g(p)s(ermission)e(to)j(run)d(the)i(unmo)s(di\014ed)e
+(Program.)40 b(The)27 b(output)330 3221 y(from)37 b(running)e(a)j(co)m
+(v)m(ered)h(w)m(ork)e(is)g(co)m(v)m(ered)i(b)m(y)e(this)h(License)f
+(only)h(if)f(the)g(output,)i(giv)m(en)g(its)330 3331
+y(con)m(ten)m(t,)33 b(constitutes)f(a)g(co)m(v)m(ered)g(w)m(ork.)42
+b(This)31 b(License)g(ac)m(kno)m(wledges)i(y)m(our)e(righ)m(ts)g(of)g
+(fair)g(use)330 3440 y(or)f(other)h(equiv)-5 b(alen)m(t,)32
+b(as)f(pro)m(vided)f(b)m(y)g(cop)m(yrigh)m(t)i(la)m(w.)330
+3587 y(Y)-8 b(ou)41 b(ma)m(y)h(mak)m(e,)i(run)c(and)g(propagate)i(co)m
+(v)m(ered)g(w)m(orks)f(that)g(y)m(ou)h(do)e(not)h(con)m(v)m(ey)-8
+b(,)46 b(without)330 3696 y(conditions)30 b(so)f(long)h(as)g(y)m(our)f
+(license)h(otherwise)g(remains)f(in)g(force.)41 b(Y)-8
+b(ou)30 b(ma)m(y)f(con)m(v)m(ey)i(co)m(v)m(ered)330 3806
+y(w)m(orks)40 b(to)g(others)g(for)g(the)g(sole)g(purp)s(ose)e(of)i(ha)m
+(ving)h(them)e(mak)m(e)i(mo)s(di\014cations)f(exclusiv)m(ely)330
+3915 y(for)45 b(y)m(ou,)50 b(or)45 b(pro)m(vide)h(y)m(ou)f(with)g
+(facilities)j(for)d(running)f(those)h(w)m(orks,)50 b(pro)m(vided)45
+b(that)h(y)m(ou)330 4025 y(comply)34 b(with)f(the)h(terms)f(of)h(this)f
+(License)i(in)e(con)m(v)m(eying)i(all)g(material)g(for)e(whic)m(h)g(y)m
+(ou)h(do)g(not)330 4134 y(con)m(trol)i(cop)m(yrigh)m(t.)55
+b(Those)35 b(th)m(us)f(making)h(or)g(running)e(the)i(co)m(v)m(ered)h(w)
+m(orks)f(for)f(y)m(ou)h(m)m(ust)g(do)330 4244 y(so)29
+b(exclusiv)m(ely)h(on)e(y)m(our)g(b)s(ehalf,)h(under)d(y)m(our)j
+(direction)g(and)f(con)m(trol,)i(on)e(terms)h(that)g(prohibit)330
+4354 y(them)35 b(from)g(making)g(an)m(y)h(copies)g(of)f(y)m(our)h(cop)m
+(yrigh)m(ted)g(material)h(outside)e(their)h(relationship)330
+4463 y(with)30 b(y)m(ou.)330 4609 y(Con)m(v)m(eying)46
+b(under)d(an)m(y)i(other)g(circumstances)g(is)g(p)s(ermitted)g(solely)g
+(under)f(the)g(conditions)330 4719 y(stated)31 b(b)s(elo)m(w.)41
+b(Sublicensing)30 b(is)g(not)h(allo)m(w)m(ed;)h(section)g(10)f(mak)m
+(es)g(it)g(unnecessary)-8 b(.)199 4865 y(3.)61 b(Protecting)32
+b(Users')e(Legal)i(Righ)m(ts)f(F)-8 b(rom)31 b(An)m(ti-Circum)m(v)m(en)
+m(tion)i(La)m(w.)330 5011 y(No)44 b(co)m(v)m(ered)i(w)m(ork)d(shall)h
+(b)s(e)g(deemed)f(part)h(of)g(an)f(e\013ectiv)m(e)k(tec)m(hnological)g
+(measure)c(under)330 5121 y(an)m(y)30 b(applicable)h(la)m(w)f
+(ful\014lling)g(obligations)h(under)e(article)i(11)g(of)f(the)g(WIPO)f
+(cop)m(yrigh)m(t)i(treat)m(y)330 5230 y(adopted)e(on)f(20)i(Decem)m(b)s
+(er)f(1996,)i(or)e(similar)g(la)m(ws)g(prohibiting)f(or)h(restricting)g
+(circum)m(v)m(en)m(tion)330 5340 y(of)i(suc)m(h)f(measures.)p
+eop end
+%%Page: 4 6
+TeXDict begin 4 5 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(4)330 299 y(When)25 b(y)m(ou)h(con)m(v)m(ey)g(a)g(co)m
+(v)m(ered)h(w)m(ork,)f(y)m(ou)g(w)m(aiv)m(e)h(an)m(y)e(legal)i(p)s(o)m
+(w)m(er)f(to)g(forbid)e(circum)m(v)m(en)m(tion)j(of)330
+408 y(tec)m(hnological)j(measures)d(to)g(the)g(exten)m(t)h(suc)m(h)e
+(circum)m(v)m(en)m(tion)j(is)d(e\013ected)i(b)m(y)f(exercising)g(righ)m
+(ts)330 518 y(under)35 b(this)h(License)h(with)e(resp)s(ect)i(to)g(the)
+f(co)m(v)m(ered)i(w)m(ork,)g(and)d(y)m(ou)i(disclaim)g(an)m(y)f(in)m
+(ten)m(tion)330 628 y(to)41 b(limit)g(op)s(eration)g(or)f(mo)s
+(di\014cation)h(of)g(the)f(w)m(ork)h(as)f(a)h(means)f(of)h(enforcing,)i
+(against)f(the)330 737 y(w)m(ork's)28 b(users,)f(y)m(our)h(or)f(third)g
+(parties')h(legal)h(righ)m(ts)f(to)g(forbid)f(circum)m(v)m(en)m(tion)i
+(of)e(tec)m(hnological)330 847 y(measures.)199 982 y(4.)61
+b(Con)m(v)m(eying)31 b(V)-8 b(erbatim)32 b(Copies.)330
+1117 y(Y)-8 b(ou)28 b(ma)m(y)g(con)m(v)m(ey)h(v)m(erbatim)f(copies)g
+(of)g(the)f(Program's)h(source)g(co)s(de)f(as)h(y)m(ou)f(receiv)m(e)j
+(it,)f(in)e(an)m(y)330 1226 y(medium,)33 b(pro)m(vided)g(that)h(y)m(ou)
+f(conspicuously)g(and)g(appropriately)g(publish)f(on)h(eac)m(h)h(cop)m
+(y)g(an)330 1336 y(appropriate)e(cop)m(yrigh)m(t)i(notice;)g(k)m(eep)f
+(in)m(tact)h(all)f(notices)g(stating)h(that)e(this)g(License)h(and)f
+(an)m(y)330 1445 y(non-p)s(ermissiv)m(e)d(terms)g(added)f(in)h(accord)h
+(with)f(section)h(7)f(apply)g(to)h(the)f(co)s(de;)h(k)m(eep)g(in)m
+(tact)h(all)330 1555 y(notices)37 b(of)f(the)g(absence)g(of)g(an)m(y)g
+(w)m(arran)m(t)m(y;)j(and)c(giv)m(e)i(all)g(recipien)m(ts)f(a)h(cop)m
+(y)f(of)g(this)f(License)330 1665 y(along)c(with)f(the)h(Program.)330
+1799 y(Y)-8 b(ou)27 b(ma)m(y)g(c)m(harge)h(an)m(y)f(price)g(or)f(no)h
+(price)f(for)h(eac)m(h)g(cop)m(y)h(that)f(y)m(ou)g(con)m(v)m(ey)-8
+b(,)29 b(and)d(y)m(ou)h(ma)m(y)h(o\013er)330 1909 y(supp)s(ort)h(or)h
+(w)m(arran)m(t)m(y)h(protection)h(for)e(a)h(fee.)199
+2044 y(5.)61 b(Con)m(v)m(eying)31 b(Mo)s(di\014ed)f(Source)g(V)-8
+b(ersions.)330 2179 y(Y)g(ou)27 b(ma)m(y)g(con)m(v)m(ey)h(a)f(w)m(ork)g
+(based)f(on)h(the)g(Program,)g(or)g(the)g(mo)s(di\014cations)g(to)g
+(pro)s(duce)e(it)i(from)330 2288 y(the)36 b(Program,)h(in)e(the)g(form)
+g(of)g(source)h(co)s(de)g(under)d(the)j(terms)f(of)h(section)g(4,)h
+(pro)m(vided)e(that)330 2398 y(y)m(ou)c(also)g(meet)g(all)h(of)e(these)
+h(conditions:)379 2533 y(a.)61 b(The)28 b(w)m(ork)h(m)m(ust)f(carry)h
+(prominen)m(t)f(notices)i(stating)g(that)f(y)m(ou)g(mo)s(di\014ed)e
+(it,)j(and)e(giving)i(a)510 2642 y(relev)-5 b(an)m(t)32
+b(date.)374 2777 y(b.)60 b(The)34 b(w)m(ork)h(m)m(ust)f(carry)h
+(prominen)m(t)f(notices)i(stating)g(that)f(it)g(is)g(released)g(under)e
+(this)i(Li-)510 2887 y(cense)i(and)f(an)m(y)h(conditions)h(added)e
+(under)f(section)j(7.)60 b(This)36 b(requiremen)m(t)h(mo)s(di\014es)f
+(the)510 2996 y(requiremen)m(t)31 b(in)f(section)h(4)g(to)g(\\k)m(eep)h
+(in)m(tact)g(all)f(notices".)384 3131 y(c.)61 b(Y)-8
+b(ou)36 b(m)m(ust)g(license)g(the)g(en)m(tire)h(w)m(ork,)g(as)f(a)g
+(whole,)h(under)d(this)i(License)g(to)h(an)m(y)m(one)f(who)510
+3241 y(comes)31 b(in)m(to)g(p)s(ossession)e(of)h(a)h(cop)m(y)-8
+b(.)41 b(This)29 b(License)i(will)f(therefore)h(apply)-8
+b(,)30 b(along)h(with)f(an)m(y)510 3351 y(applicable)k(section)f(7)g
+(additional)h(terms,)f(to)h(the)e(whole)h(of)g(the)g(w)m(ork,)g(and)f
+(all)i(its)f(parts,)510 3460 y(regardless)h(of)g(ho)m(w)g(they)g(are)g
+(pac)m(k)-5 b(aged.)52 b(This)33 b(License)h(giv)m(es)h(no)f(p)s
+(ermission)e(to)j(license)510 3570 y(the)c(w)m(ork)h(in)f(an)m(y)g
+(other)h(w)m(a)m(y)-8 b(,)33 b(but)d(it)i(do)s(es)f(not)g(in)m(v)-5
+b(alidate)33 b(suc)m(h)e(p)s(ermission)f(if)h(y)m(ou)h(ha)m(v)m(e)510
+3679 y(separately)g(receiv)m(ed)f(it.)374 3814 y(d.)60
+b(If)36 b(the)h(w)m(ork)g(has)g(in)m(teractiv)m(e)j(user)c(in)m
+(terfaces,)k(eac)m(h)e(m)m(ust)f(displa)m(y)g(Appropriate)g(Legal)510
+3924 y(Notices;)49 b(ho)m(w)m(ev)m(er,)c(if)c(the)h(Program)f(has)g(in)
+m(teractiv)m(e)j(in)m(terfaces)e(that)g(do)f(not)h(displa)m(y)510
+4033 y(Appropriate)30 b(Legal)i(Notices,)g(y)m(our)f(w)m(ork)f(need)g
+(not)h(mak)m(e)g(them)g(do)f(so.)330 4194 y(A)38 b(compilation)h(of)f
+(a)g(co)m(v)m(ered)h(w)m(ork)f(with)f(other)h(separate)h(and)e(indep)s
+(enden)m(t)f(w)m(orks,)k(whic)m(h)330 4303 y(are)c(not)g(b)m(y)g(their)
+g(nature)f(extensions)h(of)g(the)g(co)m(v)m(ered)i(w)m(ork,)f(and)e
+(whic)m(h)h(are)g(not)g(com)m(bined)330 4413 y(with)27
+b(it)i(suc)m(h)e(as)h(to)h(form)e(a)h(larger)h(program,)f(in)f(or)h(on)
+g(a)g(v)m(olume)g(of)g(a)h(storage)g(or)f(distribution)330
+4522 y(medium,)43 b(is)f(called)g(an)g(\\aggregate")j(if)c(the)h
+(compilation)h(and)e(its)g(resulting)h(cop)m(yrigh)m(t)h(are)330
+4632 y(not)31 b(used)f(to)h(limit)h(the)e(access)i(or)f(legal)h(righ)m
+(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m(ond)g(what)h(the)330
+4741 y(individual)j(w)m(orks)h(p)s(ermit.)54 b(Inclusion)34
+b(of)h(a)h(co)m(v)m(ered)g(w)m(ork)f(in)g(an)g(aggregate)j(do)s(es)c
+(not)h(cause)330 4851 y(this)30 b(License)h(to)g(apply)f(to)h(the)g
+(other)g(parts)f(of)g(the)h(aggregate.)199 4986 y(6.)61
+b(Con)m(v)m(eying)31 b(Non-Source)g(F)-8 b(orms.)330
+5121 y(Y)g(ou)29 b(ma)m(y)h(con)m(v)m(ey)g(a)f(co)m(v)m(ered)i(w)m(ork)
+e(in)f(ob)5 b(ject)30 b(co)s(de)f(form)f(under)g(the)h(terms)f(of)h
+(sections)h(4)g(and)330 5230 y(5,)42 b(pro)m(vided)d(that)g(y)m(ou)h
+(also)g(con)m(v)m(ey)g(the)g(mac)m(hine-readable)g(Corresp)s(onding)e
+(Source)g(under)330 5340 y(the)31 b(terms)f(of)g(this)h(License,)g(in)f
+(one)h(of)f(these)h(w)m(a)m(ys:)p eop end
+%%Page: 5 7
+TeXDict begin 5 6 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(5)379 299 y(a.)61 b(Con)m(v)m(ey)32 b(the)f(ob)5
+b(ject)31 b(co)s(de)g(in,)g(or)g(em)m(b)s(o)s(died)f(in,)h(a)g(ph)m
+(ysical)h(pro)s(duct)d(\(including)i(a)g(ph)m(ys-)510
+408 y(ical)37 b(distribution)d(medium\),)j(accompanied)f(b)m(y)f(the)h
+(Corresp)s(onding)d(Source)j(\014xed)e(on)i(a)510 518
+y(durable)30 b(ph)m(ysical)h(medium)e(customarily)i(used)f(for)g(soft)m
+(w)m(are)i(in)m(terc)m(hange.)374 655 y(b.)60 b(Con)m(v)m(ey)30
+b(the)f(ob)5 b(ject)30 b(co)s(de)f(in,)g(or)g(em)m(b)s(o)s(died)f(in,)h
+(a)g(ph)m(ysical)g(pro)s(duct)f(\(including)h(a)g(ph)m(ysi-)510
+765 y(cal)k(distribution)e(medium\),)h(accompanied)h(b)m(y)e(a)i
+(written)f(o\013er,)g(v)-5 b(alid)33 b(for)e(at)i(least)g(three)510
+874 y(y)m(ears)i(and)f(v)-5 b(alid)35 b(for)f(as)g(long)h(as)g(y)m(ou)g
+(o\013er)f(spare)h(parts)f(or)g(customer)h(supp)s(ort)d(for)i(that)510
+984 y(pro)s(duct)c(mo)s(del,)i(to)g(giv)m(e)g(an)m(y)m(one)h(who)d(p)s
+(ossesses)h(the)h(ob)5 b(ject)32 b(co)s(de)f(either)h(\(1\))g(a)g(cop)m
+(y)g(of)510 1093 y(the)24 b(Corresp)s(onding)e(Source)i(for)g(all)h
+(the)f(soft)m(w)m(are)h(in)f(the)g(pro)s(duct)f(that)i(is)f(co)m(v)m
+(ered)h(b)m(y)f(this)510 1203 y(License,)30 b(on)g(a)f(durable)g(ph)m
+(ysical)h(medium)e(customarily)i(used)f(for)g(soft)m(w)m(are)i(in)m
+(terc)m(hange,)510 1313 y(for)k(a)g(price)h(no)f(more)g(than)g(y)m(our)
+g(reasonable)h(cost)g(of)f(ph)m(ysically)h(p)s(erforming)e(this)h(con-)
+510 1422 y(v)m(eying)f(of)f(source,)g(or)g(\(2\))h(access)g(to)g(cop)m
+(y)f(the)g(Corresp)s(onding)e(Source)i(from)f(a)h(net)m(w)m(ork)510
+1532 y(serv)m(er)e(at)g(no)f(c)m(harge.)384 1669 y(c.)61
+b(Con)m(v)m(ey)40 b(individual)e(copies)h(of)g(the)g(ob)5
+b(ject)40 b(co)s(de)f(with)g(a)g(cop)m(y)g(of)g(the)g(written)g
+(o\013er)g(to)510 1778 y(pro)m(vide)e(the)g(Corresp)s(onding)e(Source.)
+59 b(This)36 b(alternativ)m(e)k(is)c(allo)m(w)m(ed)j(only)e(o)s
+(ccasionally)510 1888 y(and)29 b(noncommercially)-8 b(,)31
+b(and)e(only)g(if)h(y)m(ou)f(receiv)m(ed)i(the)e(ob)5
+b(ject)31 b(co)s(de)e(with)g(suc)m(h)g(an)g(o\013er,)510
+1998 y(in)h(accord)h(with)f(subsection)h(6b.)374 2134
+y(d.)60 b(Con)m(v)m(ey)37 b(the)f(ob)5 b(ject)37 b(co)s(de)f(b)m(y)g
+(o\013ering)g(access)i(from)d(a)i(designated)f(place)h(\(gratis)g(or)f
+(for)510 2244 y(a)j(c)m(harge\),)k(and)c(o\013er)g(equiv)-5
+b(alen)m(t)41 b(access)f(to)g(the)f(Corresp)s(onding)e(Source)i(in)f
+(the)i(same)510 2354 y(w)m(a)m(y)30 b(through)f(the)g(same)h(place)h
+(at)f(no)f(further)f(c)m(harge.)41 b(Y)-8 b(ou)30 b(need)f(not)h
+(require)f(recipien)m(ts)510 2463 y(to)42 b(cop)m(y)h(the)f(Corresp)s
+(onding)e(Source)h(along)i(with)f(the)g(ob)5 b(ject)42
+b(co)s(de.)75 b(If)42 b(the)f(place)i(to)510 2573 y(cop)m(y)c(the)g(ob)
+5 b(ject)39 b(co)s(de)g(is)g(a)g(net)m(w)m(ork)g(serv)m(er,)i(the)e
+(Corresp)s(onding)e(Source)h(ma)m(y)h(b)s(e)f(on)510
+2682 y(a)45 b(di\013eren)m(t)g(serv)m(er)f(\(op)s(erated)h(b)m(y)f(y)m
+(ou)h(or)g(a)f(third)g(part)m(y\))h(that)g(supp)s(orts)d(equiv)-5
+b(alen)m(t)510 2792 y(cop)m(ying)35 b(facilities,)i(pro)m(vided)c(y)m
+(ou)h(main)m(tain)h(clear)g(directions)f(next)g(to)h(the)f(ob)5
+b(ject)35 b(co)s(de)510 2902 y(sa)m(ying)h(where)f(to)h(\014nd)d(the)i
+(Corresp)s(onding)f(Source.)55 b(Regardless)35 b(of)h(what)f(serv)m(er)
+g(hosts)510 3011 y(the)e(Corresp)s(onding)e(Source,)j(y)m(ou)f(remain)f
+(obligated)j(to)e(ensure)f(that)i(it)f(is)g(a)m(v)-5
+b(ailable)35 b(for)510 3121 y(as)c(long)g(as)f(needed)g(to)h(satisfy)g
+(these)g(requiremen)m(ts.)384 3258 y(e.)61 b(Con)m(v)m(ey)24
+b(the)g(ob)5 b(ject)24 b(co)s(de)f(using)g(p)s(eer-to-p)s(eer)h
+(transmission,)g(pro)m(vided)f(y)m(ou)h(inform)f(other)510
+3367 y(p)s(eers)d(where)g(the)h(ob)5 b(ject)22 b(co)s(de)f(and)f
+(Corresp)s(onding)f(Source)i(of)g(the)g(w)m(ork)g(are)g(b)s(eing)g
+(o\013ered)510 3477 y(to)31 b(the)g(general)g(public)f(at)h(no)f(c)m
+(harge)i(under)d(subsection)h(6d.)330 3641 y(A)35 b(separable)f(p)s
+(ortion)g(of)h(the)g(ob)5 b(ject)35 b(co)s(de,)h(whose)e(source)h(co)s
+(de)g(is)f(excluded)g(from)g(the)h(Cor-)330 3751 y(resp)s(onding)c
+(Source)h(as)h(a)g(System)f(Library)-8 b(,)33 b(need)f(not)h(b)s(e)e
+(included)h(in)g(con)m(v)m(eying)i(the)f(ob)5 b(ject)330
+3861 y(co)s(de)31 b(w)m(ork.)330 3998 y(A)h(\\User)g(Pro)s(duct")f(is)h
+(either)g(\(1\))g(a)g(\\consumer)g(pro)s(duct",)f(whic)m(h)h(means)f
+(an)m(y)h(tangible)h(p)s(er-)330 4107 y(sonal)g(prop)s(ert)m(y)g(whic)m
+(h)f(is)h(normally)h(used)e(for)h(p)s(ersonal,)g(family)-8
+b(,)35 b(or)e(household)f(purp)s(oses,)g(or)330 4217
+y(\(2\))26 b(an)m(ything)f(designed)f(or)h(sold)g(for)f(incorp)s
+(oration)h(in)m(to)h(a)f(dw)m(elling.)39 b(In)24 b(determining)h
+(whether)330 4326 y(a)30 b(pro)s(duct)e(is)h(a)h(consumer)f(pro)s
+(duct,)f(doubtful)h(cases)h(shall)g(b)s(e)e(resolv)m(ed)j(in)e(fa)m(v)m
+(or)h(of)g(co)m(v)m(erage.)330 4436 y(F)-8 b(or)42 b(a)g(particular)g
+(pro)s(duct)f(receiv)m(ed)i(b)m(y)e(a)h(particular)g(user,)i
+(\\normally)f(used")e(refers)g(to)i(a)330 4545 y(t)m(ypical)e(or)e
+(common)h(use)e(of)i(that)g(class)g(of)f(pro)s(duct,)h(regardless)g(of)
+f(the)h(status)f(of)h(the)f(par-)330 4655 y(ticular)d(user)e(or)h(of)h
+(the)f(w)m(a)m(y)h(in)f(whic)m(h)f(the)i(particular)f(user)g(actually)h
+(uses,)g(or)f(exp)s(ects)h(or)f(is)330 4765 y(exp)s(ected)d(to)g(use,)g
+(the)g(pro)s(duct.)43 b(A)32 b(pro)s(duct)f(is)g(a)h(consumer)f(pro)s
+(duct)g(regardless)h(of)g(whether)330 4874 y(the)h(pro)s(duct)f(has)h
+(substan)m(tial)g(commercial,)j(industrial)c(or)h(non-consumer)g(uses,)
+g(unless)f(suc)m(h)330 4984 y(uses)e(represen)m(t)g(the)h(only)f
+(signi\014can)m(t)i(mo)s(de)e(of)g(use)g(of)h(the)f(pro)s(duct.)330
+5121 y(\\Installation)h(Information")e(for)g(a)g(User)g(Pro)s(duct)f
+(means)g(an)m(y)i(metho)s(ds,)e(pro)s(cedures,)g(autho-)330
+5230 y(rization)d(k)m(eys,)g(or)f(other)f(information)h(required)f(to)h
+(install)g(and)f(execute)i(mo)s(di\014ed)d(v)m(ersions)i(of)g(a)330
+5340 y(co)m(v)m(ered)h(w)m(ork)e(in)g(that)h(User)f(Pro)s(duct)f(from)h
+(a)h(mo)s(di\014ed)e(v)m(ersion)h(of)h(its)f(Corresp)s(onding)f
+(Source.)p eop end
+%%Page: 6 8
+TeXDict begin 6 7 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(6)330 299 y(The)30 b(information)h(m)m(ust)f(su\016ce)g
+(to)i(ensure)d(that)i(the)g(con)m(tin)m(ued)g(functioning)g(of)f(the)h
+(mo)s(di\014ed)330 408 y(ob)5 b(ject)34 b(co)s(de)f(is)g(in)f(no)h
+(case)h(prev)m(en)m(ted)f(or)g(in)m(terfered)g(with)g(solely)h(b)s
+(ecause)f(mo)s(di\014cation)g(has)330 518 y(b)s(een)d(made.)330
+650 y(If)38 b(y)m(ou)i(con)m(v)m(ey)g(an)f(ob)5 b(ject)40
+b(co)s(de)f(w)m(ork)g(under)e(this)i(section)h(in,)h(or)e(with,)i(or)e
+(sp)s(eci\014cally)g(for)330 759 y(use)g(in,)i(a)e(User)g(Pro)s(duct,)i
+(and)e(the)g(con)m(v)m(eying)i(o)s(ccurs)d(as)i(part)f(of)g(a)g
+(transaction)h(in)f(whic)m(h)330 869 y(the)d(righ)m(t)g(of)g(p)s
+(ossession)f(and)g(use)h(of)f(the)h(User)g(Pro)s(duct)f(is)g
+(transferred)g(to)i(the)e(recipien)m(t)i(in)330 978 y(p)s(erp)s(etuit)m
+(y)43 b(or)g(for)g(a)h(\014xed)e(term)i(\(regardless)g(of)f(ho)m(w)h
+(the)f(transaction)i(is)e(c)m(haracterized\),)330 1088
+y(the)c(Corresp)s(onding)e(Source)i(con)m(v)m(ey)m(ed)i(under)c(this)i
+(section)h(m)m(ust)f(b)s(e)f(accompanied)i(b)m(y)f(the)330
+1198 y(Installation)d(Information.)52 b(But)35 b(this)f(requiremen)m(t)
+g(do)s(es)g(not)h(apply)f(if)g(neither)g(y)m(ou)h(nor)f(an)m(y)330
+1307 y(third)28 b(part)m(y)i(retains)f(the)g(abilit)m(y)i(to)e(install)
+h(mo)s(di\014ed)e(ob)5 b(ject)30 b(co)s(de)f(on)g(the)h(User)f(Pro)s
+(duct)f(\(for)330 1417 y(example,)j(the)g(w)m(ork)f(has)g(b)s(een)g
+(installed)h(in)f(R)m(OM\).)330 1548 y(The)38 b(requiremen)m(t)g(to)h
+(pro)m(vide)g(Installation)g(Information)g(do)s(es)f(not)g(include)g(a)
+h(requiremen)m(t)330 1658 y(to)32 b(con)m(tin)m(ue)h(to)f(pro)m(vide)g
+(supp)s(ort)e(service,)j(w)m(arran)m(t)m(y)-8 b(,)33
+b(or)f(up)s(dates)e(for)i(a)g(w)m(ork)f(that)h(has)g(b)s(een)330
+1767 y(mo)s(di\014ed)37 b(or)h(installed)h(b)m(y)g(the)f(recipien)m(t,)
+k(or)c(for)g(the)g(User)h(Pro)s(duct)e(in)h(whic)m(h)g(it)h(has)f(b)s
+(een)330 1877 y(mo)s(di\014ed)29 b(or)h(installed.)42
+b(Access)31 b(to)g(a)g(net)m(w)m(ork)g(ma)m(y)g(b)s(e)e(denied)h(when)f
+(the)i(mo)s(di\014cation)f(itself)330 1987 y(materially)i(and)e(adv)m
+(ersely)h(a\013ects)h(the)e(op)s(eration)h(of)g(the)f(net)m(w)m(ork)h
+(or)g(violates)h(the)f(rules)f(and)330 2096 y(proto)s(cols)h(for)f
+(comm)m(unication)i(across)f(the)g(net)m(w)m(ork.)330
+2228 y(Corresp)s(onding)26 b(Source)h(con)m(v)m(ey)m(ed,)j(and)d
+(Installation)i(Information)f(pro)m(vided,)g(in)f(accord)h(with)330
+2337 y(this)d(section)i(m)m(ust)e(b)s(e)g(in)g(a)h(format)g(that)f(is)h
+(publicly)f(do)s(cumen)m(ted)g(\(and)g(with)g(an)h(implemen)m(ta-)330
+2447 y(tion)i(a)m(v)-5 b(ailable)29 b(to)f(the)g(public)e(in)h(source)h
+(co)s(de)f(form\),)h(and)f(m)m(ust)g(require)g(no)g(sp)s(ecial)h(passw)
+m(ord)330 2556 y(or)i(k)m(ey)i(for)e(unpac)m(king,)g(reading)h(or)f
+(cop)m(ying.)199 2688 y(7.)61 b(Additional)31 b(T)-8
+b(erms.)330 2819 y(\\Additional)29 b(p)s(ermissions")e(are)h(terms)f
+(that)h(supplemen)m(t)f(the)h(terms)g(of)f(this)h(License)g(b)m(y)g
+(mak-)330 2929 y(ing)41 b(exceptions)h(from)e(one)h(or)g(more)g(of)g
+(its)g(conditions.)72 b(Additional)42 b(p)s(ermissions)d(that)j(are)330
+3039 y(applicable)31 b(to)f(the)g(en)m(tire)h(Program)f(shall)g(b)s(e)f
+(treated)i(as)f(though)f(they)h(w)m(ere)h(included)e(in)g(this)330
+3148 y(License,)36 b(to)e(the)g(exten)m(t)i(that)e(they)g(are)g(v)-5
+b(alid)34 b(under)f(applicable)i(la)m(w.)52 b(If)33 b(additional)i(p)s
+(ermis-)330 3258 y(sions)27 b(apply)h(only)f(to)h(part)g(of)f(the)h
+(Program,)h(that)f(part)f(ma)m(y)h(b)s(e)f(used)g(separately)h(under)e
+(those)330 3367 y(p)s(ermissions,)31 b(but)g(the)h(en)m(tire)h(Program)
+f(remains)f(go)m(v)m(erned)i(b)m(y)f(this)g(License)g(without)g(regard)
+330 3477 y(to)f(the)g(additional)g(p)s(ermissions.)330
+3608 y(When)45 b(y)m(ou)g(con)m(v)m(ey)i(a)e(cop)m(y)h(of)f(a)g(co)m(v)
+m(ered)i(w)m(ork,)h(y)m(ou)e(ma)m(y)f(at)h(y)m(our)f(option)g(remo)m(v)
+m(e)i(an)m(y)330 3718 y(additional)30 b(p)s(ermissions)e(from)h(that)h
+(cop)m(y)-8 b(,)31 b(or)f(from)e(an)m(y)i(part)f(of)h(it.)41
+b(\(Additional)30 b(p)s(ermissions)330 3828 y(ma)m(y)41
+b(b)s(e)f(written)g(to)h(require)f(their)h(o)m(wn)f(remo)m(v)-5
+b(al)42 b(in)e(certain)h(cases)g(when)f(y)m(ou)g(mo)s(dify)g(the)330
+3937 y(w)m(ork.\))48 b(Y)-8 b(ou)33 b(ma)m(y)g(place)h(additional)f(p)s
+(ermissions)e(on)i(material,)i(added)d(b)m(y)g(y)m(ou)h(to)g(a)g(co)m
+(v)m(ered)330 4047 y(w)m(ork,)e(for)f(whic)m(h)g(y)m(ou)h(ha)m(v)m(e)g
+(or)g(can)f(giv)m(e)i(appropriate)f(cop)m(yrigh)m(t)g(p)s(ermission.)
+330 4178 y(Not)m(withstanding)e(an)m(y)g(other)g(pro)m(vision)f(of)h
+(this)f(License,)h(for)f(material)i(y)m(ou)f(add)f(to)h(a)f(co)m(v)m
+(ered)330 4288 y(w)m(ork,)40 b(y)m(ou)e(ma)m(y)g(\(if)g(authorized)g(b)
+m(y)g(the)g(cop)m(yrigh)m(t)h(holders)e(of)h(that)g(material\))h
+(supplemen)m(t)330 4398 y(the)31 b(terms)f(of)g(this)h(License)g(with)f
+(terms:)379 4529 y(a.)61 b(Disclaiming)31 b(w)m(arran)m(t)m(y)f(or)g
+(limiting)g(liabilit)m(y)h(di\013eren)m(tly)f(from)f(the)g(terms)g(of)h
+(sections)g(15)510 4639 y(and)g(16)h(of)g(this)f(License;)h(or)374
+4770 y(b.)60 b(Requiring)30 b(preserv)-5 b(ation)31 b(of)g(sp)s
+(eci\014ed)f(reasonable)h(legal)i(notices)f(or)e(author)h(attributions)
+510 4880 y(in)24 b(that)i(material)g(or)f(in)f(the)h(Appropriate)g
+(Legal)h(Notices)h(displa)m(y)m(ed)e(b)m(y)g(w)m(orks)f(con)m(taining)
+510 4989 y(it;)31 b(or)384 5121 y(c.)61 b(Prohibiting)23
+b(misrepresen)m(tation)i(of)e(the)h(origin)g(of)f(that)i(material,)h
+(or)d(requiring)g(that)h(mo)s(d-)510 5230 y(i\014ed)30
+b(v)m(ersions)h(of)f(suc)m(h)g(material)i(b)s(e)e(mark)m(ed)h(in)f
+(reasonable)h(w)m(a)m(ys)g(as)g(di\013eren)m(t)g(from)f(the)510
+5340 y(original)i(v)m(ersion;)f(or)p eop end
+%%Page: 7 9
+TeXDict begin 7 8 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(7)374 299 y(d.)60 b(Limiting)42 b(the)f(use)g(for)g
+(publicit)m(y)h(purp)s(oses)d(of)i(names)g(of)h(licensors)f(or)h
+(authors)e(of)i(the)510 408 y(material;)32 b(or)384 543
+y(e.)61 b(Declining)29 b(to)f(gran)m(t)g(righ)m(ts)f(under)f(trademark)
+h(la)m(w)h(for)f(use)g(of)g(some)h(trade)f(names,)h(trade-)510
+653 y(marks,)i(or)h(service)g(marks;)f(or)397 788 y(f.)60
+b(Requiring)26 b(indemni\014cation)g(of)g(licensors)h(and)f(authors)f
+(of)i(that)f(material)i(b)m(y)e(an)m(y)m(one)h(who)510
+897 y(con)m(v)m(eys)45 b(the)e(material)h(\(or)g(mo)s(di\014ed)e(v)m
+(ersions)h(of)h(it\))g(with)e(con)m(tractual)k(assumptions)510
+1007 y(of)40 b(liabilit)m(y)h(to)f(the)f(recipien)m(t,)k(for)c(an)m(y)h
+(liabilit)m(y)h(that)f(these)g(con)m(tractual)i(assumptions)510
+1117 y(directly)31 b(imp)s(ose)f(on)g(those)h(licensors)g(and)f
+(authors.)330 1277 y(All)i(other)h(non-p)s(ermissiv)m(e)e(additional)i
+(terms)e(are)i(considered)e(\\further)g(restrictions")i(within)330
+1386 y(the)j(meaning)f(of)h(section)g(10.)57 b(If)35
+b(the)h(Program)f(as)h(y)m(ou)g(receiv)m(ed)g(it,)i(or)d(an)m(y)h(part)
+f(of)h(it,)h(con-)330 1496 y(tains)f(a)g(notice)h(stating)g(that)f(it)g
+(is)g(go)m(v)m(erned)h(b)m(y)e(this)h(License)g(along)h(with)e(a)h
+(term)g(that)g(is)g(a)330 1606 y(further)24 b(restriction,)k(y)m(ou)e
+(ma)m(y)g(remo)m(v)m(e)h(that)f(term.)39 b(If)26 b(a)g(license)g(do)s
+(cumen)m(t)g(con)m(tains)g(a)g(further)330 1715 y(restriction)33
+b(but)f(p)s(ermits)g(relicensing)h(or)g(con)m(v)m(eying)h(under)d(this)
+i(License,)g(y)m(ou)g(ma)m(y)g(add)f(to)i(a)330 1825
+y(co)m(v)m(ered)g(w)m(ork)e(material)h(go)m(v)m(erned)h(b)m(y)e(the)g
+(terms)g(of)g(that)h(license)g(do)s(cumen)m(t,)g(pro)m(vided)e(that)330
+1934 y(the)g(further)e(restriction)i(do)s(es)f(not)h(surviv)m(e)f(suc)m
+(h)g(relicensing)h(or)g(con)m(v)m(eying.)330 2069 y(If)f(y)m(ou)g(add)g
+(terms)g(to)h(a)g(co)m(v)m(ered)h(w)m(ork)e(in)g(accord)h(with)f(this)g
+(section,)i(y)m(ou)e(m)m(ust)g(place,)i(in)e(the)330
+2179 y(relev)-5 b(an)m(t)31 b(source)f(\014les,)g(a)g(statemen)m(t)h
+(of)f(the)g(additional)g(terms)g(that)g(apply)f(to)i(those)f(\014les,)g
+(or)g(a)330 2288 y(notice)i(indicating)f(where)f(to)h(\014nd)e(the)h
+(applicable)i(terms.)330 2423 y(Additional)37 b(terms,)h(p)s(ermissiv)m
+(e)e(or)h(non-p)s(ermissiv)m(e,)h(ma)m(y)f(b)s(e)e(stated)j(in)e(the)h
+(form)f(of)g(a)h(sep-)330 2533 y(arately)i(written)f(license,)i(or)e
+(stated)h(as)e(exceptions;)43 b(the)38 b(ab)s(o)m(v)m(e)h(requiremen)m
+(ts)e(apply)g(either)330 2642 y(w)m(a)m(y)-8 b(.)199
+2777 y(8.)61 b(T)-8 b(ermination.)330 2912 y(Y)g(ou)40
+b(ma)m(y)g(not)f(propagate)i(or)e(mo)s(dify)g(a)g(co)m(v)m(ered)i(w)m
+(ork)f(except)g(as)g(expressly)f(pro)m(vided)g(un-)330
+3022 y(der)d(this)h(License.)62 b(An)m(y)37 b(attempt)h(otherwise)f(to)
+h(propagate)g(or)f(mo)s(dify)f(it)i(is)f(v)m(oid,)i(and)e(will)330
+3131 y(automatically)g(terminate)d(y)m(our)g(righ)m(ts)g(under)f(this)g
+(License)i(\(including)e(an)m(y)h(paten)m(t)h(licenses)330
+3241 y(gran)m(ted)c(under)e(the)h(third)g(paragraph)g(of)g(section)i
+(11\).)330 3376 y(Ho)m(w)m(ev)m(er,)j(if)e(y)m(ou)f(cease)i(all)f
+(violation)i(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f
+(a)h(particular)330 3485 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
+(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
+(cop)m(yrigh)m(t)h(holder)330 3595 y(explicitly)42 b(and)e(\014nally)h
+(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
+b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 3705 y(holder)34
+b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
+(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 3814
+y(after)31 b(the)f(cessation.)330 3949 y(Moreo)m(v)m(er,)k(y)m(our)d
+(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
+(reinstated)g(p)s(ermanen)m(tly)f(if)330 4059 y(the)d(cop)m(yrigh)m(t)h
+(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
+(reasonable)h(means,)f(this)g(is)g(the)330 4168 y(\014rst)f(time)i(y)m
+(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
+(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
+4278 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
+(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
+(of)f(the)330 4387 y(notice.)330 4522 y(T)-8 b(ermination)28
+b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
+(terminate)h(the)e(licenses)i(of)f(parties)330 4632 y(who)38
+b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
+(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
+330 4741 y(b)s(een)f(terminated)h(and)e(not)i(p)s(ermanen)m(tly)f
+(reinstated,)j(y)m(ou)e(do)f(not)h(qualify)f(to)h(receiv)m(e)h(new)330
+4851 y(licenses)31 b(for)f(the)h(same)g(material)h(under)c(section)k
+(10.)199 4986 y(9.)61 b(Acceptance)32 b(Not)g(Required)d(for)i(Ha)m
+(ving)g(Copies.)330 5121 y(Y)-8 b(ou)38 b(are)g(not)g(required)f(to)h
+(accept)h(this)f(License)g(in)f(order)g(to)h(receiv)m(e)i(or)e(run)e(a)
+i(cop)m(y)g(of)g(the)330 5230 y(Program.)i(Ancillary)27
+b(propagation)g(of)g(a)g(co)m(v)m(ered)h(w)m(ork)e(o)s(ccurring)g
+(solely)i(as)f(a)g(consequence)g(of)330 5340 y(using)i(p)s(eer-to-p)s
+(eer)g(transmission)g(to)h(receiv)m(e)h(a)e(cop)m(y)h(lik)m(ewise)h(do)
+s(es)d(not)i(require)e(acceptance.)p eop end
+%%Page: 8 10
+TeXDict begin 8 9 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(8)330 299 y(Ho)m(w)m(ev)m(er,)28 b(nothing)c(other)g
+(than)g(this)f(License)i(gran)m(ts)g(y)m(ou)f(p)s(ermission)f(to)i
+(propagate)g(or)f(mo)s(dify)330 408 y(an)m(y)34 b(co)m(v)m(ered)g(w)m
+(ork.)50 b(These)32 b(actions)j(infringe)e(cop)m(yrigh)m(t)h(if)f(y)m
+(ou)h(do)f(not)g(accept)i(this)e(License.)330 518 y(Therefore,)f(b)m(y)
+f(mo)s(difying)g(or)g(propagating)h(a)g(co)m(v)m(ered)h(w)m(ork,)f(y)m
+(ou)g(indicate)g(y)m(our)g(acceptance)330 628 y(of)f(this)f(License)h
+(to)g(do)f(so.)154 759 y(10.)61 b(Automatic)32 b(Licensing)f(of)f(Do)m
+(wnstream)i(Recipien)m(ts.)330 891 y(Eac)m(h)39 b(time)g(y)m(ou)g(con)m
+(v)m(ey)h(a)f(co)m(v)m(ered)h(w)m(ork,)h(the)d(recipien)m(t)i
+(automatically)h(receiv)m(es)f(a)f(license)330 1000 y(from)e(the)h
+(original)h(licensors,)h(to)f(run,)f(mo)s(dify)f(and)g(propagate)i
+(that)f(w)m(ork,)i(sub)5 b(ject)38 b(to)g(this)330 1110
+y(License.)60 b(Y)-8 b(ou)38 b(are)f(not)g(resp)s(onsible)e(for)i
+(enforcing)g(compliance)h(b)m(y)f(third)f(parties)h(with)f(this)330
+1219 y(License.)330 1351 y(An)43 b(\\en)m(tit)m(y)i(transaction")g(is)f
+(a)f(transaction)i(transferring)e(con)m(trol)h(of)g(an)f(organization,)
+49 b(or)330 1461 y(substan)m(tially)24 b(all)f(assets)g(of)g(one,)i(or)
+e(sub)s(dividing)d(an)j(organization,)j(or)d(merging)g(organizations.)
+330 1570 y(If)28 b(propagation)i(of)f(a)h(co)m(v)m(ered)g(w)m(ork)f
+(results)g(from)f(an)h(en)m(tit)m(y)i(transaction,)f(eac)m(h)g(part)m
+(y)g(to)f(that)330 1680 y(transaction)g(who)d(receiv)m(es)k(a)d(cop)m
+(y)i(of)e(the)h(w)m(ork)f(also)i(receiv)m(es)g(whatev)m(er)f(licenses)g
+(to)g(the)g(w)m(ork)330 1789 y(the)d(part)m(y's)g(predecessor)g(in)g
+(in)m(terest)h(had)e(or)h(could)g(giv)m(e)h(under)e(the)h(previous)f
+(paragraph,)i(plus)330 1899 y(a)31 b(righ)m(t)g(to)h(p)s(ossession)e
+(of)h(the)g(Corresp)s(onding)e(Source)i(of)g(the)f(w)m(ork)h(from)g
+(the)g(predecessor)f(in)330 2008 y(in)m(terest,)i(if)e(the)h
+(predecessor)f(has)g(it)h(or)f(can)h(get)h(it)e(with)h(reasonable)g
+(e\013orts.)330 2140 y(Y)-8 b(ou)36 b(ma)m(y)g(not)g(imp)s(ose)f(an)m
+(y)h(further)e(restrictions)j(on)e(the)h(exercise)g(of)g(the)g(righ)m
+(ts)g(gran)m(ted)g(or)330 2250 y(a\016rmed)27 b(under)f(this)h
+(License.)40 b(F)-8 b(or)28 b(example,)h(y)m(ou)f(ma)m(y)g(not)g(imp)s
+(ose)f(a)h(license)g(fee,)h(ro)m(y)m(alt)m(y)-8 b(,)31
+b(or)330 2359 y(other)d(c)m(harge)g(for)g(exercise)h(of)e(righ)m(ts)h
+(gran)m(ted)g(under)e(this)i(License,)h(and)d(y)m(ou)i(ma)m(y)g(not)g
+(initiate)330 2469 y(litigation)f(\(including)d(a)g(cross-claim)i(or)e
+(coun)m(terclaim)i(in)e(a)g(la)m(wsuit\))i(alleging)g(that)e(an)m(y)h
+(paten)m(t)330 2578 y(claim)j(is)g(infringed)e(b)m(y)i(making,)g
+(using,)g(selling,)h(o\013ering)f(for)f(sale,)i(or)e(imp)s(orting)g
+(the)h(Program)330 2688 y(or)i(an)m(y)h(p)s(ortion)f(of)h(it.)154
+2819 y(11.)61 b(P)m(aten)m(ts.)330 2951 y(A)41 b(\\con)m(tributor")h
+(is)f(a)g(cop)m(yrigh)m(t)i(holder)d(who)h(authorizes)g(use)g(under)e
+(this)i(License)h(of)f(the)330 3061 y(Program)35 b(or)f(a)h(w)m(ork)g
+(on)f(whic)m(h)g(the)h(Program)f(is)h(based.)53 b(The)34
+b(w)m(ork)g(th)m(us)g(licensed)h(is)g(called)330 3170
+y(the)c(con)m(tributor's)f(\\con)m(tributor)i(v)m(ersion".)330
+3302 y(A)g(con)m(tributor's)g(\\essen)m(tial)i(paten)m(t)e(claims")h
+(are)f(all)h(paten)m(t)f(claims)h(o)m(wned)e(or)h(con)m(trolled)h(b)m
+(y)330 3411 y(the)21 b(con)m(tributor,)j(whether)d(already)g(acquired)g
+(or)h(hereafter)f(acquired,)j(that)d(w)m(ould)g(b)s(e)g(infringed)330
+3521 y(b)m(y)27 b(some)h(manner,)g(p)s(ermitted)f(b)m(y)g(this)h
+(License,)h(of)e(making,)i(using,)f(or)f(selling)i(its)f(con)m
+(tributor)330 3630 y(v)m(ersion,)40 b(but)c(do)i(not)f(include)g
+(claims)i(that)f(w)m(ould)f(b)s(e)f(infringed)h(only)g(as)h(a)g
+(consequence)g(of)330 3740 y(further)33 b(mo)s(di\014cation)h(of)g(the)
+g(con)m(tributor)g(v)m(ersion.)52 b(F)-8 b(or)34 b(purp)s(oses)e(of)i
+(this)g(de\014nition,)h(\\con-)330 3850 y(trol")40 b(includes)f(the)g
+(righ)m(t)h(to)f(gran)m(t)h(paten)m(t)g(sublicenses)f(in)g(a)g(manner)g
+(consisten)m(t)h(with)f(the)330 3959 y(requiremen)m(ts)30
+b(of)h(this)f(License.)330 4091 y(Eac)m(h)44 b(con)m(tributor)h(gran)m
+(ts)f(y)m(ou)g(a)h(non-exclusiv)m(e,)j(w)m(orldwide,)f(ro)m(y)m(alt)m
+(y-free)g(paten)m(t)e(license)330 4200 y(under)26 b(the)h(con)m
+(tributor's)g(essen)m(tial)i(paten)m(t)f(claims,)h(to)f(mak)m(e,)h
+(use,)f(sell,)g(o\013er)g(for)f(sale,)i(imp)s(ort)330
+4310 y(and)h(otherwise)h(run,)e(mo)s(dify)g(and)h(propagate)i(the)e
+(con)m(ten)m(ts)i(of)f(its)g(con)m(tributor)f(v)m(ersion.)330
+4441 y(In)e(the)h(follo)m(wing)h(three)e(paragraphs,)h(a)g(\\paten)m(t)
+h(license")g(is)e(an)m(y)h(express)f(agreemen)m(t)j(or)d(com-)330
+4551 y(mitmen)m(t,)g(ho)m(w)m(ev)m(er)g(denominated,)f(not)f(to)h
+(enforce)g(a)f(paten)m(t)i(\(suc)m(h)e(as)g(an)g(express)g(p)s
+(ermission)330 4661 y(to)32 b(practice)h(a)f(paten)m(t)h(or)e(co)m(v)m
+(enan)m(t)j(not)e(to)g(sue)f(for)h(paten)m(t)g(infringemen)m(t\).)45
+b(T)-8 b(o)32 b(\\gran)m(t")h(suc)m(h)330 4770 y(a)i(paten)m(t)h
+(license)f(to)h(a)f(part)m(y)g(means)f(to)i(mak)m(e)f(suc)m(h)g(an)f
+(agreemen)m(t)j(or)d(commitmen)m(t)i(not)f(to)330 4880
+y(enforce)c(a)g(paten)m(t)g(against)h(the)e(part)m(y)-8
+b(.)330 5011 y(If)36 b(y)m(ou)h(con)m(v)m(ey)h(a)f(co)m(v)m(ered)h(w)m
+(ork,)h(kno)m(wingly)e(relying)g(on)f(a)h(paten)m(t)h(license,)h(and)d
+(the)h(Corre-)330 5121 y(sp)s(onding)21 b(Source)h(of)h(the)g(w)m(ork)g
+(is)f(not)h(a)m(v)-5 b(ailable)25 b(for)e(an)m(y)m(one)g(to)h(cop)m(y)
+-8 b(,)25 b(free)e(of)g(c)m(harge)g(and)f(under)330 5230
+y(the)32 b(terms)f(of)h(this)f(License,)i(through)e(a)h(publicly)f(a)m
+(v)-5 b(ailable)34 b(net)m(w)m(ork)e(serv)m(er)g(or)g(other)g(readily)
+330 5340 y(accessible)38 b(means,)g(then)e(y)m(ou)h(m)m(ust)f(either)h
+(\(1\))h(cause)e(the)h(Corresp)s(onding)e(Source)h(to)h(b)s(e)f(so)p
+eop end
+%%Page: 9 11
+TeXDict begin 9 10 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2052 b(9)330 299 y(a)m(v)-5 b(ailable,)32 b(or)e(\(2\))g
+(arrange)g(to)h(depriv)m(e)e(y)m(ourself)h(of)g(the)g(b)s(ene\014t)e
+(of)i(the)g(paten)m(t)g(license)h(for)e(this)330 408
+y(particular)35 b(w)m(ork,)g(or)f(\(3\))i(arrange,)g(in)d(a)i(manner)e
+(consisten)m(t)j(with)e(the)g(requiremen)m(ts)h(of)f(this)330
+518 y(License,)j(to)f(extend)g(the)f(paten)m(t)h(license)h(to)f(do)m
+(wnstream)f(recipien)m(ts.)56 b(\\Kno)m(wingly)36 b(relying")330
+628 y(means)31 b(y)m(ou)h(ha)m(v)m(e)g(actual)h(kno)m(wledge)f(that,)g
+(but)f(for)g(the)g(paten)m(t)i(license,)f(y)m(our)g(con)m(v)m(eying)h
+(the)330 737 y(co)m(v)m(ered)40 b(w)m(ork)e(in)g(a)g(coun)m(try)-8
+b(,)41 b(or)e(y)m(our)f(recipien)m(t's)h(use)f(of)g(the)h(co)m(v)m
+(ered)g(w)m(ork)g(in)e(a)i(coun)m(try)-8 b(,)330 847
+y(w)m(ould)35 b(infringe)g(one)g(or)g(more)g(iden)m(ti\014able)h(paten)
+m(ts)g(in)f(that)h(coun)m(try)f(that)h(y)m(ou)f(ha)m(v)m(e)i(reason)330
+956 y(to)31 b(b)s(eliev)m(e)h(are)e(v)-5 b(alid.)330
+1121 y(If,)31 b(pursuan)m(t)e(to)j(or)e(in)h(connection)h(with)e(a)h
+(single)h(transaction)g(or)f(arrangemen)m(t,)h(y)m(ou)f(con)m(v)m(ey)-8
+b(,)330 1230 y(or)35 b(propagate)h(b)m(y)e(pro)s(curing)g(con)m(v)m(ey)
+m(ance)j(of,)g(a)e(co)m(v)m(ered)h(w)m(ork,)g(and)f(gran)m(t)g(a)g
+(paten)m(t)h(license)330 1340 y(to)c(some)f(of)h(the)f(parties)h
+(receiving)g(the)f(co)m(v)m(ered)i(w)m(ork)e(authorizing)h(them)f(to)h
+(use,)g(propagate,)330 1450 y(mo)s(dify)26 b(or)h(con)m(v)m(ey)h(a)g
+(sp)s(eci\014c)e(cop)m(y)i(of)f(the)g(co)m(v)m(ered)i(w)m(ork,)f(then)e
+(the)h(paten)m(t)h(license)g(y)m(ou)f(gran)m(t)330 1559
+y(is)j(automatically)k(extended)c(to)h(all)g(recipien)m(ts)h(of)e(the)h
+(co)m(v)m(ered)h(w)m(ork)e(and)g(w)m(orks)g(based)g(on)h(it.)330
+1724 y(A)d(paten)m(t)g(license)h(is)e(\\discriminatory")i(if)e(it)h(do)
+s(es)f(not)h(include)f(within)g(the)h(scop)s(e)f(of)h(its)g(co)m(v)m
+(er-)330 1833 y(age,)f(prohibits)c(the)h(exercise)h(of,)h(or)d(is)h
+(conditioned)h(on)f(the)g(non-exercise)h(of)f(one)g(or)g(more)g(of)g
+(the)330 1943 y(righ)m(ts)32 b(that)g(are)g(sp)s(eci\014cally)h(gran)m
+(ted)f(under)e(this)i(License.)45 b(Y)-8 b(ou)32 b(ma)m(y)g(not)g(con)m
+(v)m(ey)h(a)f(co)m(v)m(ered)330 2052 y(w)m(ork)d(if)g(y)m(ou)g(are)h(a)
+f(part)m(y)g(to)h(an)f(arrangemen)m(t)h(with)e(a)i(third)e(part)m(y)h
+(that)g(is)g(in)g(the)g(business)f(of)330 2162 y(distributing)i(soft)m
+(w)m(are,)i(under)d(whic)m(h)h(y)m(ou)h(mak)m(e)g(pa)m(ymen)m(t)g(to)g
+(the)g(third)f(part)m(y)g(based)g(on)h(the)330 2271 y(exten)m(t)f(of)g
+(y)m(our)f(activit)m(y)i(of)e(con)m(v)m(eying)i(the)e(w)m(ork,)h(and)e
+(under)g(whic)m(h)g(the)i(third)e(part)m(y)h(gran)m(ts,)330
+2381 y(to)35 b(an)m(y)g(of)f(the)h(parties)f(who)g(w)m(ould)g(receiv)m
+(e)i(the)f(co)m(v)m(ered)h(w)m(ork)e(from)g(y)m(ou,)i(a)f
+(discriminatory)330 2491 y(paten)m(t)g(license)h(\(a\))f(in)f
+(connection)h(with)f(copies)h(of)g(the)f(co)m(v)m(ered)i(w)m(ork)f(con)
+m(v)m(ey)m(ed)h(b)m(y)e(y)m(ou)h(\(or)330 2600 y(copies)k(made)e(from)h
+(those)g(copies\),)j(or)d(\(b\))g(primarily)f(for)h(and)f(in)h
+(connection)h(with)e(sp)s(eci\014c)330 2710 y(pro)s(ducts)32
+b(or)i(compilations)h(that)f(con)m(tain)h(the)f(co)m(v)m(ered)i(w)m
+(ork,)e(unless)f(y)m(ou)h(en)m(tered)h(in)m(to)f(that)330
+2819 y(arrangemen)m(t,)e(or)e(that)h(paten)m(t)g(license)h(w)m(as)e
+(gran)m(ted,)i(prior)d(to)j(28)f(Marc)m(h)g(2007.)330
+2984 y(Nothing)23 b(in)e(this)h(License)h(shall)f(b)s(e)f(construed)h
+(as)g(excluding)g(or)g(limiting)h(an)m(y)f(implied)g(license)h(or)330
+3093 y(other)k(defenses)f(to)h(infringemen)m(t)g(that)g(ma)m(y)g
+(otherwise)g(b)s(e)e(a)m(v)-5 b(ailable)29 b(to)e(y)m(ou)g(under)e
+(applicable)330 3203 y(paten)m(t)31 b(la)m(w.)154 3367
+y(12.)61 b(No)31 b(Surrender)d(of)i(Others')g(F)-8 b(reedom.)330
+3532 y(If)24 b(conditions)g(are)h(imp)s(osed)f(on)g(y)m(ou)g(\(whether)
+g(b)m(y)g(court)h(order,)g(agreemen)m(t)h(or)e(otherwise\))h(that)330
+3641 y(con)m(tradict)35 b(the)f(conditions)h(of)e(this)h(License,)h
+(they)f(do)g(not)g(excuse)g(y)m(ou)g(from)g(the)f(conditions)330
+3751 y(of)k(this)f(License.)59 b(If)36 b(y)m(ou)h(cannot)g(con)m(v)m
+(ey)h(a)e(co)m(v)m(ered)i(w)m(ork)f(so)g(as)f(to)h(satisfy)g(sim)m
+(ultaneously)330 3861 y(y)m(our)44 b(obligations)i(under)c(this)i
+(License)h(and)e(an)m(y)i(other)f(p)s(ertinen)m(t)g(obligations,)49
+b(then)44 b(as)h(a)330 3970 y(consequence)40 b(y)m(ou)f(ma)m(y)g(not)g
+(con)m(v)m(ey)i(it)e(at)h(all.)67 b(F)-8 b(or)40 b(example,)i(if)d(y)m
+(ou)g(agree)h(to)g(terms)e(that)330 4080 y(obligate)32
+b(y)m(ou)e(to)h(collect)h(a)f(ro)m(y)m(alt)m(y)h(for)e(further)e(con)m
+(v)m(eying)k(from)e(those)g(to)h(whom)e(y)m(ou)h(con)m(v)m(ey)330
+4189 y(the)h(Program,)h(the)f(only)g(w)m(a)m(y)h(y)m(ou)g(could)f
+(satisfy)g(b)s(oth)g(those)g(terms)g(and)g(this)g(License)g(w)m(ould)
+330 4299 y(b)s(e)f(to)h(refrain)f(en)m(tirely)h(from)f(con)m(v)m(eying)
+i(the)f(Program.)154 4463 y(13.)61 b(Use)31 b(with)f(the)g(GNU)h
+(A\013ero)g(General)h(Public)e(License.)330 4628 y(Not)m(withstanding)
+39 b(an)m(y)g(other)f(pro)m(vision)h(of)f(this)g(License,)k(y)m(ou)c
+(ha)m(v)m(e)i(p)s(ermission)d(to)i(link)f(or)330 4737
+y(com)m(bine)h(an)m(y)g(co)m(v)m(ered)i(w)m(ork)e(with)f(a)h(w)m(ork)g
+(licensed)g(under)e(v)m(ersion)i(3)g(of)g(the)g(GNU)g(A\013ero)330
+4847 y(General)29 b(Public)f(License)h(in)m(to)h(a)f(single)g(com)m
+(bined)f(w)m(ork,)h(and)f(to)h(con)m(v)m(ey)h(the)f(resulting)g(w)m
+(ork.)330 4956 y(The)f(terms)g(of)g(this)h(License)f(will)h(con)m(tin)m
+(ue)g(to)g(apply)f(to)h(the)g(part)f(whic)m(h)g(is)g(the)h(co)m(v)m
+(ered)h(w)m(ork,)330 5066 y(but)38 b(the)h(sp)s(ecial)g(requiremen)m
+(ts)f(of)h(the)g(GNU)g(A\013ero)g(General)g(Public)g(License,)i
+(section)f(13,)330 5176 y(concerning)31 b(in)m(teraction)h(through)e(a)
+h(net)m(w)m(ork)g(will)f(apply)g(to)i(the)e(com)m(bination)i(as)e(suc)m
+(h.)154 5340 y(14.)61 b(Revised)31 b(V)-8 b(ersions)30
+b(of)h(this)f(License.)p eop end
+%%Page: 10 12
+TeXDict begin 10 11 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2006 b(10)330 299 y(The)35 b(F)-8 b(ree)36 b(Soft)m(w)m(are)g
+(F)-8 b(oundation)36 b(ma)m(y)g(publish)d(revised)i(and/or)g(new)g(v)m
+(ersions)h(of)f(the)g(GNU)330 408 y(General)f(Public)f(License)g(from)g
+(time)g(to)h(time.)49 b(Suc)m(h)33 b(new)f(v)m(ersions)h(will)h(b)s(e)e
+(similar)h(in)g(spirit)330 518 y(to)e(the)g(presen)m(t)f(v)m(ersion,)h
+(but)f(ma)m(y)h(di\013er)f(in)g(detail)i(to)f(address)e(new)h(problems)
+g(or)g(concerns.)330 662 y(Eac)m(h)37 b(v)m(ersion)g(is)f(giv)m(en)h(a)
+g(distinguishing)e(v)m(ersion)i(n)m(um)m(b)s(er.)57 b(If)36
+b(the)g(Program)g(sp)s(eci\014es)g(that)330 772 y(a)31
+b(certain)h(n)m(um)m(b)s(ered)d(v)m(ersion)i(of)g(the)g(GNU)g(General)h
+(Public)e(License)h(\\or)g(an)m(y)g(later)h(v)m(ersion")330
+881 y(applies)h(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
+(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+991 y(n)m(um)m(b)s(ered)h(v)m(ersion)h(or)g(of)g(an)m(y)g(later)h(v)m
+(ersion)g(published)d(b)m(y)i(the)g(F)-8 b(ree)35 b(Soft)m(w)m(are)g(F)
+-8 b(oundation.)330 1101 y(If)28 b(the)h(Program)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)h(the)g(GNU)g(General)h
+(Public)e(License,)330 1210 y(y)m(ou)j(ma)m(y)g(c)m(ho)s(ose)g(an)m(y)g
+(v)m(ersion)g(ev)m(er)g(published)d(b)m(y)j(the)f(F)-8
+b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation.)330 1354
+y(If)39 b(the)h(Program)g(sp)s(eci\014es)f(that)h(a)g(pro)m(xy)g(can)g
+(decide)g(whic)m(h)f(future)g(v)m(ersions)h(of)f(the)h(GNU)330
+1464 y(General)34 b(Public)e(License)i(can)f(b)s(e)f(used,)h(that)h
+(pro)m(xy's)e(public)h(statemen)m(t)h(of)f(acceptance)j(of)d(a)330
+1573 y(v)m(ersion)e(p)s(ermanen)m(tly)f(authorizes)h(y)m(ou)g(to)g(c)m
+(ho)s(ose)g(that)g(v)m(ersion)g(for)f(the)h(Program.)330
+1718 y(Later)37 b(license)g(v)m(ersions)f(ma)m(y)h(giv)m(e)g(y)m(ou)g
+(additional)g(or)f(di\013eren)m(t)h(p)s(ermissions.)56
+b(Ho)m(w)m(ev)m(er,)40 b(no)330 1827 y(additional)25
+b(obligations)i(are)e(imp)s(osed)f(on)g(an)m(y)h(author)f(or)h(cop)m
+(yrigh)m(t)h(holder)e(as)h(a)g(result)f(of)h(y)m(our)330
+1937 y(c)m(ho)s(osing)31 b(to)g(follo)m(w)h(a)f(later)g(v)m(ersion.)154
+2081 y(15.)61 b(Disclaimer)32 b(of)f(W)-8 b(arran)m(t)m(y)g(.)330
+2225 y(THERE)47 b(IS)f(NO)h(W)-10 b(ARRANTY)48 b(F)m(OR)f(THE)g(PR)m
+(OGRAM,)h(TO)f(THE)g(EXTENT)f(PER-)330 2335 y(MITTED)g(BY)i(APPLICABLE)
+e(LA)-10 b(W.)47 b(EX)m(CEPT)f(WHEN)i(OTHER)-10 b(WISE)45
+b(ST)-8 b(A)g(TED)47 b(IN)330 2444 y(WRITING)34 b(THE)f(COPYRIGHT)g
+(HOLDERS)g(AND/OR)i(OTHER)e(P)-8 b(AR)g(TIES)33 b(PR)m(O)m(VIDE)330
+2554 y(THE)d(PR)m(OGRAM)i(\\AS)e(IS")h(WITHOUT)f(W)-10
+b(ARRANTY)31 b(OF)g(ANY)g(KIND,)g(EITHER)f(EX-)330 2663
+y(PRESSED)k(OR)h(IMPLIED,)g(INCLUDING,)g(BUT)h(NOT)e(LIMITED)h(TO,)f
+(THE)h(IMPLIED)330 2773 y(W)-10 b(ARRANTIES)38 b(OF)g(MER)m(CHANT)-8
+b(ABILITY)39 b(AND)g(FITNESS)e(F)m(OR)i(A)f(P)-8 b(AR)g(TICULAR)330
+2883 y(PURPOSE.)39 b(THE)h(ENTIRE)f(RISK)g(AS)h(TO)f(THE)g(QUALITY)h
+(AND)h(PERF)m(ORMANCE)330 2992 y(OF)29 b(THE)g(PR)m(OGRAM)h(IS)f(WITH)g
+(YOU.)h(SHOULD)f(THE)g(PR)m(OGRAM)h(PR)m(O)m(VE)g(DEFEC-)330
+3102 y(TIVE,)24 b(YOU)g(ASSUME)f(THE)h(COST)f(OF)h(ALL)g(NECESSAR)-8
+b(Y)23 b(SER)-10 b(VICING,)23 b(REP)-8 b(AIR)24 b(OR)330
+3211 y(CORRECTION.)154 3356 y(16.)61 b(Limitation)32
+b(of)e(Liabilit)m(y)-8 b(.)330 3500 y(IN)26 b(NO)g(EVENT)g(UNLESS)f
+(REQUIRED)h(BY)h(APPLICABLE)f(LA)-10 b(W)26 b(OR)g(A)m(GREED)h(TO)f(IN)
+330 3609 y(WRITING)37 b(WILL)f(ANY)i(COPYRIGHT)e(HOLDER,)h(OR)f(ANY)h
+(OTHER)f(P)-8 b(AR)g(TY)38 b(WHO)330 3719 y(MODIFIES)33
+b(AND/OR)h(CONVEYS)e(THE)h(PR)m(OGRAM)h(AS)e(PERMITTED)h(ABO)m(VE,)h
+(BE)330 3829 y(LIABLE)d(TO)e(YOU)i(F)m(OR)g(D)m(AMA)m(GES,)i(INCLUDING)
+e(ANY)g(GENERAL,)g(SPECIAL,)f(IN-)330 3938 y(CIDENT)-8
+b(AL)32 b(OR)f(CONSEQUENTIAL)f(D)m(AMA)m(GES)j(ARISING)f(OUT)f(OF)h
+(THE)f(USE)g(OR)330 4048 y(INABILITY)47 b(TO)f(USE)g(THE)g(PR)m(OGRAM)i
+(\(INCLUDING)f(BUT)g(NOT)f(LIMITED)h(TO)330 4157 y(LOSS)28
+b(OF)h(D)m(A)-8 b(T)g(A)31 b(OR)e(D)m(A)-8 b(T)g(A)31
+b(BEING)f(RENDERED)f(INA)m(CCURA)-8 b(TE)30 b(OR)e(LOSSES)g(SUS-)330
+4267 y(T)-8 b(AINED)43 b(BY)g(YOU)f(OR)g(THIRD)h(P)-8
+b(AR)g(TIES)42 b(OR)g(A)g(F)-10 b(AILURE)43 b(OF)f(THE)g(PR)m(OGRAM)330
+4376 y(TO)30 b(OPERA)-8 b(TE)29 b(WITH)i(ANY)f(OTHER)g(PR)m(OGRAMS\),)h
+(EVEN)f(IF)h(SUCH)e(HOLDER)h(OR)330 4486 y(OTHER)36 b(P)-8
+b(AR)g(TY)37 b(HAS)g(BEEN)f(AD)m(VISED)i(OF)f(THE)f(POSSIBILITY)f(OF)h
+(SUCH)g(D)m(AM-)330 4596 y(A)m(GES.)154 4740 y(17.)61
+b(In)m(terpretation)31 b(of)g(Sections)g(15)g(and)f(16.)330
+4884 y(If)d(the)h(disclaimer)g(of)f(w)m(arran)m(t)m(y)i(and)d
+(limitation)k(of)d(liabilit)m(y)j(pro)m(vided)d(ab)s(o)m(v)m(e)h
+(cannot)g(b)s(e)f(giv)m(en)330 4994 y(lo)s(cal)35 b(legal)h(e\013ect)g
+(according)f(to)f(their)h(terms,)g(reviewing)f(courts)g(shall)h(apply)e
+(lo)s(cal)j(la)m(w)e(that)330 5103 y(most)j(closely)i(appro)m(ximates)f
+(an)f(absolute)g(w)m(aiv)m(er)i(of)e(all)g(civil)i(liabilit)m(y)f(in)f
+(connection)h(with)330 5213 y(the)d(Program,)i(unless)d(a)h(w)m(arran)m
+(t)m(y)h(or)f(assumption)g(of)g(liabilit)m(y)i(accompanies)f(a)g(cop)m
+(y)g(of)f(the)330 5322 y(Program)c(in)f(return)f(for)h(a)h(fee.)p
+eop end
+%%Page: 11 13
+TeXDict begin 11 12 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h
+(LICENSE)2006 b(11)150 299 y Fu(END)45 b(OF)g(TERMS)f(AND)h(CONDITIONS)
+150 556 y(Ho)l(w)h(to)f(Apply)f(These)h(T)-11 b(erms)45
+b(to)g(Y)-11 b(our)44 b(New)i(Programs)275 716 y Fv(If)38
+b(y)m(ou)i(dev)m(elop)g(a)f(new)g(program,)j(and)c(y)m(ou)i(w)m(an)m(t)
+g(it)f(to)h(b)s(e)f(of)g(the)h(greatest)h(p)s(ossible)d(use)h(to)150
+825 y(the)i(public,)i(the)f(b)s(est)e(w)m(a)m(y)i(to)g(ac)m(hiev)m(e)h
+(this)e(is)g(to)h(mak)m(e)g(it)g(free)f(soft)m(w)m(are)h(whic)m(h)f(ev)
+m(ery)m(one)i(can)150 935 y(redistribute)30 b(and)g(c)m(hange)h(under)e
+(these)i(terms.)275 1069 y(T)-8 b(o)29 b(do)h(so,)g(attac)m(h)h(the)f
+(follo)m(wing)h(notices)f(to)h(the)e(program.)40 b(It)30
+b(is)g(safest)g(to)g(attac)m(h)h(them)f(to)g(the)150
+1179 y(start)38 b(of)g(eac)m(h)g(source)g(\014le)f(to)h(most)g
+(e\013ectiv)m(ely)i(state)f(the)f(exclusion)g(of)f(w)m(arran)m(t)m(y;)
+42 b(and)37 b(eac)m(h)i(\014le)150 1289 y(should)29 b(ha)m(v)m(e)j(at)f
+(least)h(the)e(\\cop)m(yrigh)m(t")j(line)e(and)e(a)i(p)s(oin)m(ter)g
+(to)g(where)f(the)g(full)g(notice)i(is)e(found.)390 1401
+y Fq(one)40 b(line)g(to)g(give)g(the)g(program's)h(name)f(and)g(a)g
+(brief)g(idea)g(of)g(what)g(it)g(does.)390 1488 y Fp(Copyright)h(\(C\))
+f Fq(year)49 b(name)40 b(of)g(author)390 1662 y Fp(This)g(program)h(is)
+f(free)g(software:)h(you)f(can)g(redistribute)i(it)e(and/or)g(modify)
+390 1749 y(it)g(under)g(the)g(terms)g(of)g(the)g(GNU)g(General)h
+(Public)f(License)h(as)f(published)h(by)390 1836 y(the)f(Free)g
+(Software)h(Foundation,)h(either)e(version)h(3)f(of)f(the)h(License,)h
+(or)f(\(at)390 1924 y(your)g(option\))h(any)f(later)g(version.)390
+2098 y(This)g(program)h(is)f(distributed)h(in)f(the)g(hope)g(that)g(it)
+g(will)g(be)g(useful,)h(but)390 2185 y(WITHOUT)g(ANY)f(WARRANTY;)h
+(without)g(even)f(the)g(implied)h(warranty)g(of)390 2272
+y(MERCHANTABILITY)i(or)c(FITNESS)i(FOR)f(A)g(PARTICULAR)h(PURPOSE.)80
+b(See)40 b(the)g(GNU)390 2359 y(General)h(Public)f(License)h(for)f
+(more)g(details.)390 2534 y(You)g(should)g(have)h(received)g(a)e(copy)h
+(of)g(the)g(GNU)g(General)h(Public)f(License)390 2621
+y(along)g(with)g(this)h(program.)80 b(If)40 b(not,)g(see)g
+(http://www.gnu.org/licenses/.)275 2756 y Fv(Also)31
+b(add)e(information)i(on)f(ho)m(w)h(to)g(con)m(tact)i(y)m(ou)d(b)m(y)g
+(electronic)j(and)d(pap)s(er)f(mail.)275 2890 y(If)e(the)i(program)f
+(do)s(es)f(terminal)i(in)m(teraction,)i(mak)m(e)e(it)g(output)f(a)g
+(short)g(notice)i(lik)m(e)f(this)f(when)f(it)150 3000
+y(starts)k(in)f(an)g(in)m(teractiv)m(e)j(mo)s(de:)390
+3112 y Fq(program)49 b Fp(Copyright)42 b(\(C\))e Fq(year)48
+b(name)41 b(of)e(author)390 3199 y Fp(This)h(program)h(comes)f(with)g
+(ABSOLUTELY)i(NO)e(WARRANTY;)h(for)f(details)h(type)f(`show)g(w'.)390
+3286 y(This)g(is)g(free)g(software,)h(and)f(you)g(are)g(welcome)h(to)e
+(redistribute)j(it)390 3373 y(under)e(certain)h(conditions;)h(type)e
+(`show)g(c')g(for)g(details.)275 3508 y Fv(The)27 b(h)m(yp)s(othetical)
+i(commands)f(`)p Fr(show)h(w)p Fv(')f(and)f(`)p Fr(show)j(c)p
+Fv(')d(should)g(sho)m(w)h(the)g(appropriate)g(parts)g(of)150
+3617 y(the)i(General)h(Public)f(License.)41 b(Of)30 b(course,)h(y)m
+(our)f(program's)g(commands)f(migh)m(t)i(b)s(e)f(di\013eren)m(t;)h(for)
+f(a)150 3727 y(GUI)h(in)m(terface,)h(y)m(ou)f(w)m(ould)f(use)g(an)g
+(\\ab)s(out)h(b)s(o)m(x".)275 3861 y(Y)-8 b(ou)34 b(should)f(also)i
+(get)g(y)m(our)e(emplo)m(y)m(er)i(\(if)g(y)m(ou)f(w)m(ork)g(as)g(a)g
+(programmer\))g(or)g(sc)m(ho)s(ol,)i(if)d(an)m(y)-8 b(,)36
+b(to)150 3971 y(sign)d(a)g(\\cop)m(yrigh)m(t)h(disclaimer")g(for)e(the)
+h(program,)g(if)f(necessary)-8 b(.)48 b(F)-8 b(or)34
+b(more)e(information)h(on)g(this,)150 4081 y(and)d(ho)m(w)g(to)h(apply)
+f(and)g(follo)m(w)i(the)e(GNU)h(GPL,)g(see)g Fr
+(http://www.gnu.org/licen)o(ses)o(/)p Fv(.)275 4215 y(The)44
+b(GNU)h(General)g(Public)f(License)i(do)s(es)e(not)h(p)s(ermit)e
+(incorp)s(orating)i(y)m(our)g(program)f(in)m(to)150 4325
+y(proprietary)35 b(programs.)57 b(If)35 b(y)m(our)h(program)f(is)h(a)g
+(subroutine)f(library)-8 b(,)37 b(y)m(ou)f(ma)m(y)h(consider)e(it)i
+(more)150 4434 y(useful)30 b(to)i(p)s(ermit)e(linking)i(proprietary)e
+(applications)i(with)f(the)g(library)-8 b(.)43 b(If)31
+b(this)g(is)g(what)g(y)m(ou)g(w)m(an)m(t)150 4544 y(to)f(do,)g(use)f
+(the)g(GNU)h(Lesser)g(General)g(Public)f(License)h(instead)g(of)f(this)
+h(License.)40 b(But)30 b(\014rst,)f(please)150 4653 y(read)h
+Fr(http://www.gnu.org/philos)o(ophy)o(/why)o(-no)o(t-lg)o(pl.h)o(tml)o
+Fv(.)p eop end
+%%Page: 12 14
+TeXDict begin 12 13 bop 150 -116 a Fv(Con)m(tributors)30
+b(to)h(GNU)g Fr(gperf)e Fv(Utilit)m(y)2094 b(12)150 299
+y Fs(Con)l(tributors)50 b(to)j(GNU)h Fo(gperf)f Fs(Utilit)l(y)225
+533 y Ft(\017)60 b Fv(The)45 b(GNU)h Fr(gperf)d Fv(p)s(erfect)j(hash)e
+(function)h(generator)i(utilit)m(y)f(w)m(as)g(written)f(in)g(GNU)h(C)p
+Fr(++)330 643 y Fv(b)m(y)e(Douglas)i(C.)f(Sc)m(hmidt.)83
+b(The)44 b(general)i(idea)f(for)f(the)h(p)s(erfect)g(hash)e(function)i
+(generator)330 752 y(w)m(as)34 b(inspired)e(b)m(y)h(Keith)g(Bostic's)j
+(algorithm)e(written)f(in)g(C,)g(and)g(distributed)f(to)i(net.sources)
+330 862 y(around)42 b(1984.)79 b(The)42 b(curren)m(t)g(program)h(is)g
+(a)g(hea)m(vily)h(mo)s(di\014ed,)g(enhanced,)i(and)c(extended)330
+971 y(implemen)m(tation)d(of)e(Keith's)g(basic)h(idea,)h(created)f(at)g
+(the)f(Univ)m(ersit)m(y)h(of)g(California,)h(Irvine.)330
+1081 y(Bugs,)31 b(patc)m(hes,)g(and)f(suggestions)h(should)f(b)s(e)f
+(rep)s(orted)h(to)h Fr(<bug-gnu-gperf@gnu.org>)p Fv(.)225
+1215 y Ft(\017)60 b Fv(Sp)s(ecial)33 b(thanks)g(is)g(extended)g(to)h
+(Mic)m(hael)h(Tiemann)e(and)g(Doug)h(Lea,)g(for)f(pro)m(viding)g(a)h
+(useful)330 1325 y(compiler,)d(and)f(for)g(giving)h(me)g(a)g(forum)e
+(to)i(exhibit)g(m)m(y)f(creation.)330 1460 y(In)22 b(addition,)i(Adam)f
+(de)f(Bo)s(or)h(and)f(Nels)i(Olson)e(pro)m(vided)g(man)m(y)h(tips)f
+(and)g(insigh)m(ts)h(that)g(greatly)330 1569 y(help)s(ed)29
+b(impro)m(v)m(e)j(the)e(qualit)m(y)i(and)e(functionalit)m(y)h(of)g
+Fr(gperf)p Fv(.)225 1704 y Ft(\017)60 b Fv(Bruno)26 b(Haible)i
+(enhanced)f(and)f(optimized)i(the)f(searc)m(h)h(algorithm.)41
+b(He)27 b(also)h(rewrote)g(the)f(input)330 1813 y(routines)j(and)g(the)
+h(output)f(routines)g(for)g(b)s(etter)g(reliabilit)m(y)-8
+b(,)33 b(and)d(added)g(a)h(testsuite.)p eop end
+%%Page: 13 15
+TeXDict begin 13 14 bop 150 -116 a Fv(Chapter)30 b(1:)41
+b(In)m(tro)s(duction)2546 b(13)150 299 y Fs(1)80 b(In)l(tro)t(duction)
+275 533 y Fr(gperf)31 b Fv(is)j(a)f(p)s(erfect)h(hash)e(function)h
+(generator)i(written)e(in)g(C)p Fr(++)p Fv(.)49 b(It)33
+b(transforms)g(an)g Fn(n)f Fv(elemen)m(t)150 643 y(user-sp)s(eci\014ed)
+k(k)m(eyw)m(ord)i(set)g Fn(W)49 b Fv(in)m(to)39 b(a)e(p)s(erfect)h
+(hash)e(function)h Fn(F)p Fv(.)h Fn(F)44 b Fv(uniquely)37
+b(maps)g(k)m(eyw)m(ords)150 752 y(in)e Fn(W)47 b Fv(on)m(to)36
+b(the)f(range)g(0..)p Fn(k)p Fv(,)j(where)c Fn(k)40 b
+Fr(>)p Fv(=)35 b Fn(n-1)p Fv(.)54 b(If)35 b Fn(k)40 b
+Fv(=)35 b Fn(n-1)42 b Fv(then)35 b Fn(F)42 b Fv(is)35
+b(a)g Fm(minimal)46 b Fv(p)s(erfect)35 b(hash)150 862
+y(function.)68 b Fr(gperf)39 b Fv(generates)i(a)f(0..)p
+Fn(k)46 b Fv(elemen)m(t)41 b(static)g(lo)s(okup)f(table)g(and)f(a)i
+(pair)e(of)h(C)f(functions.)150 971 y(These)34 b(functions)g(determine)
+h(whether)e(a)i(giv)m(en)g(c)m(haracter)h(string)f Fn(s)j
+Fv(o)s(ccurs)c(in)g Fn(W)p Fv(,)h(using)e(at)j(most)150
+1081 y(one)31 b(prob)s(e)e(in)m(to)i(the)g(lo)s(okup)f(table.)275
+1215 y Fr(gperf)22 b Fv(curren)m(tly)h(generates)j(the)d(reserv)m(ed)h
+(k)m(eyw)m(ord)g(recognizer)i(for)d(lexical)j(analyzers)e(in)g(sev)m
+(eral)150 1325 y(pro)s(duction)30 b(and)g(researc)m(h)h(compilers)g
+(and)g(language)h(pro)s(cessing)e(to)s(ols,)i(including)e(GNU)i(C,)e
+(GNU)150 1435 y(C)p Fr(++)p Fv(,)24 b(GNU)f(Ja)m(v)-5
+b(a,)26 b(GNU)d(P)m(ascal,)j(GNU)e(Mo)s(dula)f(3,)i(and)d(GNU)h(inden)m
+(t.)38 b(Complete)24 b(C)p Fr(++)e Fv(source)h(co)s(de)150
+1544 y(for)42 b Fr(gperf)f Fv(is)h(a)m(v)-5 b(ailable)44
+b(from)e Fr(http://ftp.gnu.org/pub/g)o(nu/g)o(perf)o(/)p
+Fv(.)70 b(A)42 b(pap)s(er)f(describing)150 1654 y Fr(gperf)p
+Fv('s)d(design)i(and)f(implemen)m(tation)j(in)d(greater)i(detail)g(is)f
+(a)m(v)-5 b(ailable)42 b(in)e(the)g(Second)f(USENIX)150
+1763 y(C)p Fr(++)29 b Fv(Conference)g(pro)s(ceedings)h(or)g(from)f
+Fr(http://www.cs.wustl.edu)o(/~sc)o(hmid)o(t/r)o(esum)o(e.ht)o(ml)p
+Fv(.)p eop end
+%%Page: 14 16
+TeXDict begin 14 15 bop 150 -116 a Fv(Chapter)30 b(2:)41
+b(Static)32 b(searc)m(h)f(structures)e(and)h(GNU)h Fr(gperf)1425
+b Fv(14)150 299 y Fs(2)80 b(Static)53 b(searc)l(h)g(structures)e(and)j
+(GNU)f Fo(gperf)275 533 y Fv(A)24 b Fn(static)i(searc)m(h)f(structure)k
+Fv(is)c(an)f(Abstract)h(Data)i(T)m(yp)s(e)c(with)i(certain)g(fundamen)m
+(tal)f(op)s(erations,)150 643 y(e.g.,)32 b Fm(initialize)p
+Fv(,)g Fm(insert)p Fv(,)f(and)f Fm(r)-5 b(etrieve)p Fv(.)42
+b(Conceptually)-8 b(,)32 b(all)g(insertions)f(o)s(ccur)f(b)s(efore)h
+(an)m(y)g(retriev)-5 b(als.)150 752 y(In)20 b(practice,)25
+b Fr(gperf)19 b Fv(generates)k(a)e Fm(static)27 b Fv(arra)m(y)22
+b(con)m(taining)g(searc)m(h)g(set)f(k)m(eyw)m(ords)h(and)e(an)m(y)h
+(asso)s(ciated)150 862 y(attributes)37 b(sp)s(eci\014ed)f(b)m(y)h(the)f
+(user.)59 b(Th)m(us,)37 b(there)g(is)g(essen)m(tially)h(no)f
+(execution-time)i(cost)e(for)g(the)150 971 y(insertions.)j(It)27
+b(is)g(a)g(useful)g(data)g(structure)g(for)g(represen)m(ting)g
+Fm(static)j(se)-5 b(ar)g(ch)32 b(sets)p Fv(.)40 b(Static)28
+b(searc)m(h)g(sets)150 1081 y(o)s(ccur)c(frequen)m(tly)h(in)f(soft)m(w)
+m(are)i(system)e(applications.)40 b(T)m(ypical)25 b(static)h(searc)m(h)
+f(sets)g(include)f(compiler)150 1191 y(reserv)m(ed)42
+b(w)m(ords,)j(assem)m(bler)e(instruction)f(op)s(co)s(des,)j(and)c
+(built-in)h(shell)h(in)m(terpreter)f(commands.)150 1300
+y(Searc)m(h)g(set)g(mem)m(b)s(ers,)h(called)g Fn(k)m(eyw)m(ords)p
+Fv(,)i(are)c(inserted)h(in)m(to)g(the)g(structure)f(only)g(once,)k
+(usually)150 1410 y(during)29 b(program)h(initialization,)k(and)c(are)g
+(not)h(generally)h(mo)s(di\014ed)d(at)i(run-time.)275
+1544 y(Numerous)c(static)i(searc)m(h)g(structure)e(implemen)m(tations)i
+(exist,)h(e.g.,)f(arra)m(ys,)g(link)m(ed)g(lists,)g(binary)150
+1654 y(searc)m(h)45 b(trees,)j(digital)d(searc)m(h)g(tries,)j(and)43
+b(hash)g(tables.)83 b(Di\013eren)m(t)45 b(approac)m(hes)g(o\013er)f
+(trade-o\013s)150 1763 y(b)s(et)m(w)m(een)e(space)h(utilization)g(and)f
+(searc)m(h)g(time)g(e\016ciency)-8 b(.)77 b(F)-8 b(or)42
+b(example,)k(an)41 b Fn(n)h Fv(elemen)m(t)h(sorted)150
+1873 y(arra)m(y)d(is)g(space)h(e\016cien)m(t,)i(though)d(the)g(a)m(v)m
+(erage-case)k(time)c(complexit)m(y)i(for)e(retriev)-5
+b(al)41 b(op)s(erations)150 1983 y(using)31 b(binary)f(searc)m(h)i(is)f
+(prop)s(ortional)g(to)g(log)i Fn(n)p Fv(.)42 b(Con)m(v)m(ersely)-8
+b(,)33 b(hash)d(table)i(implemen)m(tations)h(often)150
+2092 y(lo)s(cate)27 b(a)f(table)g(en)m(try)g(in)f(constan)m(t)i(time,)g
+(but)e(t)m(ypically)i(imp)s(ose)e(additional)i(memory)e(o)m(v)m(erhead)
+i(and)150 2202 y(exhibit)k(p)s(o)s(or)e(w)m(orst)i(case)g(p)s
+(erformance.)275 2336 y Fm(Minimal)26 b(p)-5 b(erfe)g(ct)28
+b(hash)f(functions)32 b Fv(pro)m(vide)24 b(an)f(optimal)i(solution)f
+(for)f(a)h(particular)g(class)h(of)e(static)150 2446
+y(searc)m(h)31 b(sets.)41 b(A)31 b(minimal)f(p)s(erfect)g(hash)g
+(function)g(is)h(de\014ned)e(b)m(y)h(t)m(w)m(o)i(prop)s(erties:)225
+2580 y Ft(\017)60 b Fv(It)34 b(allo)m(ws)i(k)m(eyw)m(ord)f(recognition)
+h(in)e(a)h(static)h(searc)m(h)f(set)g(using)f(at)h(most)g
+Fm(one)41 b Fv(prob)s(e)33 b(in)m(to)j(the)330 2690 y(hash)30
+b(table.)41 b(This)30 b(represen)m(ts)g(the)h(\\p)s(erfect")g(prop)s
+(ert)m(y)-8 b(.)225 2824 y Ft(\017)60 b Fv(The)35 b(actual)j(memory)e
+(allo)s(cated)i(to)e(store)h(the)f(k)m(eyw)m(ords)h(is)f(precisely)g
+(large)h(enough)f(for)g(the)330 2934 y(k)m(eyw)m(ord)31
+b(set,)g(and)f Fm(no)j(lar)-5 b(ger)p Fv(.)42 b(This)29
+b(is)i(the)f(\\minimal")i(prop)s(ert)m(y)-8 b(.)275 3093
+y(F)g(or)38 b(most)g(applications)h(it)f(is)g(far)f(easier)i(to)f
+(generate)h Fm(p)-5 b(erfe)g(ct)47 b Fv(hash)37 b(functions)g(than)h
+Fm(minimal)150 3203 y(p)-5 b(erfe)g(ct)47 b Fv(hash)36
+b(functions.)60 b(Moreo)m(v)m(er,)41 b(non-minimal)c(p)s(erfect)g(hash)
+f(functions)g(frequen)m(tly)i(execute)150 3313 y(faster)44
+b(than)g(minimal)g(ones)g(in)f(practice.)83 b(This)43
+b(phenomena)g(o)s(ccurs)g(since)h(searc)m(hing)h(a)f(sparse)150
+3422 y(k)m(eyw)m(ord)34 b(table)g(increases)g(the)g(probabilit)m(y)f
+(of)h(lo)s(cating)h(a)e(\\n)m(ull")i(en)m(try)-8 b(,)35
+b(thereb)m(y)e(reducing)g(string)150 3532 y(comparisons.)56
+b Fr(gperf)p Fv('s)34 b(default)h(b)s(eha)m(vior)g(generates)i
+Fm(ne)-5 b(ar-minimal)47 b Fv(p)s(erfect)35 b(hash)f(functions)h(for)
+150 3641 y(k)m(eyw)m(ord)40 b(sets.)68 b(Ho)m(w)m(ev)m(er,)44
+b Fr(gperf)39 b Fv(pro)m(vides)g(man)m(y)h(options)f(that)h(p)s(ermit)f
+(user)g(con)m(trol)i(o)m(v)m(er)g(the)150 3751 y(degree)31
+b(of)g(minimalit)m(y)g(and)f(p)s(erfection.)275 3885
+y(Static)37 b(searc)m(h)f(sets)g(often)g(exhibit)g(relativ)m(e)i
+(stabilit)m(y)f(o)m(v)m(er)g(time.)58 b(F)-8 b(or)36
+b(example,)i(Ada's)e(63)h(re-)150 3995 y(serv)m(ed)31
+b(w)m(ords)f(ha)m(v)m(e)i(remained)e(constan)m(t)i(for)f(nearly)g(a)g
+(decade.)42 b(It)31 b(is)g(therefore)g(frequen)m(tly)g(w)m(orth-)150
+4105 y(while)22 b(to)h(exp)s(end)e(concerted)i(e\013ort)g(building)e
+(an)h(optimal)i(searc)m(h)e(structure)g Fm(onc)-5 b(e)p
+Fv(,)25 b(if)d(it)g(subsequen)m(tly)150 4214 y(receiv)m(es)j(hea)m(vy)f
+(use)e(m)m(ultiple)i(times.)39 b Fr(gperf)22 b Fv(remo)m(v)m(es)i(the)f
+(drudgery)f(asso)s(ciated)j(with)d(constructing)150 4324
+y(time-)38 b(and)f(space-e\016cien)m(t)j(searc)m(h)d(structures)g(b)m
+(y)g(hand.)61 b(It)37 b(has)g(pro)m(v)m(en)h(a)f(useful)g(and)f
+(practical)150 4433 y(to)s(ol)29 b(for)f(serious)g(programming)g(pro)5
+b(jects.)40 b(Output)27 b(from)h Fr(gperf)e Fv(is)i(curren)m(tly)h
+(used)e(in)h(sev)m(eral)h(pro-)150 4543 y(duction)d(and)e(researc)m(h)j
+(compilers,)g(including)e(GNU)h(C,)g(GNU)g(C)p Fr(++)p
+Fv(,)g(GNU)g(Ja)m(v)-5 b(a,)28 b(GNU)e(P)m(ascal,)j(and)150
+4653 y(GNU)38 b(Mo)s(dula)f(3.)63 b(The)36 b(latter)j(t)m(w)m(o)g
+(compilers)f(are)f(not)h(y)m(et)h(part)e(of)g(the)h(o\016cial)h(GNU)f
+(distribu-)150 4762 y(tion.)51 b(Eac)m(h)34 b(compiler)g(utilizes)h
+Fr(gperf)d Fv(to)i(automatically)i(generate)f(static)g(searc)m(h)f
+(structures)f(that)150 4872 y(e\016cien)m(tly)f(iden)m(tify)f(their)f
+(resp)s(ectiv)m(e)i(reserv)m(ed)e(k)m(eyw)m(ords.)p eop
+end
+%%Page: 15 17
+TeXDict begin 15 16 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(15)150 299 y Fs(3)80 b(High-Lev)l(el)52 b(Description)f(of)j(GNU)g
+Fo(gperf)275 555 y Fv(The)29 b(p)s(erfect)h(hash)g(function)g
+(generator)h Fr(gperf)e Fv(reads)h(a)h(set)g(of)f(\\k)m(eyw)m(ords")i
+(from)d(an)i(input)e(\014le)150 664 y(\(or)34 b(from)g(the)g(standard)f
+(input)g(b)m(y)h(default\).)52 b(It)34 b(attempts)h(to)f(deriv)m(e)h(a)
+f(p)s(erfect)g(hashing)f(function)150 774 y(that)k(recognizes)i(a)e
+(mem)m(b)s(er)f(of)h(the)g Fn(static)h(k)m(eyw)m(ord)f(set)j
+Fv(with)c(at)i(most)f(a)g(single)g(prob)s(e)f(in)m(to)i(the)150
+884 y(lo)s(okup)26 b(table.)41 b(If)26 b Fr(gperf)f Fv(succeeds)i(in)g
+(generating)h(suc)m(h)e(a)h(function)f(it)i(pro)s(duces)d(a)i(pair)g
+(of)f(C)h(source)150 993 y(co)s(de)39 b(routines)g(that)h(p)s(erform)d
+(hashing)i(and)f(table)i(lo)s(okup)e(recognition.)69
+b(All)39 b(generated)h(C)f(co)s(de)150 1103 y(is)f(directed)g(to)g(the)
+g(standard)f(output.)62 b(Command-line)38 b(options)g(describ)s(ed)e(b)
+s(elo)m(w)i(allo)m(w)h(y)m(ou)f(to)150 1212 y(mo)s(dify)30
+b(the)g(input)g(and)f(output)h(format)h(to)g Fr(gperf)p
+Fv(.)275 1354 y(By)23 b(default,)i Fr(gperf)d Fv(attempts)i(to)g(pro)s
+(duce)e(time-e\016cien)m(t)k(co)s(de,)f(with)e(less)h(emphasis)e(on)h
+(e\016cien)m(t)150 1464 y(space)31 b(utilization.)43
+b(Ho)m(w)m(ev)m(er,)33 b(sev)m(eral)e(options)g(exist)g(that)g(p)s
+(ermit)f(trading-o\013)h(execution)h(time)f(for)150 1573
+y(storage)i(space)f(and)g(vice)g(v)m(ersa.)46 b(In)31
+b(particular,)h(expanding)f(the)h(generated)h(table)g(size)f(pro)s
+(duces)f(a)150 1683 y(sparse)26 b(searc)m(h)g(structure,)h(generally)g
+(yielding)f(faster)h(searc)m(hes.)40 b(Con)m(v)m(ersely)-8
+b(,)28 b(y)m(ou)f(can)f(direct)g Fr(gperf)150 1793 y
+Fv(to)21 b(utilize)h(a)f(C)f Fr(switch)f Fv(statemen)m(t)k(sc)m(heme)e
+(that)g(minimizes)g(data)g(space)g(storage)h(size.)39
+b(F)-8 b(urthermore,)150 1902 y(using)40 b(a)g(C)g Fr(switch)e
+Fv(ma)m(y)i(actually)i(sp)s(eed)d(up)g(the)h(k)m(eyw)m(ord)h(retriev)-5
+b(al)41 b(time)g(somewhat.)70 b(Actual)150 2012 y(results)30
+b(dep)s(end)f(on)h(y)m(our)g(C)g(compiler,)i(of)e(course.)275
+2154 y(In)44 b(general,)50 b Fr(gperf)44 b Fv(assigns)h(v)-5
+b(alues)46 b(to)g(the)f(b)m(ytes)h(it)g(is)f(using)g(for)g(hashing)f
+(un)m(til)i(some)f(set)150 2263 y(of)d(v)-5 b(alues)43
+b(giv)m(es)g(eac)m(h)h(k)m(eyw)m(ord)e(a)h(unique)e(v)-5
+b(alue.)77 b(A)42 b(helpful)f(heuristic)i(is)f(that)h(the)f(larger)h
+(the)150 2373 y(hash)36 b(v)-5 b(alue)37 b(range,)i(the)e(easier)h(it)f
+(is)g(for)f Fr(gperf)f Fv(to)j(\014nd)d(and)h(generate)i(a)f(p)s
+(erfect)g(hash)f(function.)150 2482 y(Exp)s(erimen)m(tation)31
+b(is)f(the)h(k)m(ey)g(to)g(getting)h(the)f(most)g(from)e
+Fr(gperf)p Fv(.)150 2726 y Fu(3.1)68 b(Input)44 b(F)-11
+b(ormat)46 b(to)f Fl(gperf)275 2885 y Fv(Y)-8 b(ou)38
+b(can)g(con)m(trol)i(the)e(input)f(\014le)h(format)g(b)m(y)g(v)-5
+b(arying)38 b(certain)g(command-line)h(argumen)m(ts,)h(in)150
+2995 y(particular)f(the)g(`)p Fr(-t)p Fv(')g(option.)66
+b(The)38 b(input's)g(app)s(earance)h(is)g(similar)g(to)g(GNU)h
+(utilities)g Fr(flex)e Fv(and)150 3104 y Fr(bison)29
+b Fv(\(or)i(UNIX)f(utilities)i Fr(lex)e Fv(and)f Fr(yacc)p
+Fv(\).)40 b(Here's)31 b(an)g(outline)g(of)f(the)h(general)g(format:)390
+3246 y Fr(declarations)390 3356 y(\045\045)390 3465 y(keywords)390
+3575 y(\045\045)390 3684 y(functions)275 3826 y Fm(Unlike)41
+b Fr(flex)35 b Fv(or)g Fr(bison)p Fv(,)h(the)g(declarations)g(section)h
+(and)e(the)h(functions)f(section)i(are)f(optional.)150
+3936 y(The)30 b(follo)m(wing)i(sections)f(describ)s(e)f(the)g(input)g
+(format)h(for)f(eac)m(h)h(section.)275 4078 y(It)h(is)g(p)s(ossible)g
+(to)h(omit)g(the)g(declaration)h(section)f(en)m(tirely)-8
+b(,)35 b(if)d(the)h(`)p Fr(-t)p Fv(')f(option)h(is)f(not)h(giv)m(en.)48
+b(In)150 4187 y(this)30 b(case)i(the)e(input)g(\014le)g(b)s(egins)g
+(directly)h(with)f(the)h(\014rst)e(k)m(eyw)m(ord)i(line,)g(e.g.:)390
+4329 y Fr(january)390 4439 y(february)390 4548 y(march)390
+4658 y(april)390 4767 y(...)150 4974 y Fk(3.1.1)63 b(Declarations)275
+5121 y Fv(The)33 b(k)m(eyw)m(ord)i(input)f(\014le)g(optionally)i(con)m
+(tains)g(a)f(section)g(for)f(including)g(arbitrary)h(C)f(declara-)150
+5230 y(tions)d(and)e(de\014nitions,)h Fr(gperf)f Fv(declarations)j
+(that)f(act)g(lik)m(e)h(command-line)f(options,)g(as)f(w)m(ell)i(as)e
+(for)150 5340 y(pro)m(viding)g(a)h(user-supplied)e Fr(struct)p
+Fv(.)p eop end
+%%Page: 16 18
+TeXDict begin 16 17 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(16)150 299 y Fk(3.1.1.1)63 b(User-supplied)43 b
+Fj(struct)275 446 y Fv(If)24 b(the)h(`)p Fr(-t)p Fv(')f(option)h(\(or,)
+i(equiv)-5 b(alen)m(tly)d(,)28 b(the)d(`)p Fr(\045struct-type)p
+Fv(')d(declaration\))k Fm(is)32 b Fv(enabled,)26 b(y)m(ou)f
+Fm(must)150 555 y Fv(pro)m(vide)37 b(a)f(C)h Fr(struct)d
+Fv(as)j(the)g(last)g(comp)s(onen)m(t)g(in)f(the)h(declaration)h
+(section)f(from)f(the)h(input)f(\014le.)150 665 y(The)26
+b(\014rst)f(\014eld)h(in)g(this)g(struct)g(m)m(ust)g(b)s(e)g(of)g(t)m
+(yp)s(e)g Fr(char)j(*)d Fv(or)g Fr(const)j(char)h(*)25
+b Fv(if)h(the)h(`)p Fr(-P)p Fv(')f(option)g(is)h(not)150
+775 y(giv)m(en,)k(or)g(of)f(t)m(yp)s(e)g Fr(int)g Fv(if)g(the)g(option)
+h(`)p Fr(-P)p Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)32
+b(the)f(`)p Fr(\045pic)p Fv(')e(declaration\))j(is)f(enabled.)150
+884 y(This)k(\014rst)f(\014eld)h(m)m(ust)h(b)s(e)e(called)j(`)p
+Fr(name)p Fv(',)f(although)g(it)g(is)g(p)s(ossible)f(to)h(mo)s(dify)e
+(its)i(name)g(with)f(the)150 994 y(`)p Fr(-K)p Fv(')30
+b(option)h(\(or,)g(equiv)-5 b(alen)m(tly)d(,)33 b(the)d(`)p
+Fr(\045define)f(slot-name)p Fv(')f(declaration\))k(describ)s(ed)e(b)s
+(elo)m(w.)275 1139 y(Here)g(is)h(a)g(simple)f(example,)h(using)f(mon)m
+(ths)g(of)h(the)f(y)m(ear)i(and)d(their)i(attributes)g(as)f(input:)390
+1284 y Fr(struct)46 b(month)g({)i(char)f(*name;)f(int)h(number;)e(int)i
+(days;)g(int)g(leap_days;)e(};)390 1393 y(\045\045)390
+1503 y(january,)141 b(1,)47 b(31,)g(31)390 1612 y(february,)93
+b(2,)47 b(28,)g(29)390 1722 y(march,)237 b(3,)47 b(31,)g(31)390
+1832 y(april,)237 b(4,)47 b(30,)g(30)390 1941 y(may,)333
+b(5,)47 b(31,)g(31)390 2051 y(june,)285 b(6,)47 b(30,)g(30)390
+2160 y(july,)285 b(7,)47 b(31,)g(31)390 2270 y(august,)189
+b(8,)47 b(31,)g(31)390 2380 y(september,)e(9,)i(30,)g(30)390
+2489 y(october,)93 b(10,)47 b(31,)g(31)390 2599 y(november,)e(11,)i
+(30,)g(30)390 2708 y(december,)e(12,)i(31,)g(31)275 2853
+y Fv(Separating)25 b(the)g Fr(struct)f Fv(declaration)i(from)f(the)g
+(list)h(of)f(k)m(eyw)m(ords)h(and)e(other)h(\014elds)g(are)g(a)h(pair)f
+(of)150 2963 y(consecutiv)m(e)33 b(p)s(ercen)m(t)f(signs,)f(`)p
+Fr(\045\045)p Fv(',)h(app)s(earing)f(left)h(justi\014ed)e(in)h(the)h
+(\014rst)e(column,)i(as)f(in)g(the)h(UNIX)150 3072 y(utilit)m(y)g
+Fr(lex)p Fv(.)275 3217 y(If)k(the)i Fr(struct)d Fv(has)i(already)h(b)s
+(een)f(declared)h(in)f(an)g(include)g(\014le,)i(it)f(can)g(b)s(e)e(men)
+m(tioned)i(in)f(an)150 3327 y(abbreviated)31 b(form,)f(lik)m(e)i(this:)
+390 3472 y Fr(struct)46 b(month;)390 3581 y(\045\045)390
+3691 y(january,)141 b(1,)47 b(31,)g(31)390 3801 y(...)150
+4010 y Fk(3.1.1.2)63 b(Gp)s(erf)43 b(Declarations)275
+4157 y Fv(The)31 b(declaration)j(section)g(can)e(con)m(tain)i
+Fr(gperf)c Fv(declarations.)48 b(They)32 b(in\015uence)g(the)g(w)m(a)m
+(y)h Fr(gperf)150 4267 y Fv(w)m(orks,)43 b(lik)m(e)f(command)f(line)g
+(options)g(do.)72 b(In)40 b(fact,)k(ev)m(ery)e(suc)m(h)e(declaration)i
+(is)f(equiv)-5 b(alen)m(t)42 b(to)g(a)150 4376 y(command)30
+b(line)h(option.)41 b(There)30 b(are)h(three)f(forms)g(of)h
+(declarations:)199 4521 y(1.)61 b(Declarations)33 b(without)d(argumen)m
+(t,)h(lik)m(e)h(`)p Fr(\045compare-lengths)p Fv('.)199
+4661 y(2.)61 b(Declarations)33 b(with)d(an)g(argumen)m(t,)h(lik)m(e)h
+(`)p Fr(\045switch=)p Fi(count)11 b Fv('.)199 4801 y(3.)61
+b(Declarations)114 b(of)e(names)g(of)g(en)m(tities)i(in)d(the)h(output)
+g(\014le,)132 b(lik)m(e)114 b(`)p Fr(\045define)330 4910
+y(lookup-function-name)25 b Fi(name)11 b Fv('.)275 5085
+y(When)35 b(a)h(declaration)h(is)f(giv)m(en)g(b)s(oth)f(in)h(the)f
+(input)g(\014le)h(and)f(as)h(a)g(command)f(line)h(option,)i(the)150
+5195 y(command-line)31 b(option's)g(v)-5 b(alue)31 b(prev)-5
+b(ails.)275 5340 y(The)29 b(follo)m(wing)j Fr(gperf)d
+Fv(declarations)j(are)f(a)m(v)-5 b(ailable.)p eop end
+%%Page: 17 19
+TeXDict begin 17 18 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(17)150 299 y(`)p Fr(\045delimiters=)p Fi(delimiter-lis)o(t)11
+b Fv(')630 408 y(Allo)m(ws)30 b(y)m(ou)f(to)g(pro)m(vide)g(a)g(string)g
+(con)m(taining)h(delimiters)g(used)d(to)j(separate)g(k)m(eyw)m(ords)630
+518 y(from)k(their)h(attributes.)54 b(The)34 b(default)g(is)h
+Fr(")p Fv(,)p Fr(")p Fv(.)53 b(This)34 b(option)h(is)f(essen)m(tial)j
+(if)d(y)m(ou)h(w)m(an)m(t)630 628 y(to)c(use)f(k)m(eyw)m(ords)h(that)g
+(ha)m(v)m(e)g(em)m(b)s(edded)f(commas)h(or)f(newlines.)150
+774 y(`)p Fr(\045struct-type)p Fv(')630 883 y(Allo)m(ws)i(y)m(ou)e(to)i
+(include)e(a)h Fr(struct)d Fv(t)m(yp)s(e)j(declaration)h(for)e
+(generated)i(co)s(de;)f(see)g(ab)s(o)m(v)m(e)630 993
+y(for)f(an)g(example.)150 1139 y(`)p Fr(\045ignore-case)p
+Fv(')630 1249 y(Consider)43 b(upp)s(er)f(and)i(lo)m(w)m(er)h(case)g
+(ASCI)s(I)e(c)m(haracters)i(as)f(equiv)-5 b(alen)m(t.)83
+b(The)44 b(string)630 1358 y(comparison)28 b(will)h(use)f(a)h(case)g
+(insigni\014can)m(t)g(c)m(haracter)h(comparison.)40 b(Note)29
+b(that)g(lo)s(cale)630 1468 y(dep)s(enden)m(t)g(case)j(mappings)d(are)i
+(ignored.)150 1614 y(`)p Fr(\045language=)p Fi(language-name)10
+b Fv(')630 1724 y(Instructs)33 b Fr(gperf)f Fv(to)i(generate)h(co)s(de)
+f(in)f(the)h(language)h(sp)s(eci\014ed)d(b)m(y)i(the)g(option's)g(ar-)
+630 1833 y(gumen)m(t.)41 b(Languages)31 b(handled)f(are)h(curren)m
+(tly:)630 1979 y(`)p Fr(KR-C)p Fv(')238 b(Old-st)m(yle)27
+b(K&R)f(C.)g(This)f(language)j(is)f(understo)s(o)s(d)d(b)m(y)i(old-st)m
+(yle)i(C)e(com-)1110 2089 y(pilers)e(and)g(ANSI)f(C)h(compilers,)i(but)
+e(ANSI)f(C)h(compilers)h(ma)m(y)f(\015ag)h(w)m(arn-)1110
+2198 y(ings)30 b(\(or)h(ev)m(en)g(errors\))f(b)s(ecause)h(of)f(lac)m
+(king)i(`)p Fr(const)p Fv('.)630 2345 y(`)p Fr(C)p Fv(')382
+b(Common)23 b(C.)f(This)h(language)h(is)f(understo)s(o)s(d)e(b)m(y)i
+(ANSI)g(C)f(compilers,)k(and)1110 2454 y(also)k(b)m(y)e(old-st)m(yle)i
+(C)f(compilers,)g(pro)m(vided)f(that)i(y)m(ou)f Fr(#define)f(const)f
+Fv(to)1110 2564 y(empt)m(y)k(for)f(compilers)h(whic)m(h)f(don't)g(kno)m
+(w)h(ab)s(out)f(this)g(k)m(eyw)m(ord.)630 2710 y(`)p
+Fr(ANSI-C)p Fv(')142 b(ANSI)32 b(C.)g(This)f(language)j(is)e(understo)s
+(o)s(d)e(b)m(y)i(ANSI)g(C)f(\(C89,)j(ISO)d(C90\))1110
+2819 y(compilers,)g(ISO)e(C99)i(compilers,)g(and)f(C)p
+Fr(++)f Fv(compilers.)630 2966 y(`)p Fr(C++)p Fv(')286
+b(C)p Fr(++)p Fv(.)40 b(This)29 b(language)j(is)f(understo)s(o)s(d)d(b)
+m(y)i(C)p Fr(++)g Fv(compilers.)630 3112 y(The)g(default)g(is)h(C.)150
+3258 y(`)p Fr(\045define)e(slot-name)e Fi(name)11 b Fv(')630
+3367 y(This)65 b(declaration)j(is)e(only)g(useful)f(when)g(option)h(`)p
+Fr(-t)p Fv(')g(\(or,)76 b(equiv)-5 b(alen)m(tly)d(,)77
+b(the)630 3477 y(`)p Fr(\045struct-type)p Fv(')27 b(declaration\))32
+b(has)e(b)s(een)g(giv)m(en.)41 b(By)31 b(default,)f(the)g(program)g
+(assumes)630 3587 y(the)48 b(structure)g(comp)s(onen)m(t)h(iden)m
+(ti\014er)f(for)g(the)g(k)m(eyw)m(ord)h(is)f(`)p Fr(name)p
+Fv('.)94 b(This)47 b(option)630 3696 y(allo)m(ws)f(an)e(arbitrary)g(c)m
+(hoice)i(of)f(iden)m(ti\014er)f(for)h(this)f(comp)s(onen)m(t,)k
+(although)d(it)g(still)630 3806 y(m)m(ust)30 b(o)s(ccur)g(as)h(the)g
+(\014rst)e(\014eld)h(in)g(y)m(our)h(supplied)e Fr(struct)p
+Fv(.)150 3952 y(`)p Fr(\045define)g(initializer-suffix)c
+Fi(initializers)11 b Fv(')630 4061 y(This)65 b(declaration)j(is)e(only)
+g(useful)f(when)g(option)h(`)p Fr(-t)p Fv(')g(\(or,)76
+b(equiv)-5 b(alen)m(tly)d(,)77 b(the)630 4171 y(`)p Fr(\045struct-type)
+p Fv(')33 b(declaration\))38 b(has)d(b)s(een)g(giv)m(en.)58
+b(It)36 b(p)s(ermits)f(to)i(sp)s(ecify)e(initializers)630
+4281 y(for)44 b(the)g(structure)g(mem)m(b)s(ers)f(follo)m(wing)i
+Fn(slot-name)51 b Fv(in)43 b(empt)m(y)i(hash)e(table)i(en)m(tries.)630
+4390 y(The)d(list)g(of)h(initializers)g(should)e(start)i(with)f(a)g
+(comma.)77 b(By)42 b(default,)k(the)c(emitted)630 4500
+y(co)s(de)31 b(will)f(zero-initialize)k(structure)c(mem)m(b)s(ers)g
+(follo)m(wing)i Fn(slot-name)p Fv(.)150 4646 y(`)p Fr(\045define)d
+(hash-function-name)c Fi(name)11 b Fv(')630 4756 y(Allo)m(ws)31
+b(y)m(ou)f(to)g(sp)s(ecify)g(the)g(name)g(for)f(the)h(generated)h(hash)
+e(function.)40 b(Default)31 b(name)630 4865 y(is)f(`)p
+Fr(hash)p Fv('.)40 b(This)30 b(option)h(p)s(ermits)e(the)i(use)f(of)h
+(t)m(w)m(o)g(hash)f(tables)h(in)f(the)h(same)g(\014le.)150
+5011 y(`)p Fr(\045define)e(lookup-function-name)24 b
+Fi(name)11 b Fv(')630 5121 y(Allo)m(ws)43 b(y)m(ou)f(to)h(sp)s(ecify)e
+(the)i(name)f(for)f(the)h(generated)h(lo)s(okup)f(function.)75
+b(Default)630 5230 y(name)28 b(is)g(`)p Fr(in_word_set)p
+Fv('.)37 b(This)27 b(option)h(p)s(ermits)f(m)m(ultiple)i(generated)f
+(hash)f(functions)630 5340 y(to)k(b)s(e)f(used)f(in)h(the)h(same)g
+(application.)p eop end
+%%Page: 18 20
+TeXDict begin 18 19 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(18)150 299 y(`)p Fr(\045define)29 b(class-name)e
+Fi(name)11 b Fv(')630 408 y(This)66 b(option)i(is)f(only)h(useful)e
+(when)h(option)g(`)p Fr(-L)30 b(C++)p Fv(')67 b(\(or,)77
+b(equiv)-5 b(alen)m(tly)d(,)79 b(the)630 518 y(`)p Fr(\045language=C++)
+p Fv(')43 b(declaration\))k(has)f(b)s(een)f(giv)m(en.)88
+b(It)46 b(allo)m(ws)h(y)m(ou)f(to)g(sp)s(ecify)g(the)630
+628 y(name)30 b(of)h(generated)g(C)p Fr(++)f Fv(class.)41
+b(Default)32 b(name)e(is)h Fr(Perfect_Hash)p Fv(.)150
+792 y(`)p Fr(\0457bit)p Fv(')190 b(This)36 b(option)i(sp)s(eci\014es)f
+(that)g(all)h(strings)f(that)h(will)f(b)s(e)g(passed)f(as)i(argumen)m
+(ts)f(to)h(the)630 902 y(generated)e(hash)e(function)g(and)h(the)g
+(generated)g(lo)s(okup)g(function)f(will)h(solely)h(consist)630
+1011 y(of)d(7-bit)h(ASCI)s(I)e(c)m(haracters)j(\(b)m(ytes)f(in)f(the)g
+(range)h(0..127\).)51 b(\(Note)35 b(that)f(the)g(ANSI)e(C)630
+1121 y(functions)f Fr(isalnum)f Fv(and)i Fr(isgraph)e
+Fv(do)i Fm(not)41 b Fv(guaran)m(tee)33 b(that)g(a)f(b)m(yte)h(is)f(in)f
+(this)h(range.)630 1230 y(Only)e(an)g(explicit)i(test)f(lik)m(e)h(`)p
+Fr(c)e(>=)g('A')f(&&)h(c)g(<=)g('Z')p Fv(')f(guaran)m(tees)j(this.\))
+150 1395 y(`)p Fr(\045compare-lengths)p Fv(')630 1504
+y(Compare)40 b(k)m(eyw)m(ord)g(lengths)g(b)s(efore)f(trying)h(a)h
+(string)e(comparison.)70 b(This)39 b(option)h(is)630
+1614 y(mandatory)32 b(for)h(binary)e(comparisons)i(\(see)g(Section)h
+(3.3)f([Binary)g(Strings],)g(page)g(22\).)630 1724 y(It)g(also)h(migh)m
+(t)g(cut)f(do)m(wn)f(on)h(the)g(n)m(um)m(b)s(er)f(of)h(string)g
+(comparisons)g(made)g(during)f(the)630 1833 y(lo)s(okup,)i(since)g(k)m
+(eyw)m(ords)f(with)g(di\013eren)m(t)h(lengths)g(are)f(nev)m(er)h
+(compared)f(via)h Fr(strcmp)p Fv(.)630 1943 y(Ho)m(w)m(ev)m(er,)d
+(using)d(`)p Fr(\045compare-lengths)p Fv(')c(migh)m(t)29
+b(greatly)h(increase)f(the)g(size)g(of)g(the)f(gen-)630
+2052 y(erated)j(C)f(co)s(de)h(if)f(the)h(lo)s(okup)f(table)i(range)e
+(is)h(large)g(\(whic)m(h)g(implies)g(that)g(the)f(switc)m(h)630
+2162 y(option)24 b(`)p Fr(-S)p Fv(')g(or)g(`)p Fr(\045switch)p
+Fv(')f(is)h(not)g(enabled\),)i(since)e(the)g(length)h(table)f(con)m
+(tains)i(as)e(man)m(y)630 2271 y(elemen)m(ts)32 b(as)e(there)h(are)g
+(en)m(tries)g(in)f(the)g(lo)s(okup)g(table.)150 2436
+y(`)p Fr(\045compare-strncmp)p Fv(')630 2545 y(Generates)22
+b(C)f(co)s(de)g(that)h(uses)e(the)i Fr(strncmp)d Fv(function)h(to)i(p)s
+(erform)e(string)h(comparisons.)630 2655 y(The)30 b(default)g(action)i
+(is)f(to)g(use)f Fr(strcmp)p Fv(.)150 2819 y(`)p Fr
+(\045readonly-tables)p Fv(')630 2929 y(Mak)m(es)41 b(the)f(con)m(ten)m
+(ts)h(of)f(all)h(generated)f(lo)s(okup)f(tables)i(constan)m(t,)i(i.e.,)
+h(\\readonly".)630 3039 y(Man)m(y)31 b(compilers)g(can)g(generate)h
+(more)e(e\016cien)m(t)i(co)s(de)f(for)f(this)h(b)m(y)f(putting)g(the)h
+(tables)630 3148 y(in)f(readonly)h(memory)-8 b(.)150
+3313 y(`)p Fr(\045enum)p Fv(')190 b(De\014ne)31 b(constan)m(t)g(v)-5
+b(alues)31 b(using)f(an)g(en)m(um)g(lo)s(cal)i(to)f(the)g(lo)s(okup)f
+(function)g(rather)g(than)630 3422 y(with)37 b(#de\014nes.)60
+b(This)36 b(also)i(means)g(that)f(di\013eren)m(t)h(lo)s(okup)f
+(functions)g(can)g(reside)g(in)630 3532 y(the)31 b(same)f(\014le.)41
+b(Thanks)29 b(to)j(James)e(Clark)g Fr(<jjc@ai.mit.edu>)p
+Fv(.)150 3696 y(`)p Fr(\045includes)p Fv(')630 3806 y(Include)g(the)h
+(necessary)h(system)f(include)g(\014le,)g Fr(<string.h>)p
+Fv(,)e(at)i(the)g(b)s(eginning)g(of)g(the)630 3915 y(co)s(de.)39
+b(By)27 b(default,)g(this)f(is)g(not)g(done;)i(the)e(user)f(m)m(ust)h
+(include)g(this)f(header)h(\014le)g(himself)630 4025
+y(to)31 b(allo)m(w)h(compilation)g(of)e(the)h(co)s(de.)150
+4189 y(`)p Fr(\045global-table)p Fv(')630 4299 y(Generate)38
+b(the)f(static)h(table)f(of)g(k)m(eyw)m(ords)g(as)g(a)g(static)h
+(global)g(v)-5 b(ariable,)39 b(rather)d(than)630 4408
+y(hiding)30 b(it)h(inside)f(of)g(the)h(lo)s(okup)f(function)g(\(whic)m
+(h)g(is)h(the)f(default)h(b)s(eha)m(vior\).)150 4573
+y(`)p Fr(\045pic)p Fv(')238 b(Optimize)42 b(the)f(generated)h(table)g
+(for)f(inclusion)g(in)g(shared)f(libraries.)73 b(This)40
+b(reduces)630 4682 y(the)35 b(startup)g(time)h(of)f(programs)g(using)g
+(a)h(shared)e(library)h(con)m(taining)i(the)e(generated)630
+4792 y(co)s(de.)j(If)21 b(the)h(`)p Fr(\045struct-type)p
+Fv(')d(declaration)24 b(\(or,)g(equiv)-5 b(alen)m(tly)d(,)26
+b(the)c(option)g(`)p Fr(-t)p Fv('\))g(is)g(also)630 4902
+y(giv)m(en,)32 b(the)f(\014rst)e(\014eld)i(of)f(the)h(user-de\014ned)e
+(struct)i(m)m(ust)f(b)s(e)g(of)h(t)m(yp)s(e)g(`)p Fr(int)p
+Fv(',)f(not)h(`)p Fr(char)630 5011 y(*)p Fv(',)h(b)s(ecause)f(it)i
+(will)e(con)m(tain)i(o\013sets)g(in)m(to)f(the)g(string)f(p)s(o)s(ol)h
+(instead)f(of)h(actual)h(strings.)630 5121 y(T)-8 b(o)33
+b(con)m(v)m(ert)h(suc)m(h)f(an)f(o\013set)i(to)f(a)g(string,)h(y)m(ou)f
+(can)g(use)f(the)h(expression)f(`)p Fr(stringpool)630
+5230 y(+)e Fi(o)11 b Fv(',)33 b(where)f Fn(o)37 b Fv(is)c(the)g
+(o\013set.)48 b(The)32 b(string)g(p)s(o)s(ol)g(name)h(can)g(b)s(e)f(c)m
+(hanged)h(through)f(the)630 5340 y(`)p Fr(\045define)d
+(string-pool-name)p Fv(')d(declaration.)p eop end
+%%Page: 19 21
+TeXDict begin 19 20 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(19)150 299 y(`)p Fr(\045define)29 b(string-pool-name)d
+Fi(name)11 b Fv(')630 408 y(Allo)m(ws)42 b(y)m(ou)f(to)h(sp)s(ecify)f
+(the)g(name)g(of)g(the)g(generated)h(string)f(p)s(o)s(ol)g(created)h(b)
+m(y)f(the)630 518 y(declaration)48 b(`)p Fr(\045pic)p
+Fv(')e(\(or,)51 b(equiv)-5 b(alen)m(tly)d(,)53 b(the)47
+b(option)f(`)p Fr(-P)p Fv('\).)90 b(The)46 b(default)g(name)h(is)630
+628 y(`)p Fr(stringpool)p Fv('.)38 b(This)29 b(declaration)i(p)s
+(ermits)e(the)h(use)g(of)g(t)m(w)m(o)h(hash)e(tables)h(in)g(the)g(same)
+630 737 y(\014le,)39 b(with)d(`)p Fr(\045pic)p Fv(')g(and)g(ev)m(en)h
+(when)f(the)h(`)p Fr(\045global-table)p Fv(')c(declaration)38
+b(\(or,)h(equiv)-5 b(a-)630 847 y(len)m(tly)d(,)32 b(the)f(option)g(`)p
+Fr(-G)p Fv('\))f(is)h(giv)m(en.)150 1108 y(`)p Fr(\045null-strings)p
+Fv(')630 1218 y(Use)39 b(NULL)g(strings)f(instead)i(of)e(empt)m(y)i
+(strings)e(for)h(empt)m(y)g(k)m(eyw)m(ord)g(table)h(en)m(tries.)630
+1327 y(This)e(reduces)g(the)h(startup)g(time)g(of)g(programs)g(using)f
+(a)h(shared)f(library)g(con)m(taining)630 1437 y(the)29
+b(generated)g(co)s(de)g(\(but)f(not)g(as)h(m)m(uc)m(h)g(as)f(the)h
+(declaration)h(`)p Fr(\045pic)p Fv('\),)f(at)g(the)f(exp)s(ense)630
+1546 y(of)j(one)f(more)h(test-and-branc)m(h)g(instruction)f(at)h(run)e
+(time.)150 1807 y(`)p Fr(\045define)g(word-array-name)d
+Fi(name)11 b Fv(')630 1917 y(Allo)m(ws)41 b(y)m(ou)f(to)h(sp)s(ecify)f
+(the)g(name)g(for)f(the)i(generated)g(arra)m(y)f(con)m(taining)i(the)e
+(hash)630 2027 y(table.)106 b(Default)53 b(name)e(is)h(`)p
+Fr(wordlist)p Fv('.)103 b(This)51 b(option)h(p)s(ermits)f(the)h(use)g
+(of)g(t)m(w)m(o)630 2136 y(hash)37 b(tables)h(in)g(the)g(same)g
+(\014le,)i(ev)m(en)e(when)f(the)h(option)g(`)p Fr(-G)p
+Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)630
+2246 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33
+b(is)d(giv)m(en.)150 2507 y(`)p Fr(\045define)f(length-table-name)c
+Fi(name)11 b Fv(')630 2616 y(Allo)m(ws)36 b(y)m(ou)e(to)i(sp)s(ecify)e
+(the)h(name)f(for)g(the)h(generated)h(arra)m(y)f(con)m(taining)h(the)f
+(length)630 2726 y(table.)77 b(Default)43 b(name)g(is)f(`)p
+Fr(lengthtable)p Fv('.)74 b(This)41 b(option)i(p)s(ermits)e(the)h(use)g
+(of)h(t)m(w)m(o)630 2836 y(length)33 b(tables)h(in)f(the)g(same)g
+(\014le,)h(ev)m(en)g(when)e(the)h(option)h(`)p Fr(-G)p
+Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)36 b(the)630
+2945 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33
+b(is)d(giv)m(en.)150 3206 y(`)p Fr(\045switch=)p Fi(count)11
+b Fv(')630 3316 y(Causes)35 b(the)h(generated)h(C)e(co)s(de)h(to)h(use)
+e(a)h Fr(switch)e Fv(statemen)m(t)k(sc)m(heme,)g(rather)d(than)630
+3425 y(an)j(arra)m(y)g(lo)s(okup)g(table.)64 b(This)37
+b(can)h(lead)h(to)f(a)h(reduction)f(in)f(b)s(oth)g(time)i(and)e(space)
+630 3535 y(requiremen)m(ts)43 b(for)h(some)f(input)g(\014les.)80
+b(The)43 b(argumen)m(t)h(to)g(this)f(option)h(determines)630
+3645 y(ho)m(w)33 b(man)m(y)f Fr(switch)f Fv(statemen)m(ts)k(are)e
+(generated.)49 b(A)32 b(v)-5 b(alue)34 b(of)e(1)i(generates)g(1)f
+Fr(switch)630 3754 y Fv(con)m(taining)25 b(all)e(the)h(elemen)m(ts,)i
+(a)d(v)-5 b(alue)23 b(of)h(2)f(generates)h(2)g(tables)f(with)g(1/2)h
+(the)g(elemen)m(ts)630 3864 y(in)38 b(eac)m(h)h Fr(switch)p
+Fv(,)g(etc.)65 b(This)37 b(is)h(useful)g(since)g(man)m(y)h(C)e
+(compilers)i(cannot)g(correctly)630 3973 y(generate)29
+b(co)s(de)f(for)f(large)h Fr(switch)e Fv(statemen)m(ts.)41
+b(This)27 b(option)h(w)m(as)g(inspired)e(in)h(part)g(b)m(y)630
+4083 y(Keith)k(Bostic's)h(original)f(C)f(program.)150
+4344 y(`)p Fr(\045omit-struct-type)p Fv(')630 4454 y(Prev)m(en)m(ts)f
+(the)e(transfer)h(of)f(the)h(t)m(yp)s(e)g(declaration)h(to)g(the)f
+(output)f(\014le.)40 b(Use)28 b(this)f(option)630 4563
+y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g(de\014ned)e(elsewhere.)150
+4864 y Fk(3.1.1.3)63 b(C)41 b(Co)s(de)g(Inclusion)275
+5011 y Fv(Using)26 b(a)g(syn)m(tax)h(similar)f(to)h(GNU)f(utilities)i
+Fr(flex)d Fv(and)g Fr(bison)p Fv(,)h(it)g(is)g(p)s(ossible)g(to)g
+(directly)h(include)150 5121 y(C)i(source)h(text)g(and)f(commen)m(ts)h
+(v)m(erbatim)g(in)m(to)h(the)e(generated)i(output)e(\014le.)40
+b(This)29 b(is)g(accomplished)150 5230 y(b)m(y)37 b(enclosing)h(the)g
+(region)g(inside)e(left-justi\014ed)i(surrounding)d(`)p
+Fr(\045{)p Fv(',)k(`)p Fr(\045})p Fv(')e(pairs.)61 b(Here)38
+b(is)f(an)g(input)150 5340 y(fragmen)m(t)31 b(based)f(on)g(the)h
+(previous)f(example)h(that)g(illustrates)g(this)g(feature:)p
+eop end
+%%Page: 20 22
+TeXDict begin 20 21 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(20)390 299 y Fr(\045{)390 408 y(#include)46 b(<assert.h>)390
+518 y(/*)h(This)g(section)f(of)h(code)f(is)i(inserted)d(directly)h
+(into)g(the)h(output.)f(*/)390 628 y(int)h(return_month_days)c
+(\(struct)j(month)g(*months,)g(int)h(is_leap_year\);)390
+737 y(\045})390 847 y(struct)f(month)g({)i(char)f(*name;)f(int)h
+(number;)e(int)i(days;)g(int)g(leap_days;)e(};)390 956
+y(\045\045)390 1066 y(january,)141 b(1,)47 b(31,)g(31)390
+1176 y(february,)93 b(2,)47 b(28,)g(29)390 1285 y(march,)237
+b(3,)47 b(31,)g(31)390 1395 y(...)150 1636 y Fk(3.1.2)63
+b(F)-10 b(ormat)41 b(for)h(Keyw)m(ord)e(En)m(tries)275
+1783 y Fv(The)33 b(second)i(input)e(\014le)i(format)g(section)g(con)m
+(tains)h(lines)e(of)h(k)m(eyw)m(ords)g(and)e(an)m(y)i(asso)s(ciated)h
+(at-)150 1893 y(tributes)i(y)m(ou)h(migh)m(t)g(supply)-8
+b(.)64 b(A)39 b(line)f(b)s(eginning)g(with)g(`)p Fr(#)p
+Fv(')h(in)f(the)h(\014rst)f(column)g(is)g(considered)h(a)150
+2002 y(commen)m(t.)53 b(Ev)m(erything)34 b(follo)m(wing)h(the)g(`)p
+Fr(#)p Fv(')f(is)g(ignored,)h(up)e(to)i(and)e(including)h(the)g(follo)m
+(wing)h(new-)150 2112 y(line.)57 b(A)36 b(line)h(b)s(eginning)e(with)g
+(`)p Fr(\045)p Fv(')h(in)g(the)g(\014rst)f(column)g(is)h(an)g(option)g
+(declaration)i(and)d(m)m(ust)h(not)150 2222 y(o)s(ccur)30
+b(within)g(the)h(k)m(eyw)m(ords)f(section.)275 2399 y(The)36
+b(\014rst)g(\014eld)g(of)h(eac)m(h)g(non-commen)m(t)h(line)f(is)g(alw)m
+(a)m(ys)h(the)f(k)m(eyw)m(ord)g(itself.)60 b(It)37 b(can)g(b)s(e)f(giv)
+m(en)150 2508 y(in)f(t)m(w)m(o)h(w)m(a)m(ys:)51 b(as)35
+b(a)g(simple)g(name,)i(i.e.,)g(without)e(surrounding)e(string)i
+(quotation)h(marks,)g(or)f(as)h(a)150 2618 y(string)i(enclosed)g(in)f
+(double-quotes,)j(in)d(C)h(syn)m(tax,)i(p)s(ossibly)d(with)g(bac)m
+(kslash)h(escap)s(es)g(lik)m(e)h Fr(\\")e Fv(or)150 2727
+y Fr(\\234)23 b Fv(or)i Fr(\\xa8)p Fv(.)37 b(In)24 b(either)h(case,)i
+(it)e(m)m(ust)f(start)h(righ)m(t)g(at)g(the)g(b)s(eginning)e(of)i(the)g
+(line,)h(without)e(leading)150 2837 y(whitespace.)58
+b(In)35 b(this)h(con)m(text,)j(a)e(\\\014eld")f(is)g(considered)g(to)g
+(extend)g(up)f(to,)j(but)d(not)h(include,)i(the)150 2946
+y(\014rst)g(blank,)i(comma,)i(or)c(newline.)65 b(Here)39
+b(is)f(a)h(simple)g(example)g(tak)m(en)g(from)f(a)h(partial)h(list)f
+(of)f(C)150 3056 y(reserv)m(ed)31 b(w)m(ords:)390 3233
+y Fr(#)47 b(These)g(are)g(a)g(few)g(C)h(reserved)d(words,)h(see)h(the)g
+(c.gperf)f(file)390 3342 y(#)h(for)g(a)h(complete)d(list)i(of)g(ANSI)g
+(C)g(reserved)f(words.)390 3452 y(unsigned)390 3562 y(sizeof)390
+3671 y(switch)390 3781 y(signed)390 3890 y(if)390 4000
+y(default)390 4110 y(for)390 4219 y(while)390 4329 y(return)275
+4506 y Fv(Note)38 b(that)f(unlik)m(e)g Fr(flex)f Fv(or)h
+Fr(bison)e Fv(the)j(\014rst)e(`)p Fr(\045\045)p Fv(')g(mark)m(er)i(ma)m
+(y)f(b)s(e)f(elided)h(if)g(the)g(declaration)150 4615
+y(section)32 b(is)e(empt)m(y)-8 b(.)275 4792 y(Additional)29
+b(\014elds)f(ma)m(y)h(optionally)h(follo)m(w)g(the)f(leading)g(k)m(eyw)
+m(ord.)41 b(Fields)29 b(should)e(b)s(e)h(separated)150
+4902 y(b)m(y)g(commas,)i(and)d(terminate)j(at)f(the)f(end)g(of)g(line.)
+41 b(What)29 b(these)f(\014elds)g(mean)g(is)h(en)m(tirely)g(up)e(to)i
+(y)m(ou;)150 5011 y(they)k(are)h(used)e(to)i(initialize)h(the)f(elemen)
+m(ts)g(of)f(the)h(user-de\014ned)d Fr(struct)h Fv(pro)m(vided)g(b)m(y)h
+(y)m(ou)h(in)f(the)150 5121 y(declaration)40 b(section.)67
+b(If)39 b(the)g(`)p Fr(-t)p Fv(')f(option)h(\(or,)j(equiv)-5
+b(alen)m(tly)d(,)43 b(the)c(`)p Fr(\045struct-type)p
+Fv(')d(declaration\))150 5230 y(is)g Fm(not)45 b Fv(enabled)36
+b(these)g(\014elds)g(are)g(simply)f(ignored.)58 b(All)36
+b(previous)g(examples)g(except)h(the)f(last)h(one)150
+5340 y(con)m(tain)32 b(k)m(eyw)m(ord)f(attributes.)p
+eop end
+%%Page: 21 23
+TeXDict begin 21 22 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(21)150 299 y Fk(3.1.3)63 b(Including)41 b(Additional)g(C)g(F)-10
+b(unctions)275 446 y Fv(The)30 b(optional)i(third)e(section)i(also)g
+(corresp)s(onds)d(closely)j(with)f(con)m(v)m(en)m(tions)i(found)c(in)i
+Fr(flex)f Fv(and)150 555 y Fr(bison)p Fv(.)36 b(All)23
+b(text)g(in)f(this)f(section,)k(starting)e(at)g(the)f(\014nal)f(`)p
+Fr(\045\045)p Fv(')h(and)f(extending)i(to)f(the)g(end)g(of)g(the)g
+(input)150 665 y(\014le,)31 b(is)g(included)g(v)m(erbatim)g(in)m(to)h
+(the)f(generated)h(output)f(\014le.)42 b(Naturally)-8
+b(,)33 b(it)e(is)g(y)m(our)g(resp)s(onsibilit)m(y)150
+775 y(to)g(ensure)f(that)h(the)f(co)s(de)h(con)m(tained)g(in)g(this)f
+(section)h(is)g(v)-5 b(alid)30 b(C.)150 982 y Fk(3.1.4)63
+b(Where)41 b(to)g(place)f(directiv)m(es)g(for)i(GNU)g
+Fj(indent)p Fk(.)275 1129 y Fv(If)26 b(y)m(ou)i(w)m(an)m(t)g(to)g(in)m
+(v)m(ok)m(e)h(GNU)f Fr(indent)e Fv(on)h(a)g Fr(gperf)f
+Fv(input)h(\014le,)h(y)m(ou)f(will)h(see)g(that)g(GNU)g
+Fr(indent)150 1239 y Fv(do)s(esn't)33 b(understand)e(the)i(`)p
+Fr(\045\045)p Fv(',)h(`)p Fr(\045{)p Fv(')e(and)h(`)p
+Fr(\045})p Fv(')g(directiv)m(es)h(that)f(con)m(trol)i
+Fr(gperf)p Fv('s)c(in)m(terpretation)k(of)150 1348 y(the)23
+b(input)f(\014le.)38 b(Therefore)23 b(y)m(ou)g(ha)m(v)m(e)h(to)g
+(insert)f(some)g(directiv)m(es)h(for)f(GNU)h Fr(indent)p
+Fv(.)36 b(More)24 b(precisely)-8 b(,)150 1458 y(assuming)30
+b(the)h(most)f(general)i(input)d(\014le)i(structure)390
+1600 y Fr(declarations)44 b(part)j(1)390 1710 y(\045{)390
+1820 y(verbatim)f(code)390 1929 y(\045})390 2039 y(declarations)e(part)
+j(2)390 2148 y(\045\045)390 2258 y(keywords)390 2368
+y(\045\045)390 2477 y(functions)150 2620 y Fv(y)m(ou)31
+b(w)m(ould)f(insert)g(`)p Fr(*INDENT-OFF*)p Fv(')e(and)h(`)p
+Fr(*INDENT-ON*)p Fv(')f(commen)m(ts)k(as)e(follo)m(ws:)390
+2763 y Fr(/*)47 b(*INDENT-OFF*)e(*/)390 2872 y(declarations)f(part)j(1)
+390 2982 y(\045{)390 3091 y(/*)g(*INDENT-ON*)e(*/)390
+3201 y(verbatim)h(code)390 3310 y(/*)h(*INDENT-OFF*)e(*/)390
+3420 y(\045})390 3530 y(declarations)f(part)j(2)390 3639
+y(\045\045)390 3749 y(keywords)390 3858 y(\045\045)390
+3968 y(/*)g(*INDENT-ON*)e(*/)390 4078 y(functions)150
+4322 y Fu(3.2)68 b(Output)45 b(F)-11 b(ormat)45 b(for)g(Generated)h(C)f
+(Co)t(de)g(with)g Fl(gperf)275 4482 y Fv(Sev)m(eral)28
+b(options)g(con)m(trol)h(ho)m(w)e(the)h(generated)h(C)e(co)s(de)h(app)s
+(ears)e(on)i(the)g(standard)e(output.)40 b(Tw)m(o)150
+4591 y(C)i(functions)g(are)h(generated.)77 b(They)42
+b(are)h(called)g Fr(hash)f Fv(and)f Fr(in_word_set)p
+Fv(,)i(although)g(y)m(ou)f(ma)m(y)150 4701 y(mo)s(dify)30
+b(their)g(names)h(with)f(a)h(command-line)g(option.)42
+b(Both)31 b(functions)f(require)g(t)m(w)m(o)i(argumen)m(ts,)g(a)150
+4811 y(string,)h Fr(char)c(*)i Fn(str)p Fv(,)i(and)e(a)i(length)f
+(parameter,)h Fr(int)e Fn(len)p Fv(.)46 b(Their)31 b(default)h
+(function)g(protot)m(yp)s(es)h(are)150 4920 y(as)e(follo)m(ws:)3350
+5121 y([F)-8 b(unction])-3599 b Fh(unsigned)55 b(int)e(hash)47
+b Fg(\()p Fn(const)31 b(c)m(har)g(*)f Ff(str)p Fn(,)i(unsigned)d(in)m
+(t)i Ff(len)12 b Fg(\))390 5230 y Fv(By)35 b(default,)h(the)e
+(generated)i Fr(hash)d Fv(function)h(returns)f(an)i(in)m(teger)h(v)-5
+b(alue)34 b(created)i(b)m(y)e(adding)390 5340 y Fn(len)28
+b Fv(to)g(sev)m(eral)h(user-sp)s(eci\014ed)d Fn(str)34
+b Fv(b)m(yte)28 b(p)s(ositions)g(indexed)f(in)m(to)h(an)f
+Fn(asso)s(ciated)i(v)-5 b(alues)32 b Fv(table)p eop end
+%%Page: 22 24
+TeXDict begin 22 23 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(22)390 299 y(stored)28 b(in)g(a)g(lo)s(cal)i(static)f(arra)m(y)-8
+b(.)41 b(The)28 b(asso)s(ciated)h(v)-5 b(alues)29 b(table)g(is)f
+(constructed)g(in)m(ternally)h(b)m(y)390 408 y Fr(gperf)34
+b Fv(and)g(later)i(output)e(as)i(a)f(static)i(lo)s(cal)f(C)e(arra)m(y)i
+(called)g(`)p Fr(hash_table)p Fv('.)52 b(The)35 b(relev)-5
+b(an)m(t)390 518 y(selected)28 b(p)s(ositions)f(\(i.e.)41
+b(indices)27 b(in)m(to)h Fn(str)7 b Fv(\))26 b(are)h(sp)s(eci\014ed)f
+(via)i(the)f(`)p Fr(-k)p Fv(')g(option)g(when)f(running)390
+628 y Fr(gperf)p Fv(,)j(as)i(detailed)g(in)f(the)h Fm(Options)39
+b Fv(section)31 b(b)s(elo)m(w)g(\(see)g(Chapter)f(4)h([Options],)f
+(page)h(24\).)3350 830 y([F)-8 b(unction])-3599 b Fh(in_word_set)49
+b Fg(\()p Fn(const)31 b(c)m(har)g(*)g Ff(str)p Fn(,)g(unsigned)e(in)m
+(t)i Ff(len)12 b Fg(\))390 939 y Fv(If)33 b Fn(str)41
+b Fv(is)33 b(in)h(the)g(k)m(eyw)m(ord)g(set,)i(returns)c(a)j(p)s(oin)m
+(ter)f(to)g(that)h(k)m(eyw)m(ord.)51 b(More)35 b(exactly)-8
+b(,)37 b(if)d(the)390 1049 y(option)d(`)p Fr(-t)p Fv(')g(\(or,)g(equiv)
+-5 b(alen)m(tly)d(,)33 b(the)e(`)p Fr(\045struct-type)p
+Fv(')d(declaration\))k(w)m(as)f(giv)m(en,)h(it)f(returns)f(a)390
+1159 y(p)s(oin)m(ter)g(to)h(the)g(matc)m(hing)h(k)m(eyw)m(ord's)e
+(structure.)41 b(Otherwise)30 b(it)h(returns)e Fr(NULL)p
+Fv(.)275 1361 y(If)39 b(the)i(option)f(`)p Fr(-c)p Fv(')g(\(or,)j
+(equiv)-5 b(alen)m(tly)d(,)45 b(the)c(`)p Fr(\045compare-strncmp)p
+Fv(')36 b(declaration\))42 b(is)e(not)g(used,)150 1470
+y Fn(str)k Fv(m)m(ust)37 b(b)s(e)f(a)i(NUL)f(terminated)h(string)f(of)h
+(exactly)h(length)e Fn(len)p Fv(.)62 b(If)37 b(`)p Fr(-c)p
+Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)150
+1580 y(`)p Fr(\045compare-strncmp)p Fv(')22 b(declaration\))28
+b(is)e(used,)g Fn(str)32 b Fv(m)m(ust)26 b(simply)g(b)s(e)f(an)h(arra)m
+(y)g(of)g Fn(len)g Fv(b)m(ytes)h(and)e(do)s(es)150 1689
+y(not)31 b(need)f(to)h(b)s(e)f(NUL)g(terminated.)275
+1833 y(The)f(co)s(de)i(generated)g(for)g(these)f(t)m(w)m(o)i(functions)
+e(is)g(a\013ected)i(b)m(y)f(the)f(follo)m(wing)i(options:)150
+2006 y(`)p Fr(-t)p Fv(')150 2115 y(`)p Fr(--struct-type)p
+Fv(')630 2225 y(Mak)m(e)g(use)e(of)h(the)f(user-de\014ned)f
+Fr(struct)p Fv(.)150 2393 y(`)p Fr(-S)h Fi(total-switch-statements)10
+b Fv(')150 2503 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)g
+Fv(')630 2612 y(Generate)22 b(1)f(or)g(more)g(C)f Fr(switch)f
+Fv(statemen)m(t)j(rather)f(than)f(use)h(a)g(large,)j(\(and)c(p)s(oten)m
+(tially)630 2722 y(sparse\))j(static)h(arra)m(y)-8 b(.)40
+b(Although)23 b(the)g(exact)h(time)g(and)e(space)i(sa)m(vings)g(of)f
+(this)g(approac)m(h)630 2831 y(v)-5 b(ary)32 b(according)g(to)h(y)m
+(our)e(C)g(compiler's)i(degree)f(of)g(optimization,)i(this)d(metho)s(d)
+h(often)630 2941 y(results)e(in)g(smaller)h(and)f(faster)h(co)s(de.)275
+3114 y(If)c(the)h(`)p Fr(-t)p Fv(')g(and)f(`)p Fr(-S)p
+Fv(')g(options)i(\(or,)f(equiv)-5 b(alen)m(tly)d(,)31
+b(the)d(`)p Fr(\045struct-type)p Fv(')d(and)i(`)p Fr(\045switch)p
+Fv(')g(declara-)150 3223 y(tions\))f(are)f(omitted,)i(the)e(default)g
+(action)h(is)f(to)h(generate)g(a)g Fr(char)j(*)24 b Fv(arra)m(y)i(con)m
+(taining)g(the)f(k)m(eyw)m(ords,)150 3333 y(together)32
+b(with)e(additional)i(empt)m(y)f(strings)f(used)g(for)g(padding)g(the)g
+(arra)m(y)-8 b(.)43 b(By)30 b(exp)s(erimen)m(ting)h(with)150
+3442 y(the)g(v)-5 b(arious)32 b(input)e(and)g(output)h(options,)h(and)f
+(timing)g(the)h(resulting)f(C)g(co)s(de,)h(y)m(ou)f(can)h(determine)150
+3552 y(the)f(b)s(est)f(option)g(c)m(hoices)i(for)f(di\013eren)m(t)f(k)m
+(eyw)m(ord)h(set)g(c)m(haracteristics.)150 3798 y Fu(3.3)68
+b(Use)46 b(of)f(NUL)g(b)l(ytes)275 3957 y Fv(By)30 b(default,)h(the)f
+(co)s(de)g(generated)i(b)m(y)e Fr(gperf)e Fv(op)s(erates)j(on)f(zero)h
+(terminated)g(strings,)f(the)g(usual)150 4067 y(represen)m(tation)41
+b(of)e(strings)h(in)f(C.)h(This)e(means)i(that)g(the)g(k)m(eyw)m(ords)g
+(in)f(the)h(input)f(\014le)g(m)m(ust)h(not)150 4176 y(con)m(tain)d(NUL)
+f(b)m(ytes,)i(and)e(the)g Fn(str)42 b Fv(argumen)m(t)36
+b(passed)g(to)g Fr(hash)f Fv(or)h Fr(in_word_set)d Fv(m)m(ust)j(b)s(e)f
+(NUL)150 4286 y(terminated)c(and)f(ha)m(v)m(e)h(exactly)h(length)f
+Fn(len)p Fv(.)275 4429 y(If)k(option)i(`)p Fr(-c)p Fv(')f(\(or,)i
+(equiv)-5 b(alen)m(tly)d(,)40 b(the)c(`)p Fr(\045compare-strncmp)p
+Fv(')c(declaration\))38 b(is)e(used,)h(then)f(the)150
+4539 y Fn(str)e Fv(argumen)m(t)29 b(do)s(es)e(not)h(need)g(to)h(b)s(e)e
+(NUL)h(terminated.)41 b(The)27 b(co)s(de)h(generated)h(b)m(y)f
+Fr(gperf)f Fv(will)h(only)150 4649 y(access)h(the)f(\014rst)g
+Fn(len)p Fv(,)g(not)h Fn(len)p Fr(+)p Fn(1)p Fv(,)f(b)m(ytes)h
+(starting)g(at)f Fn(str)p Fv(.)40 b(Ho)m(w)m(ev)m(er,)31
+b(the)d(k)m(eyw)m(ords)g(in)g(the)g(input)f(\014le)150
+4758 y(still)k(m)m(ust)g(not)f(con)m(tain)i(NUL)e(b)m(ytes.)275
+4902 y(If)35 b(option)i(`)p Fr(-l)p Fv(')f(\(or,)i(equiv)-5
+b(alen)m(tly)d(,)40 b(the)c(`)p Fr(\045compare-lengths)p
+Fv(')c(declaration\))38 b(is)e(used,)h(then)f(the)150
+5011 y(hash)c(table)i(p)s(erforms)d(binary)h(comparison.)47
+b(The)33 b(k)m(eyw)m(ords)g(in)f(the)h(input)f(\014le)g(ma)m(y)i(con)m
+(tain)g(NUL)150 5121 y(b)m(ytes,)46 b(written)41 b(in)h(string)g(syn)m
+(tax)g(as)g Fr(\\000)f Fv(or)h Fr(\\x00)p Fv(,)i(and)d(the)h(co)s(de)g
+(generated)h(b)m(y)f Fr(gperf)f Fv(will)150 5230 y(treat)i(NUL)e(lik)m
+(e)i(an)m(y)f(other)g(b)m(yte.)75 b(Also,)45 b(in)c(this)g(case)i(the)f
+(`)p Fr(-c)p Fv(')f(option)h(\(or,)j(equiv)-5 b(alen)m(tly)d(,)47
+b(the)150 5340 y(`)p Fr(\045compare-strncmp)p Fv(')26
+b(declaration\))33 b(is)d(ignored.)p eop end
+%%Page: 23 25
+TeXDict begin 23 24 bop 150 -116 a Fv(Chapter)30 b(3:)41
+b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520
+b Fv(23)150 299 y Fu(3.4)68 b(The)45 b(Cop)l(yrigh)l(t)h(of)f(the)g
+(Output)275 458 y Fr(gperf)24 b Fv(is)i(under)f(GPL,)h(but)f(that)i(do)
+s(es)e(not)h(cause)h(the)f(output)g(pro)s(duced)e(b)m(y)i
+Fr(gperf)e Fv(to)j(b)s(e)e(under)150 568 y(GPL.)35 b(The)f(reason)g(is)
+h(that)g(the)f(output)g(con)m(tains)i(only)f(small)g(pieces)g(of)f
+(text)i(that)f(come)g(directly)150 677 y(from)f Fr(gperf)p
+Fv('s)f(source)h(co)s(de)h({)g(only)f(ab)s(out)g(7)h(lines)f(long,)i
+(to)s(o)g(small)e(for)g(b)s(eing)g(signi\014can)m(t)i({,)g(and)150
+787 y(therefore)31 b(the)f(output)g(is)h(not)f(a)h(\\w)m(ork)g(based)f
+(on)g Fr(gperf)p Fv(")g(\(in)g(the)h(sense)f(of)h(the)f(GPL)h(v)m
+(ersion)f(3\).)275 922 y(On)i(the)h(other)h(hand,)f(the)g(output)g(pro)
+s(duced)f(b)m(y)h Fr(gperf)e Fv(con)m(tains)k(essen)m(tially)g(all)f
+(of)f(the)h(input)150 1031 y(\014le.)40 b(Therefore)26
+b(the)h(output)g(is)g(a)g(\\deriv)-5 b(ativ)m(e)29 b(w)m(ork")e(of)g
+(the)g(input)f(\(in)h(the)g(sense)g(of)g(U.S.)g(cop)m(yrigh)m(t)150
+1141 y(la)m(w\);)42 b(and)37 b(its)h(cop)m(yrigh)m(t)g(status)g(dep)s
+(ends)e(on)h(the)g(cop)m(yrigh)m(t)i(of)f(the)f(input.)61
+b(F)-8 b(or)38 b(most)f(soft)m(w)m(are)150 1250 y(licenses,)28
+b(the)e(result)g(is)g(that)h(the)f(the)g(output)f(is)h(under)f(the)h
+(same)g(license,)i(with)e(the)g(same)h(cop)m(yrigh)m(t)150
+1360 y(holder,)j(as)h(the)f(input)g(that)h(w)m(as)g(passed)e(to)j
+Fr(gperf)p Fv(.)p eop end
+%%Page: 24 26
+TeXDict begin 24 25 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(24)150 299 y
+Fs(4)80 b(In)l(v)l(oking)52 b Fo(gperf)275 586 y Fv(There)35
+b(are)i Fm(many)46 b Fv(options)36 b(to)i Fr(gperf)p
+Fv(.)57 b(They)36 b(w)m(ere)h(added)e(to)j(mak)m(e)f(the)g(program)f
+(more)g(con-)150 695 y(v)m(enien)m(t)f(for)e(use)g(with)g(real)h
+(applications.)50 b(\\On-line")34 b(help)f(is)g(readily)h(a)m(v)-5
+b(ailable)36 b(via)e(the)f(`)p Fr(--help)p Fv(')150 805
+y(option.)41 b(Here)31 b(is)f(the)h(complete)h(list)f(of)f(options.)150
+1064 y Fu(4.1)68 b(Sp)t(ecifying)45 b(the)g(Lo)t(cation)h(of)f(the)g
+(Output)g(File)150 1257 y Fv(`)p Fr(--output-file=)p
+Fi(file)11 b Fv(')630 1367 y(Allo)m(ws)31 b(y)m(ou)g(to)g(sp)s(ecify)f
+(the)h(name)f(of)h(the)f(\014le)h(to)g(whic)m(h)f(the)h(output)f(is)g
+(written)g(to.)275 1553 y(The)f(results)i(are)f(written)h(to)g
+(standard)e(output)h(if)h(no)f(output)g(\014le)g(is)h(sp)s(eci\014ed)f
+(or)g(if)g(it)h(is)g(`)p Fr(-)p Fv('.)150 1811 y Fu(4.2)68
+b(Options)45 b(that)h(a\013ect)g(In)l(terpretation)h(of)e(the)g(Input)g
+(File)275 1971 y Fv(These)d(options)h(are)g(also)g(a)m(v)-5
+b(ailable)45 b(as)e(declarations)h(in)e(the)h(input)f(\014le)g(\(see)i
+(Section)f(3.1.1.2)150 2080 y([Gp)s(erf)30 b(Declarations],)j(page)e
+(16\).)150 2266 y(`)p Fr(-e)f Fi(keyword-delimiter-list)11
+b Fv(')150 2376 y(`)p Fr(--delimiters=)p Fi(keyword-deli)o(mite)o(r-li)
+o(st)f Fv(')630 2485 y(Allo)m(ws)30 b(y)m(ou)f(to)g(pro)m(vide)g(a)g
+(string)g(con)m(taining)h(delimiters)g(used)d(to)j(separate)g(k)m(eyw)m
+(ords)630 2595 y(from)k(their)h(attributes.)54 b(The)34
+b(default)g(is)h Fr(")p Fv(,)p Fr(")p Fv(.)53 b(This)34
+b(option)h(is)f(essen)m(tial)j(if)d(y)m(ou)h(w)m(an)m(t)630
+2705 y(to)f(use)e(k)m(eyw)m(ords)h(that)h(ha)m(v)m(e)g(em)m(b)s(edded)e
+(commas)h(or)g(newlines.)48 b(One)33 b(useful)f(tric)m(k)i(is)630
+2814 y(to)d(use)f(-e'T)-8 b(AB',)33 b(where)c(T)-8 b(AB)31
+b(is)g(the)f(literal)i(tab)f(c)m(haracter.)150 2991 y(`)p
+Fr(-t)p Fv(')150 3101 y(`)p Fr(--struct-type)p Fv(')630
+3210 y(Allo)m(ws)h(y)m(ou)g(to)g(include)f(a)g Fr(struct)f
+Fv(t)m(yp)s(e)h(declaration)i(for)e(generated)h(co)s(de.)44
+b(An)m(y)31 b(text)630 3320 y(b)s(efore)43 b(a)i(pair)e(of)h
+(consecutiv)m(e)i(`)p Fr(\045\045)p Fv(')d(is)h(considered)g(part)f(of)
+h(the)g(t)m(yp)s(e)g(declaration.)630 3430 y(Keyw)m(ords)39
+b(and)g(additional)h(\014elds)f(ma)m(y)i(follo)m(w)f(this,)i(one)e
+(group)f(of)h(\014elds)f(p)s(er)f(line.)630 3539 y(A)31
+b(set)g(of)g(examples)g(for)f(generating)i(p)s(erfect)e(hash)g(tables)i
+(and)e(functions)g(for)g(Ada,)h(C,)630 3649 y(C)p Fr(++)p
+Fv(,)24 b(P)m(ascal,)j(Mo)s(dula)c(2,)j(Mo)s(dula)d(3)h(and)f(Ja)m(v)-5
+b(aScript)24 b(reserv)m(ed)f(w)m(ords)g(are)h(distributed)630
+3758 y(with)30 b(this)g(release.)150 3935 y(`)p Fr(--ignore-case)p
+Fv(')630 4045 y(Consider)43 b(upp)s(er)f(and)i(lo)m(w)m(er)h(case)g
+(ASCI)s(I)e(c)m(haracters)i(as)f(equiv)-5 b(alen)m(t.)83
+b(The)44 b(string)630 4155 y(comparison)28 b(will)h(use)f(a)h(case)g
+(insigni\014can)m(t)g(c)m(haracter)h(comparison.)40 b(Note)29
+b(that)g(lo)s(cale)630 4264 y(dep)s(enden)m(t)e(case)i(mappings)f(are)g
+(ignored.)40 b(This)28 b(option)g(is)h(therefore)f(not)h(suitable)f(if)
+h(a)630 4374 y(prop)s(erly)k(in)m(ternationalized)k(or)d(lo)s(cale)i(a)
+m(w)m(are)g(case)f(mapping)f(should)f(b)s(e)h(used.)52
+b(\(F)-8 b(or)630 4483 y(example,)31 b(in)e(a)g(T)-8
+b(urkish)29 b(lo)s(cale,)i(the)f(upp)s(er)d(case)k(equiv)-5
+b(alen)m(t)30 b(of)g(the)g(lo)m(w)m(ercase)h(ASCI)s(I)630
+4593 y(letter)42 b(`)p Fr(i)p Fv(')g(is)f(the)g(non-ASCI)s(I)e(c)m
+(haracter)k(`)p Fr(capital)29 b(i)h(with)f(dot)g(above)p
+Fv('.\))72 b(F)-8 b(or)42 b(this)630 4702 y(case,)d(it)d(is)g(b)s
+(etter)h(to)f(apply)g(an)g(upp)s(ercase)f(or)h(lo)m(w)m(ercase)i(con)m
+(v)m(ersion)g(on)e(the)g(string)630 4812 y(b)s(efore)30
+b(passing)g(it)h(to)g(the)g Fr(gperf)e Fv(generated)i(function.)150
+5071 y Fu(4.3)68 b(Options)45 b(to)h(sp)t(ecify)f(the)g(Language)h(for)
+f(the)g(Output)f(Co)t(de)275 5230 y Fv(These)e(options)h(are)g(also)g
+(a)m(v)-5 b(ailable)45 b(as)e(declarations)h(in)e(the)h(input)f(\014le)
+g(\(see)i(Section)f(3.1.1.2)150 5340 y([Gp)s(erf)30 b(Declarations],)j
+(page)e(16\).)p eop end
+%%Page: 25 27
+TeXDict begin 25 26 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(25)150 299 y(`)p
+Fr(-L)30 b Fi(generated-language-name)10 b Fv(')150 408
+y(`)p Fr(--language=)p Fi(generated-lang)o(uage)o(-nam)o(e)g
+Fv(')630 518 y(Instructs)33 b Fr(gperf)f Fv(to)i(generate)h(co)s(de)f
+(in)f(the)h(language)h(sp)s(eci\014ed)d(b)m(y)i(the)g(option's)g(ar-)
+630 628 y(gumen)m(t.)41 b(Languages)31 b(handled)f(are)h(curren)m(tly:)
+630 804 y(`)p Fr(KR-C)p Fv(')238 b(Old-st)m(yle)27 b(K&R)f(C.)g(This)f
+(language)j(is)f(understo)s(o)s(d)d(b)m(y)i(old-st)m(yle)i(C)e(com-)
+1110 914 y(pilers)e(and)g(ANSI)f(C)h(compilers,)i(but)e(ANSI)f(C)h
+(compilers)h(ma)m(y)f(\015ag)h(w)m(arn-)1110 1023 y(ings)30
+b(\(or)h(ev)m(en)g(errors\))f(b)s(ecause)h(of)f(lac)m(king)i(`)p
+Fr(const)p Fv('.)630 1200 y(`)p Fr(C)p Fv(')382 b(Common)23
+b(C.)f(This)h(language)h(is)f(understo)s(o)s(d)e(b)m(y)i(ANSI)g(C)f
+(compilers,)k(and)1110 1310 y(also)k(b)m(y)e(old-st)m(yle)i(C)f
+(compilers,)g(pro)m(vided)f(that)i(y)m(ou)f Fr(#define)f(const)f
+Fv(to)1110 1419 y(empt)m(y)k(for)f(compilers)h(whic)m(h)f(don't)g(kno)m
+(w)h(ab)s(out)f(this)g(k)m(eyw)m(ord.)630 1596 y(`)p
+Fr(ANSI-C)p Fv(')142 b(ANSI)39 b(C.)h(This)e(language)j(is)f(understo)s
+(o)s(d)e(b)m(y)h(ANSI)g(C)h(compilers)g(and)1110 1705
+y(C)p Fr(++)29 b Fv(compilers.)630 1882 y(`)p Fr(C++)p
+Fv(')286 b(C)p Fr(++)p Fv(.)40 b(This)29 b(language)j(is)f(understo)s
+(o)s(d)d(b)m(y)i(C)p Fr(++)g Fv(compilers.)630 2058 y(The)g(default)g
+(is)h(C.)150 2235 y(`)p Fr(-a)p Fv(')334 b(This)33 b(option)h(is)f
+(supp)s(orted)f(for)h(compatibilit)m(y)j(with)d(previous)g(releases)i
+(of)f Fr(gperf)p Fv(.)49 b(It)630 2345 y(do)s(es)30 b(not)h(do)f(an)m
+(ything.)150 2521 y(`)p Fr(-g)p Fv(')334 b(This)33 b(option)h(is)f
+(supp)s(orted)f(for)h(compatibilit)m(y)j(with)d(previous)g(releases)i
+(of)f Fr(gperf)p Fv(.)49 b(It)630 2631 y(do)s(es)30 b(not)h(do)f(an)m
+(ything.)150 2889 y Fu(4.4)68 b(Options)45 b(for)g(\014ne)g(tuning)g
+(Details)i(in)e(the)g(Output)f(Co)t(de)275 3048 y Fv(Most)21
+b(of)g(these)g(options)g(are)g(also)h(a)m(v)-5 b(ailable)23
+b(as)e(declarations)h(in)f(the)g(input)e(\014le)i(\(see)h(Section)f
+(3.1.1.2)150 3158 y([Gp)s(erf)30 b(Declarations],)j(page)e(16\).)150
+3343 y(`)p Fr(-K)f Fi(slot-name)11 b Fv(')150 3453 y(`)p
+Fr(--slot-name=)p Fi(slot-name)g Fv(')630 3562 y(This)21
+b(option)h(is)g(only)f(useful)g(when)g(option)h(`)p Fr(-t)p
+Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)26 b(the)c(`)p
+Fr(\045struct-type)p Fv(')630 3672 y(declaration\))41
+b(has)e(b)s(een)f(giv)m(en.)67 b(By)39 b(default,)j(the)d(program)g
+(assumes)f(the)h(structure)630 3781 y(comp)s(onen)m(t)28
+b(iden)m(ti\014er)h(for)f(the)g(k)m(eyw)m(ord)g(is)h(`)p
+Fr(name)p Fv('.)39 b(This)27 b(option)i(allo)m(ws)g(an)f(arbitrary)630
+3891 y(c)m(hoice)33 b(of)f(iden)m(ti\014er)g(for)f(this)h(comp)s(onen)m
+(t,)g(although)g(it)g(still)g(m)m(ust)g(o)s(ccur)f(as)h(the)g(\014rst)
+630 4001 y(\014eld)e(in)g(y)m(our)g(supplied)f Fr(struct)p
+Fv(.)150 4177 y(`)p Fr(-F)h Fi(initializers)11 b Fv(')150
+4287 y(`)p Fr(--initializer-suffix=)p Fi(init)o(iali)o(zers)f
+Fv(')630 4396 y(This)21 b(option)h(is)g(only)f(useful)g(when)g(option)h
+(`)p Fr(-t)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)26
+b(the)c(`)p Fr(\045struct-type)p Fv(')630 4506 y(declaration\))34
+b(has)f(b)s(een)e(giv)m(en.)49 b(It)32 b(p)s(ermits)g(to)h(sp)s(ecify)f
+(initializers)i(for)f(the)f(structure)630 4615 y(mem)m(b)s(ers)23
+b(follo)m(wing)i Fn(slot-name)30 b Fv(in)23 b(empt)m(y)h(hash)f(table)h
+(en)m(tries.)39 b(The)23 b(list)h(of)g(initializers)630
+4725 y(should)37 b(start)i(with)g(a)f(comma.)66 b(By)39
+b(default,)i(the)e(emitted)g(co)s(de)g(will)f(zero-initialize)630
+4835 y(structure)30 b(mem)m(b)s(ers)f(follo)m(wing)j
+Fn(slot-name)p Fv(.)150 5011 y(`)p Fr(-H)e Fi(hash-function-name)11
+b Fv(')150 5121 y(`)p Fr(--hash-function-name=)p Fi(hash)o(-fun)o(ctio)
+o(n-n)o(ame)f Fv(')630 5230 y(Allo)m(ws)31 b(y)m(ou)f(to)g(sp)s(ecify)g
+(the)g(name)g(for)f(the)h(generated)h(hash)e(function.)40
+b(Default)31 b(name)630 5340 y(is)f(`)p Fr(hash)p Fv('.)40
+b(This)30 b(option)h(p)s(ermits)e(the)i(use)f(of)h(t)m(w)m(o)g(hash)f
+(tables)h(in)f(the)h(same)g(\014le.)p eop end
+%%Page: 26 28
+TeXDict begin 26 27 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(26)150 299 y(`)p
+Fr(-N)30 b Fi(lookup-function-name)11 b Fv(')150 408
+y(`)p Fr(--lookup-function-name=)p Fi(lo)o(okup)o(-fun)o(cti)o(on-n)o
+(ame)f Fv(')630 518 y(Allo)m(ws)43 b(y)m(ou)f(to)h(sp)s(ecify)e(the)i
+(name)f(for)f(the)h(generated)h(lo)s(okup)f(function.)75
+b(Default)630 628 y(name)28 b(is)g(`)p Fr(in_word_set)p
+Fv('.)37 b(This)27 b(option)h(p)s(ermits)f(m)m(ultiple)i(generated)f
+(hash)f(functions)630 737 y(to)k(b)s(e)f(used)f(in)h(the)h(same)g
+(application.)150 938 y(`)p Fr(-Z)f Fi(class-name)11
+b Fv(')150 1048 y(`)p Fr(--class-name=)p Fi(class-name)f
+Fv(')630 1157 y(This)66 b(option)i(is)f(only)h(useful)e(when)h(option)g
+(`)p Fr(-L)30 b(C++)p Fv(')67 b(\(or,)77 b(equiv)-5 b(alen)m(tly)d(,)79
+b(the)630 1267 y(`)p Fr(\045language=C++)p Fv(')43 b(declaration\))k
+(has)f(b)s(een)f(giv)m(en.)88 b(It)46 b(allo)m(ws)h(y)m(ou)f(to)g(sp)s
+(ecify)g(the)630 1377 y(name)30 b(of)h(generated)g(C)p
+Fr(++)f Fv(class.)41 b(Default)32 b(name)e(is)h Fr(Perfect_Hash)p
+Fv(.)150 1577 y(`)p Fr(-7)p Fv(')150 1687 y(`)p Fr(--seven-bit)p
+Fv(')630 1797 y(This)36 b(option)i(sp)s(eci\014es)f(that)g(all)h
+(strings)f(that)h(will)f(b)s(e)g(passed)f(as)i(argumen)m(ts)f(to)h(the)
+630 1906 y(generated)e(hash)e(function)g(and)h(the)g(generated)g(lo)s
+(okup)g(function)f(will)h(solely)h(consist)630 2016 y(of)d(7-bit)h
+(ASCI)s(I)e(c)m(haracters)j(\(b)m(ytes)f(in)f(the)g(range)h(0..127\).)
+51 b(\(Note)35 b(that)f(the)g(ANSI)e(C)630 2125 y(functions)f
+Fr(isalnum)f Fv(and)i Fr(isgraph)e Fv(do)i Fm(not)41
+b Fv(guaran)m(tee)33 b(that)g(a)f(b)m(yte)h(is)f(in)f(this)h(range.)630
+2235 y(Only)26 b(an)g(explicit)i(test)g(lik)m(e)f(`)p
+Fr(c)k(>=)f('A')f(&&)h(c)g(<=)g('Z')p Fv(')25 b(guaran)m(tees)j
+(this.\))40 b(This)26 b(w)m(as)h(the)630 2345 y(default)g(in)g(v)m
+(ersions)g(of)g Fr(gperf)e Fv(earlier)j(than)e(2.7;)k(no)m(w)d(the)g
+(default)g(is)f(to)i(supp)s(ort)d(8-bit)630 2454 y(and)30
+b(m)m(ultib)m(yte)h(c)m(haracters.)150 2655 y(`)p Fr(-l)p
+Fv(')150 2765 y(`)p Fr(--compare-lengths)p Fv(')630 2874
+y(Compare)40 b(k)m(eyw)m(ord)g(lengths)g(b)s(efore)f(trying)h(a)h
+(string)e(comparison.)70 b(This)39 b(option)h(is)630
+2984 y(mandatory)32 b(for)h(binary)e(comparisons)i(\(see)g(Section)h
+(3.3)f([Binary)g(Strings],)g(page)g(22\).)630 3093 y(It)g(also)h(migh)m
+(t)g(cut)f(do)m(wn)f(on)h(the)g(n)m(um)m(b)s(er)f(of)h(string)g
+(comparisons)g(made)g(during)f(the)630 3203 y(lo)s(okup,)i(since)g(k)m
+(eyw)m(ords)f(with)g(di\013eren)m(t)h(lengths)g(are)f(nev)m(er)h
+(compared)f(via)h Fr(strcmp)p Fv(.)630 3313 y(Ho)m(w)m(ev)m(er,)j
+(using)c(`)p Fr(-l)p Fv(')g(migh)m(t)h(greatly)h(increase)g(the)f(size)
+g(of)g(the)f(generated)i(C)e(co)s(de)h(if)630 3422 y(the)k(lo)s(okup)g
+(table)g(range)h(is)f(large)h(\(whic)m(h)f(implies)g(that)g(the)g
+(switc)m(h)h(option)f(`)p Fr(-S)p Fv(')g(or)630 3532
+y(`)p Fr(\045switch)p Fv(')29 b(is)i(not)g(enabled\),)h(since)f(the)g
+(length)g(table)h(con)m(tains)g(as)f(man)m(y)g(elemen)m(ts)h(as)630
+3641 y(there)f(are)f(en)m(tries)i(in)e(the)g(lo)s(okup)g(table.)150
+3842 y(`)p Fr(-c)p Fv(')150 3952 y(`)p Fr(--compare-strncmp)p
+Fv(')630 4061 y(Generates)22 b(C)f(co)s(de)g(that)h(uses)e(the)i
+Fr(strncmp)d Fv(function)h(to)i(p)s(erform)e(string)h(comparisons.)630
+4171 y(The)30 b(default)g(action)i(is)f(to)g(use)f Fr(strcmp)p
+Fv(.)150 4372 y(`)p Fr(-C)p Fv(')150 4482 y(`)p Fr(--readonly-tables)p
+Fv(')630 4591 y(Mak)m(es)41 b(the)f(con)m(ten)m(ts)h(of)f(all)h
+(generated)f(lo)s(okup)f(tables)i(constan)m(t,)i(i.e.,)h(\\readonly".)
+630 4701 y(Man)m(y)31 b(compilers)g(can)g(generate)h(more)e(e\016cien)m
+(t)i(co)s(de)f(for)f(this)h(b)m(y)f(putting)g(the)h(tables)630
+4810 y(in)f(readonly)h(memory)-8 b(.)150 5011 y(`)p Fr(-E)p
+Fv(')150 5121 y(`)p Fr(--enum)p Fv(')142 b(De\014ne)31
+b(constan)m(t)g(v)-5 b(alues)31 b(using)f(an)g(en)m(um)g(lo)s(cal)i(to)
+f(the)g(lo)s(okup)f(function)g(rather)g(than)630 5230
+y(with)37 b(#de\014nes.)60 b(This)36 b(also)i(means)g(that)f
+(di\013eren)m(t)h(lo)s(okup)f(functions)g(can)g(reside)g(in)630
+5340 y(the)31 b(same)f(\014le.)41 b(Thanks)29 b(to)j(James)e(Clark)g
+Fr(<jjc@ai.mit.edu>)p Fv(.)p eop end
+%%Page: 27 29
+TeXDict begin 27 28 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(27)150 299 y(`)p
+Fr(-I)p Fv(')150 408 y(`)p Fr(--includes)p Fv(')630 518
+y(Include)30 b(the)h(necessary)h(system)f(include)g(\014le,)g
+Fr(<string.h>)p Fv(,)e(at)i(the)g(b)s(eginning)g(of)g(the)630
+628 y(co)s(de.)39 b(By)27 b(default,)g(this)f(is)g(not)g(done;)i(the)e
+(user)f(m)m(ust)h(include)g(this)f(header)h(\014le)g(himself)630
+737 y(to)31 b(allo)m(w)h(compilation)g(of)e(the)h(co)s(de.)150
+897 y(`)p Fr(-G)p Fv(')150 1007 y(`)p Fr(--global-table)p
+Fv(')630 1117 y(Generate)38 b(the)f(static)h(table)f(of)g(k)m(eyw)m
+(ords)g(as)g(a)g(static)h(global)g(v)-5 b(ariable,)39
+b(rather)d(than)630 1226 y(hiding)30 b(it)h(inside)f(of)g(the)h(lo)s
+(okup)f(function)g(\(whic)m(h)g(is)h(the)f(default)h(b)s(eha)m(vior\).)
+150 1386 y(`)p Fr(-P)p Fv(')150 1496 y(`)p Fr(--pic)p
+Fv(')190 b(Optimize)42 b(the)f(generated)h(table)g(for)f(inclusion)g
+(in)g(shared)f(libraries.)73 b(This)40 b(reduces)630
+1606 y(the)35 b(startup)g(time)h(of)f(programs)g(using)g(a)h(shared)e
+(library)h(con)m(taining)i(the)e(generated)630 1715 y(co)s(de.)j(If)21
+b(the)h(option)h(`)p Fr(-t)p Fv(')e(\(or,)k(equiv)-5
+b(alen)m(tly)d(,)25 b(the)d(`)p Fr(\045struct-type)p
+Fv(')d(declaration\))24 b(is)e(also)630 1825 y(giv)m(en,)32
+b(the)f(\014rst)e(\014eld)i(of)f(the)h(user-de\014ned)e(struct)i(m)m
+(ust)f(b)s(e)g(of)h(t)m(yp)s(e)g(`)p Fr(int)p Fv(',)f(not)h(`)p
+Fr(char)630 1934 y(*)p Fv(',)h(b)s(ecause)f(it)i(will)e(con)m(tain)i
+(o\013sets)g(in)m(to)f(the)g(string)f(p)s(o)s(ol)h(instead)f(of)h
+(actual)h(strings.)630 2044 y(T)-8 b(o)33 b(con)m(v)m(ert)h(suc)m(h)f
+(an)f(o\013set)i(to)f(a)g(string,)h(y)m(ou)f(can)g(use)f(the)h
+(expression)f(`)p Fr(stringpool)630 2153 y(+)e Fi(o)11
+b Fv(',)33 b(where)f Fn(o)37 b Fv(is)c(the)g(o\013set.)48
+b(The)32 b(string)g(p)s(o)s(ol)g(name)h(can)g(b)s(e)f(c)m(hanged)h
+(through)f(the)630 2263 y(option)f(`)p Fr(--string-pool-name)p
+Fv('.)150 2423 y(`)p Fr(-Q)f Fi(string-pool-name)11 b
+Fv(')150 2533 y(`)p Fr(--string-pool-name=)p Fi(string)o(-poo)o(l-na)o
+(me)f Fv(')630 2642 y(Allo)m(ws)32 b(y)m(ou)g(to)g(sp)s(ecify)f(the)g
+(name)h(of)f(the)h(generated)g(string)f(p)s(o)s(ol)g(created)h(b)m(y)f
+(option)630 2752 y(`)p Fr(-P)p Fv('.)38 b(The)21 b(default)g(name)h(is)
+f(`)p Fr(stringpool)p Fv('.)36 b(This)20 b(option)i(p)s(ermits)f(the)g
+(use)g(of)h(t)m(w)m(o)h(hash)630 2862 y(tables)i(in)e(the)h(same)g
+(\014le,)i(with)d(`)p Fr(-P)p Fv(')h(and)f(ev)m(en)h(when)f(the)h
+(option)g(`)p Fr(-G)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)630
+2971 y(the)31 b(`)p Fr(\045global-table)p Fv(')c(declaration\))32
+b(is)f(giv)m(en.)150 3131 y(`)p Fr(--null-strings)p Fv(')630
+3241 y(Use)39 b(NULL)g(strings)f(instead)i(of)e(empt)m(y)i(strings)e
+(for)h(empt)m(y)g(k)m(eyw)m(ord)g(table)h(en)m(tries.)630
+3351 y(This)e(reduces)g(the)h(startup)g(time)g(of)g(programs)g(using)f
+(a)h(shared)f(library)g(con)m(taining)630 3460 y(the)j(generated)g(co)s
+(de)g(\(but)f(not)h(as)f(m)m(uc)m(h)h(as)g(option)g(`)p
+Fr(-P)p Fv('\),)i(at)e(the)g(exp)s(ense)f(of)h(one)630
+3570 y(more)31 b(test-and-branc)m(h)f(instruction)h(at)g(run)e(time.)
+150 3730 y(`)p Fr(-W)h Fi(hash-table-array-name)11 b
+Fv(')150 3839 y(`)p Fr(--word-array-name=)p Fi(hash-ta)o(ble-)o(arra)o
+(y-n)o(ame)f Fv(')630 3949 y(Allo)m(ws)41 b(y)m(ou)f(to)h(sp)s(ecify)f
+(the)g(name)g(for)f(the)i(generated)g(arra)m(y)f(con)m(taining)i(the)e
+(hash)630 4059 y(table.)106 b(Default)53 b(name)e(is)h(`)p
+Fr(wordlist)p Fv('.)103 b(This)51 b(option)h(p)s(ermits)f(the)h(use)g
+(of)g(t)m(w)m(o)630 4168 y(hash)37 b(tables)h(in)g(the)g(same)g
+(\014le,)i(ev)m(en)e(when)f(the)h(option)g(`)p Fr(-G)p
+Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)630
+4278 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33
+b(is)d(giv)m(en.)150 4413 y(`)p Fr(--length-table-name=)p
+Fi(lengt)o(h-ta)o(ble-)o(arr)o(ay-n)o(ame)10 b Fv(')630
+4522 y(Allo)m(ws)36 b(y)m(ou)e(to)i(sp)s(ecify)e(the)h(name)f(for)g
+(the)h(generated)h(arra)m(y)f(con)m(taining)h(the)f(length)630
+4632 y(table.)77 b(Default)43 b(name)g(is)f(`)p Fr(lengthtable)p
+Fv('.)74 b(This)41 b(option)i(p)s(ermits)e(the)h(use)g(of)h(t)m(w)m(o)
+630 4741 y(length)33 b(tables)h(in)f(the)g(same)g(\014le,)h(ev)m(en)g
+(when)e(the)h(option)h(`)p Fr(-G)p Fv(')f(\(or,)h(equiv)-5
+b(alen)m(tly)d(,)36 b(the)630 4851 y(`)p Fr(\045global-table)p
+Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 5011
+y(`)p Fr(-S)g Fi(total-switch-statements)10 b Fv(')150
+5121 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)g
+Fv(')630 5230 y(Causes)35 b(the)h(generated)h(C)e(co)s(de)h(to)h(use)e
+(a)h Fr(switch)e Fv(statemen)m(t)k(sc)m(heme,)g(rather)d(than)630
+5340 y(an)j(arra)m(y)g(lo)s(okup)g(table.)64 b(This)37
+b(can)h(lead)h(to)f(a)h(reduction)f(in)f(b)s(oth)g(time)i(and)e(space)p
+eop end
+%%Page: 28 30
+TeXDict begin 28 29 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(28)630 299 y(requiremen)m(ts)
+43 b(for)h(some)f(input)g(\014les.)80 b(The)43 b(argumen)m(t)h(to)g
+(this)f(option)h(determines)630 408 y(ho)m(w)33 b(man)m(y)f
+Fr(switch)f Fv(statemen)m(ts)k(are)e(generated.)49 b(A)32
+b(v)-5 b(alue)34 b(of)e(1)i(generates)g(1)f Fr(switch)630
+518 y Fv(con)m(taining)25 b(all)e(the)h(elemen)m(ts,)i(a)d(v)-5
+b(alue)23 b(of)h(2)f(generates)h(2)g(tables)f(with)g(1/2)h(the)g
+(elemen)m(ts)630 628 y(in)38 b(eac)m(h)h Fr(switch)p
+Fv(,)g(etc.)65 b(This)37 b(is)h(useful)g(since)g(man)m(y)h(C)e
+(compilers)i(cannot)g(correctly)630 737 y(generate)29
+b(co)s(de)f(for)f(large)h Fr(switch)e Fv(statemen)m(ts.)41
+b(This)27 b(option)h(w)m(as)g(inspired)e(in)h(part)g(b)m(y)630
+847 y(Keith)k(Bostic's)h(original)f(C)f(program.)150
+1009 y(`)p Fr(-T)p Fv(')150 1118 y(`)p Fr(--omit-struct-type)p
+Fv(')630 1228 y(Prev)m(en)m(ts)f(the)e(transfer)h(of)f(the)h(t)m(yp)s
+(e)g(declaration)h(to)g(the)f(output)f(\014le.)40 b(Use)28
+b(this)f(option)630 1338 y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g
+(de\014ned)e(elsewhere.)150 1500 y(`)p Fr(-p)p Fv(')334
+b(This)33 b(option)h(is)f(supp)s(orted)f(for)h(compatibilit)m(y)j(with)
+d(previous)g(releases)i(of)f Fr(gperf)p Fv(.)49 b(It)630
+1609 y(do)s(es)30 b(not)h(do)f(an)m(ything.)150 1845
+y Fu(4.5)68 b(Options)45 b(for)g(c)l(hanging)h(the)f(Algorithms)h
+(emplo)l(y)l(ed)g(b)l(y)f Fl(gperf)150 2031 y Fv(`)p
+Fr(-k)30 b Fi(selected-byte-positions)10 b Fv(')150 2141
+y(`)p Fr(--key-positions=)p Fi(selected-)o(byte)o(-pos)o(iti)o(ons)g
+Fv(')630 2250 y(Allo)m(ws)28 b(selection)h(of)e(the)g(b)m(yte)h(p)s
+(ositions)f(used)f(in)h(the)g(k)m(eyw)m(ords')h(hash)e(function.)39
+b(The)630 2360 y(allo)m(w)m(able)24 b(c)m(hoices)g(range)e(b)s(et)m(w)m
+(een)h(1-255,)j(inclusiv)m(e.)38 b(The)22 b(p)s(ositions)f(are)i
+(separated)f(b)m(y)630 2469 y(commas,)27 b(e.g.,)i(`)p
+Fr(-k)h(9,4,13,14)p Fv(';)25 b(ranges)h(ma)m(y)g(b)s(e)f(used,)h(e.g.,)
+i(`)p Fr(-k)i(2-7)p Fv(';)d(and)e(p)s(ositions)630 2579
+y(ma)m(y)c(o)s(ccur)f(in)h(an)m(y)g(order.)37 b(F)-8
+b(urthermore,)22 b(the)f(wildcard)f('*')h(causes)g(the)g(generated)h
+(hash)630 2689 y(function)37 b(to)h(consider)g Fe(all)g
+Fv(b)m(yte)g(p)s(ositions)f(in)g(eac)m(h)i(k)m(eyw)m(ord,)h(whereas)d
+('$')h(instructs)630 2798 y(the)31 b(hash)g(function)f(to)i(use)f(the)g
+(\\\014nal)h(b)m(yte")g(of)f(a)h(k)m(eyw)m(ord)f(\(this)g(is)h(the)f
+(only)g(w)m(a)m(y)h(to)630 2908 y(use)e(a)h(b)m(yte)g(p)s(osition)f
+(greater)i(than)e(255,)i(inciden)m(tally\).)630 3043
+y(F)-8 b(or)37 b(instance,)h(the)e(option)h(`)p Fr(-k)30
+b(1,2,4,6-10,'$')p Fv(')i(generates)38 b(a)e(hash)g(function)f(that)630
+3153 y(considers)g(p)s(ositions)g(1,2,4,6,7,8,9,10,)42
+b(plus)34 b(the)i(last)g(b)m(yte)f(in)g(eac)m(h)h(k)m(eyw)m(ord)g
+(\(whic)m(h)630 3263 y(ma)m(y)j(b)s(e)f(at)i(a)f(di\013eren)m(t)g(p)s
+(osition)g(for)f(eac)m(h)i(k)m(eyw)m(ord,)h(ob)m(viously\).)67
+b(Keyw)m(ords)38 b(with)630 3372 y(length)30 b(less)g(than)f(the)g
+(indicated)h(b)m(yte)h(p)s(ositions)e(w)m(ork)g(prop)s(erly)-8
+b(,)30 b(since)f(selected)i(b)m(yte)630 3482 y(p)s(ositions)k
+(exceeding)h(the)g(k)m(eyw)m(ord)f(length)g(are)h(simply)e(not)i
+(referenced)f(in)f(the)i(hash)630 3591 y(function.)630
+3727 y(This)28 b(option)i(is)f(not)g(normally)g(needed)g(since)g(v)m
+(ersion)g(2.8)i(of)e Fr(gperf)p Fv(;)f(the)h(default)g(b)m(yte)630
+3837 y(p)s(ositions)36 b(are)g(computed)f(dep)s(ending)f(on)i(the)f(k)m
+(eyw)m(ord)h(set,)i(through)d(a)h(searc)m(h)g(that)630
+3946 y(minimizes)31 b(the)f(n)m(um)m(b)s(er)f(of)i(b)m(yte)g(p)s
+(ositions.)150 4108 y(`)p Fr(-D)p Fv(')150 4218 y(`)p
+Fr(--duplicates)p Fv(')630 4327 y(Handle)h(k)m(eyw)m(ords)h(whose)f
+(selected)i(b)m(yte)e(sets)h(hash)e(to)i(duplicate)g(v)-5
+b(alues.)46 b(Duplicate)630 4437 y(hash)33 b(v)-5 b(alues)34
+b(can)h(o)s(ccur)e(if)h(a)g(set)h(of)f(k)m(eyw)m(ords)g(has)g(the)g
+(same)g(names,)h(but)e(p)s(ossesses)630 4547 y(di\013eren)m(t)f
+(attributes,)g(or)f(if)h(the)f(selected)i(b)m(yte)f(p)s(ositions)f(are)
+h(not)f(w)m(ell)h(c)m(hosen.)44 b(With)630 4656 y(the)36
+b(-D)g(option)g Fr(gperf)e Fv(treats)j(all)f(these)h(k)m(eyw)m(ords)e
+(as)h(part)g(of)g(an)f(equiv)-5 b(alence)37 b(class)630
+4766 y(and)31 b(generates)i(a)f(p)s(erfect)g(hash)f(function)g(with)h
+(m)m(ultiple)g(comparisons)g(for)f(duplicate)630 4875
+y(k)m(eyw)m(ords.)38 b(It)21 b(is)f(up)g(to)h(y)m(ou)g(to)h(completely)
+g(disam)m(biguate)g(the)f(k)m(eyw)m(ords)g(b)m(y)g(mo)s(difying)630
+4985 y(the)28 b(generated)g(C)f(co)s(de.)40 b(Ho)m(w)m(ev)m(er,)30
+b Fr(gperf)c Fv(helps)h(y)m(ou)g(out)h(b)m(y)f(organizing)i(the)e
+(output.)630 5121 y(Using)32 b(this)g(option)g(usually)g(means)g(that)g
+(the)g(generated)h(hash)e(function)h(is)g(no)f(longer)630
+5230 y(p)s(erfect.)48 b(On)31 b(the)i(other)g(hand,)g(it)g(p)s(ermits)f
+Fr(gperf)f Fv(to)i(w)m(ork)g(on)g(k)m(eyw)m(ord)g(sets)g(that)g(it)630
+5340 y(otherwise)e(could)f(not)h(handle.)p eop end
+%%Page: 29 31
+TeXDict begin 29 30 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(29)150 299 y(`)p
+Fr(-m)30 b Fi(iterations)11 b Fv(')150 408 y(`)p Fr
+(--multiple-iterations=)p Fi(ite)o(rati)o(ons)f Fv(')630
+518 y(P)m(erform)24 b(m)m(ultiple)h(c)m(hoices)h(of)e(the)h(`)p
+Fr(-i)p Fv(')f(and)g(`)p Fr(-j)p Fv(')g(v)-5 b(alues,)26
+b(and)d(c)m(ho)s(ose)j(the)e(b)s(est)g(results.)630 628
+y(This)34 b(increases)i(the)f(running)e(time)i(b)m(y)g(a)g(factor)h(of)
+f Fn(iterations)40 b Fv(but)34 b(do)s(es)g(a)i(go)s(o)s(d)e(job)630
+737 y(minimizing)d(the)f(generated)i(table)f(size.)150
+907 y(`)p Fr(-i)f Fi(initial-value)11 b Fv(')150 1016
+y(`)p Fr(--initial-asso=)p Fi(initial-va)o(lue)f Fv(')630
+1126 y(Pro)m(vides)29 b(an)f(initial)h Fn(v)-5 b(alue)34
+b Fv(for)28 b(the)g(asso)s(ciate)i(v)-5 b(alues)29 b(arra)m(y)-8
+b(.)41 b(Default)29 b(is)f(0.)41 b(Increasing)630 1235
+y(the)30 b(initial)h(v)-5 b(alue)31 b(helps)e(in\015ate)h(the)g
+(\014nal)g(table)h(size,)g(p)s(ossibly)e(leading)i(to)f(more)g(time)630
+1345 y(e\016cien)m(t)f(k)m(eyw)m(ord)e(lo)s(okups.)39
+b(Note)29 b(that)e(this)g(option)h(is)f(not)g(particularly)h(useful)e
+(when)630 1455 y(`)p Fr(-S)p Fv(')i(\(or,)i(equiv)-5
+b(alen)m(tly)d(,)31 b(`)p Fr(\045switch)p Fv('\))c(is)i(used.)39
+b(Also,)30 b(`)p Fr(-i)p Fv(')e(is)g(o)m(v)m(erridden)h(when)e(the)i(`)
+p Fr(-r)p Fv(')630 1564 y(option)i(is)f(used.)150 1733
+y(`)p Fr(-j)g Fi(jump-value)11 b Fv(')150 1843 y(`)p
+Fr(--jump=)p Fi(jump-value)g Fv(')630 1953 y(A\013ects)41
+b(the)f(\\jump)f(v)-5 b(alue",)44 b(i.e.,)g(ho)m(w)c(far)g(to)g(adv)-5
+b(ance)41 b(the)f(asso)s(ciated)i(b)m(yte)e(v)-5 b(alue)630
+2062 y(up)s(on)29 b(collisions.)43 b Fn(Jump-v)-5 b(alue)35
+b Fv(is)30 b(rounded)f(up)h(to)h(an)f(o)s(dd)g(n)m(um)m(b)s(er,)f(the)i
+(default)g(is)f(5.)630 2172 y(If)g(the)g Fn(jump-v)-5
+b(alue)35 b Fv(is)c(0)f Fr(gperf)f Fv(jumps)g(b)m(y)h(random)g(amoun)m
+(ts.)150 2341 y(`)p Fr(-n)p Fv(')150 2451 y(`)p Fr(--no-strlen)p
+Fv(')630 2560 y(Instructs)c(the)i(generator)g(not)f(to)h(include)f(the)
+h(length)f(of)g(a)h(k)m(eyw)m(ord)g(when)e(computing)630
+2670 y(its)41 b(hash)f(v)-5 b(alue.)72 b(This)40 b(ma)m(y)h(sa)m(v)m(e)
+h(a)f(few)f(assem)m(bly)h(instructions)g(in)f(the)h(generated)630
+2780 y(lo)s(okup)30 b(table.)150 2949 y(`)p Fr(-r)p Fv(')150
+3059 y(`)p Fr(--random)p Fv(')630 3168 y(Utilizes)40
+b(randomness)e(to)h(initialize)h(the)f(asso)s(ciated)h(v)-5
+b(alues)38 b(table.)66 b(This)38 b(frequen)m(tly)630
+3278 y(generates)23 b(solutions)e(faster)h(than)f(using)g
+(deterministic)h(initialization)i(\(whic)m(h)d(starts)h(all)630
+3387 y(asso)s(ciated)28 b(v)-5 b(alues)28 b(at)f(0\).)40
+b(F)-8 b(urthermore,)28 b(using)f(the)g(randomization)g(option)h
+(generally)630 3497 y(increases)j(the)g(size)g(of)f(the)h(table.)150
+3666 y(`)p Fr(-s)f Fi(size-multiple)11 b Fv(')150 3776
+y(`)p Fr(--size-multiple=)p Fi(size-mult)o(iple)f Fv(')630
+3885 y(A\013ects)40 b(the)e(size)h(of)g(the)f(generated)i(hash)d
+(table.)66 b(The)38 b(n)m(umeric)g(argumen)m(t)h(for)f(this)630
+3995 y(option)33 b(indicates)g(\\ho)m(w)g(man)m(y)g(times)g(larger)g
+(or)f(smaller")i(the)e(maxim)m(um)g(asso)s(ciated)630
+4105 y(v)-5 b(alue)38 b(range)g(should)e(b)s(e,)j(in)e(relationship)h
+(to)g(the)f(n)m(um)m(b)s(er)g(of)g(k)m(eyw)m(ords.)62
+b(It)38 b(can)g(b)s(e)630 4214 y(written)g(as)h(an)f(in)m(teger,)43
+b(a)38 b(\015oating-p)s(oin)m(t)i(n)m(um)m(b)s(er)d(or)i(a)f(fraction.)
+66 b(F)-8 b(or)39 b(example,)j(a)630 4324 y(v)-5 b(alue)40
+b(of)f(3)h(means)f(\\allo)m(w)i(the)f(maxim)m(um)f(asso)s(ciated)h(v)-5
+b(alue)40 b(to)g(b)s(e)f(ab)s(out)g(3)g(times)630 4433
+y(larger)33 b(than)g(the)g(n)m(um)m(b)s(er)e(of)i(input)f(k)m(eyw)m
+(ords".)49 b(Con)m(v)m(ersely)-8 b(,)35 b(a)e(v)-5 b(alue)33
+b(of)g(1/3)h(means)630 4543 y(\\allo)m(w)43 b(the)e(maxim)m(um)f(asso)s
+(ciated)j(v)-5 b(alue)41 b(to)h(b)s(e)e(ab)s(out)g(3)h(times)h(smaller)
+f(than)g(the)630 4653 y(n)m(um)m(b)s(er)33 b(of)i(input)f(k)m(eyw)m
+(ords".)55 b(V)-8 b(alues)35 b(smaller)h(than)e(1)h(are)g(useful)f(for)
+h(limiting)h(the)630 4762 y(o)m(v)m(erall)31 b(size)e(of)g(the)f
+(generated)i(hash)e(table,)i(though)e(the)g(option)h(`)p
+Fr(-m)p Fv(')g(is)f(b)s(etter)h(at)g(this)630 4872 y(purp)s(ose.)630
+5011 y(If)44 b(`generate)h(switc)m(h')g(option)g(`)p
+Fr(-S)p Fv(')f(\(or,)k(equiv)-5 b(alen)m(tly)d(,)49 b(`)p
+Fr(\045switch)p Fv('\))43 b(is)h Fm(not)54 b Fv(enabled,)630
+5121 y(the)45 b(maxim)m(um)h(asso)s(ciated)g(v)-5 b(alue)46
+b(in\015uences)f(the)g(static)i(arra)m(y)f(table)g(size,)k(and)45
+b(a)630 5230 y(larger)27 b(table)g(should)e(decrease)i(the)f(time)h
+(required)e(for)h(an)f(unsuccessful)g(searc)m(h,)j(at)f(the)630
+5340 y(exp)s(ense)j(of)g(extra)i(table)f(space.)p eop
+end
+%%Page: 30 32
+TeXDict begin 30 31 bop 150 -116 a Fv(Chapter)30 b(4:)41
+b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(30)630 299 y(The)35
+b(default)g(v)-5 b(alue)36 b(is)f(1,)i(th)m(us)e(the)h(default)f(maxim)
+m(um)g(asso)s(ciated)i(v)-5 b(alue)36 b(ab)s(out)f(the)630
+408 y(same)h(size)g(as)f(the)h(n)m(um)m(b)s(er)e(of)h(k)m(eyw)m(ords)h
+(\(for)g(e\016ciency)-8 b(,)38 b(the)d(maxim)m(um)g(asso)s(ciated)630
+518 y(v)-5 b(alue)36 b(is)g(alw)m(a)m(ys)h(rounded)d(up)g(to)i(a)g(p)s
+(o)m(w)m(er)g(of)f(2\).)57 b(The)35 b(actual)i(table)g(size)f(ma)m(y)g
+(v)-5 b(ary)630 628 y(somewhat,)31 b(since)g(this)f(tec)m(hnique)h(is)g
+(essen)m(tially)h(a)f(heuristic.)150 860 y Fu(4.6)68
+b(Informativ)l(e)47 b(Output)150 1044 y Fv(`)p Fr(-h)p
+Fv(')150 1154 y(`)p Fr(--help)p Fv(')142 b(Prin)m(ts)24
+b(a)g(short)f(summary)g(on)h(the)g(meaning)g(of)g(eac)m(h)h(program)e
+(option.)39 b(Ab)s(orts)23 b(further)630 1264 y(program)30
+b(execution.)150 1423 y(`)p Fr(-v)p Fv(')150 1533 y(`)p
+Fr(--version)p Fv(')630 1642 y(Prin)m(ts)g(out)h(the)f(curren)m(t)h(v)m
+(ersion)f(n)m(um)m(b)s(er.)150 1802 y(`)p Fr(-d)p Fv(')150
+1911 y(`)p Fr(--debug)p Fv(')94 b(Enables)28 b(the)h(debugging)f
+(option.)40 b(This)28 b(pro)s(duces)f(v)m(erb)s(ose)i(diagnostics)g(to)
+g(\\standard)630 2021 y(error")i(when)g Fr(gperf)f Fv(is)h(executing.)
+45 b(It)32 b(is)f(useful)g(b)s(oth)g(for)g(main)m(taining)i(the)e
+(program)630 2130 y(and)f(for)h(determining)g(whether)f(a)h(giv)m(en)h
+(set)f(of)g(options)g(is)g(actually)i(sp)s(eeding)d(up)g(the)630
+2240 y(searc)m(h)41 b(for)e(a)h(solution.)70 b(Some)40
+b(useful)f(information)h(is)g(dump)s(ed)e(at)i(the)g(end)g(of)g(the)630
+2350 y(program)30 b(when)g(the)g(`)p Fr(-d)p Fv(')g(option)h(is)g
+(enabled.)p eop end
+%%Page: 31 33
+TeXDict begin 31 32 bop 150 -116 a Fv(Chapter)30 b(5:)41
+b(Kno)m(wn)30 b(Bugs)g(and)g(Limitations)h(with)f Fr(gperf)1397
+b Fv(31)150 299 y Fs(5)80 b(Kno)l(wn)53 b(Bugs)f(and)i(Limitations)f
+(with)f Fo(gperf)275 533 y Fv(The)29 b(follo)m(wing)j(are)f(some)g
+(limitations)h(with)e(the)g(curren)m(t)h(release)g(of)g
+Fr(gperf)p Fv(:)225 667 y Ft(\017)60 b Fv(The)31 b Fr(gperf)g
+Fv(utilit)m(y)i(is)f(tuned)f(to)h(execute)h(quic)m(kly)-8
+b(,)34 b(and)d(w)m(orks)h(quic)m(kly)g(for)g(small)g(to)h(medium)330
+777 y(size)i(data)g(sets)g(\(around)f(1000)i(k)m(eyw)m(ords\).)54
+b(It)34 b(is)h(extremely)h(useful)d(for)h(main)m(taining)i(p)s(erfect)
+330 887 y(hash)k(functions)h(for)f(compiler)i(k)m(eyw)m(ord)f(sets.)72
+b(Sev)m(eral)42 b(recen)m(t)g(enhancemen)m(ts)g(no)m(w)e(enable)330
+996 y Fr(gperf)31 b Fv(to)j(w)m(ork)e(e\016cien)m(tly)j(on)d(m)m(uc)m
+(h)h(larger)g(k)m(eyw)m(ord)g(sets)g(\(o)m(v)m(er)i(15,000)g(k)m(eyw)m
+(ords\).)48 b(When)330 1106 y(pro)s(cessing)30 b(large)i(k)m(eyw)m(ord)
+e(sets)h(it)g(helps)f(greatly)i(to)f(ha)m(v)m(e)g(o)m(v)m(er)h(8)f
+(megs)g(of)f(RAM.)225 1240 y Ft(\017)60 b Fv(The)43 b(size)i(of)f(the)g
+(generate)h(static)h(k)m(eyw)m(ord)e(arra)m(y)g(can)g(get)h
+Fm(extr)-5 b(emely)53 b Fv(large)45 b(if)f(the)g(input)330
+1350 y(k)m(eyw)m(ord)d(\014le)f(is)g(large)i(or)e(if)g(the)h(k)m(eyw)m
+(ords)f(are)h(quite)g(similar.)70 b(This)40 b(tends)g(to)h(slo)m(w)f
+(do)m(wn)330 1460 y(the)35 b(compilation)h(of)f(the)f(generated)i(C)e
+(co)s(de,)i(and)e Fm(gr)-5 b(e)g(atly)44 b Fv(in\015ates)35
+b(the)g(ob)5 b(ject)35 b(co)s(de)g(size.)54 b(If)330
+1569 y(this)40 b(situation)h(o)s(ccurs,)h(consider)e(using)f(the)h(`)p
+Fr(-S)p Fv(')g(option)g(to)h(reduce)e(data)i(size,)i(p)s(oten)m(tially)
+330 1679 y(increasing)h(k)m(eyw)m(ord)g(recognition)h(time)f(a)g
+(negligible)i(amoun)m(t.)80 b(Since)44 b(man)m(y)f(C)h(compilers)330
+1788 y(cannot)37 b(correctly)i(generate)f(co)s(de)f(for)g(large)h
+(switc)m(h)f(statemen)m(ts)i(it)e(is)g(imp)s(ortan)m(t)g(to)h(qualify)
+330 1898 y(the)i Fn(-S)46 b Fv(option)40 b(with)g(an)g(appropriate)g(n)
+m(umerical)h(argumen)m(t)f(that)h(con)m(trols)h(the)e(n)m(um)m(b)s(er)f
+(of)330 2007 y(switc)m(h)31 b(statemen)m(ts)h(generated.)225
+2142 y Ft(\017)60 b Fv(The)35 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i
+(selected)h(b)m(yte)f(p)s(ositions)f(has)g(an)h(arbitrary)f(limit)h(of)
+g(255.)57 b(This)330 2252 y(restriction)29 b(should)e(b)s(e)g(remo)m(v)
+m(ed,)j(and)d(if)h(an)m(y)m(one)h(considers)f(this)g(a)g(problem)f
+(write)i(me)f(and)f(let)330 2361 y(me)j(kno)m(w)h(so)f(I)h(can)f(remo)m
+(v)m(e)i(the)f(constrain)m(t.)p eop end
+%%Page: 32 34
+TeXDict begin 32 33 bop 150 -116 a Fv(Chapter)30 b(6:)41
+b(Things)29 b(Still)i(Left)g(to)g(Do)2133 b(32)150 299
+y Fs(6)80 b(Things)53 b(Still)g(Left)g(to)g(Do)275 533
+y Fv(It)24 b(should)f(b)s(e)h(\\relativ)m(ely")k(easy)d(to)g(replace)g
+(the)g(curren)m(t)f(p)s(erfect)g(hash)g(function)g(algorithm)h(with)150
+643 y(a)35 b(more)f(exhaustiv)m(e)h(approac)m(h;)i(the)d(p)s(erfect)h
+(hash)e(mo)s(dule)h(is)g(essen)m(tial)i(indep)s(enden)m(t)d(from)h
+(other)150 752 y(program)c(mo)s(dules.)40 b(Additional)31
+b(w)m(orth)m(while)g(impro)m(v)m(emen)m(ts)h(include:)225
+887 y Ft(\017)60 b Fv(Another)34 b(useful)f(extension)h(in)m(v)m(olv)m
+(es)i(mo)s(difying)d(the)h(program)f(to)i(generate)g(\\minimal")g(p)s
+(er-)330 996 y(fect)42 b(hash)f(functions)f(\(under)h(certain)h
+(circumstances,)j(the)c(curren)m(t)g(v)m(ersion)h(can)f(b)s(e)g(rather)
+330 1106 y(extra)m(v)-5 b(agan)m(t)39 b(in)d(the)h(generated)g(table)g
+(size\).)60 b(This)36 b(is)g(mostly)h(of)g(theoretical)h(in)m(terest,)i
+(since)330 1215 y(a)f(sparse)f(table)h(often)g(pro)s(duces)e(faster)i
+(lo)s(okups,)h(and)e(use)g(of)h(the)g(`)p Fr(-S)p Fv(')f
+Fr(switch)f Fv(option)i(can)330 1325 y(minimize)g(the)g(data)g(size,)j
+(at)d(the)g(exp)s(ense)f(of)h(sligh)m(tly)h(longer)f(lo)s(okups)f
+(\(note)i(that)f(the)g(gcc)330 1435 y(compiler)e(generally)g(pro)s
+(duces)e(go)s(o)s(d)h(co)s(de)g(for)g Fr(switch)f Fv(statemen)m(ts,)k
+(reducing)d(the)g(need)g(for)330 1544 y(more)31 b(complex)g(sc)m
+(hemes\).)225 1679 y Ft(\017)60 b Fv(In)38 b(addition)h(to)h(impro)m
+(ving)f(the)h(algorithm,)i(it)d(w)m(ould)g(also)h(b)s(e)f(useful)f(to)h
+(generate)i(an)e(Ada)330 1788 y(pac)m(k)-5 b(age)32 b(as)f(the)g(co)s
+(de)f(output,)g(in)g(addition)h(to)g(the)g(curren)m(t)f(C)g(and)g(C)p
+Fr(++)f Fv(routines.)p eop end
+%%Page: 33 35
+TeXDict begin 33 34 bop 150 -116 a Fv(Chapter)30 b(7:)41
+b(Bibliograph)m(y)2536 b(33)150 299 y Fs(7)80 b(Bibliograph)l(y)150
+533 y Fv([1])35 b(Chang,)f(C.C.:)47 b Fm(A)36 b(Scheme)g(for)g
+(Constructing)h(Or)-5 b(der)g(e)g(d)37 b(Minimal)f(Perfe)-5
+b(ct)36 b(Hashing)g(F)-7 b(unctions)150 643 y Fv(Information)30
+b(Sciences)h(39\(1986\),)j(187-195.)150 777 y([2])23
+b(Cic)m(helli,)j(Ric)m(hard)c(J.)h Fm(A)n(uthor's)i(R)-5
+b(esp)g(onse)28 b(to)e(\\On)e(Cichel)5 b(li's)26 b(Minimal)f(Perfe)-5
+b(ct)25 b(Hash)h(F)-7 b(unctions)150 887 y(Metho)i(d")38
+b Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g(23,)g(12\(Decem)m(b)s
+(er)i(1980\),)g(729.)150 1021 y([3])h(Cic)m(helli,)i(Ric)m(hard)e(J.)f
+Fm(Minimal)j(Perfe)-5 b(ct)35 b(Hash)h(F)-7 b(unctions)36
+b(Made)g(Simple)41 b Fv(Comm)m(unications)34 b(of)150
+1131 y(the)d(A)m(CM,)g(23,)g(1\(Jan)m(uary)g(1980\),)i(17-19.)150
+1265 y([4])f(Co)s(ok,)g(C.)f(R.)g(and)g(Oldeho)s(eft,)h(R.R.)f
+Fm(A)i(L)-5 b(etter)34 b(Oriente)-5 b(d)34 b(Minimal)g(Perfe)-5
+b(ct)33 b(Hashing)h(F)-7 b(unction)150 1375 y Fv(SIGPLAN)30
+b(Notices,)i(17,)g(9\(Septem)m(b)s(er)f(1982\),)h(18-27.)150
+1509 y([5])g(Cormac)m(k,)g(G.)g(V.)g(and)e(Horsp)s(o)s(ol,)i(R.)f(N.)g
+(S.)g(and)g(Kaiserw)m(erth,)h(M.)g Fm(Pr)-5 b(actic)g(al)34
+b(Perfe)-5 b(ct)34 b(Hashing)150 1619 y Fv(Computer)c(Journal,)g(28,)h
+(1\(Jan)m(uary)g(1985\),)i(54-58.)150 1753 y([6])40 b(Jaesc)m(hk)m(e,)j
+(G.)d Fm(R)-5 b(e)g(cipr)g(o)g(c)g(al)44 b(Hashing:)58
+b(A)40 b(Metho)-5 b(d)42 b(for)f(Gener)-5 b(ating)42
+b(Minimal)f(Perfe)-5 b(ct)41 b(Hashing)150 1863 y(F)-7
+b(unctions)39 b Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g(24,)g
+(12\(Decem)m(b)s(er)i(1981\),)g(829-833.)150 1998 y([7])g(Jaesc)m(hk)m
+(e,)i(G.)d(and)g(Osterburg,)g(G.)h Fm(On)h(Cichel)5 b(li's)34
+b(Minimal)h(Perfe)-5 b(ct)34 b(Hash)h(F)-7 b(unctions)35
+b(Metho)-5 b(d)150 2107 y Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)
+g(23,)h(12\(Decem)m(b)s(er)g(1980\),)h(728-729.)150 2242
+y([8])j(Sager,)i(Thomas)d(J.)g Fm(A)i(Polynomial)i(Time)e(Gener)-5
+b(ator)40 b(for)e(Minimal)f(Perfe)-5 b(ct)37 b(Hash)h(F)-7
+b(unctions)150 2351 y Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g
+(28,)h(5\(Decem)m(b)s(er)g(1985\),)g(523-532)150 2486
+y([9])25 b(Sc)m(hmidt,)h(Douglas)f(C.)f Fm(GPERF:)j(A)g(Perfe)-5
+b(ct)27 b(Hash)g(F)-7 b(unction)28 b(Gener)-5 b(ator)36
+b Fv(Second)24 b(USENIX)g(C)p Fr(++)150 2595 y Fv(Conference)30
+b(Pro)s(ceedings,)h(April)f(1990.)150 2730 y([10])i(Sc)m(hmidt,)f
+(Douglas)h(C.)f Fm(GPERF:)i(A)f(Perfe)-5 b(ct)33 b(Hash)h(F)-7
+b(unction)33 b(Gener)-5 b(ator)43 b Fv(C)p Fr(++)30 b
+Fv(Rep)s(ort,)h(SIGS)150 2839 y(10)g(10)g(\(No)m(v)m(em)m(b)s(er/Decem)
+m(b)s(er)j(1998\).)150 2974 y([11])h(Seb)s(esta,)g(R.W.)g(and)e(T)-8
+b(a)m(ylor,)37 b(M.A.)e Fm(Minimal)h(Perfe)-5 b(ct)36
+b(Hash)g(F)-7 b(unctions)37 b(for)f(R)-5 b(eserve)g(d)38
+b(Wor)-5 b(d)150 3083 y(Lists)38 b Fv(SIGPLAN)30 b(Notices,)j(20,)e
+(12\(Septem)m(b)s(er)g(1985\),)i(47-53.)150 3218 y([12])f(Sprugnoli,)d
+(R.)h Fm(Perfe)-5 b(ct)33 b(Hashing)g(F)-7 b(unctions:)42
+b(A)32 b(Single)h(Pr)-5 b(ob)g(e)33 b(R)-5 b(etrieving)33
+b(Metho)-5 b(d)33 b(for)g(Static)150 3328 y(Sets)38 b
+Fv(Comm)m(unications)31 b(of)g(the)f(A)m(CM,)h(20)h(11\(No)m(v)m(em)m
+(b)s(er)g(1977\),)h(841-850.)150 3462 y([13])f(Stallman,)f(Ric)m(hard)f
+(M.)h Fm(Using)h(and)i(Porting)f(GNU)f(CC)43 b Fv(F)-8
+b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32 b(1988.)150
+3597 y([14])g(Stroustrup,)d(Bjarne)h Fm(The)j(C)p Fr(++)f
+Fm(Pr)-5 b(o)g(gr)g(amming)35 b(L)-5 b(anguage.)41 b
+Fv(Addison-W)-8 b(esley)g(,)32 b(1986.)150 3731 y([15])g(Tiemann,)e
+(Mic)m(hael)i(D.)f Fm(User's)i(Guide)f(to)i(GNU)e(C)p
+Fr(++)d Fv(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32
+b(1989.)p eop end
+%%Page: 34 36
+TeXDict begin 34 35 bop 150 -116 a Fv(Concept)31 b(Index)2927
+b(34)150 299 y Fs(Concept)52 b(Index)150 638 y Fu(\045)150
+757 y Fd(`)p Fp(\045\045)p Fd(')24 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)49 b Fd(16)150 846 y(`)p Fp(\045{)p Fd(')24 b Fc(:)13
+b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)49 b Fd(19)150 934 y(`)p
+Fp(\045})p Fd(')24 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)49
+b Fd(19)150 1023 y(`)p Fp(\0457bit)p Fd(')15 b Fc(:)g(:)e(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)42
+b Fd(18)150 1112 y(`)p Fp(\045compare-lengths)p Fd(')26
+b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fd(18)150
+1201 y(`)p Fp(\045compare-strncmp)p Fd(')26 b Fc(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fd(18)150 1289
+y(`)p Fp(\045define)28 b(class-name)p Fd(')6 b Fc(:)15
+b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fd(18)150 1378 y(`)p
+Fp(\045define)c(hash-function-name)p Fd(')c Fc(:)13 b(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fd(17)150
+1467 y(`)p Fp(\045define)28 b(initializer-suffix)p Fd(')c
+Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46
+b Fd(17)150 1555 y(`)p Fp(\045define)28 b(length-table-name)p
+Fd(')e Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)49 b Fd(19)150 1644 y(`)p Fp(\045define)28 b
+(lookup-function-name)p Fd(')15 b Fc(:)i(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)41 b Fd(17)150 1733 y(`)p Fp(\045define)28
+b(slot-name)p Fd(')9 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35
+b Fd(17)150 1821 y(`)p Fp(\045define)28 b(string-pool-name)p
+Fd(')8 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)34 b Fd(19)150 1910 y(`)p Fp(\045define)28
+b(word-array-name)p Fd(')10 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fd(19)150
+1999 y(`)p Fp(\045delimiters)p Fd(')17 b Fc(:)f(:)e(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fd(17)150 2087 y(`)p
+Fp(\045enum)p Fd(')15 b Fc(:)g(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)42 b Fd(18)150
+2176 y(`)p Fp(\045global-table)p Fd(')12 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fd(18)150 2265 y(`)p
+Fp(\045ignore-case)p Fd(')15 b Fc(:)h(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)41 b Fd(17)150 2353 y(`)p Fp(\045includes)p
+Fd(')25 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)49 b Fd(18)150 2442 y(`)p Fp(\045language)p
+Fd(')25 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)49 b Fd(17)150 2531 y(`)p Fp(\045null-strings)p
+Fd(')12 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38
+b Fd(19)150 2619 y(`)p Fp(\045omit-struct-type)p Fd(')23
+b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)45 b Fd(19)150
+2708 y(`)p Fp(\045pic)p Fd(')18 b Fc(:)d(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)44
+b Fd(18)150 2797 y(`)p Fp(\045readonly-tables)p Fd(')26
+b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)48 b Fd(18)150
+2885 y(`)p Fp(\045struct-type)p Fd(')15 b Fc(:)h(:)d(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fd(17)150 2974 y(`)p
+Fp(\045switch)p Fd(')10 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fd(19)150
+3223 y Fu(A)150 3342 y Fd(Arra)n(y)25 b(name)c Fc(:)13
+b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)47
+b Fd(27)150 3599 y Fu(B)150 3718 y Fd(Bugs)18 b Fc(:)c(:)f(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)44 b Fd(12)150 3976 y Fu(C)150 4095 y Fd(Class)27
+b(name)13 b Fc(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)39 b Fd(26)150 4183 y(Cop)n(yrigh)n(t)19
+b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)45 b Fd(23)2025 638 y Fu(D)2025 755 y Fd(Declaration)27
+b(section)18 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)44
+b Fd(15)2025 842 y(Delimiters)13 b Fc(:)h(:)g(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)40 b Fd(24)2025
+930 y(Duplicates)9 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fd(28)2025 1181
+y Fu(F)2025 1298 y Fd(F)-6 b(ormat)13 b Fc(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)39
+b Fd(15)2025 1385 y(F)-6 b(unctions)25 b(section)14 b
+Fc(:)g(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41
+b Fd(15)2025 1620 y Fu(H)2025 1737 y Fp(hash)23 b Fc(:)13
+b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)49 b Fd(21)2025 1824 y(hash)25
+b(table)13 b Fc(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)g(:)40 b Fd(21)2025 2059 y Fu(I)2025
+2176 y Fp(in_word_set)24 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)48 b Fd(22)2025 2263 y(Initializers)10
+b Fc(:)k(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)36 b Fd(25)2025 2498 y Fu(J)2025 2615 y Fd(Jump)25
+b(v)l(alue)9 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)36 b Fd(29)2025 2866 y Fu(K)2025
+2983 y Fd(Keyw)n(ords)25 b(section)13 b Fc(:)h(:)f(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)h(:)f(:)g(:)39 b Fd(15)2025 3234 y Fu(M)2025
+3351 y Fd(Minimal)27 b(p)r(erfect)f(hash)g(functions)21
+b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+48 b Fd(14)2025 3602 y Fu(N)2025 3719 y Fd(NUL)18 b Fc(:)13
+b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)46 b Fd(22)2025 3954 y Fu(S)2025
+4070 y Fd(Slot)26 b(name)17 b Fc(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)44 b Fd(25)2025
+4158 y(Static)26 b(searc)n(h)g(structure)11 b Fc(:)i(:)g(:)g(:)g(:)h(:)
+f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)38 b Fd(14)2025 4245 y Fp(switch)6 b Fc(:)15 b(:)e(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33
+b Fd(22,)27 b(27)p eop end
+%%Page: -1 37
+TeXDict begin -1 36 bop 3725 -116 a Fv(i)150 299 y Fs(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fu(GNU)45 b(GENERAL)g(PUBLIC)
+g(LICENSE)28 b Fb(:)20 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)73
+b Fu(1)150 911 y(Con)l(tributors)46 b(to)f(GNU)g Fl(gperf)e
+Fu(Utilit)l(y)21 b Fb(:)g(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
+(:)g(:)66 b Fu(12)150 1181 y(1)135 b(In)l(tro)t(duction)32
+b Fb(:)19 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)
+h(:)76 b Fu(13)150 1450 y(2)135 b(Static)45 b(searc)l(h)h(structures)f
+(and)f(GNU)h Fl(gperf)33 b Fb(:)19 b(:)h(:)f(:)80 b Fu(14)150
+1720 y(3)135 b(High-Lev)l(el)46 b(Description)g(of)f(GNU)g
+Fl(gperf)24 b Fb(:)18 b(:)h(:)g(:)h(:)f(:)h(:)69 b Fu(15)275
+1857 y Fv(3.1)92 b(Input)29 b(F)-8 b(ormat)31 b(to)g
+Fr(gperf)14 b Fa(:)g(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)43 b Fv(15)399 1967
+y(3.1.1)93 b(Declarations)30 b Fa(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)
+h(:)57 b Fv(15)524 2076 y(3.1.1.1)93 b(User-supplied)30
+b Fr(struct)12 b Fa(:)h(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+g(:)42 b Fv(16)524 2186 y(3.1.1.2)93 b(Gp)s(erf)30 b(Declarations)23
+b Fa(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+53 b Fv(16)524 2296 y(3.1.1.3)93 b(C)30 b(Co)s(de)g(Inclusion)15
+b Fa(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)45 b Fv(19)399 2405 y(3.1.2)93 b(F)-8 b(ormat)32
+b(for)e(Keyw)m(ord)g(En)m(tries)15 b Fa(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
+h(:)f(:)h(:)f(:)45 b Fv(20)399 2515 y(3.1.3)93 b(Including)29
+b(Additional)i(C)f(F)-8 b(unctions)11 b Fa(:)17 b(:)e(:)h(:)f(:)g(:)h
+(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
+f(:)41 b Fv(21)399 2624 y(3.1.4)93 b(Where)31 b(to)g(place)g(directiv)m
+(es)h(for)e(GNU)h Fr(indent)p Fv(.)17 b Fa(:)d(:)h(:)h(:)f(:)h(:)f(:)g
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)47 b Fv(21)275 2734 y(3.2)92
+b(Output)29 b(F)-8 b(ormat)32 b(for)e(Generated)h(C)f(Co)s(de)g(with)g
+Fr(gperf)20 b Fa(:)13 b(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
+49 b Fv(21)275 2844 y(3.3)92 b(Use)30 b(of)h(NUL)f(b)m(ytes)18
+b Fa(:)e(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
+(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fv(22)275
+2953 y(3.4)92 b(The)29 b(Cop)m(yrigh)m(t)i(of)g(the)g(Output)11
+b Fa(:)j(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41
+b Fv(23)150 3196 y Fu(4)135 b(In)l(v)l(oking)45 b Fl(gperf)25
+b Fb(:)18 b(:)h(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)70
+b Fu(24)275 3333 y Fv(4.1)92 b(Sp)s(ecifying)29 b(the)i(Lo)s(cation)h
+(of)e(the)h(Output)e(File)d Fa(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)55 b Fv(24)275
+3442 y(4.2)92 b(Options)30 b(that)h(a\013ect)g(In)m(terpretation)h(of)e
+(the)h(Input)e(File)23 b Fa(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
+(:)h(:)52 b Fv(24)275 3552 y(4.3)92 b(Options)30 b(to)h(sp)s(ecify)f
+(the)g(Language)i(for)e(the)g(Output)g(Co)s(de)c Fa(:)15
+b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Fv(24)275 3661 y(4.4)92
+b(Options)30 b(for)g(\014ne)f(tuning)h(Details)j(in)d(the)g(Output)f
+(Co)s(de)19 b Fa(:)c(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)49
+b Fv(25)275 3771 y(4.5)92 b(Options)30 b(for)g(c)m(hanging)h(the)g
+(Algorithms)g(emplo)m(y)m(ed)g(b)m(y)f Fr(gperf)10 b
+Fa(:)k(:)i(:)f(:)h(:)f(:)g(:)40 b Fv(28)275 3880 y(4.6)92
+b(Informativ)m(e)31 b(Output)21 b Fa(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
+h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)51
+b Fv(30)150 4123 y Fu(5)135 b(Kno)l(wn)45 b(Bugs)f(and)h(Limitations)i
+(with)e Fl(gperf)23 b Fb(:)17 b(:)i(:)h(:)67 b Fu(31)150
+4393 y(6)135 b(Things)44 b(Still)i(Left)g(to)f(Do)18
+b Fb(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
+h(:)f(:)h(:)f(:)g(:)h(:)f(:)63 b Fu(32)150 4663 y(7)135
+b(Bibliograph)l(y)25 b Fb(:)20 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
+(:)f(:)h(:)f(:)h(:)f(:)g(:)70 b Fu(33)150 4932 y(Concept)45
+b(Index)18 b Fb(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f
+(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)
+f(:)h(:)f(:)h(:)f(:)63 b Fu(34)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/gperf.texi b/doc/gperf.texi
new file mode 100644 (file)
index 0000000..0bb42b8
--- /dev/null
@@ -0,0 +1,1428 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename gperf.info
+@c The @ifset makeinfo ... @end ifset conditional evaluates to true in makeinfo
+@c for info and html output, but to false in texi2html.
+@ifnottex
+@ifclear texi2html
+@set makeinfo
+@end ifclear
+@end ifnottex
+@settitle Perfect Hash Function Generator
+@ifclear texi2html
+@firstparagraphindent insert
+@end ifclear
+@c @setchapternewpage odd
+@c %**end of header
+
+@c some day we should @include version.texi instead of defining
+@c these values at hand.
+@set UPDATED 1 February 2009
+@set EDITION 3.0.4
+@set VERSION 3.0.4
+@c ---------------------
+
+@c remove the black boxes generated in the GPL appendix.
+@finalout
+
+@c Merge functions into the concept index
+@syncodeindex fn cp
+@c @synindex pg cp
+
+@ifinfo
+@dircategory Programming Tools
+@direntry
+* Gperf: (gperf).                Perfect Hash Function Generator.
+@end direntry
+@end ifinfo
+
+@ifinfo
+This file documents the features of the GNU Perfect Hash Function
+Generator @value{VERSION}.
+
+Copyright @copyright{} 1989-2009 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries a copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+section entitled ``GNU General Public License'' is included exactly as
+in the original, and provided that the entire resulting derived work is
+distributed under the terms of a permission notice identical to this
+one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that the section entitled ``GNU General Public License'' and this
+permission notice may be included in translations approved by the Free
+Software Foundation instead of in the original English.
+
+@end ifinfo
+
+@titlepage
+@title User's Guide to @code{gperf} @value{VERSION}
+@subtitle The GNU Perfect Hash Function Generator
+@subtitle Edition @value{EDITION}, @value{UPDATED}
+@author Douglas C. Schmidt
+@author Bruno Haible
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1989-2009 Free Software Foundation, Inc.
+
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+section entitled ``GNU General Public License'' is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that the section entitled ``GNU General Public License'' may be
+included in a translation approved by the author instead of in the
+original English.
+@end titlepage
+
+@ifnottex
+@c Table of Contents
+@contents
+@end ifnottex
+
+@ifset makeinfo
+@node Top, Copying, (dir), (dir)
+@top Introduction
+
+This manual documents the GNU @code{gperf} perfect hash function generator
+utility, focusing on its features and how to use them, and how to report
+bugs.
+
+@menu
+* Copying::                     GNU General Public License says how you can
+                                copy and share @code{gperf}.
+* Contributors::                People who have contributed to @code{gperf}.
+* Motivation::                  The purpose of @code{gperf}.
+* Search Structures::           Static search structures and GNU @code{gperf}
+* Description::                 High-level discussion of how GPERF functions.
+* Options::                     A description of options to the program.
+* Bugs::                        Known bugs and limitations with GPERF.
+* Projects::                    Things still left to do.
+* Bibliography::                Material Referenced in this Report.
+
+* Concept Index::               
+
+@detailmenu --- The Detailed Node Listing ---
+
+High-Level Description of GNU @code{gperf}
+
+* Input Format::                Input Format to @code{gperf}
+* Output Format::               Output Format for Generated C Code with @code{gperf}
+* Binary Strings::              Use of NUL bytes
+* Output Copyright::            The Copyright of the Output.
+
+Input Format to @code{gperf}
+
+* Declarations::                Declarations.
+* Keywords::                    Format for Keyword Entries.
+* Functions::                   Including Additional C Functions.
+* Controls for GNU indent::     Where to place directives for GNU @code{indent}.
+
+Declarations
+
+* User-supplied Struct::        Specifying keywords with attributes.
+* Gperf Declarations::          Embedding command line options in the input.
+* C Code Inclusion::            Including C declarations and definitions.
+
+Invoking @code{gperf}
+
+* Input Details::               Options that affect Interpretation of the Input File
+* Output Language::             Specifying the Language for the Output Code
+* Output Details::              Fine tuning Details in the Output Code
+* Algorithmic Details::         Changing the Algorithms employed by @code{gperf}
+* Verbosity::                   Informative Output
+
+@end detailmenu
+@end menu
+
+@end ifset
+
+@node Copying, Contributors, Top, Top
+@unnumbered GNU GENERAL PUBLIC LICENSE
+@include gpl-3.0.texi
+
+@node Contributors, Motivation, Copying, Top
+@unnumbered Contributors to GNU @code{gperf} Utility
+
+@itemize @bullet
+@item
+@cindex Bugs 
+The GNU @code{gperf} perfect hash function generator utility was
+written in GNU C++ by Douglas C. Schmidt.  The general
+idea for the perfect hash function generator was inspired by Keith
+Bostic's algorithm written in C, and distributed to net.sources around
+1984.  The current program is a heavily modified, enhanced, and extended
+implementation of Keith's basic idea, created at the University of
+California, Irvine.  Bugs, patches, and suggestions should be reported
+to @code{<bug-gnu-gperf@@gnu.org>}.
+
+@item
+Special thanks is extended to Michael Tiemann and Doug Lea, for
+providing a useful compiler, and for giving me a forum to exhibit my
+creation.
+
+In addition, Adam de Boor and Nels Olson provided many tips and insights
+that greatly helped improve the quality and functionality of @code{gperf}.
+
+@item
+Bruno Haible enhanced and optimized the search algorithm.  He also rewrote
+the input routines and the output routines for better reliability, and
+added a testsuite.
+@end itemize
+
+@node Motivation, Search Structures, Contributors, Top
+@chapter Introduction
+
+@code{gperf} is a perfect hash function generator written in C++.  It
+transforms an @var{n} element user-specified keyword set @var{W} into a
+perfect hash function @var{F}.  @var{F} uniquely maps keywords in
+@var{W} onto the range 0..@var{k}, where @var{k} >= @var{n-1}.  If @var{k}
+= @var{n-1} then @var{F} is a @emph{minimal} perfect hash function.
+@code{gperf} generates a 0..@var{k} element static lookup table and a
+pair of C functions.  These functions determine whether a given
+character string @var{s} occurs in @var{W}, using at most one probe into
+the lookup table.
+
+@code{gperf} currently generates the reserved keyword recognizer for
+lexical analyzers in several production and research compilers and
+language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal,
+GNU Modula 3, and GNU indent.  Complete C++ source code for @code{gperf} is
+available from @code{http://ftp.gnu.org/pub/gnu/gperf/}.
+A paper describing @code{gperf}'s design and implementation in greater
+detail is available in the Second USENIX C++ Conference proceedings
+or from @code{http://www.cs.wustl.edu/~schmidt/resume.html}.
+
+@node Search Structures, Description, Motivation, Top
+@chapter Static search structures and GNU @code{gperf}
+@cindex Static search structure
+
+A @dfn{static search structure} is an Abstract Data Type with certain
+fundamental operations, e.g., @emph{initialize}, @emph{insert},
+and @emph{retrieve}.  Conceptually, all insertions occur before any
+retrievals.  In practice, @code{gperf} generates a @emph{static} array
+containing search set keywords and any associated attributes specified
+by the user.  Thus, there is essentially no execution-time cost for the
+insertions.  It is a useful data structure for representing @emph{static
+search sets}.  Static search sets occur frequently in software system
+applications.  Typical static search sets include compiler reserved
+words, assembler instruction opcodes, and built-in shell interpreter
+commands.  Search set members, called @dfn{keywords}, are inserted into
+the structure only once, usually during program initialization, and are
+not generally modified at run-time.
+
+Numerous static search structure implementations exist, e.g.,
+arrays, linked lists, binary search trees, digital search tries, and
+hash tables.  Different approaches offer trade-offs between space
+utilization and search time efficiency.  For example, an @var{n} element
+sorted array is space efficient, though the average-case time
+complexity for retrieval operations using binary search is
+proportional to log @var{n}.  Conversely, hash table implementations
+often locate a table entry in constant time, but typically impose
+additional memory overhead and exhibit poor worst case performance.
+
+@cindex Minimal perfect hash functions
+@emph{Minimal perfect hash functions} provide an optimal solution for a
+particular class of static search sets.  A minimal perfect hash
+function is defined by two properties:
+
+@itemize @bullet
+@item 
+It allows keyword recognition in a static search set using at most
+@emph{one} probe into the hash table.  This represents the ``perfect''
+property.
+@item 
+The actual memory allocated to store the keywords is precisely large
+enough for the keyword set, and @emph{no larger}.  This is the
+``minimal'' property.
+@end itemize
+
+For most applications it is far easier to generate @emph{perfect} hash
+functions than @emph{minimal perfect} hash functions.  Moreover,
+non-minimal perfect hash functions frequently execute faster than
+minimal ones in practice.  This phenomena occurs since searching a
+sparse keyword table increases the probability of locating a ``null''
+entry, thereby reducing string comparisons.  @code{gperf}'s default
+behavior generates @emph{near-minimal} perfect hash functions for
+keyword sets.  However, @code{gperf} provides many options that permit
+user control over the degree of minimality and perfection.
+
+Static search sets often exhibit relative stability over time.  For
+example, Ada's 63 reserved words have remained constant for nearly a
+decade.  It is therefore frequently worthwhile to expend concerted
+effort building an optimal search structure @emph{once}, if it
+subsequently receives heavy use multiple times.  @code{gperf} removes
+the drudgery associated with constructing time- and space-efficient
+search structures by hand.  It has proven a useful and practical tool
+for serious programming projects.  Output from @code{gperf} is currently
+used in several production and research compilers, including GNU C, GNU
+C++, GNU Java, GNU Pascal, and GNU Modula 3.  The latter two compilers are
+not yet part of the official GNU distribution.  Each compiler utilizes
+@code{gperf} to automatically generate static search structures that
+efficiently identify their respective reserved keywords.
+
+@node Description, Options, Search Structures, Top
+@chapter High-Level Description of GNU @code{gperf}
+
+@menu
+* Input Format::                Input Format to @code{gperf}
+* Output Format::               Output Format for Generated C Code with @code{gperf}
+* Binary Strings::              Use of NUL bytes
+* Output Copyright::            The Copyright of the Output.
+@end menu
+
+The perfect hash function generator @code{gperf} reads a set of
+``keywords'' from an input file (or from the standard input by
+default).  It attempts to derive a perfect hashing function that
+recognizes a member of the @dfn{static keyword set} with at most a
+single probe into the lookup table.  If @code{gperf} succeeds in
+generating such a function it produces a pair of C source code routines
+that perform hashing and table lookup recognition.  All generated C code
+is directed to the standard output.  Command-line options described
+below allow you to modify the input and output format to @code{gperf}.
+
+By default, @code{gperf} attempts to produce time-efficient code, with
+less emphasis on efficient space utilization.  However, several options
+exist that permit trading-off execution time for storage space and vice
+versa.  In particular, expanding the generated table size produces a
+sparse search structure, generally yielding faster searches.
+Conversely, you can direct @code{gperf} to utilize a C @code{switch}
+statement scheme that minimizes data space storage size.  Furthermore,
+using a C @code{switch} may actually speed up the keyword retrieval time
+somewhat.  Actual results depend on your C compiler, of course.
+
+In general, @code{gperf} assigns values to the bytes it is using
+for hashing until some set of values gives each keyword a unique value.
+A helpful heuristic is that the larger the hash value range, the easier
+it is for @code{gperf} to find and generate a perfect hash function.
+Experimentation is the key to getting the most from @code{gperf}.
+
+@node Input Format, Output Format, Description, Description
+@section Input Format to @code{gperf}
+@cindex Format
+@cindex Declaration section
+@cindex Keywords section
+@cindex Functions section
+You can control the input file format by varying certain command-line
+arguments, in particular the @samp{-t} option.  The input's appearance
+is similar to GNU utilities @code{flex} and @code{bison} (or UNIX
+utilities @code{lex} and @code{yacc}).  Here's an outline of the general
+format:
+
+@example
+@group
+declarations
+%%
+keywords
+%%
+functions
+@end group
+@end example
+
+@emph{Unlike} @code{flex} or @code{bison}, the declarations section and
+the functions section are optional.  The following sections describe the
+input format for each section.
+
+@menu
+* Declarations::                Declarations.
+* Keywords::                    Format for Keyword Entries.
+* Functions::                   Including Additional C Functions.
+* Controls for GNU indent::     Where to place directives for GNU @code{indent}.
+@end menu
+
+It is possible to omit the declaration section entirely, if the @samp{-t}
+option is not given.  In this case the input file begins directly with the
+first keyword line, e.g.:
+
+@example
+@group
+january
+february
+march
+april
+...
+@end group
+@end example
+
+@node Declarations, Keywords, Input Format, Input Format
+@subsection Declarations
+
+The keyword input file optionally contains a section for including
+arbitrary C declarations and definitions, @code{gperf} declarations that
+act like command-line options, as well as for providing a user-supplied
+@code{struct}.
+
+@menu
+* User-supplied Struct::        Specifying keywords with attributes.
+* Gperf Declarations::          Embedding command line options in the input.
+* C Code Inclusion::            Including C declarations and definitions.
+@end menu
+
+@node User-supplied Struct, Gperf Declarations, Declarations, Declarations
+@subsubsection User-supplied @code{struct}
+
+If the @samp{-t} option (or, equivalently, the @samp{%struct-type} declaration)
+@emph{is} enabled, you @emph{must} provide a C @code{struct} as the last
+component in the declaration section from the input file.  The first
+field in this struct must be of type @code{char *} or @code{const char *}
+if the @samp{-P} option is not given, or of type @code{int} if the option
+@samp{-P} (or, equivalently, the @samp{%pic} declaration) is enabled.
+This first field must be called @samp{name}, although it is possible to modify
+its name with the @samp{-K} option (or, equivalently, the
+@samp{%define slot-name} declaration) described below.
+
+Here is a simple example, using months of the year and their attributes as
+input:
+
+@example
+@group
+struct month @{ char *name; int number; int days; int leap_days; @};
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+april,     4, 30, 30
+may,       5, 31, 31
+june,      6, 30, 30
+july,      7, 31, 31
+august,    8, 31, 31
+september, 9, 30, 30
+october,  10, 31, 31
+november, 11, 30, 30
+december, 12, 31, 31
+@end group
+@end example
+
+@cindex @samp{%%}
+Separating the @code{struct} declaration from the list of keywords and
+other fields are a pair of consecutive percent signs, @samp{%%},
+appearing left justified in the first column, as in the UNIX utility
+@code{lex}.
+
+If the @code{struct} has already been declared in an include file, it can
+be mentioned in an abbreviated form, like this:
+
+@example
+@group
+struct month;
+%%
+january,   1, 31, 31
+...
+@end group
+@end example
+
+@node Gperf Declarations, C Code Inclusion, User-supplied Struct, Declarations
+@subsubsection Gperf Declarations
+
+The declaration section can contain @code{gperf} declarations.  They
+influence the way @code{gperf} works, like command line options do.
+In fact, every such declaration is equivalent to a command line option.
+There are three forms of declarations:
+
+@enumerate
+@item
+Declarations without argument, like @samp{%compare-lengths}.
+
+@item
+Declarations with an argument, like @samp{%switch=@var{count}}.
+
+@item
+Declarations of names of entities in the output file, like
+@samp{%define lookup-function-name @var{name}}.
+@end enumerate
+
+When a declaration is given both in the input file and as a command line
+option, the command-line option's value prevails.
+
+The following @code{gperf} declarations are available.
+
+@table @samp
+@item %delimiters=@var{delimiter-list}
+@cindex @samp{%delimiters}
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.
+
+@item %struct-type
+@cindex @samp{%struct-type}
+Allows you to include a @code{struct} type declaration for generated
+code; see above for an example.
+
+@item %ignore-case
+@cindex @samp{%ignore-case}
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.
+
+@item %language=@var{language-name}
+@cindex @samp{%language}
+Instructs @code{gperf} to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+@table @samp
+@item KR-C
+Old-style K&R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking @samp{const}.
+
+@item C
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you @code{#define const} to empty
+for compilers which don't know about this keyword.
+
+@item ANSI-C
+ANSI C.  This language is understood by ANSI C (C89, ISO C90) compilers,
+ISO C99 compilers, and C++ compilers.
+
+@item C++
+C++.  This language is understood by C++ compilers.
+@end table
+
+The default is C.
+
+@item %define slot-name @var{name}
+@cindex @samp{%define slot-name}
+This declaration is only useful when option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is @samp{name}.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied @code{struct}.
+
+@item %define initializer-suffix @var{initializers}
+@cindex @samp{%define initializer-suffix}
+This declaration is only useful when option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) has been given.
+It permits to specify initializers for the structure members following
+@var{slot-name} in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following @var{slot-name}.
+
+@item %define hash-function-name @var{name}
+@cindex @samp{%define hash-function-name}
+Allows you to specify the name for the generated hash function.  Default
+name is @samp{hash}.  This option permits the use of two hash tables in
+the same file.
+
+@item %define lookup-function-name @var{name}
+@cindex @samp{%define lookup-function-name}
+Allows you to specify the name for the generated lookup function.
+Default name is @samp{in_word_set}.  This option permits multiple
+generated hash functions to be used in the same application.
+
+@item %define class-name @var{name}
+@cindex @samp{%define class-name}
+This option is only useful when option @samp{-L C++} (or, equivalently,
+the @samp{%language=C++} declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+@code{Perfect_Hash}.
+
+@item %7bit
+@cindex @samp{%7bit}
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions @code{isalnum} and @code{isgraph} do
+@emph{not} guarantee that a byte is in this range.  Only an explicit
+test like @samp{c >= 'A' && c <= 'Z'} guarantees this.)
+
+@item %compare-lengths
+@cindex @samp{%compare-lengths}
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (@pxref{Binary Strings}).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via @code{strcmp}.
+However, using @samp{%compare-lengths} might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option @samp{-S} or @samp{%switch} is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+@item %compare-strncmp
+@cindex @samp{%compare-strncmp}
+Generates C code that uses the @code{strncmp} function to perform
+string comparisons.  The default action is to use @code{strcmp}.
+
+@item %readonly-tables
+@cindex @samp{%readonly-tables}
+Makes the contents of all generated lookup tables constant, i.e.,
+``readonly''.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+@item %enum
+@cindex @samp{%enum}
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark @code{<jjc@@ai.mit.edu>}.
+
+@item %includes
+@cindex @samp{%includes}
+Include the necessary system include file, @code{<string.h>}, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+@item %global-table
+@cindex @samp{%global-table}
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+@item %pic
+@cindex @samp{%pic}
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the @samp{%struct-type} declaration (or,
+equivalently, the option @samp{-t}) is also given, the first field of the
+user-defined struct must be of type @samp{int}, not @samp{char *}, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+@samp{stringpool + @var{o}}, where @var{o} is the offset.  The string pool
+name can be changed through the @samp{%define string-pool-name} declaration.
+
+@item %define string-pool-name @var{name}
+@cindex @samp{%define string-pool-name}
+Allows you to specify the name of the generated string pool created by
+the declaration @samp{%pic} (or, equivalently, the option @samp{-P}).
+The default name is @samp{stringpool}.  This declaration permits the use of
+two hash tables in the same file, with @samp{%pic} and even when the
+@samp{%global-table} declaration (or, equivalently, the option @samp{-G})
+is given.
+
+@item %null-strings
+@cindex @samp{%null-strings}
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as the declaration @samp{%pic}), at the
+expense of one more test-and-branch instruction at run time.
+
+@item %define word-array-name @var{name}
+@cindex @samp{%define word-array-name}
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is @samp{wordlist}.  This option permits the
+use of two hash tables in the same file, even when the option @samp{-G}
+(or, equivalently, the @samp{%global-table} declaration) is given.
+
+@item %define length-table-name @var{name}
+@cindex @samp{%define length-table-name}
+Allows you to specify the name for the generated array containing the
+length table.  Default name is @samp{lengthtable}.  This option permits the
+use of two length tables in the same file, even when the option @samp{-G}
+(or, equivalently, the @samp{%global-table} declaration) is given.
+
+@item %switch=@var{count}
+@cindex @samp{%switch}
+Causes the generated C code to use a @code{switch} statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many @code{switch} statements are generated.  A
+value of 1 generates 1 @code{switch} containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+@code{switch}, etc.  This is useful since many C compilers cannot
+correctly generate code for large @code{switch} statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+@item %omit-struct-type
+@cindex @samp{%omit-struct-type}
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+@end table
+
+@node C Code Inclusion,  , Gperf Declarations, Declarations
+@subsubsection C Code Inclusion
+
+@cindex @samp{%@{}
+@cindex @samp{%@}}
+Using a syntax similar to GNU utilities @code{flex} and @code{bison}, it
+is possible to directly include C source text and comments verbatim into
+the generated output file.  This is accomplished by enclosing the region
+inside left-justified surrounding @samp{%@{}, @samp{%@}} pairs.  Here is
+an input fragment based on the previous example that illustrates this
+feature:
+
+@example
+@group
+%@{
+#include <assert.h>
+/* This section of code is inserted directly into the output. */
+int return_month_days (struct month *months, int is_leap_year);
+%@}
+struct month @{ char *name; int number; int days; int leap_days; @};
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+...
+@end group
+@end example
+
+@node Keywords, Functions, Declarations, Input Format
+@subsection Format for Keyword Entries
+
+The second input file format section contains lines of keywords and any
+associated attributes you might supply.  A line beginning with @samp{#}
+in the first column is considered a comment.  Everything following the
+@samp{#} is ignored, up to and including the following newline.  A line
+beginning with @samp{%} in the first column is an option declaration and
+must not occur within the keywords section.
+
+The first field of each non-comment line is always the keyword itself.  It
+can be given in two ways: as a simple name, i.e., without surrounding
+string quotation marks, or as a string enclosed in double-quotes, in
+C syntax, possibly with backslash escapes like @code{\"} or @code{\234}
+or @code{\xa8}.  In either case, it must start right at the beginning
+of the line, without leading whitespace.
+In this context, a ``field'' is considered to extend up to, but
+not include, the first blank, comma, or newline.  Here is a simple
+example taken from a partial list of C reserved words:
+
+@example
+@group
+# These are a few C reserved words, see the c.gperf file 
+# for a complete list of ANSI C reserved words.
+unsigned
+sizeof
+switch
+signed
+if
+default
+for
+while
+return
+@end group
+@end example
+
+Note that unlike @code{flex} or @code{bison} the first @samp{%%} marker
+may be elided if the declaration section is empty.
+
+Additional fields may optionally follow the leading keyword.  Fields
+should be separated by commas, and terminate at the end of line.  What
+these fields mean is entirely up to you; they are used to initialize the
+elements of the user-defined @code{struct} provided by you in the
+declaration section.  If the @samp{-t} option (or, equivalently, the
+@samp{%struct-type} declaration) is @emph{not} enabled
+these fields are simply ignored.  All previous examples except the last
+one contain keyword attributes.
+
+@node Functions, Controls for GNU indent, Keywords, Input Format
+@subsection Including Additional C Functions
+
+The optional third section also corresponds closely with conventions
+found in @code{flex} and @code{bison}.  All text in this section,
+starting at the final @samp{%%} and extending to the end of the input
+file, is included verbatim into the generated output file.  Naturally,
+it is your responsibility to ensure that the code contained in this
+section is valid C.
+
+@node Controls for GNU indent,  , Functions, Input Format
+@subsection Where to place directives for GNU @code{indent}.
+
+If you want to invoke GNU @code{indent} on a @code{gperf} input file,
+you will see that GNU @code{indent} doesn't understand the @samp{%%},
+@samp{%@{} and @samp{%@}} directives that control @code{gperf}'s
+interpretation of the input file.  Therefore you have to insert some
+directives for GNU @code{indent}.  More precisely, assuming the most
+general input file structure
+
+@example
+@group
+declarations part 1
+%@{
+verbatim code
+%@}
+declarations part 2
+%%
+keywords
+%%
+functions
+@end group
+@end example
+
+@noindent
+you would insert @samp{*INDENT-OFF*} and @samp{*INDENT-ON*} comments
+as follows:
+
+@example
+@group
+/* *INDENT-OFF* */
+declarations part 1
+%@{
+/* *INDENT-ON* */
+verbatim code
+/* *INDENT-OFF* */
+%@}
+declarations part 2
+%%
+keywords
+%%
+/* *INDENT-ON* */
+functions
+@end group
+@end example
+
+@node Output Format, Binary Strings, Input Format, Description
+@section Output Format for Generated C Code with @code{gperf}
+@cindex hash table
+
+Several options control how the generated C code appears on the standard 
+output.  Two C functions are generated.  They are called @code{hash} and 
+@code{in_word_set}, although you may modify their names with a command-line 
+option.  Both functions require two arguments, a string, @code{char *} 
+@var{str}, and a length parameter, @code{int} @var{len}.  Their default 
+function prototypes are as follows:
+
+@deftypefun {unsigned int} hash (const char * @var{str}, unsigned int @var{len})
+By default, the generated @code{hash} function returns an integer value
+created by adding @var{len} to several user-specified @var{str} byte
+positions indexed into an @dfn{associated values} table stored in a
+local static array.  The associated values table is constructed
+internally by @code{gperf} and later output as a static local C array
+called @samp{hash_table}.  The relevant selected positions (i.e. indices
+into @var{str}) are specified via the @samp{-k} option when running
+@code{gperf}, as detailed in the @emph{Options} section below (@pxref{Options}).
+@end deftypefun
+
+@deftypefun {} in_word_set (const char * @var{str}, unsigned int @var{len})
+If @var{str} is in the keyword set, returns a pointer to that
+keyword.  More exactly, if the option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) was given, it returns
+a pointer to the matching keyword's structure.  Otherwise it returns
+@code{NULL}.
+@end deftypefun
+
+If the option @samp{-c} (or, equivalently, the @samp{%compare-strncmp}
+declaration) is not used, @var{str} must be a NUL terminated
+string of exactly length @var{len}.  If @samp{-c} (or, equivalently, the
+@samp{%compare-strncmp} declaration) is used, @var{str} must
+simply be an array of @var{len} bytes and does not need to be NUL
+terminated.
+
+The code generated for these two functions is affected by the following
+options:
+
+@table @samp
+@item -t
+@itemx --struct-type
+Make use of the user-defined @code{struct}.
+
+@item -S @var{total-switch-statements}
+@itemx --switch=@var{total-switch-statements}
+@cindex @code{switch}
+Generate 1 or more C @code{switch} statement rather than use a large,
+(and potentially sparse) static array.  Although the exact time and
+space savings of this approach vary according to your C compiler's
+degree of optimization, this method often results in smaller and faster
+code.
+@end table
+
+If the @samp{-t} and @samp{-S} options (or, equivalently, the
+@samp{%struct-type} and @samp{%switch} declarations) are omitted, the default
+action
+is to generate a @code{char *} array containing the keywords, together with
+additional empty strings used for padding the array.  By experimenting
+with the various input and output options, and timing the resulting C
+code, you can determine the best option choices for different keyword
+set characteristics.
+
+@node Binary Strings, Output Copyright, Output Format, Description
+@section Use of NUL bytes
+@cindex NUL
+
+By default, the code generated by @code{gperf} operates on zero
+terminated strings, the usual representation of strings in C.  This means
+that the keywords in the input file must not contain NUL bytes,
+and the @var{str} argument passed to @code{hash} or @code{in_word_set}
+must be NUL terminated and have exactly length @var{len}.
+
+If option @samp{-c} (or, equivalently, the @samp{%compare-strncmp}
+declaration) is used, then the @var{str} argument does not need
+to be NUL terminated.  The code generated by @code{gperf} will only
+access the first @var{len}, not @var{len+1}, bytes starting at @var{str}.
+However, the keywords in the input file still must not contain NUL
+bytes.
+
+If option @samp{-l} (or, equivalently, the @samp{%compare-lengths}
+declaration) is used, then the hash table performs binary
+comparison.  The keywords in the input file may contain NUL bytes,
+written in string syntax as @code{\000} or @code{\x00}, and the code
+generated by @code{gperf} will treat NUL like any other byte.
+Also, in this case the @samp{-c} option (or, equivalently, the
+@samp{%compare-strncmp} declaration) is ignored.
+
+@node Output Copyright,  , Binary Strings, Description
+@section The Copyright of the Output
+@cindex Copyright
+
+@code{gperf} is under GPL, but that does not cause the output produced
+by @code{gperf} to be under GPL.  The reason is that the output contains
+only small pieces of text that come directly from @code{gperf}'s source
+code -- only about 7 lines long, too small for being significant --, and
+therefore the output is not a ``work based on @code{gperf}'' (in the
+sense of the GPL version 3).
+
+On the other hand, the output produced by @code{gperf} contains
+essentially all of the input file.  Therefore the output is a
+``derivative work'' of the input (in the sense of U.S.@: copyright law);
+and its copyright status depends on the copyright of the input.  For most
+software licenses, the result is that the the output is under the same
+license, with the same copyright holder, as the input that was passed to
+@code{gperf}.
+
+@node Options, Bugs, Description, Top
+@chapter Invoking @code{gperf}
+
+There are @emph{many} options to @code{gperf}.  They were added to make
+the program more convenient for use with real applications.  ``On-line''
+help is readily available via the @samp{--help} option.  Here is the
+complete list of options.
+
+@menu
+* Output File::                 Specifying the Location of the Output File
+* Input Details::               Options that affect Interpretation of the Input File
+* Output Language::             Specifying the Language for the Output Code
+* Output Details::              Fine tuning Details in the Output Code
+* Algorithmic Details::         Changing the Algorithms employed by @code{gperf}
+* Verbosity::                   Informative Output
+@end menu
+
+@node Output File, Input Details, Options, Options
+@section Specifying the Location of the Output File
+
+@table @samp
+@item --output-file=@var{file}
+Allows you to specify the name of the file to which the output is written to.
+@end table
+
+The results are written to standard output if no output file is specified
+or if it is @samp{-}.
+
+@node Input Details, Output Language, Output File, Options
+@section Options that affect Interpretation of the Input File
+
+These options are also available as declarations in the input file
+(@pxref{Gperf Declarations}).
+
+@table @samp
+@item -e @var{keyword-delimiter-list}
+@itemx --delimiters=@var{keyword-delimiter-list}
+@cindex Delimiters
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.  One useful trick is to use -e'TAB', where TAB is
+the literal tab character.
+
+@item -t
+@itemx --struct-type
+Allows you to include a @code{struct} type declaration for generated
+code.  Any text before a pair of consecutive @samp{%%} is considered
+part of the type declaration.  Keywords and additional fields may follow
+this, one group of fields per line.  A set of examples for generating
+perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2,
+Modula 3 and JavaScript reserved words are distributed with this release.
+
+@item --ignore-case
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.  This option is therefore not
+suitable if a properly internationalized or locale aware case mapping
+should be used.  (For example, in a Turkish locale, the upper case equivalent
+of the lowercase ASCII letter @samp{i} is the non-ASCII character
+@samp{capital i with dot above}.)  For this case, it is better to apply
+an uppercase or lowercase conversion on the string before passing it to
+the @code{gperf} generated function.
+@end table
+
+@node Output Language, Output Details, Input Details, Options
+@section Options to specify the Language for the Output Code
+
+These options are also available as declarations in the input file
+(@pxref{Gperf Declarations}).
+
+@table @samp
+@item -L @var{generated-language-name}
+@itemx --language=@var{generated-language-name}
+Instructs @code{gperf} to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+@table @samp
+@item KR-C
+Old-style K&R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking @samp{const}.
+
+@item C
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you @code{#define const} to empty
+for compilers which don't know about this keyword.
+
+@item ANSI-C
+ANSI C.  This language is understood by ANSI C compilers and C++ compilers.
+
+@item C++
+C++.  This language is understood by C++ compilers.
+@end table
+
+The default is C.
+
+@item -a
+This option is supported for compatibility with previous releases of
+@code{gperf}.  It does not do anything.
+
+@item -g
+This option is supported for compatibility with previous releases of
+@code{gperf}.  It does not do anything.
+@end table
+
+@node Output Details, Algorithmic Details, Output Language, Options
+@section Options for fine tuning Details in the Output Code
+
+Most of these options are also available as declarations in the input file
+(@pxref{Gperf Declarations}).
+
+@table @samp
+@item -K @var{slot-name}
+@itemx --slot-name=@var{slot-name}
+@cindex Slot name
+This option is only useful when option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is @samp{name}.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied @code{struct}.
+
+@item -F @var{initializers}
+@itemx --initializer-suffix=@var{initializers}
+@cindex Initializers
+This option is only useful when option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) has been given.
+It permits to specify initializers for the structure members following
+@var{slot-name} in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following @var{slot-name}.
+
+@item -H @var{hash-function-name}
+@itemx --hash-function-name=@var{hash-function-name}
+Allows you to specify the name for the generated hash function.  Default
+name is @samp{hash}.  This option permits the use of two hash tables in
+the same file.
+
+@item -N @var{lookup-function-name}
+@itemx --lookup-function-name=@var{lookup-function-name}
+Allows you to specify the name for the generated lookup function.
+Default name is @samp{in_word_set}.  This option permits multiple
+generated hash functions to be used in the same application.
+
+@item -Z @var{class-name}
+@itemx --class-name=@var{class-name}
+@cindex Class name
+This option is only useful when option @samp{-L C++} (or, equivalently,
+the @samp{%language=C++} declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+@code{Perfect_Hash}.
+
+@item -7
+@itemx --seven-bit
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions @code{isalnum} and @code{isgraph} do
+@emph{not} guarantee that a byte is in this range.  Only an explicit
+test like @samp{c >= 'A' && c <= 'Z'} guarantees this.) This was the
+default in versions of @code{gperf} earlier than 2.7; now the default is
+to support 8-bit and multibyte characters.
+
+@item -l
+@itemx --compare-lengths
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (@pxref{Binary Strings}).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via @code{strcmp}.
+However, using @samp{-l} might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option @samp{-S} or @samp{%switch} is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+@item -c
+@itemx --compare-strncmp
+Generates C code that uses the @code{strncmp} function to perform
+string comparisons.  The default action is to use @code{strcmp}.
+
+@item -C
+@itemx --readonly-tables
+Makes the contents of all generated lookup tables constant, i.e.,
+``readonly''.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+@item -E
+@itemx  --enum
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark @code{<jjc@@ai.mit.edu>}.
+
+@item -I
+@itemx --includes
+Include the necessary system include file, @code{<string.h>}, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+@item -G
+@itemx --global-table
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+@item -P
+@itemx --pic
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the option @samp{-t} (or, equivalently, the
+@samp{%struct-type} declaration) is also given, the first field of the
+user-defined struct must be of type @samp{int}, not @samp{char *}, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+@samp{stringpool + @var{o}}, where @var{o} is the offset.  The string pool
+name can be changed through the option @samp{--string-pool-name}.
+
+@item -Q @var{string-pool-name}
+@itemx --string-pool-name=@var{string-pool-name}
+Allows you to specify the name of the generated string pool created by
+option @samp{-P}.  The default name is @samp{stringpool}.  This option
+permits the use of two hash tables in the same file, with @samp{-P} and
+even when the option @samp{-G} (or, equivalently, the @samp{%global-table}
+declaration) is given.
+
+@item --null-strings
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as option @samp{-P}), at the expense
+of one more test-and-branch instruction at run time.
+
+@item -W @var{hash-table-array-name}
+@itemx --word-array-name=@var{hash-table-array-name}
+@cindex Array name
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is @samp{wordlist}.  This option permits the
+use of two hash tables in the same file, even when the option @samp{-G}
+(or, equivalently, the @samp{%global-table} declaration) is given.
+
+@itemx --length-table-name=@var{length-table-array-name}
+@cindex Array name
+Allows you to specify the name for the generated array containing the
+length table.  Default name is @samp{lengthtable}.  This option permits the
+use of two length tables in the same file, even when the option @samp{-G}
+(or, equivalently, the @samp{%global-table} declaration) is given.
+
+@item -S @var{total-switch-statements}
+@itemx --switch=@var{total-switch-statements}
+@cindex @code{switch}
+Causes the generated C code to use a @code{switch} statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many @code{switch} statements are generated.  A
+value of 1 generates 1 @code{switch} containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+@code{switch}, etc.  This is useful since many C compilers cannot
+correctly generate code for large @code{switch} statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+@item -T
+@itemx --omit-struct-type
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+
+@item -p
+This option is supported for compatibility with previous releases of
+@code{gperf}.  It does not do anything.
+@end table
+
+@node Algorithmic Details, Verbosity, Output Details, Options
+@section Options for changing the Algorithms employed by @code{gperf}
+
+@table @samp
+@item -k @var{selected-byte-positions}
+@itemx --key-positions=@var{selected-byte-positions}
+Allows selection of the byte positions used in the keywords'
+hash function.  The allowable choices range between 1-255, inclusive.
+The positions are separated by commas, e.g., @samp{-k 9,4,13,14};
+ranges may be used, e.g., @samp{-k 2-7}; and positions may occur
+in any order.  Furthermore, the wildcard '*' causes the generated
+hash function to consider @strong{all} byte positions in each keyword,
+whereas '$' instructs the hash function to use the ``final byte''
+of a keyword (this is the only way to use a byte position greater than
+255, incidentally).
+
+For instance, the option @samp{-k 1,2,4,6-10,'$'} generates a hash
+function that considers positions 1,2,4,6,7,8,9,10, plus the last
+byte in each keyword (which may be at a different position for each
+keyword, obviously).  Keywords
+with length less than the indicated byte positions work properly, since
+selected byte positions exceeding the keyword length are simply not
+referenced in the hash function.
+
+This option is not normally needed since version 2.8 of @code{gperf};
+the default byte positions are computed depending on the keyword set,
+through a search that minimizes the number of byte positions.
+
+@item -D
+@itemx --duplicates
+@cindex Duplicates
+Handle keywords whose selected byte sets hash to duplicate values.
+Duplicate hash values can occur if a set of keywords has the same names, but
+possesses different attributes, or if the selected byte positions are not well
+chosen.  With the -D option @code{gperf} treats all these keywords as
+part of an equivalence class and generates a perfect hash function with
+multiple comparisons for duplicate keywords.  It is up to you to completely
+disambiguate the keywords by modifying the generated C code.  However,
+@code{gperf} helps you out by organizing the output.
+
+Using this option usually means that the generated hash function is no
+longer perfect.  On the other hand, it permits @code{gperf} to work on
+keyword sets that it otherwise could not handle.
+
+@item -m @var{iterations}
+@itemx --multiple-iterations=@var{iterations}
+Perform multiple choices of the @samp{-i} and @samp{-j} values, and
+choose the best results.  This increases the running time by a factor of
+@var{iterations} but does a good job minimizing the generated table size.
+
+@item -i @var{initial-value}
+@itemx --initial-asso=@var{initial-value}
+Provides an initial @var{value} for the associate values array.  Default
+is 0.  Increasing the initial value helps inflate the final table size,
+possibly leading to more time efficient keyword lookups.  Note that this
+option is not particularly useful when @samp{-S} (or, equivalently,
+@samp{%switch}) is used.  Also,
+@samp{-i} is overridden when the @samp{-r} option is used.
+
+@item -j @var{jump-value}
+@itemx --jump=@var{jump-value}
+@cindex Jump value
+Affects the ``jump value'', i.e., how far to advance the associated
+byte value upon collisions.  @var{Jump-value} is rounded up to an
+odd number, the default is 5.  If the @var{jump-value} is 0 @code{gperf}
+jumps by random amounts.
+
+@item -n
+@itemx --no-strlen
+Instructs the generator not to include the length of a keyword when
+computing its hash value.  This may save a few assembly instructions in
+the generated lookup table.
+
+@item -r
+@itemx --random
+Utilizes randomness to initialize the associated values table.  This
+frequently generates solutions faster than using deterministic
+initialization (which starts all associated values at 0).  Furthermore,
+using the randomization option generally increases the size of the
+table.
+
+@item -s @var{size-multiple}
+@itemx --size-multiple=@var{size-multiple}
+Affects the size of the generated hash table.  The numeric argument for
+this option indicates ``how many times larger or smaller'' the maximum
+associated value range should be, in relationship to the number of keywords.
+It can be written as an integer, a floating-point number or a fraction.
+For example, a value of 3 means ``allow the maximum associated value to be
+about 3 times larger than the number of input keywords''.
+Conversely, a value of 1/3 means ``allow the maximum associated value to
+be about 3 times smaller than the number of input keywords''.  Values
+smaller than 1 are useful for limiting the overall size of the generated hash
+table, though the option @samp{-m} is better at this purpose.
+
+If `generate switch' option @samp{-S} (or, equivalently, @samp{%switch}) is
+@emph{not} enabled, the maximum
+associated value influences the static array table size, and a larger
+table should decrease the time required for an unsuccessful search, at
+the expense of extra table space.
+
+The default value is 1, thus the default maximum associated value about
+the same size as the number of keywords (for efficiency, the maximum
+associated value is always rounded up to a power of 2).  The actual
+table size may vary somewhat, since this technique is essentially a
+heuristic.
+@end table
+
+@node Verbosity,  , Algorithmic Details, Options
+@section Informative Output
+
+@table @samp
+@item -h
+@itemx --help
+Prints a short summary on the meaning of each program option.  Aborts
+further program execution.
+
+@item -v
+@itemx --version
+Prints out the current version number.
+
+@item -d
+@itemx --debug
+Enables the debugging option.  This produces verbose diagnostics to
+``standard error'' when @code{gperf} is executing.  It is useful both for
+maintaining the program and for determining whether a given set of
+options is actually speeding up the search for a solution.  Some useful
+information is dumped at the end of the program when the @samp{-d}
+option is enabled.
+@end table
+
+@node Bugs, Projects, Options, Top
+@chapter Known Bugs and Limitations with @code{gperf}
+
+The following are some limitations with the current release of
+@code{gperf}:
+
+@itemize @bullet
+@item
+The @code{gperf} utility is tuned to execute quickly, and works quickly
+for small to medium size data sets (around 1000 keywords).  It is
+extremely useful for maintaining perfect hash functions for compiler
+keyword sets.  Several recent enhancements now enable @code{gperf} to
+work efficiently on much larger keyword sets (over 15,000 keywords).
+When processing large keyword sets it helps greatly to have over 8 megs
+of RAM.
+
+@item 
+The size of the generate static keyword array can get @emph{extremely}
+large if the input keyword file is large or if the keywords are quite
+similar.  This tends to slow down the compilation of the generated C
+code, and @emph{greatly} inflates the object code size.  If this
+situation occurs, consider using the @samp{-S} option to reduce data
+size, potentially increasing keyword recognition time a negligible
+amount.  Since many C compilers cannot correctly generate code for
+large switch statements it is important to qualify the @var{-S} option
+with an appropriate numerical argument that controls the number of
+switch statements generated.
+
+@item 
+The maximum number of selected byte positions has an
+arbitrary limit of 255.  This restriction should be removed, and if
+anyone considers this a problem write me and let me know so I can remove
+the constraint.
+@end itemize
+
+@node Projects, Bibliography, Bugs, Top
+@chapter Things Still Left to Do
+
+It should be ``relatively'' easy to replace the current perfect hash
+function algorithm with a more exhaustive approach; the perfect hash
+module is essential independent from other program modules.  Additional
+worthwhile improvements include:
+
+@itemize @bullet
+@item 
+Another useful extension involves modifying the program to generate
+``minimal'' perfect hash functions (under certain circumstances, the
+current version can be rather extravagant in the generated table size).
+This is mostly of theoretical interest, since a sparse table
+often produces faster lookups, and use of the @samp{-S} @code{switch}
+option can minimize the data size, at the expense of slightly longer
+lookups (note that the gcc compiler generally produces good code for
+@code{switch} statements, reducing the need for more complex schemes).
+
+@item
+In addition to improving the algorithm, it would also be useful to
+generate an Ada package as the code output, in addition to the current
+C and C++ routines.
+@end itemize
+
+@page
+
+@node Bibliography, Concept Index, Projects, Top
+@chapter Bibliography
+
+@noindent
+[1] Chang, C.C.: @i{A Scheme for Constructing Ordered Minimal Perfect
+Hashing Functions} Information Sciences 39(1986), 187-195.
+
+@noindent
+[2] Cichelli, Richard J. @i{Author's Response to ``On Cichelli's Minimal Perfect Hash
+Functions Method''} Communications of the ACM, 23, 12(December 1980), 729.
+
+@noindent
+[3] Cichelli, Richard J. @i{Minimal Perfect Hash Functions Made Simple}
+Communications of the ACM, 23, 1(January 1980), 17-19.
+
+@noindent
+[4] Cook, C. R. and Oldehoeft, R.R. @i{A Letter Oriented Minimal
+Perfect Hashing Function} SIGPLAN Notices, 17, 9(September 1982), 18-27.
+
+@noindent
+[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
+@i{Practical Perfect Hashing} Computer Journal, 28, 1(January 1985), 54-58.
+
+@noindent
+[6] Jaeschke, G. @i{Reciprocal Hashing: A Method for Generating Minimal
+Perfect Hashing Functions} Communications of the ACM, 24, 12(December
+1981), 829-833.
+
+@noindent
+[7] Jaeschke, G. and Osterburg, G. @i{On Cichelli's Minimal Perfect
+Hash Functions Method} Communications of the ACM, 23, 12(December 1980),
+728-729.
+
+@noindent
+[8] Sager, Thomas J. @i{A Polynomial Time Generator for Minimal Perfect
+Hash Functions} Communications of the ACM, 28, 5(December 1985), 523-532
+
+@noindent
+[9] Schmidt, Douglas C. @i{GPERF: A Perfect Hash Function Generator}
+Second USENIX C++ Conference Proceedings, April 1990.
+
+@noindent
+[10] Schmidt, Douglas C. @i{GPERF: A Perfect Hash Function Generator}
+C++ Report, SIGS 10 10 (November/December 1998).
+
+@noindent
+[11] Sebesta, R.W. and Taylor, M.A. @i{Minimal Perfect Hash Functions
+for Reserved Word Lists}  SIGPLAN Notices, 20, 12(September 1985), 47-53.
+
+@noindent
+[12] Sprugnoli, R. @i{Perfect Hashing Functions: A Single Probe
+Retrieving Method for Static Sets} Communications of the ACM, 20
+11(November 1977), 841-850.
+
+@noindent
+[13] Stallman, Richard M. @i{Using and Porting GNU CC} Free Software Foundation,
+1988.
+
+@noindent
+[14] Stroustrup, Bjarne @i{The C++ Programming Language.} Addison-Wesley, 1986.
+
+@noindent
+[15] Tiemann, Michael D. @i{User's Guide to GNU C++} Free Software
+Foundation, 1989.
+
+@node Concept Index,  , Bibliography, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@iftex
+@c Table of Contents
+@contents
+@end iftex
+
+@bye
diff --git a/doc/gperf_1.html b/doc/gperf_1.html
new file mode 100644 (file)
index 0000000..addeecf
--- /dev/null
@@ -0,0 +1,825 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - GNU GENERAL PUBLIC LICENSE</TITLE>
+</HEAD>
+<BODY>
+Go to the first, previous, <A HREF="gperf_2.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+<P>
+Copyright (C) 1989-2009 Free Software Foundation, Inc.
+
+</P>
+
+<P>
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+</P>
+<P>
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+section entitled “GNU General Public License” is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+</P>
+<P>
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that the section entitled “GNU General Public License” may be
+included in a translation approved by the author instead of in the
+original English.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="gperf_toc.html#TOC1">GNU GENERAL PUBLIC LICENSE</A></H1>
+<P>
+Version 3, 29 June 2007
+
+</P>
+
+
+<PRE>
+Copyright (C) 2007 Free Software Foundation, Inc. <A HREF="http://fsf.org/">http://fsf.org/</A>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+</PRE>
+
+
+<H2>1.0  Preamble</H2>
+
+<P>
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+</P>
+<P>
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program--to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+</P>
+<P>
+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
+them 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.
+
+</P>
+<P>
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+</P>
+<P>
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+</P>
+<P>
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+</P>
+<P>
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+</P>
+<P>
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+</P>
+<P>
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+</P>
+<P>
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+
+<H2>1.1  TERMS AND CONDITIONS</H2>
+
+
+<OL>
+<LI>Definitions.
+
+“This License” refers to version 3 of the GNU General Public License.
+
+“Copyright” also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.
+
+To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a “modified version” of
+the earlier work or a work “based on” the earlier work.
+
+A “covered work” means either the unmodified Program or a work based
+on the Program.
+
+To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays “Appropriate Legal Notices” to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+<LI>Source Code.
+
+The “source code” for a work means the preferred form of the work for
+making modifications to it.  “Object code” means any non-source form
+of a work.
+
+A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+<LI>Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+<LI>Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+<LI>Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+<LI>Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+
+<OL>
+<LI>
+
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+<LI>
+
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to “keep intact all
+notices”.
+
+<LI>
+
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+<LI>
+
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+</OL>
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+<LI>Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+
+<OL>
+<LI>
+
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+<LI>
+
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+<LI>
+
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+<LI>
+
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+<LI>
+
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+</OL>
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+“normally used” refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+<LI>Additional Terms.
+
+“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+
+<OL>
+<LI>
+
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+<LI>
+
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+<LI>
+
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+<LI>
+
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+<LI>
+
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+<LI>
+
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+</OL>
+
+All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+<LI>Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+<LI>Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+<LI>Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+<LI>Patents.
+
+A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.
+
+A contributor's “essential patent claims” are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is “discriminatory” if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+<LI>No Surrender of Others' Freedom.
+
+If 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 convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+<LI>Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+<LI>Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU 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 Program
+specifies that a certain numbered version of the GNU General Public
+License “or any later version” applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+<LI>Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “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 PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+<LI>Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM 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 PROGRAM (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 PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+<LI>Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+</OL>
+
+
+<H2>1.2  END OF TERMS AND CONDITIONS</H2>
+
+
+<H2>1.3  How to Apply These Terms to Your New Programs</H2>
+
+<P>
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+</P>
+<P>
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.
+
+</P>
+
+<PRE>
+<VAR>one line to give the program's name and a brief idea of what it does.</VAR>
+Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, 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.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <A HREF="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</A>.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+</P>
+
+<PRE>
+<VAR>program</VAR> Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+This program comes with ABSOLUTELY NO WARRANTY; for details type <SAMP>&lsquo;show w&rsquo;</SAMP>.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type <SAMP>&lsquo;show c&rsquo;</SAMP> for details.
+</PRE>
+
+<P>
+The hypothetical commands <SAMP>&lsquo;show w&rsquo;</SAMP> and <SAMP>&lsquo;show c&rsquo;</SAMP> should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an “about box”.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<A HREF="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</A>.
+
+</P>
+<P>
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read <A HREF="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</A>.
+
+</P>
+<P><HR><P>
+Go to the first, previous, <A HREF="gperf_2.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_10.html b/doc/gperf_10.html
new file mode 100644 (file)
index 0000000..d03d419
--- /dev/null
@@ -0,0 +1,135 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - Concept Index</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_9.html">previous</A>, next, last section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC27" HREF="gperf_toc.html#TOC27">Concept Index</A></H1>
+
+<P>
+Jump to:
+<A HREF="#cindex_&">&#38;</A>
+-
+<A HREF="#cindex_a">a</A>
+-
+<A HREF="#cindex_b">b</A>
+-
+<A HREF="#cindex_c">c</A>
+-
+<A HREF="#cindex_d">d</A>
+-
+<A HREF="#cindex_f">f</A>
+-
+<A HREF="#cindex_h">h</A>
+-
+<A HREF="#cindex_i">i</A>
+-
+<A HREF="#cindex_j">j</A>
+-
+<A HREF="#cindex_k">k</A>
+-
+<A HREF="#cindex_m">m</A>
+-
+<A HREF="#cindex_n">n</A>
+-
+<A HREF="#cindex_s">s</A>
+<P>
+<H2><A NAME="cindex_&">&#38;</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX8"><SAMP>&lsquo;%%&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX18"><SAMP>&lsquo;%7bit&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX19"><SAMP>&lsquo;%compare-lengths&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX20"><SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX17"><SAMP>&lsquo;%define class-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX15"><SAMP>&lsquo;%define hash-function-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX14"><SAMP>&lsquo;%define initializer-suffix&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX29"><SAMP>&lsquo;%define length-table-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX16"><SAMP>&lsquo;%define lookup-function-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX13"><SAMP>&lsquo;%define slot-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX26"><SAMP>&lsquo;%define string-pool-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX28"><SAMP>&lsquo;%define word-array-name&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX9"><SAMP>&lsquo;%delimiters&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX22"><SAMP>&lsquo;%enum&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX24"><SAMP>&lsquo;%global-table&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX11"><SAMP>&lsquo;%ignore-case&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX23"><SAMP>&lsquo;%includes&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX12"><SAMP>&lsquo;%language&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX27"><SAMP>&lsquo;%null-strings&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX31"><SAMP>&lsquo;%omit-struct-type&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX25"><SAMP>&lsquo;%pic&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX21"><SAMP>&lsquo;%readonly-tables&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX10"><SAMP>&lsquo;%struct-type&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX30"><SAMP>&lsquo;%switch&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX32"><SAMP>&lsquo;%{&rsquo;</SAMP></A>
+<LI><A HREF="gperf_5.html#IDX33"><SAMP>&lsquo;%}&rsquo;</SAMP></A>
+</DIR>
+<H2><A NAME="cindex_a">a</A></H2>
+<DIR>
+<LI><A HREF="gperf_6.html#IDX44">Array name</A>, <A HREF="gperf_6.html#IDX45">Array name</A>
+</DIR>
+<H2><A NAME="cindex_b">b</A></H2>
+<DIR>
+<LI><A HREF="gperf_2.html#IDX1">Bugs</A>
+</DIR>
+<H2><A NAME="cindex_c">c</A></H2>
+<DIR>
+<LI><A HREF="gperf_6.html#IDX43">Class name</A>
+<LI><A HREF="gperf_5.html#IDX39">Copyright</A>
+</DIR>
+<H2><A NAME="cindex_d">d</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX5">Declaration section</A>
+<LI><A HREF="gperf_6.html#IDX40">Delimiters</A>
+<LI><A HREF="gperf_6.html#IDX47">Duplicates</A>
+</DIR>
+<H2><A NAME="cindex_f">f</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX4">Format</A>
+<LI><A HREF="gperf_5.html#IDX7">Functions section</A>
+</DIR>
+<H2><A NAME="cindex_h">h</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX35">hash</A>
+<LI><A HREF="gperf_5.html#IDX34">hash table</A>
+</DIR>
+<H2><A NAME="cindex_i">i</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX36">in_word_set</A>
+<LI><A HREF="gperf_6.html#IDX42">Initializers</A>
+</DIR>
+<H2><A NAME="cindex_j">j</A></H2>
+<DIR>
+<LI><A HREF="gperf_6.html#IDX48">Jump value</A>
+</DIR>
+<H2><A NAME="cindex_k">k</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX6">Keywords section</A>
+</DIR>
+<H2><A NAME="cindex_m">m</A></H2>
+<DIR>
+<LI><A HREF="gperf_4.html#IDX3">Minimal perfect hash functions</A>
+</DIR>
+<H2><A NAME="cindex_n">n</A></H2>
+<DIR>
+<LI><A HREF="gperf_5.html#IDX38">NUL</A>
+</DIR>
+<H2><A NAME="cindex_s">s</A></H2>
+<DIR>
+<LI><A HREF="gperf_6.html#IDX41">Slot name</A>
+<LI><A HREF="gperf_4.html#IDX2">Static search structure</A>
+<LI><A HREF="gperf_5.html#IDX37"><CODE>switch</CODE></A>, <A HREF="gperf_6.html#IDX46"><CODE>switch</CODE></A>
+</DIR>
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_9.html">previous</A>, next, last section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_2.html b/doc/gperf_2.html
new file mode 100644 (file)
index 0000000..5468477
--- /dev/null
@@ -0,0 +1,49 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - Contributors to GNU gperf Utility</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_1.html">previous</A>, <A HREF="gperf_3.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC2" HREF="gperf_toc.html#TOC2">Contributors to GNU <CODE>gperf</CODE> Utility</A></H1>
+
+
+<UL>
+<LI>
+
+<A NAME="IDX1"></A>
+The GNU <CODE>gperf</CODE> perfect hash function generator utility was
+written in GNU C++ by Douglas C. Schmidt.  The general
+idea for the perfect hash function generator was inspired by Keith
+Bostic's algorithm written in C, and distributed to net.sources around
+1984.  The current program is a heavily modified, enhanced, and extended
+implementation of Keith's basic idea, created at the University of
+California, Irvine.  Bugs, patches, and suggestions should be reported
+to <CODE>&#60;bug-gnu-gperf@gnu.org&#62;</CODE>.
+
+<LI>
+
+Special thanks is extended to Michael Tiemann and Doug Lea, for
+providing a useful compiler, and for giving me a forum to exhibit my
+creation.
+
+In addition, Adam de Boor and Nels Olson provided many tips and insights
+that greatly helped improve the quality and functionality of <CODE>gperf</CODE>.
+
+<LI>
+
+Bruno Haible enhanced and optimized the search algorithm.  He also rewrote
+the input routines and the output routines for better reliability, and
+added a testsuite.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_1.html">previous</A>, <A HREF="gperf_3.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_3.html b/doc/gperf_3.html
new file mode 100644 (file)
index 0000000..f4f671d
--- /dev/null
@@ -0,0 +1,42 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 2  Introduction</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_2.html">previous</A>, <A HREF="gperf_4.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC3" HREF="gperf_toc.html#TOC3">2  Introduction</A></H1>
+
+<P>
+<CODE>gperf</CODE> is a perfect hash function generator written in C++.  It
+transforms an <VAR>n</VAR> element user-specified keyword set <VAR>W</VAR> into a
+perfect hash function <VAR>F</VAR>.  <VAR>F</VAR> uniquely maps keywords in
+<VAR>W</VAR> onto the range 0..<VAR>k</VAR>, where <VAR>k</VAR> &#62;= <VAR>n-1</VAR>.  If <VAR>k</VAR>
+= <VAR>n-1</VAR> then <VAR>F</VAR> is a <EM>minimal</EM> perfect hash function.
+<CODE>gperf</CODE> generates a 0..<VAR>k</VAR> element static lookup table and a
+pair of C functions.  These functions determine whether a given
+character string <VAR>s</VAR> occurs in <VAR>W</VAR>, using at most one probe into
+the lookup table.
+
+</P>
+<P>
+<CODE>gperf</CODE> currently generates the reserved keyword recognizer for
+lexical analyzers in several production and research compilers and
+language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal,
+GNU Modula 3, and GNU indent.  Complete C++ source code for <CODE>gperf</CODE> is
+available from <CODE>http://ftp.gnu.org/pub/gnu/gperf/</CODE>.
+A paper describing <CODE>gperf</CODE>'s design and implementation in greater
+detail is available in the Second USENIX C++ Conference proceedings
+or from <CODE>http://www.cs.wustl.edu/~schmidt/resume.html</CODE>.
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_2.html">previous</A>, <A HREF="gperf_4.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_4.html b/doc/gperf_4.html
new file mode 100644 (file)
index 0000000..8d6219e
--- /dev/null
@@ -0,0 +1,99 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 3  Static search structures and GNU gperf</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_3.html">previous</A>, <A HREF="gperf_5.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC4" HREF="gperf_toc.html#TOC4">3  Static search structures and GNU <CODE>gperf</CODE></A></H1>
+<P>
+<A NAME="IDX2"></A>
+
+</P>
+<P>
+A <EM>static search structure</EM> is an Abstract Data Type with certain
+fundamental operations, e.g., <EM>initialize</EM>, <EM>insert</EM>,
+and <EM>retrieve</EM>.  Conceptually, all insertions occur before any
+retrievals.  In practice, <CODE>gperf</CODE> generates a <EM>static</EM> array
+containing search set keywords and any associated attributes specified
+by the user.  Thus, there is essentially no execution-time cost for the
+insertions.  It is a useful data structure for representing <EM>static
+search sets</EM>.  Static search sets occur frequently in software system
+applications.  Typical static search sets include compiler reserved
+words, assembler instruction opcodes, and built-in shell interpreter
+commands.  Search set members, called <EM>keywords</EM>, are inserted into
+the structure only once, usually during program initialization, and are
+not generally modified at run-time.
+
+</P>
+<P>
+Numerous static search structure implementations exist, e.g.,
+arrays, linked lists, binary search trees, digital search tries, and
+hash tables.  Different approaches offer trade-offs between space
+utilization and search time efficiency.  For example, an <VAR>n</VAR> element
+sorted array is space efficient, though the average-case time
+complexity for retrieval operations using binary search is
+proportional to log <VAR>n</VAR>.  Conversely, hash table implementations
+often locate a table entry in constant time, but typically impose
+additional memory overhead and exhibit poor worst case performance.
+
+</P>
+<P>
+<A NAME="IDX3"></A>
+<EM>Minimal perfect hash functions</EM> provide an optimal solution for a
+particular class of static search sets.  A minimal perfect hash
+function is defined by two properties:
+
+</P>
+
+<UL>
+<LI>
+
+It allows keyword recognition in a static search set using at most
+<EM>one</EM> probe into the hash table.  This represents the “perfect”
+property.
+<LI>
+
+The actual memory allocated to store the keywords is precisely large
+enough for the keyword set, and <EM>no larger</EM>.  This is the
+“minimal” property.
+</UL>
+
+<P>
+For most applications it is far easier to generate <EM>perfect</EM> hash
+functions than <EM>minimal perfect</EM> hash functions.  Moreover,
+non-minimal perfect hash functions frequently execute faster than
+minimal ones in practice.  This phenomena occurs since searching a
+sparse keyword table increases the probability of locating a “null”
+entry, thereby reducing string comparisons.  <CODE>gperf</CODE>'s default
+behavior generates <EM>near-minimal</EM> perfect hash functions for
+keyword sets.  However, <CODE>gperf</CODE> provides many options that permit
+user control over the degree of minimality and perfection.
+
+</P>
+<P>
+Static search sets often exhibit relative stability over time.  For
+example, Ada's 63 reserved words have remained constant for nearly a
+decade.  It is therefore frequently worthwhile to expend concerted
+effort building an optimal search structure <EM>once</EM>, if it
+subsequently receives heavy use multiple times.  <CODE>gperf</CODE> removes
+the drudgery associated with constructing time- and space-efficient
+search structures by hand.  It has proven a useful and practical tool
+for serious programming projects.  Output from <CODE>gperf</CODE> is currently
+used in several production and research compilers, including GNU C, GNU
+C++, GNU Java, GNU Pascal, and GNU Modula 3.  The latter two compilers are
+not yet part of the official GNU distribution.  Each compiler utilizes
+<CODE>gperf</CODE> to automatically generate static search structures that
+efficiently identify their respective reserved keywords.
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_3.html">previous</A>, <A HREF="gperf_5.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_5.html b/doc/gperf_5.html
new file mode 100644 (file)
index 0000000..7bc830f
--- /dev/null
@@ -0,0 +1,720 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 4  High-Level Description of GNU gperf</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_4.html">previous</A>, <A HREF="gperf_6.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC5" HREF="gperf_toc.html#TOC5">4  High-Level Description of GNU <CODE>gperf</CODE></A></H1>
+
+<P>
+The perfect hash function generator <CODE>gperf</CODE> reads a set of
+“keywords” from an input file (or from the standard input by
+default).  It attempts to derive a perfect hashing function that
+recognizes a member of the <EM>static keyword set</EM> with at most a
+single probe into the lookup table.  If <CODE>gperf</CODE> succeeds in
+generating such a function it produces a pair of C source code routines
+that perform hashing and table lookup recognition.  All generated C code
+is directed to the standard output.  Command-line options described
+below allow you to modify the input and output format to <CODE>gperf</CODE>.
+
+</P>
+<P>
+By default, <CODE>gperf</CODE> attempts to produce time-efficient code, with
+less emphasis on efficient space utilization.  However, several options
+exist that permit trading-off execution time for storage space and vice
+versa.  In particular, expanding the generated table size produces a
+sparse search structure, generally yielding faster searches.
+Conversely, you can direct <CODE>gperf</CODE> to utilize a C <CODE>switch</CODE>
+statement scheme that minimizes data space storage size.  Furthermore,
+using a C <CODE>switch</CODE> may actually speed up the keyword retrieval time
+somewhat.  Actual results depend on your C compiler, of course.
+
+</P>
+<P>
+In general, <CODE>gperf</CODE> assigns values to the bytes it is using
+for hashing until some set of values gives each keyword a unique value.
+A helpful heuristic is that the larger the hash value range, the easier
+it is for <CODE>gperf</CODE> to find and generate a perfect hash function.
+Experimentation is the key to getting the most from <CODE>gperf</CODE>.
+
+</P>
+
+
+<H2><A NAME="SEC6" HREF="gperf_toc.html#TOC6">4.1  Input Format to <CODE>gperf</CODE></A></H2>
+<P>
+<A NAME="IDX4"></A>
+<A NAME="IDX5"></A>
+<A NAME="IDX6"></A>
+<A NAME="IDX7"></A>
+You can control the input file format by varying certain command-line
+arguments, in particular the <SAMP>&lsquo;-t&rsquo;</SAMP> option.  The input's appearance
+is similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE> (or UNIX
+utilities <CODE>lex</CODE> and <CODE>yacc</CODE>).  Here's an outline of the general
+format:
+
+</P>
+
+<PRE>
+declarations
+%%
+keywords
+%%
+functions
+</PRE>
+
+<P>
+<EM>Unlike</EM> <CODE>flex</CODE> or <CODE>bison</CODE>, the declarations section and
+the functions section are optional.  The following sections describe the
+input format for each section.
+
+</P>
+
+<P>
+It is possible to omit the declaration section entirely, if the <SAMP>&lsquo;-t&rsquo;</SAMP>
+option is not given.  In this case the input file begins directly with the
+first keyword line, e.g.:
+
+</P>
+
+<PRE>
+january
+february
+march
+april
+...
+</PRE>
+
+
+
+<H3><A NAME="SEC7" HREF="gperf_toc.html#TOC7">4.1.1  Declarations</A></H3>
+
+<P>
+The keyword input file optionally contains a section for including
+arbitrary C declarations and definitions, <CODE>gperf</CODE> declarations that
+act like command-line options, as well as for providing a user-supplied
+<CODE>struct</CODE>.
+
+</P>
+
+
+
+<H4><A NAME="SEC8" HREF="gperf_toc.html#TOC8">4.1.1.1  User-supplied <CODE>struct</CODE></A></H4>
+
+<P>
+If the <SAMP>&lsquo;-t&rsquo;</SAMP> option (or, equivalently, the <SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration)
+<EM>is</EM> enabled, you <EM>must</EM> provide a C <CODE>struct</CODE> as the last
+component in the declaration section from the input file.  The first
+field in this struct must be of type <CODE>char *</CODE> or <CODE>const char *</CODE>
+if the <SAMP>&lsquo;-P&rsquo;</SAMP> option is not given, or of type <CODE>int</CODE> if the option
+<SAMP>&lsquo;-P&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%pic&rsquo;</SAMP> declaration) is enabled.
+This first field must be called <SAMP>&lsquo;name&rsquo;</SAMP>, although it is possible to modify
+its name with the <SAMP>&lsquo;-K&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%define slot-name&rsquo;</SAMP> declaration) described below.
+
+</P>
+<P>
+Here is a simple example, using months of the year and their attributes as
+input:
+
+</P>
+
+<PRE>
+struct month { char *name; int number; int days; int leap_days; };
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+april,     4, 30, 30
+may,       5, 31, 31
+june,      6, 30, 30
+july,      7, 31, 31
+august,    8, 31, 31
+september, 9, 30, 30
+october,  10, 31, 31
+november, 11, 30, 30
+december, 12, 31, 31
+</PRE>
+
+<P>
+<A NAME="IDX8"></A>
+Separating the <CODE>struct</CODE> declaration from the list of keywords and
+other fields are a pair of consecutive percent signs, <SAMP>&lsquo;%%&rsquo;</SAMP>,
+appearing left justified in the first column, as in the UNIX utility
+<CODE>lex</CODE>.
+
+</P>
+<P>
+If the <CODE>struct</CODE> has already been declared in an include file, it can
+be mentioned in an abbreviated form, like this:
+
+</P>
+
+<PRE>
+struct month;
+%%
+january,   1, 31, 31
+...
+</PRE>
+
+
+
+<H4><A NAME="SEC9" HREF="gperf_toc.html#TOC9">4.1.1.2  Gperf Declarations</A></H4>
+
+<P>
+The declaration section can contain <CODE>gperf</CODE> declarations.  They
+influence the way <CODE>gperf</CODE> works, like command line options do.
+In fact, every such declaration is equivalent to a command line option.
+There are three forms of declarations:
+
+</P>
+
+<OL>
+<LI>
+
+Declarations without argument, like <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>.
+
+<LI>
+
+Declarations with an argument, like <SAMP>&lsquo;%switch=<VAR>count</VAR>&rsquo;</SAMP>.
+
+<LI>
+
+Declarations of names of entities in the output file, like
+<SAMP>&lsquo;%define lookup-function-name <VAR>name</VAR>&rsquo;</SAMP>.
+</OL>
+
+<P>
+When a declaration is given both in the input file and as a command line
+option, the command-line option's value prevails.
+
+</P>
+<P>
+The following <CODE>gperf</CODE> declarations are available.
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;%delimiters=<VAR>delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX9"></A>
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.
+
+<DT><SAMP>&lsquo;%struct-type&rsquo;</SAMP>
+<DD>
+<A NAME="IDX10"></A>
+Allows you to include a <CODE>struct</CODE> type declaration for generated
+code; see above for an example.
+
+<DT><SAMP>&lsquo;%ignore-case&rsquo;</SAMP>
+<DD>
+<A NAME="IDX11"></A>
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.
+
+<DT><SAMP>&lsquo;%language=<VAR>language-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX12"></A>
+Instructs <CODE>gperf</CODE> to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;KR-C&rsquo;</SAMP>
+<DD>
+Old-style K&#38;R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking <SAMP>&lsquo;const&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;C&rsquo;</SAMP>
+<DD>
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you <CODE>#define const</CODE> to empty
+for compilers which don't know about this keyword.
+
+<DT><SAMP>&lsquo;ANSI-C&rsquo;</SAMP>
+<DD>
+ANSI C.  This language is understood by ANSI C (C89, ISO C90) compilers,
+ISO C99 compilers, and C++ compilers.
+
+<DT><SAMP>&lsquo;C++&rsquo;</SAMP>
+<DD>
+C++.  This language is understood by C++ compilers.
+</DL>
+
+The default is C.
+
+<DT><SAMP>&lsquo;%define slot-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX13"></A>
+This declaration is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is <SAMP>&lsquo;name&rsquo;</SAMP>.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;%define initializer-suffix <VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX14"></A>
+This declaration is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+It permits to specify initializers for the structure members following
+<VAR>slot-name</VAR> in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following <VAR>slot-name</VAR>.
+
+<DT><SAMP>&lsquo;%define hash-function-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX15"></A>
+Allows you to specify the name for the generated hash function.  Default
+name is <SAMP>&lsquo;hash&rsquo;</SAMP>.  This option permits the use of two hash tables in
+the same file.
+
+<DT><SAMP>&lsquo;%define lookup-function-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX16"></A>
+Allows you to specify the name for the generated lookup function.
+Default name is <SAMP>&lsquo;in_word_set&rsquo;</SAMP>.  This option permits multiple
+generated hash functions to be used in the same application.
+
+<DT><SAMP>&lsquo;%define class-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX17"></A>
+This option is only useful when option <SAMP>&lsquo;-L C++&rsquo;</SAMP> (or, equivalently,
+the <SAMP>&lsquo;%language=C++&rsquo;</SAMP> declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+<CODE>Perfect_Hash</CODE>.
+
+<DT><SAMP>&lsquo;%7bit&rsquo;</SAMP>
+<DD>
+<A NAME="IDX18"></A>
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions <CODE>isalnum</CODE> and <CODE>isgraph</CODE> do
+<EM>not</EM> guarantee that a byte is in this range.  Only an explicit
+test like <SAMP>&lsquo;c &#62;= 'A' &#38;&#38; c &#60;= 'Z'&rsquo;</SAMP> guarantees this.)
+
+<DT><SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>
+<DD>
+<A NAME="IDX19"></A>
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (see section <A HREF="gperf_5.html#SEC15">4.3  Use of NUL bytes</A>).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via <CODE>strcmp</CODE>.
+However, using <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP> might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option <SAMP>&lsquo;-S&rsquo;</SAMP> or <SAMP>&lsquo;%switch&rsquo;</SAMP> is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+<DT><SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+<DD>
+<A NAME="IDX20"></A>
+Generates C code that uses the <CODE>strncmp</CODE> function to perform
+string comparisons.  The default action is to use <CODE>strcmp</CODE>.
+
+<DT><SAMP>&lsquo;%readonly-tables&rsquo;</SAMP>
+<DD>
+<A NAME="IDX21"></A>
+Makes the contents of all generated lookup tables constant, i.e.,
+“readonly”.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+<DT><SAMP>&lsquo;%enum&rsquo;</SAMP>
+<DD>
+<A NAME="IDX22"></A>
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark <CODE>&#60;jjc@ai.mit.edu&#62;</CODE>.
+
+<DT><SAMP>&lsquo;%includes&rsquo;</SAMP>
+<DD>
+<A NAME="IDX23"></A>
+Include the necessary system include file, <CODE>&#60;string.h&#62;</CODE>, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+<DT><SAMP>&lsquo;%global-table&rsquo;</SAMP>
+<DD>
+<A NAME="IDX24"></A>
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+<DT><SAMP>&lsquo;%pic&rsquo;</SAMP>
+<DD>
+<A NAME="IDX25"></A>
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the <SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration (or,
+equivalently, the option <SAMP>&lsquo;-t&rsquo;</SAMP>) is also given, the first field of the
+user-defined struct must be of type <SAMP>&lsquo;int&rsquo;</SAMP>, not <SAMP>&lsquo;char *&rsquo;</SAMP>, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+<SAMP>&lsquo;stringpool + <VAR>o</VAR>&rsquo;</SAMP>, where <VAR>o</VAR> is the offset.  The string pool
+name can be changed through the <SAMP>&lsquo;%define string-pool-name&rsquo;</SAMP> declaration.
+
+<DT><SAMP>&lsquo;%define string-pool-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX26"></A>
+Allows you to specify the name of the generated string pool created by
+the declaration <SAMP>&lsquo;%pic&rsquo;</SAMP> (or, equivalently, the option <SAMP>&lsquo;-P&rsquo;</SAMP>).
+The default name is <SAMP>&lsquo;stringpool&rsquo;</SAMP>.  This declaration permits the use of
+two hash tables in the same file, with <SAMP>&lsquo;%pic&rsquo;</SAMP> and even when the
+<SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration (or, equivalently, the option <SAMP>&lsquo;-G&rsquo;</SAMP>)
+is given.
+
+<DT><SAMP>&lsquo;%null-strings&rsquo;</SAMP>
+<DD>
+<A NAME="IDX27"></A>
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as the declaration <SAMP>&lsquo;%pic&rsquo;</SAMP>), at the
+expense of one more test-and-branch instruction at run time.
+
+<DT><SAMP>&lsquo;%define word-array-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX28"></A>
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is <SAMP>&lsquo;wordlist&rsquo;</SAMP>.  This option permits the
+use of two hash tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;%define length-table-name <VAR>name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX29"></A>
+Allows you to specify the name for the generated array containing the
+length table.  Default name is <SAMP>&lsquo;lengthtable&rsquo;</SAMP>.  This option permits the
+use of two length tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;%switch=<VAR>count</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX30"></A>
+Causes the generated C code to use a <CODE>switch</CODE> statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many <CODE>switch</CODE> statements are generated.  A
+value of 1 generates 1 <CODE>switch</CODE> containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+<CODE>switch</CODE>, etc.  This is useful since many C compilers cannot
+correctly generate code for large <CODE>switch</CODE> statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+<DT><SAMP>&lsquo;%omit-struct-type&rsquo;</SAMP>
+<DD>
+<A NAME="IDX31"></A>
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+</DL>
+
+
+
+<H4><A NAME="SEC10" HREF="gperf_toc.html#TOC10">4.1.1.3  C Code Inclusion</A></H4>
+
+<P>
+<A NAME="IDX32"></A>
+<A NAME="IDX33"></A>
+Using a syntax similar to GNU utilities <CODE>flex</CODE> and <CODE>bison</CODE>, it
+is possible to directly include C source text and comments verbatim into
+the generated output file.  This is accomplished by enclosing the region
+inside left-justified surrounding <SAMP>&lsquo;%{&rsquo;</SAMP>, <SAMP>&lsquo;%}&rsquo;</SAMP> pairs.  Here is
+an input fragment based on the previous example that illustrates this
+feature:
+
+</P>
+
+<PRE>
+%{
+#include &#60;assert.h&#62;
+/* This section of code is inserted directly into the output. */
+int return_month_days (struct month *months, int is_leap_year);
+%}
+struct month { char *name; int number; int days; int leap_days; };
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+...
+</PRE>
+
+
+
+<H3><A NAME="SEC11" HREF="gperf_toc.html#TOC11">4.1.2  Format for Keyword Entries</A></H3>
+
+<P>
+The second input file format section contains lines of keywords and any
+associated attributes you might supply.  A line beginning with <SAMP>&lsquo;#&rsquo;</SAMP>
+in the first column is considered a comment.  Everything following the
+<SAMP>&lsquo;#&rsquo;</SAMP> is ignored, up to and including the following newline.  A line
+beginning with <SAMP>&lsquo;%&rsquo;</SAMP> in the first column is an option declaration and
+must not occur within the keywords section.
+
+</P>
+<P>
+The first field of each non-comment line is always the keyword itself.  It
+can be given in two ways: as a simple name, i.e., without surrounding
+string quotation marks, or as a string enclosed in double-quotes, in
+C syntax, possibly with backslash escapes like <CODE>\"</CODE> or <CODE>\234</CODE>
+or <CODE>\xa8</CODE>.  In either case, it must start right at the beginning
+of the line, without leading whitespace.
+In this context, a “field” is considered to extend up to, but
+not include, the first blank, comma, or newline.  Here is a simple
+example taken from a partial list of C reserved words:
+
+</P>
+
+<PRE>
+# These are a few C reserved words, see the c.gperf file 
+# for a complete list of ANSI C reserved words.
+unsigned
+sizeof
+switch
+signed
+if
+default
+for
+while
+return
+</PRE>
+
+<P>
+Note that unlike <CODE>flex</CODE> or <CODE>bison</CODE> the first <SAMP>&lsquo;%%&rsquo;</SAMP> marker
+may be elided if the declaration section is empty.
+
+</P>
+<P>
+Additional fields may optionally follow the leading keyword.  Fields
+should be separated by commas, and terminate at the end of line.  What
+these fields mean is entirely up to you; they are used to initialize the
+elements of the user-defined <CODE>struct</CODE> provided by you in the
+declaration section.  If the <SAMP>&lsquo;-t&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) is <EM>not</EM> enabled
+these fields are simply ignored.  All previous examples except the last
+one contain keyword attributes.
+
+</P>
+
+
+<H3><A NAME="SEC12" HREF="gperf_toc.html#TOC12">4.1.3  Including Additional C Functions</A></H3>
+
+<P>
+The optional third section also corresponds closely with conventions
+found in <CODE>flex</CODE> and <CODE>bison</CODE>.  All text in this section,
+starting at the final <SAMP>&lsquo;%%&rsquo;</SAMP> and extending to the end of the input
+file, is included verbatim into the generated output file.  Naturally,
+it is your responsibility to ensure that the code contained in this
+section is valid C.
+
+</P>
+
+
+<H3><A NAME="SEC13" HREF="gperf_toc.html#TOC13">4.1.4  Where to place directives for GNU <CODE>indent</CODE>.</A></H3>
+
+<P>
+If you want to invoke GNU <CODE>indent</CODE> on a <CODE>gperf</CODE> input file,
+you will see that GNU <CODE>indent</CODE> doesn't understand the <SAMP>&lsquo;%%&rsquo;</SAMP>,
+<SAMP>&lsquo;%{&rsquo;</SAMP> and <SAMP>&lsquo;%}&rsquo;</SAMP> directives that control <CODE>gperf</CODE>'s
+interpretation of the input file.  Therefore you have to insert some
+directives for GNU <CODE>indent</CODE>.  More precisely, assuming the most
+general input file structure
+
+</P>
+
+<PRE>
+declarations part 1
+%{
+verbatim code
+%}
+declarations part 2
+%%
+keywords
+%%
+functions
+</PRE>
+
+<P>
+you would insert <SAMP>&lsquo;*INDENT-OFF*&rsquo;</SAMP> and <SAMP>&lsquo;*INDENT-ON*&rsquo;</SAMP> comments
+as follows:
+
+</P>
+
+<PRE>
+/* *INDENT-OFF* */
+declarations part 1
+%{
+/* *INDENT-ON* */
+verbatim code
+/* *INDENT-OFF* */
+%}
+declarations part 2
+%%
+keywords
+%%
+/* *INDENT-ON* */
+functions
+</PRE>
+
+
+
+<H2><A NAME="SEC14" HREF="gperf_toc.html#TOC14">4.2  Output Format for Generated C Code with <CODE>gperf</CODE></A></H2>
+<P>
+<A NAME="IDX34"></A>
+
+</P>
+<P>
+Several options control how the generated C code appears on the standard 
+output.  Two C functions are generated.  They are called <CODE>hash</CODE> and 
+<CODE>in_word_set</CODE>, although you may modify their names with a command-line 
+option.  Both functions require two arguments, a string, <CODE>char *</CODE> 
+<VAR>str</VAR>, and a length parameter, <CODE>int</CODE> <VAR>len</VAR>.  Their default 
+function prototypes are as follows:
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> unsigned int <B>hash</B> <I>(const char * <VAR>str</VAR>, unsigned int <VAR>len</VAR>)</I>
+<DD><A NAME="IDX35"></A>
+By default, the generated <CODE>hash</CODE> function returns an integer value
+created by adding <VAR>len</VAR> to several user-specified <VAR>str</VAR> byte
+positions indexed into an <EM>associated values</EM> table stored in a
+local static array.  The associated values table is constructed
+internally by <CODE>gperf</CODE> and later output as a static local C array
+called <SAMP>&lsquo;hash_table&rsquo;</SAMP>.  The relevant selected positions (i.e. indices
+into <VAR>str</VAR>) are specified via the <SAMP>&lsquo;-k&rsquo;</SAMP> option when running
+<CODE>gperf</CODE>, as detailed in the <EM>Options</EM> section below (see section <A HREF="gperf_6.html#SEC17">5  Invoking <CODE>gperf</CODE></A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U>  <B>in_word_set</B> <I>(const char * <VAR>str</VAR>, unsigned int <VAR>len</VAR>)</I>
+<DD><A NAME="IDX36"></A>
+If <VAR>str</VAR> is in the keyword set, returns a pointer to that
+keyword.  More exactly, if the option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) was given, it returns
+a pointer to the matching keyword's structure.  Otherwise it returns
+<CODE>NULL</CODE>.
+</DL>
+
+</P>
+<P>
+If the option <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+declaration) is not used, <VAR>str</VAR> must be a NUL terminated
+string of exactly length <VAR>len</VAR>.  If <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP> declaration) is used, <VAR>str</VAR> must
+simply be an array of <VAR>len</VAR> bytes and does not need to be NUL
+terminated.
+
+</P>
+<P>
+The code generated for these two functions is affected by the following
+options:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-t&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--struct-type&rsquo;</SAMP>
+<DD>
+Make use of the user-defined <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;-S <VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--switch=<VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX37"></A>
+Generate 1 or more C <CODE>switch</CODE> statement rather than use a large,
+(and potentially sparse) static array.  Although the exact time and
+space savings of this approach vary according to your C compiler's
+degree of optimization, this method often results in smaller and faster
+code.
+</DL>
+
+<P>
+If the <SAMP>&lsquo;-t&rsquo;</SAMP> and <SAMP>&lsquo;-S&rsquo;</SAMP> options (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> and <SAMP>&lsquo;%switch&rsquo;</SAMP> declarations) are omitted, the default
+action
+is to generate a <CODE>char *</CODE> array containing the keywords, together with
+additional empty strings used for padding the array.  By experimenting
+with the various input and output options, and timing the resulting C
+code, you can determine the best option choices for different keyword
+set characteristics.
+
+</P>
+
+
+<H2><A NAME="SEC15" HREF="gperf_toc.html#TOC15">4.3  Use of NUL bytes</A></H2>
+<P>
+<A NAME="IDX38"></A>
+
+</P>
+<P>
+By default, the code generated by <CODE>gperf</CODE> operates on zero
+terminated strings, the usual representation of strings in C.  This means
+that the keywords in the input file must not contain NUL bytes,
+and the <VAR>str</VAR> argument passed to <CODE>hash</CODE> or <CODE>in_word_set</CODE>
+must be NUL terminated and have exactly length <VAR>len</VAR>.
+
+</P>
+<P>
+If option <SAMP>&lsquo;-c&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP>
+declaration) is used, then the <VAR>str</VAR> argument does not need
+to be NUL terminated.  The code generated by <CODE>gperf</CODE> will only
+access the first <VAR>len</VAR>, not <VAR>len+1</VAR>, bytes starting at <VAR>str</VAR>.
+However, the keywords in the input file still must not contain NUL
+bytes.
+
+</P>
+<P>
+If option <SAMP>&lsquo;-l&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%compare-lengths&rsquo;</SAMP>
+declaration) is used, then the hash table performs binary
+comparison.  The keywords in the input file may contain NUL bytes,
+written in string syntax as <CODE>\000</CODE> or <CODE>\x00</CODE>, and the code
+generated by <CODE>gperf</CODE> will treat NUL like any other byte.
+Also, in this case the <SAMP>&lsquo;-c&rsquo;</SAMP> option (or, equivalently, the
+<SAMP>&lsquo;%compare-strncmp&rsquo;</SAMP> declaration) is ignored.
+
+</P>
+
+
+<H2><A NAME="SEC16" HREF="gperf_toc.html#TOC16">4.4  The Copyright of the Output</A></H2>
+<P>
+<A NAME="IDX39"></A>
+
+</P>
+<P>
+<CODE>gperf</CODE> is under GPL, but that does not cause the output produced
+by <CODE>gperf</CODE> to be under GPL.  The reason is that the output contains
+only small pieces of text that come directly from <CODE>gperf</CODE>'s source
+code -- only about 7 lines long, too small for being significant --, and
+therefore the output is not a “work based on <CODE>gperf</CODE>” (in the
+sense of the GPL version 3).
+
+</P>
+<P>
+On the other hand, the output produced by <CODE>gperf</CODE> contains
+essentially all of the input file.  Therefore the output is a
+“derivative work” of the input (in the sense of U.S. copyright law);
+and its copyright status depends on the copyright of the input.  For most
+software licenses, the result is that the the output is under the same
+license, with the same copyright holder, as the input that was passed to
+<CODE>gperf</CODE>.
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_4.html">previous</A>, <A HREF="gperf_6.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_6.html b/doc/gperf_6.html
new file mode 100644 (file)
index 0000000..d575e87
--- /dev/null
@@ -0,0 +1,502 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 5  Invoking gperf</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_5.html">previous</A>, <A HREF="gperf_7.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC17" HREF="gperf_toc.html#TOC17">5  Invoking <CODE>gperf</CODE></A></H1>
+
+<P>
+There are <EM>many</EM> options to <CODE>gperf</CODE>.  They were added to make
+the program more convenient for use with real applications.  “On-line”
+help is readily available via the <SAMP>&lsquo;--help&rsquo;</SAMP> option.  Here is the
+complete list of options.
+
+</P>
+
+
+
+<H2><A NAME="SEC18" HREF="gperf_toc.html#TOC18">5.1  Specifying the Location of the Output File</A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;--output-file=<VAR>file</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name of the file to which the output is written to.
+</DL>
+
+<P>
+The results are written to standard output if no output file is specified
+or if it is <SAMP>&lsquo;-&rsquo;</SAMP>.
+
+</P>
+
+
+<H2><A NAME="SEC19" HREF="gperf_toc.html#TOC19">5.2  Options that affect Interpretation of the Input File</A></H2>
+
+<P>
+These options are also available as declarations in the input file
+(see section <A HREF="gperf_5.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-e <VAR>keyword-delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--delimiters=<VAR>keyword-delimiter-list</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX40"></A>
+Allows you to provide a string containing delimiters used to
+separate keywords from their attributes.  The default is ",".  This
+option is essential if you want to use keywords that have embedded
+commas or newlines.  One useful trick is to use -e'TAB', where TAB is
+the literal tab character.
+
+<DT><SAMP>&lsquo;-t&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--struct-type&rsquo;</SAMP>
+<DD>
+Allows you to include a <CODE>struct</CODE> type declaration for generated
+code.  Any text before a pair of consecutive <SAMP>&lsquo;%%&rsquo;</SAMP> is considered
+part of the type declaration.  Keywords and additional fields may follow
+this, one group of fields per line.  A set of examples for generating
+perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2,
+Modula 3 and JavaScript reserved words are distributed with this release.
+
+<DT><SAMP>&lsquo;--ignore-case&rsquo;</SAMP>
+<DD>
+Consider upper and lower case ASCII characters as equivalent.  The string
+comparison will use a case insignificant character comparison.  Note that
+locale dependent case mappings are ignored.  This option is therefore not
+suitable if a properly internationalized or locale aware case mapping
+should be used.  (For example, in a Turkish locale, the upper case equivalent
+of the lowercase ASCII letter <SAMP>&lsquo;i&rsquo;</SAMP> is the non-ASCII character
+<SAMP>&lsquo;capital i with dot above&rsquo;</SAMP>.)  For this case, it is better to apply
+an uppercase or lowercase conversion on the string before passing it to
+the <CODE>gperf</CODE> generated function.
+</DL>
+
+
+
+<H2><A NAME="SEC20" HREF="gperf_toc.html#TOC20">5.3  Options to specify the Language for the Output Code</A></H2>
+
+<P>
+These options are also available as declarations in the input file
+(see section <A HREF="gperf_5.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-L <VAR>generated-language-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--language=<VAR>generated-language-name</VAR>&rsquo;</SAMP>
+<DD>
+Instructs <CODE>gperf</CODE> to generate code in the language specified by the
+option's argument.  Languages handled are currently:
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;KR-C&rsquo;</SAMP>
+<DD>
+Old-style K&#38;R C.  This language is understood by old-style C compilers and
+ANSI C compilers, but ANSI C compilers may flag warnings (or even errors)
+because of lacking <SAMP>&lsquo;const&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;C&rsquo;</SAMP>
+<DD>
+Common C.  This language is understood by ANSI C compilers, and also by
+old-style C compilers, provided that you <CODE>#define const</CODE> to empty
+for compilers which don't know about this keyword.
+
+<DT><SAMP>&lsquo;ANSI-C&rsquo;</SAMP>
+<DD>
+ANSI C.  This language is understood by ANSI C compilers and C++ compilers.
+
+<DT><SAMP>&lsquo;C++&rsquo;</SAMP>
+<DD>
+C++.  This language is understood by C++ compilers.
+</DL>
+
+The default is C.
+
+<DT><SAMP>&lsquo;-a&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+
+<DT><SAMP>&lsquo;-g&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+</DL>
+
+
+
+<H2><A NAME="SEC21" HREF="gperf_toc.html#TOC21">5.4  Options for fine tuning Details in the Output Code</A></H2>
+
+<P>
+Most of these options are also available as declarations in the input file
+(see section <A HREF="gperf_5.html#SEC9">4.1.1.2  Gperf Declarations</A>).
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-K <VAR>slot-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--slot-name=<VAR>slot-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX41"></A>
+This option is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+By default, the program assumes the structure component identifier for
+the keyword is <SAMP>&lsquo;name&rsquo;</SAMP>.  This option allows an arbitrary choice of
+identifier for this component, although it still must occur as the first
+field in your supplied <CODE>struct</CODE>.
+
+<DT><SAMP>&lsquo;-F <VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--initializer-suffix=<VAR>initializers</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX42"></A>
+This option is only useful when option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) has been given.
+It permits to specify initializers for the structure members following
+<VAR>slot-name</VAR> in empty hash table entries.  The list of initializers
+should start with a comma.  By default, the emitted code will
+zero-initialize structure members following <VAR>slot-name</VAR>.
+
+<DT><SAMP>&lsquo;-H <VAR>hash-function-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--hash-function-name=<VAR>hash-function-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name for the generated hash function.  Default
+name is <SAMP>&lsquo;hash&rsquo;</SAMP>.  This option permits the use of two hash tables in
+the same file.
+
+<DT><SAMP>&lsquo;-N <VAR>lookup-function-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--lookup-function-name=<VAR>lookup-function-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name for the generated lookup function.
+Default name is <SAMP>&lsquo;in_word_set&rsquo;</SAMP>.  This option permits multiple
+generated hash functions to be used in the same application.
+
+<DT><SAMP>&lsquo;-Z <VAR>class-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--class-name=<VAR>class-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX43"></A>
+This option is only useful when option <SAMP>&lsquo;-L C++&rsquo;</SAMP> (or, equivalently,
+the <SAMP>&lsquo;%language=C++&rsquo;</SAMP> declaration) has been given.  It
+allows you to specify the name of generated C++ class.  Default name is
+<CODE>Perfect_Hash</CODE>.
+
+<DT><SAMP>&lsquo;-7&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--seven-bit&rsquo;</SAMP>
+<DD>
+This option specifies that all strings that will be passed as arguments
+to the generated hash function and the generated lookup function will
+solely consist of 7-bit ASCII characters (bytes in the range 0..127).
+(Note that the ANSI C functions <CODE>isalnum</CODE> and <CODE>isgraph</CODE> do
+<EM>not</EM> guarantee that a byte is in this range.  Only an explicit
+test like <SAMP>&lsquo;c &#62;= 'A' &#38;&#38; c &#60;= 'Z'&rsquo;</SAMP> guarantees this.) This was the
+default in versions of <CODE>gperf</CODE> earlier than 2.7; now the default is
+to support 8-bit and multibyte characters.
+
+<DT><SAMP>&lsquo;-l&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--compare-lengths&rsquo;</SAMP>
+<DD>
+Compare keyword lengths before trying a string comparison.  This option
+is mandatory for binary comparisons (see section <A HREF="gperf_5.html#SEC15">4.3  Use of NUL bytes</A>).  It also might
+cut down on the number of string comparisons made during the lookup, since
+keywords with different lengths are never compared via <CODE>strcmp</CODE>.
+However, using <SAMP>&lsquo;-l&rsquo;</SAMP> might greatly increase the size of the
+generated C code if the lookup table range is large (which implies that
+the switch option <SAMP>&lsquo;-S&rsquo;</SAMP> or <SAMP>&lsquo;%switch&rsquo;</SAMP> is not enabled), since the length
+table contains as many elements as there are entries in the lookup table.
+
+<DT><SAMP>&lsquo;-c&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--compare-strncmp&rsquo;</SAMP>
+<DD>
+Generates C code that uses the <CODE>strncmp</CODE> function to perform
+string comparisons.  The default action is to use <CODE>strcmp</CODE>.
+
+<DT><SAMP>&lsquo;-C&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--readonly-tables&rsquo;</SAMP>
+<DD>
+Makes the contents of all generated lookup tables constant, i.e.,
+“readonly”.  Many compilers can generate more efficient code for this
+by putting the tables in readonly memory.
+
+<DT><SAMP>&lsquo;-E&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--enum&rsquo;</SAMP>
+<DD>
+Define constant values using an enum local to the lookup function rather
+than with #defines.  This also means that different lookup functions can
+reside in the same file.  Thanks to James Clark <CODE>&#60;jjc@ai.mit.edu&#62;</CODE>.
+
+<DT><SAMP>&lsquo;-I&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--includes&rsquo;</SAMP>
+<DD>
+Include the necessary system include file, <CODE>&#60;string.h&#62;</CODE>, at the
+beginning of the code.  By default, this is not done; the user must
+include this header file himself to allow compilation of the code.
+
+<DT><SAMP>&lsquo;-G&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--global-table&rsquo;</SAMP>
+<DD>
+Generate the static table of keywords as a static global variable,
+rather than hiding it inside of the lookup function (which is the
+default behavior).
+
+<DT><SAMP>&lsquo;-P&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--pic&rsquo;</SAMP>
+<DD>
+Optimize the generated table for inclusion in shared libraries.  This
+reduces the startup time of programs using a shared library containing
+the generated code.  If the option <SAMP>&lsquo;-t&rsquo;</SAMP> (or, equivalently, the
+<SAMP>&lsquo;%struct-type&rsquo;</SAMP> declaration) is also given, the first field of the
+user-defined struct must be of type <SAMP>&lsquo;int&rsquo;</SAMP>, not <SAMP>&lsquo;char *&rsquo;</SAMP>, because
+it will contain offsets into the string pool instead of actual strings.
+To convert such an offset to a string, you can use the expression
+<SAMP>&lsquo;stringpool + <VAR>o</VAR>&rsquo;</SAMP>, where <VAR>o</VAR> is the offset.  The string pool
+name can be changed through the option <SAMP>&lsquo;--string-pool-name&rsquo;</SAMP>.
+
+<DT><SAMP>&lsquo;-Q <VAR>string-pool-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--string-pool-name=<VAR>string-pool-name</VAR>&rsquo;</SAMP>
+<DD>
+Allows you to specify the name of the generated string pool created by
+option <SAMP>&lsquo;-P&rsquo;</SAMP>.  The default name is <SAMP>&lsquo;stringpool&rsquo;</SAMP>.  This option
+permits the use of two hash tables in the same file, with <SAMP>&lsquo;-P&rsquo;</SAMP> and
+even when the option <SAMP>&lsquo;-G&rsquo;</SAMP> (or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP>
+declaration) is given.
+
+<DT><SAMP>&lsquo;--null-strings&rsquo;</SAMP>
+<DD>
+Use NULL strings instead of empty strings for empty keyword table entries.
+This reduces the startup time of programs using a shared library containing
+the generated code (but not as much as option <SAMP>&lsquo;-P&rsquo;</SAMP>), at the expense
+of one more test-and-branch instruction at run time.
+
+<DT><SAMP>&lsquo;-W <VAR>hash-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--word-array-name=<VAR>hash-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX44"></A>
+Allows you to specify the name for the generated array containing the
+hash table.  Default name is <SAMP>&lsquo;wordlist&rsquo;</SAMP>.  This option permits the
+use of two hash tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;--length-table-name=<VAR>length-table-array-name</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX45"></A>
+Allows you to specify the name for the generated array containing the
+length table.  Default name is <SAMP>&lsquo;lengthtable&rsquo;</SAMP>.  This option permits the
+use of two length tables in the same file, even when the option <SAMP>&lsquo;-G&rsquo;</SAMP>
+(or, equivalently, the <SAMP>&lsquo;%global-table&rsquo;</SAMP> declaration) is given.
+
+<DT><SAMP>&lsquo;-S <VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--switch=<VAR>total-switch-statements</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX46"></A>
+Causes the generated C code to use a <CODE>switch</CODE> statement scheme,
+rather than an array lookup table.  This can lead to a reduction in both
+time and space requirements for some input files.  The argument to this
+option determines how many <CODE>switch</CODE> statements are generated.  A
+value of 1 generates 1 <CODE>switch</CODE> containing all the elements, a
+value of 2 generates 2 tables with 1/2 the elements in each
+<CODE>switch</CODE>, etc.  This is useful since many C compilers cannot
+correctly generate code for large <CODE>switch</CODE> statements.  This option
+was inspired in part by Keith Bostic's original C program.
+
+<DT><SAMP>&lsquo;-T&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--omit-struct-type&rsquo;</SAMP>
+<DD>
+Prevents the transfer of the type declaration to the output file.  Use
+this option if the type is already defined elsewhere.
+
+<DT><SAMP>&lsquo;-p&rsquo;</SAMP>
+<DD>
+This option is supported for compatibility with previous releases of
+<CODE>gperf</CODE>.  It does not do anything.
+</DL>
+
+
+
+<H2><A NAME="SEC22" HREF="gperf_toc.html#TOC22">5.5  Options for changing the Algorithms employed by <CODE>gperf</CODE></A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-k <VAR>selected-byte-positions</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--key-positions=<VAR>selected-byte-positions</VAR>&rsquo;</SAMP>
+<DD>
+Allows selection of the byte positions used in the keywords'
+hash function.  The allowable choices range between 1-255, inclusive.
+The positions are separated by commas, e.g., <SAMP>&lsquo;-k 9,4,13,14&rsquo;</SAMP>;
+ranges may be used, e.g., <SAMP>&lsquo;-k 2-7&rsquo;</SAMP>; and positions may occur
+in any order.  Furthermore, the wildcard '*' causes the generated
+hash function to consider <STRONG>all</STRONG> byte positions in each keyword,
+whereas '$' instructs the hash function to use the “final byte”
+of a keyword (this is the only way to use a byte position greater than
+255, incidentally).
+
+For instance, the option <SAMP>&lsquo;-k 1,2,4,6-10,'$'&rsquo;</SAMP> generates a hash
+function that considers positions 1,2,4,6,7,8,9,10, plus the last
+byte in each keyword (which may be at a different position for each
+keyword, obviously).  Keywords
+with length less than the indicated byte positions work properly, since
+selected byte positions exceeding the keyword length are simply not
+referenced in the hash function.
+
+This option is not normally needed since version 2.8 of <CODE>gperf</CODE>;
+the default byte positions are computed depending on the keyword set,
+through a search that minimizes the number of byte positions.
+
+<DT><SAMP>&lsquo;-D&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--duplicates&rsquo;</SAMP>
+<DD>
+<A NAME="IDX47"></A>
+Handle keywords whose selected byte sets hash to duplicate values.
+Duplicate hash values can occur if a set of keywords has the same names, but
+possesses different attributes, or if the selected byte positions are not well
+chosen.  With the -D option <CODE>gperf</CODE> treats all these keywords as
+part of an equivalence class and generates a perfect hash function with
+multiple comparisons for duplicate keywords.  It is up to you to completely
+disambiguate the keywords by modifying the generated C code.  However,
+<CODE>gperf</CODE> helps you out by organizing the output.
+
+Using this option usually means that the generated hash function is no
+longer perfect.  On the other hand, it permits <CODE>gperf</CODE> to work on
+keyword sets that it otherwise could not handle.
+
+<DT><SAMP>&lsquo;-m <VAR>iterations</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--multiple-iterations=<VAR>iterations</VAR>&rsquo;</SAMP>
+<DD>
+Perform multiple choices of the <SAMP>&lsquo;-i&rsquo;</SAMP> and <SAMP>&lsquo;-j&rsquo;</SAMP> values, and
+choose the best results.  This increases the running time by a factor of
+<VAR>iterations</VAR> but does a good job minimizing the generated table size.
+
+<DT><SAMP>&lsquo;-i <VAR>initial-value</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--initial-asso=<VAR>initial-value</VAR>&rsquo;</SAMP>
+<DD>
+Provides an initial <VAR>value</VAR> for the associate values array.  Default
+is 0.  Increasing the initial value helps inflate the final table size,
+possibly leading to more time efficient keyword lookups.  Note that this
+option is not particularly useful when <SAMP>&lsquo;-S&rsquo;</SAMP> (or, equivalently,
+<SAMP>&lsquo;%switch&rsquo;</SAMP>) is used.  Also,
+<SAMP>&lsquo;-i&rsquo;</SAMP> is overridden when the <SAMP>&lsquo;-r&rsquo;</SAMP> option is used.
+
+<DT><SAMP>&lsquo;-j <VAR>jump-value</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--jump=<VAR>jump-value</VAR>&rsquo;</SAMP>
+<DD>
+<A NAME="IDX48"></A>
+Affects the “jump value”, i.e., how far to advance the associated
+byte value upon collisions.  <VAR>Jump-value</VAR> is rounded up to an
+odd number, the default is 5.  If the <VAR>jump-value</VAR> is 0 <CODE>gperf</CODE>
+jumps by random amounts.
+
+<DT><SAMP>&lsquo;-n&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--no-strlen&rsquo;</SAMP>
+<DD>
+Instructs the generator not to include the length of a keyword when
+computing its hash value.  This may save a few assembly instructions in
+the generated lookup table.
+
+<DT><SAMP>&lsquo;-r&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--random&rsquo;</SAMP>
+<DD>
+Utilizes randomness to initialize the associated values table.  This
+frequently generates solutions faster than using deterministic
+initialization (which starts all associated values at 0).  Furthermore,
+using the randomization option generally increases the size of the
+table.
+
+<DT><SAMP>&lsquo;-s <VAR>size-multiple</VAR>&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--size-multiple=<VAR>size-multiple</VAR>&rsquo;</SAMP>
+<DD>
+Affects the size of the generated hash table.  The numeric argument for
+this option indicates “how many times larger or smaller” the maximum
+associated value range should be, in relationship to the number of keywords.
+It can be written as an integer, a floating-point number or a fraction.
+For example, a value of 3 means “allow the maximum associated value to be
+about 3 times larger than the number of input keywords”.
+Conversely, a value of 1/3 means “allow the maximum associated value to
+be about 3 times smaller than the number of input keywords”.  Values
+smaller than 1 are useful for limiting the overall size of the generated hash
+table, though the option <SAMP>&lsquo;-m&rsquo;</SAMP> is better at this purpose.
+
+If `generate switch' option <SAMP>&lsquo;-S&rsquo;</SAMP> (or, equivalently, <SAMP>&lsquo;%switch&rsquo;</SAMP>) is
+<EM>not</EM> enabled, the maximum
+associated value influences the static array table size, and a larger
+table should decrease the time required for an unsuccessful search, at
+the expense of extra table space.
+
+The default value is 1, thus the default maximum associated value about
+the same size as the number of keywords (for efficiency, the maximum
+associated value is always rounded up to a power of 2).  The actual
+table size may vary somewhat, since this technique is essentially a
+heuristic.
+</DL>
+
+
+
+<H2><A NAME="SEC23" HREF="gperf_toc.html#TOC23">5.6  Informative Output</A></H2>
+
+<DL COMPACT>
+
+<DT><SAMP>&lsquo;-h&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--help&rsquo;</SAMP>
+<DD>
+Prints a short summary on the meaning of each program option.  Aborts
+further program execution.
+
+<DT><SAMP>&lsquo;-v&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--version&rsquo;</SAMP>
+<DD>
+Prints out the current version number.
+
+<DT><SAMP>&lsquo;-d&rsquo;</SAMP>
+<DD>
+<DT><SAMP>&lsquo;--debug&rsquo;</SAMP>
+<DD>
+Enables the debugging option.  This produces verbose diagnostics to
+“standard error” when <CODE>gperf</CODE> is executing.  It is useful both for
+maintaining the program and for determining whether a given set of
+options is actually speeding up the search for a solution.  Some useful
+information is dumped at the end of the program when the <SAMP>&lsquo;-d&rsquo;</SAMP>
+option is enabled.
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_5.html">previous</A>, <A HREF="gperf_7.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_7.html b/doc/gperf_7.html
new file mode 100644 (file)
index 0000000..ae5dad3
--- /dev/null
@@ -0,0 +1,57 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 6  Known Bugs and Limitations with gperf</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_6.html">previous</A>, <A HREF="gperf_8.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC24" HREF="gperf_toc.html#TOC24">6  Known Bugs and Limitations with <CODE>gperf</CODE></A></H1>
+
+<P>
+The following are some limitations with the current release of
+<CODE>gperf</CODE>:
+
+</P>
+
+<UL>
+<LI>
+
+The <CODE>gperf</CODE> utility is tuned to execute quickly, and works quickly
+for small to medium size data sets (around 1000 keywords).  It is
+extremely useful for maintaining perfect hash functions for compiler
+keyword sets.  Several recent enhancements now enable <CODE>gperf</CODE> to
+work efficiently on much larger keyword sets (over 15,000 keywords).
+When processing large keyword sets it helps greatly to have over 8 megs
+of RAM.
+
+<LI>
+
+The size of the generate static keyword array can get <EM>extremely</EM>
+large if the input keyword file is large or if the keywords are quite
+similar.  This tends to slow down the compilation of the generated C
+code, and <EM>greatly</EM> inflates the object code size.  If this
+situation occurs, consider using the <SAMP>&lsquo;-S&rsquo;</SAMP> option to reduce data
+size, potentially increasing keyword recognition time a negligible
+amount.  Since many C compilers cannot correctly generate code for
+large switch statements it is important to qualify the <VAR>-S</VAR> option
+with an appropriate numerical argument that controls the number of
+switch statements generated.
+
+<LI>
+
+The maximum number of selected byte positions has an
+arbitrary limit of 255.  This restriction should be removed, and if
+anyone considers this a problem write me and let me know so I can remove
+the constraint.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_6.html">previous</A>, <A HREF="gperf_8.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_8.html b/doc/gperf_8.html
new file mode 100644 (file)
index 0000000..9761d45
--- /dev/null
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 7  Things Still Left to Do</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_7.html">previous</A>, <A HREF="gperf_9.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC25" HREF="gperf_toc.html#TOC25">7  Things Still Left to Do</A></H1>
+
+<P>
+It should be “relatively” easy to replace the current perfect hash
+function algorithm with a more exhaustive approach; the perfect hash
+module is essential independent from other program modules.  Additional
+worthwhile improvements include:
+
+</P>
+
+<UL>
+<LI>
+
+Another useful extension involves modifying the program to generate
+“minimal” perfect hash functions (under certain circumstances, the
+current version can be rather extravagant in the generated table size).
+This is mostly of theoretical interest, since a sparse table
+often produces faster lookups, and use of the <SAMP>&lsquo;-S&rsquo;</SAMP> <CODE>switch</CODE>
+option can minimize the data size, at the expense of slightly longer
+lookups (note that the gcc compiler generally produces good code for
+<CODE>switch</CODE> statements, reducing the need for more complex schemes).
+
+<LI>
+
+In addition to improving the algorithm, it would also be useful to
+generate an Ada package as the code output, in addition to the current
+C and C++ routines.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_7.html">previous</A>, <A HREF="gperf_9.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_9.html b/doc/gperf_9.html
new file mode 100644 (file)
index 0000000..ba71042
--- /dev/null
@@ -0,0 +1,96 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - 8  Bibliography</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_8.html">previous</A>, <A HREF="gperf_10.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC26" HREF="gperf_toc.html#TOC26">8  Bibliography</A></H1>
+
+<P>
+[1] Chang, C.C.: <I>A Scheme for Constructing Ordered Minimal Perfect
+Hashing Functions</I> Information Sciences 39(1986), 187-195.
+
+</P>
+<P>
+[2] Cichelli, Richard J. <I>Author's Response to “On Cichelli's Minimal Perfect Hash
+Functions Method”</I> Communications of the ACM, 23, 12(December 1980), 729.
+
+</P>
+<P>
+[3] Cichelli, Richard J. <I>Minimal Perfect Hash Functions Made Simple</I>
+Communications of the ACM, 23, 1(January 1980), 17-19.
+
+</P>
+<P>
+[4] Cook, C. R. and Oldehoeft, R.R. <I>A Letter Oriented Minimal
+Perfect Hashing Function</I> SIGPLAN Notices, 17, 9(September 1982), 18-27.
+
+</P>
+<P>
+[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
+<I>Practical Perfect Hashing</I> Computer Journal, 28, 1(January 1985), 54-58.
+
+</P>
+<P>
+[6] Jaeschke, G. <I>Reciprocal Hashing: A Method for Generating Minimal
+Perfect Hashing Functions</I> Communications of the ACM, 24, 12(December
+1981), 829-833.
+
+</P>
+<P>
+[7] Jaeschke, G. and Osterburg, G. <I>On Cichelli's Minimal Perfect
+Hash Functions Method</I> Communications of the ACM, 23, 12(December 1980),
+728-729.
+
+</P>
+<P>
+[8] Sager, Thomas J. <I>A Polynomial Time Generator for Minimal Perfect
+Hash Functions</I> Communications of the ACM, 28, 5(December 1985), 523-532
+
+</P>
+<P>
+[9] Schmidt, Douglas C. <I>GPERF: A Perfect Hash Function Generator</I>
+Second USENIX C++ Conference Proceedings, April 1990.
+
+</P>
+<P>
+[10] Schmidt, Douglas C. <I>GPERF: A Perfect Hash Function Generator</I>
+C++ Report, SIGS 10 10 (November/December 1998).
+
+</P>
+<P>
+[11] Sebesta, R.W. and Taylor, M.A. <I>Minimal Perfect Hash Functions
+for Reserved Word Lists</I>  SIGPLAN Notices, 20, 12(September 1985), 47-53.
+
+</P>
+<P>
+[12] Sprugnoli, R. <I>Perfect Hashing Functions: A Single Probe
+Retrieving Method for Static Sets</I> Communications of the ACM, 20
+11(November 1977), 841-850.
+
+</P>
+<P>
+[13] Stallman, Richard M. <I>Using and Porting GNU CC</I> Free Software Foundation,
+1988.
+
+</P>
+<P>
+[14] Stroustrup, Bjarne <I>The C++ Programming Language.</I> Addison-Wesley, 1986.
+
+</P>
+<P>
+[15] Tiemann, Michael D. <I>User's Guide to GNU C++</I> Free Software
+Foundation, 1989.
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gperf_1.html">first</A>, <A HREF="gperf_8.html">previous</A>, <A HREF="gperf_10.html">next</A>, <A HREF="gperf_10.html">last</A> section, <A HREF="gperf_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/gperf_toc.html b/doc/gperf_toc.html
new file mode 100644 (file)
index 0000000..654da0c
--- /dev/null
@@ -0,0 +1,59 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52b
+     from gperf.texi on 1 February 2009 -->
+
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Perfect Hash Function Generator - Table of Contents</TITLE>
+</HEAD>
+<BODY>
+<H1>User's Guide to <CODE>gperf</CODE> 3.0.4</H1>
+<H2>The GNU Perfect Hash Function Generator</H2>
+<H2>Edition 3.0.4, 1 February 2009</H2>
+<ADDRESS>Douglas C. Schmidt</ADDRESS>
+<ADDRESS>Bruno Haible</ADDRESS>
+<P>
+<P><HR><P>
+<UL>
+<LI><A NAME="TOC1" HREF="gperf_1.html#SEC1">GNU GENERAL PUBLIC LICENSE</A>
+<LI><A NAME="TOC2" HREF="gperf_2.html#SEC2">Contributors to GNU <CODE>gperf</CODE> Utility</A>
+<LI><A NAME="TOC3" HREF="gperf_3.html#SEC3">2  Introduction</A>
+<LI><A NAME="TOC4" HREF="gperf_4.html#SEC4">3  Static search structures and GNU <CODE>gperf</CODE></A>
+<LI><A NAME="TOC5" HREF="gperf_5.html#SEC5">4  High-Level Description of GNU <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC6" HREF="gperf_5.html#SEC6">4.1  Input Format to <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC7" HREF="gperf_5.html#SEC7">4.1.1  Declarations</A>
+<UL>
+<LI><A NAME="TOC8" HREF="gperf_5.html#SEC8">4.1.1.1  User-supplied <CODE>struct</CODE></A>
+<LI><A NAME="TOC9" HREF="gperf_5.html#SEC9">4.1.1.2  Gperf Declarations</A>
+<LI><A NAME="TOC10" HREF="gperf_5.html#SEC10">4.1.1.3  C Code Inclusion</A>
+</UL>
+<LI><A NAME="TOC11" HREF="gperf_5.html#SEC11">4.1.2  Format for Keyword Entries</A>
+<LI><A NAME="TOC12" HREF="gperf_5.html#SEC12">4.1.3  Including Additional C Functions</A>
+<LI><A NAME="TOC13" HREF="gperf_5.html#SEC13">4.1.4  Where to place directives for GNU <CODE>indent</CODE>.</A>
+</UL>
+<LI><A NAME="TOC14" HREF="gperf_5.html#SEC14">4.2  Output Format for Generated C Code with <CODE>gperf</CODE></A>
+<LI><A NAME="TOC15" HREF="gperf_5.html#SEC15">4.3  Use of NUL bytes</A>
+<LI><A NAME="TOC16" HREF="gperf_5.html#SEC16">4.4  The Copyright of the Output</A>
+</UL>
+<LI><A NAME="TOC17" HREF="gperf_6.html#SEC17">5  Invoking <CODE>gperf</CODE></A>
+<UL>
+<LI><A NAME="TOC18" HREF="gperf_6.html#SEC18">5.1  Specifying the Location of the Output File</A>
+<LI><A NAME="TOC19" HREF="gperf_6.html#SEC19">5.2  Options that affect Interpretation of the Input File</A>
+<LI><A NAME="TOC20" HREF="gperf_6.html#SEC20">5.3  Options to specify the Language for the Output Code</A>
+<LI><A NAME="TOC21" HREF="gperf_6.html#SEC21">5.4  Options for fine tuning Details in the Output Code</A>
+<LI><A NAME="TOC22" HREF="gperf_6.html#SEC22">5.5  Options for changing the Algorithms employed by <CODE>gperf</CODE></A>
+<LI><A NAME="TOC23" HREF="gperf_6.html#SEC23">5.6  Informative Output</A>
+</UL>
+<LI><A NAME="TOC24" HREF="gperf_7.html#SEC24">6  Known Bugs and Limitations with <CODE>gperf</CODE></A>
+<LI><A NAME="TOC25" HREF="gperf_8.html#SEC25">7  Things Still Left to Do</A>
+<LI><A NAME="TOC26" HREF="gperf_9.html#SEC26">8  Bibliography</A>
+<LI><A NAME="TOC27" HREF="gperf_10.html#SEC27">Concept Index</A>
+</UL>
+<P><HR><P>
+This document was generated on 1 February 2009 using the
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>
+translator version 1.52b.</P>
+</BODY>
+</HTML>
diff --git a/doc/gpl-3.0.texi b/doc/gpl-3.0.texi
new file mode 100644 (file)
index 0000000..97a17e1
--- /dev/null
@@ -0,0 +1,717 @@
+@c The GNU General Public License.
+@center Version 3, 29 June 2007
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it.  ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item  Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If 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 convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU 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 Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``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 PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM 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 PROGRAM (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 PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@heading END OF TERMS AND CONDITIONS
+
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, 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.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see @url{http://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author}
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{http://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
diff --git a/doc/help2man b/doc/help2man
new file mode 100755 (executable)
index 0000000..5fc20dc
--- /dev/null
@@ -0,0 +1,517 @@
+#!/usr/bin/perl -w
+
+# Generate a short man page from --help and --version output.
+# Copyright © 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU 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.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Written by Brendan O'Dea <bod@compusol.com.au>
+# Available from ftp://ftp.gnu.org/gnu/help2man/
+
+use 5.004;
+use strict;
+use Getopt::Long;
+use Text::Tabs qw(expand);
+use POSIX qw(strftime setlocale LC_TIME);
+
+my $this_program = 'help2man';
+my $this_version = '1.23';
+my $version_info = <<EOT;
+GNU $this_program $this_version
+
+Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Written by Brendan O'Dea <bod\@compusol.com.au>
+EOT
+
+my $help_info = <<EOT;
+`$this_program' generates a man page out of `--help' and `--version' output.
+
+Usage: $this_program [OPTION]... EXECUTABLE
+
+ -n, --name=STRING       use `STRING' as the description for the NAME paragraph
+ -s, --section=SECTION   use `SECTION' as the section for the man page
+ -i, --include=FILE      include material from `FILE'
+ -I, --opt-include=FILE  include material from `FILE' if it exists
+ -o, --output=FILE       send output to `FILE'
+ -N, --no-info           suppress pointer to Texinfo manual
+     --help              print this help, then exit
+     --version           print version number, then exit
+
+EXECUTABLE should accept `--help' and `--version' options.
+
+Report bugs to <bug-help2man\@gnu.org>.
+EOT
+
+my $section = 1;
+my ($opt_name, @opt_include, $opt_output, $opt_no_info);
+
+# Parse options.
+Getopt::Long::config('bundling');
+GetOptions (
+    'n|name=s'         => \$opt_name,
+    's|section=s'      => \$section,
+    'i|include=s'      => sub { push @opt_include, [ pop, 1 ] },
+    'I|opt-include=s'  => sub { push @opt_include, [ pop, 0 ] },
+    'o|output=s'       => \$opt_output,
+    'N|no-info'                => \$opt_no_info,
+    help               => sub { print $help_info; exit },
+    version            => sub { print $version_info; exit },
+) or die $help_info;
+
+die $help_info unless @ARGV == 1;
+
+my %include = ();
+my %append = ();
+my @include = (); # retain order given in include file
+
+# Provide replacement `quote-regex' operator for pre-5.005.
+BEGIN { eval q(sub qr { '' =~ $_[0]; $_[0] }) if $] < 5.005 }
+
+# Process include file (if given).  Format is:
+#
+#   [section name]
+#   verbatim text
+#
+# or
+#
+#   /pattern/
+#   verbatim text
+#
+
+for (@opt_include)
+{
+    my ($inc, $required) = @$_;
+
+    next unless -f $inc or $required;
+    die "$this_program: can't open `$inc' ($!)\n"
+       unless open INC, $inc;
+
+    my $key;
+    my $hash = \%include;
+
+    while (<INC>)
+    {
+       # [section]
+       if (/^\[([^]]+)\]/)
+       {
+           $key = uc $1;
+           $key =~ s/^\s+//;
+           $key =~ s/\s+$//;
+           $hash = \%include;
+           push @include, $key unless $include{$key};
+           next;
+       }
+
+       # /pattern/
+       if (m!^/(.*)/([ims]*)!)
+       {
+           my $pat = $2 ? "(?$2)$1" : $1;
+
+           # Check pattern.
+           eval { $key = qr($pat) };
+           if ($@)
+           {
+               $@ =~ s/ at .*? line \d.*//;
+               die "$inc:$.:$@";
+           }
+
+           $hash = \%append;
+           next;
+       }
+
+       # Silently ignore anything before the first
+       # section--allows for comments and revision info.
+       next unless $key;
+
+       $hash->{$key} ||= '';
+       $hash->{$key} .= $_;
+    }
+
+    close INC;
+
+    die "$this_program: no valid information found in `$inc'\n"
+       unless $key;
+}
+
+# Compress trailing blank lines.
+for my $hash (\(%include, %append))
+{
+    for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ }
+}
+
+# Turn off localisation of executable's ouput.
+@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
+
+# Turn off localisation of date (for strftime).
+setlocale LC_TIME, 'C';
+
+# Grab help and version info from executable.
+my ($help_text, $version_text) = map {
+    join '', map { s/ +$//; expand $_ } `$ARGV[0] --$_ 2>/dev/null`
+       or die "$this_program: can't get `--$_' info from $ARGV[0]\n"
+} qw(help version);
+
+my $date = strftime "%B %Y", localtime;
+(my $program = $ARGV[0]) =~ s!.*/!!;
+my $package = $program;
+my $version;
+
+if ($opt_output)
+{
+    unlink $opt_output
+       or die "$this_program: can't unlink $opt_output ($!)\n"
+       if -e $opt_output;
+
+    open STDOUT, ">$opt_output"
+       or die "$this_program: can't create $opt_output ($!)\n";
+}
+
+# The first line of the --version information is assumed to be in one
+# of the following formats:
+#
+#   <version>
+#   <program> <version>
+#   {GNU,Free} <program> <version>
+#   <program> ({GNU,Free} <package>) <version>
+#   <program> - {GNU,Free} <package> <version>
+#
+# and seperated from any copyright/author details by a blank line.
+
+($_, $version_text) = split /\n+/, $version_text, 2;
+
+if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
+    /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
+{
+    $program = $1;
+    $package = $2;
+    $version = $3;
+}
+elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/)
+{
+    $program = $2;
+    $package = $1 ? "$1$2" : $2;
+    $version = $3;
+}
+else
+{
+    $version = $_;
+}
+
+$program =~ s!.*/!!;
+
+# No info for `info' itself.
+$opt_no_info = 1 if $program eq 'info';
+
+# --name overrides --include contents.
+$include{NAME} = "$program \\- $opt_name\n" if $opt_name;
+
+# Default (useless) NAME paragraph.
+$include{NAME} ||= "$program \\- manual page for $program $version\n";
+
+# Man pages traditionally have the page title in caps.
+my $PROGRAM = uc $program;
+
+# Extract usage clause(s) [if any] for SYNOPSIS.
+if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m)
+{
+    my @syn = $2 . $3;
+
+    if ($_ = $4)
+    {
+       s/^\n//;
+       for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ }
+    }
+
+    my $synopsis = '';
+    for (@syn)
+    {
+       $synopsis .= ".br\n" if $synopsis;
+       s!^\S*/!!;
+       s/^(\S+) *//;
+       $synopsis .= ".B $1\n";
+       s/\s+$//;
+       s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
+       s/^/\\fI/ unless s/^\\fR//;
+       $_ .= '\fR';
+       s/(\\fI)( *)/$2$1/g;
+       s/\\fI\\fR//g;
+       s/^\\fR//;
+       s/\\fI$//;
+       s/^\./\\&./;
+
+       $synopsis .= "$_\n";
+    }
+
+    $include{SYNOPSIS} ||= $synopsis;
+}
+
+# Process text, initial section is DESCRIPTION.
+my $sect = 'DESCRIPTION';
+$_ = "$help_text\n\n$version_text";
+
+# Normalise paragraph breaks.
+s/^\n+//;
+s/\n*$/\n/;
+s/\n\n+/\n\n/g;
+
+# Temporarily exchange leading dots, apostrophes and backslashes for
+# tokens.
+s/^\./\x80/mg;
+s/^'/\x81/mg;
+s/\\/\x82/g;
+
+# Start a new paragraph (if required) for these.
+s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g;
+
+sub convert_option;
+
+while (length)
+{
+    # Convert some standard paragraph names.
+    if (s/^(Options|Examples): *\n//)
+    {
+       $sect = uc $1;
+       next;
+    }
+
+    # Copyright section
+    if (/^Copyright +[(\xa9]/)
+    {
+       $sect = 'COPYRIGHT';
+       $include{$sect} ||= '';
+       $include{$sect} .= ".PP\n" if $include{$sect};
+
+       my $copy;
+       ($copy, $_) = split /\n\n/, $_, 2;
+
+       for ($copy)
+       {
+           # Add back newline
+           s/\n*$/\n/;
+
+           # Convert iso9959-1 copyright symbol or (c) to nroff
+           # character.
+           s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg;
+
+           # Insert line breaks before additional copyright messages
+           # and the disclaimer.
+           s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g;
+
+           # Join hyphenated lines.
+           s/([A-Za-z])-\n */$1/g;
+       }
+
+       $include{$sect} .= $copy;
+       $_ ||= '';
+       next;
+    }
+
+    # Catch bug report text.
+    if (/^(Report +bugs|Email +bug +reports +to) /)
+    {
+       $sect = 'REPORTING BUGS';
+    }
+
+    # Author section.
+    elsif (/^Written +by/)
+    {
+       $sect = 'AUTHOR';
+    }
+
+    # Examples, indicated by an indented leading $, % or > are
+    # rendered in a constant width font.
+    if (/^( +)([\$\%>] )\S/)
+    {
+       my $indent = $1;
+       my $prefix = $2;
+       my $break = '.IP';
+       $include{$sect} ||= '';
+       while (s/^$indent\Q$prefix\E(\S.*)\n*//)
+       {
+           $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
+           $break = '.br';
+       }
+
+       next;
+    }
+
+    my $matched = '';
+    $include{$sect} ||= '';
+
+    # Sub-sections have a trailing colon and the second line indented.
+    if (s/^(\S.*:) *\n / /)
+    {
+       $matched .= $& if %append;
+       $include{$sect} .= qq(.SS "$1"\n);
+    }
+
+    my $indent = 0;
+    my $content = '';
+
+    # Option with description.
+    if (s/^( {1,10}([+-]\S.*?))(?:(  +)|\n( {20,}))(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length ($4 || "$1$3");
+       $content = ".TP\n\x83$2\n\x83$5\n";
+       unless ($4)
+       {
+           # Indent may be different on second line.
+           $indent = length $& if /^ {20,}/;
+       }
+    }
+
+    # Option without description.
+    elsif (s/^ {1,10}([+-]\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $content = ".HP\n\x83$1\n";
+       $indent = 80; # not continued
+    }
+
+    # Indented paragraph with tag.
+    elsif (s/^( +(\S.*?)  +)(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length $1;
+       $content = ".TP\n\x83$2\n\x83$3\n";
+    }
+
+    # Indented paragraph.
+    elsif (s/^( +)(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length $1;
+       $content = ".IP\n\x83$2\n";
+    }
+
+    # Left justified paragraph.
+    else
+    {
+       s/(.*)\n//;
+       $matched .= $& if %append;
+       $content = ".PP\n" if $include{$sect};
+       $content .= "$1\n";
+    }
+
+    # Append continuations.
+    while (s/^ {$indent}(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $content .= "\x83$1\n"
+    }
+
+    # Move to next paragraph.
+    s/^\n+//;
+
+    for ($content)
+    {
+       # Leading dot and apostrophe protection.
+       s/\x83\./\x80/g;
+       s/\x83'/\x81/g;
+       s/\x83//g;
+
+       # Convert options.
+       s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
+    }
+
+    # Check if matched paragraph contains /pat/.
+    if (%append)
+    {
+       for my $pat (keys %append)
+       {
+           if ($matched =~ $pat)
+           {
+               $content .= ".PP\n" unless $append{$pat} =~ /^\./;
+               $content .= $append{$pat};
+           }
+       }
+    }
+
+    $include{$sect} .= $content;
+}
+
+# Refer to the real documentation.
+unless ($opt_no_info)
+{
+    $sect = 'SEE ALSO';
+    $include{$sect} ||= '';
+    $include{$sect} .= ".PP\n" if $include{$sect};
+    $include{$sect} .= <<EOT;
+The full documentation for
+.B $program
+is maintained as a Texinfo manual.  If the
+.B info
+and
+.B $program
+programs are properly installed at your site, the command
+.IP
+.B info $program
+.PP
+should give you access to the complete manual.
+EOT
+}
+
+# Output header.
+print <<EOT;
+.\\" DO NOT MODIFY THIS FILE!  It was generated by $this_program $this_version.
+.TH $PROGRAM "$section" "$date" "$package $version" FSF
+EOT
+
+# Section ordering.
+my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES);
+my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO');
+my $filter = join '|', @pre, @post;
+
+# Output content.
+for (@pre, (grep ! /^($filter)$/o, @include), @post)
+{
+    if ($include{$_})
+    {
+       my $quote = /\W/ ? '"' : '';
+       print ".SH $quote$_$quote\n";
+       
+       for ($include{$_})
+       {
+           # Replace leading dot, apostrophe and backslash tokens.
+           s/\x80/\\&./g;
+           s/\x81/\\&'/g;
+           s/\x82/\\e/g;
+           print;
+       }
+    }
+}
+
+exit;
+
+# Convert option dashes to \- to stop nroff from hyphenating 'em, and
+# embolden.  Option arguments get italicised.
+sub convert_option
+{
+    local $_ = '\fB' . shift;
+
+    s/-/\\-/g;
+    unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
+    {
+       s/=(.)/\\fR=\\fI$1/;
+       s/ (.)/ \\fI$1/;
+       $_ .= '\fR';
+    }
+
+    $_;
+}
diff --git a/doc/texi2html b/doc/texi2html
new file mode 100755 (executable)
index 0000000..d423c2f
--- /dev/null
@@ -0,0 +1,2136 @@
+#!/usr/local/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+#                                                                              #
+# File: texi2html                                                              #
+#                                                                              #
+# Description: Program to transform most Texinfo documents to HTML             #
+#                                                                              #
+#-##############################################################################
+
+# @(#)texi2html        1.52b 01/05/98  Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch
+# 1.52a: Use acute accent instead of apostrophe. Add support for ISO-8859-1
+#        characters with cedilla, circumflex etc.
+# 1.52b: Add option -expandtex. Expand @ifhtml by default, not @ifinfo.
+#        Use Unicode quotation marks instead of grave and acute accents.
+#        Emit charset=UTF-8 declaration.
+
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+# Please read the copyright at the end of the man page.
+
+#+++############################################################################
+#                                                                              #
+# Constants                                                                    #
+#                                                                              #
+#---############################################################################
+
+$DEBUG_TOC   =  1;
+$DEBUG_INDEX =  2;
+$DEBUG_BIB   =  4;
+$DEBUG_GLOSS =  8;
+$DEBUG_DEF   = 16;
+$DEBUG_HTML  = 32;
+$DEBUG_USER  = 64;
+
+$BIBRE = '\[[\w\/-]+\]';               # RE for a bibliography reference
+$FILERE = '[\/\w.+-]+';                        # RE for a file name
+$VARRE = '[^\s\{\}]+';                 # RE for a variable name
+$NODERE = '[^@{}:\'`",]+';             # RE for a node name
+$NODESRE = '[^@{}:\'`"]+';             # RE for a list of node names
+$XREFRE = '[^@{}]+';                   # RE for a xref (should use NODERE)
+
+$ERROR = "***";                                # prefix for errors and warnings
+$THISPROG = "texi2html 1.52b";                 # program name and version
+$HOMEPAGE = "http://wwwinfo.cern.ch/dis/texi2html/"; # program home page
+$TODAY = &pretty_date;                 # like "20 September 1993"
+$SPLITTAG = "<!-- SPLIT HERE -->\n";   # tag to know where to split
+$PROTECTTAG = "_ThisIsProtected_";     # tag to recognize protected sections
+$html2_doctype = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 2//EN">';
+
+#
+# language dependent constants
+#
+#$LDC_SEE = 'see';
+#$LDC_SECTION = 'section';
+#$LDC_IN = 'in';
+#$LDC_TOC = 'Table of Contents';
+#$LDC_GOTO = 'Go to the';
+#$LDC_FOOT = 'Footnotes';
+# TODO: @def* shortcuts
+
+#
+# pre-defined indices
+#
+%predefined_index = (
+                   'cp', 'c',
+                   'fn', 'f',
+                   'vr', 'v',
+                   'ky', 'k',
+                   'pg', 'p',
+                   'tp', 't',
+                   );
+
+#
+# valid indices
+#
+%valid_index = (
+                   'c', 1,
+                   'f', 1,
+                   'v', 1,
+                   'k', 1,
+                   'p', 1,
+                   't', 1,
+               );
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+             'top', 0,
+             'chapter', 1,
+             'unnumbered', 1,
+             'majorheading', 1,
+             'chapheading', 1,
+             'appendix', 1,
+             'section', 2,
+             'unnumberedsec', 2,
+             'heading', 2,
+             'appendixsec', 2,
+             'appendixsection', 2,
+             'subsection', 3,
+             'unnumberedsubsec', 3,
+             'subheading', 3,
+             'appendixsubsec', 3,
+             'subsubsection', 4,
+             'unnumberedsubsubsec', 4,
+             'subsubheading', 4,
+             'appendixsubsubsec', 4,
+             );
+
+#
+# accent map, TeX command to ISO name
+#
+%accent_map = (
+              '"',  'uml',
+              '~',  'tilde',
+              '^',  'circ',
+              '`',  'grave',
+              '\'', 'acute',
+              );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+              # cf. makeinfo.c
+              "*", "<BR>",             # HTML+
+              " ", " ",
+              "\n", "\n",
+              "|", "",
+              # spacing commands
+              ":", "",
+              "!", "!",
+              "?", "?",
+              ".", ".",
+              "-", "",
+              );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+              'TeX', 'TeX',
+              'br', '<P>',             # paragraph break
+              'bullet', '*',
+              'copyright', '(C)',
+              'dots', '...',
+              'equiv', '==',
+              'error', 'error-->',
+              'expansion', '==>',
+              'minus', '-',
+              'point', '-!-',
+              'print', '-|',
+              'result', '=>',
+              'today', $TODAY,
+              'aa', '&aring;',
+              'AA', '&Aring;',
+              'ae', '&aelig;',
+              'AE', '&AElig;',
+              'o',  '&oslash;',
+              'O',  '&Oslash;',
+              'ss', '&szlig;',
+              'exclamdown', '&iexcl;',
+              'questiondown', '&iquest;',
+              'pounds', '&pound;'
+              );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+             'asis', '',
+             'b', 'B',
+             'cite', 'CITE',
+             'code', 'CODE',
+             'ctrl', '&do_ctrl',       # special case
+             'dfn', 'EM',              # DFN tag is illegal in the standard
+             'dmn', '',                # useless
+             'email', '&do_email',     # insert a clickable email address
+             'emph', 'EM',
+             'file', '"TT',            # will put quotes, cf. &apply_style
+             'i', 'I',
+             'kbd', 'KBD',
+             'key', 'KBD',
+             'math', 'EM',
+             'r', '',                  # unsupported
+             'samp', '"SAMP',          # will put quotes, cf. &apply_style
+             'sc', '&do_sc',           # special case
+             'strong', 'STRONG',
+             't', 'TT',
+             'titlefont', '',          # useless
+             'uref', '&do_uref',       # insert a clickable URL
+             'url', '&do_url',         # insert a clickable URL
+             'var', 'VAR',
+             'w', '',                  # unsupported
+             '"', '&do_diaeresis',
+             '\'', '&do_acuteaccent',  # doesn't work??
+             '\`', '&do_graveaccent',  # doesn't work??
+             '~', '&do_tildeaccent',
+             ',', '&do_cedilla',
+             '^', '&do_circumflex',
+             );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+              'display', 'PRE',
+              'example', 'PRE',
+              'format', 'PRE',
+              'lisp', 'PRE',
+              'quotation', 'BLOCKQUOTE',
+              'smallexample', 'PRE',
+              'smalllisp', 'PRE',
+              # lists
+              'itemize', 'UL',
+              'enumerate', 'OL',
+              # poorly supported
+              'flushleft', 'PRE',
+              'flushright', 'PRE',
+              );
+
+#
+# texinfo definition shortcuts to real ones
+#
+%def_map = (
+           # basic commands
+           'deffn', 0,
+           'defvr', 0,
+           'deftypefn', 0,
+           'deftypevr', 0,
+           'defcv', 0,
+           'defop', 0,
+           'deftp', 0,
+           # basic x commands
+           'deffnx', 0,
+           'defvrx', 0,
+           'deftypefnx', 0,
+           'deftypevrx', 0,
+           'defcvx', 0,
+           'defopx', 0,
+           'deftpx', 0,
+           # shortcuts
+           'defun', 'deffn Function',
+           'defmac', 'deffn Macro',
+           'defspec', 'deffn {Special Form}',
+           'defvar', 'defvr Variable',
+           'defopt', 'defvr {User Option}',
+           'deftypefun', 'deftypefn Function',
+           'deftypevar', 'deftypevr Variable',
+           'defivar', 'defcv {Instance Variable}',
+           'defmethod', 'defop Method',
+           # x shortcuts
+           'defunx', 'deffnx Function',
+           'defmacx', 'deffnx Macro',
+           'defspecx', 'deffnx {Special Form}',
+           'defvarx', 'defvrx Variable',
+           'defoptx', 'defvrx {User Option}',
+           'deftypefunx', 'deftypefnx Function',
+           'deftypevarx', 'deftypevrx Variable',
+           'defivarx', 'defcvx {Instance Variable}',
+           'defmethodx', 'defopx Method',
+           );
+
+#
+# things to skip
+#
+%to_skip = (
+           # comments
+           'c', 1,
+           'comment', 1,
+           # useless
+           'contents', 1,
+           'shortcontents', 1,
+           'summarycontents', 1,
+           'footnotestyle', 1,
+           'end ifclear', 1,
+           'end ifset', 1,
+           'titlepage', 1,
+           'end titlepage', 1,
+           # unsupported commands (formatting)
+           'afourpaper', 1,
+           'cropmarks', 1,
+           'finalout', 1,
+           'headings', 1,
+           'need', 1,
+           'page', 1,
+           'setchapternewpage', 1,
+           'everyheading', 1,
+           'everyfooting', 1,
+           'evenheading', 1,
+           'evenfooting', 1,
+           'oddheading', 1,
+           'oddfooting', 1,
+           'smallbook', 1,
+           'vskip', 1,
+           'filbreak', 1,
+           'paragraphindent', 1,
+           # unsupported formats
+           'cartouche', 1,
+           'end cartouche', 1,
+           'group', 1,
+           'end group', 1,
+           );
+
+#+++############################################################################
+#                                                                              #
+# Argument parsing, initialisation                                             #
+#                                                                              #
+#---############################################################################
+
+%value = ();                           # hold texinfo variables, see also -D
+
+$use_bibliography = 1;
+$use_acc = 0;
+$debug = 0;
+$doctype = '';
+$check = 0;
+$expandinfo = 0;
+$expandtex = 0;
+$use_glossary = 0;
+$invisible_mark = '';
+$use_iso = 0;
+@include_dirs = ();
+$show_menu = 0;
+$number_sections = 0;
+$split_node = 0;
+$split_chapter = 0;
+$monolithic = 0;
+$verbose = 0;
+$usage = <<EOT;
+This is $THISPROG
+To convert a Texinfo file to HMTL: $0 [options] file
+  where options can be:
+    -expandinfo    : use \@ifinfo sections, not \@ifhtml
+    -expandtex     : use \@iftex sections, not \@ifhtml
+    -glossary      : handle a glossary
+    -invisible name: use 'name' as an invisible anchor
+    -Dname         : define name like with \@set
+    -I dir         : search also for files in 'dir'
+    -menu          : handle menus
+    -monolithic    : output only one file including ToC
+    -number        : number sections
+    -split_chapter : split on main sections
+    -split_node    : split on nodes
+    -usage         : print usage instructions
+    -verbose       : verbose output
+To check converted files: $0 -check [-verbose] files
+EOT
+
+while (@ARGV && $ARGV[0] =~ /^-/) {
+    $_ = shift(@ARGV);
+    if (/^-acc$/)            { $use_acc = 1; next; }
+    if (/^-d(ebug)?(\d+)?$/) { $debug = $2 || shift(@ARGV); next; }
+    if (/^-doctype$/)        { $doctype = shift(@ARGV); next; }
+    if (/^-c(heck)?$/)       { $check = 1; next; }
+    if (/^-expandi(nfo)?$/)  { $expandinfo = 1; next; }
+    if (/^-expandt(ex)?$/)   { $expandtex = 1; next; }
+    if (/^-g(lossary)?$/)    { $use_glossary = 1; next; }
+    if (/^-i(nvisible)?$/)   { $invisible_mark = shift(@ARGV); next; }
+    if (/^-iso$/)            { $use_iso = 1; next; }
+    if (/^-D(.+)?$/)         { $value{$1 || shift(@ARGV)} = 1; next; }
+    if (/^-I(.+)?$/)         { push(@include_dirs, $1 || shift(@ARGV)); next; }
+    if (/^-m(enu)?$/)        { $show_menu = 1; next; }
+    if (/^-mono(lithic)?$/)  { $monolithic = 1; next; }
+    if (/^-n(umber)?$/)      { $number_sections = 1; next; }
+    if (/^-s(plit)?_?(n(ode)?|c(hapter)?)?$/) {
+       if ($2 =~ /^n/) {
+           $split_node = 1;
+       } else {
+           $split_chapter = 1;
+       }
+       next;
+    }
+    if (/^-v(erbose)?$/)     { $verbose = 1; next; }
+    die $usage;
+}
+if ($check) {
+    die $usage unless @ARGV > 0;
+    &check;
+    exit;
+}
+
+if (($split_node || $split_chapter) && $monolithic) {
+    warn "Can't use -monolithic with -split, -monolithic ignored.\n";
+    $monolithic = 0;
+}
+if ($expandinfo) {
+    $to_skip{'ifinfo'}++;
+    $to_skip{'end ifinfo'}++;
+    $to_skip{'ifnottex'}++;
+    $to_skip{'end ifnottex'}++;
+    $to_skip{'ifnothtml'}++;
+    $to_skip{'end ifnothtml'}++;
+} elsif ($expandtex) {
+    $to_skip{'ifnotinfo'}++;
+    $to_skip{'end ifnotinfo'}++;
+    $to_skip{'iftex'}++;
+    $to_skip{'end iftex'}++;
+    $to_skip{'ifnothtml'}++;
+    $to_skip{'end ifnothtml'}++;
+} else {
+    $to_skip{'ifnotinfo'}++;
+    $to_skip{'end ifnotinfo'}++;
+    $to_skip{'ifnottex'}++;
+    $to_skip{'end ifnottex'}++;
+    $to_skip{'ifhtml'}++;
+    $to_skip{'end ifhtml'}++;
+}
+$invisible_mark = '<IMG SRC="invisible.xbm">' if $invisible_mark eq 'xbm';
+die $usage unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+    chop($docu_dir = $&);
+    $docu_name = $';
+} else {
+    $docu_dir = '.';
+    $docu_name = $docu;
+}
+unshift(@include_dirs, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//;    # basename of the document
+
+$docu_doc = "$docu_name.html";         # document's contents
+if ($monolithic) {
+    $docu_toc = $docu_foot = $docu_doc;
+} else {
+    $docu_toc  = "${docu_name}_toc.html";  # document's table of contents
+    $docu_foot = "${docu_name}_foot.html"; # document's footnotes
+}
+
+#
+# variables
+#
+$value{'html'} = 1;                    # predefine html (the output format)
+$value{'texi2html'} = '1.52b';         # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+        '_settitle', '_setfilename') {
+    $value{$_} = '';                   # prevent -w warnings
+}
+%node2sec = ();                                # node to section name
+%node2href = ();                       # node to HREF
+%bib2href = ();                                # bibliography reference to HREF
+%gloss2href = ();                      # glossary term to HREF
+@sections = ();                                # list of sections
+%tag2pro = ();                         # protected sections
+
+#
+# initial indexes
+#
+$bib_num = 0;
+$foot_num = 0;
+$gloss_num = 0;
+$idx_num = 0;
+$sec_num = 0;
+$doc_num = 0;
+$html_num = 0;
+
+#
+# can I use ISO8879 characters? (HTML+)
+#
+if ($use_iso) {
+    $things_map{'bullet'} = "&bull;";
+    $things_map{'copyright'} = "&copy;";
+    $things_map{'dots'} = "&hellip;";
+    $things_map{'equiv'} = "&equiv;";
+    $things_map{'expansion'} = "&rarr;";
+    $things_map{'point'} = "&lowast;";
+    $things_map{'result'} = "&rArr;";
+}
+
+#
+# read texi2html extensions (if any)
+#
+$extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions) {
+    print "# reading extensions from $extensions\n" if $verbose;
+    require($extensions);
+}
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './')) {
+    $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+    if (-f $extensions) {
+       print "# reading extensions from $extensions\n" if $verbose;
+       require($extensions);
+    }
+}
+
+print "# reading from $docu\n" if $verbose;
+
+#+++############################################################################
+#                                                                              #
+# Pass 1: read source, handle command, variable, simple substitution           #
+#                                                                              #
+#---############################################################################
+
+@lines = ();                           # whole document
+@toc_lines = ();                       # table of contents
+$toplevel = 0;                         # top level seen in hierarchy
+$curlevel = 0;                         # current level in TOC
+$node = '';                            # current node name
+$in_table = 0;                         # am I inside a table
+$table_type = '';                      # type of table ('', 'f', 'v', 'multi')
+@tables = ();                          # nested table support
+$in_bibliography = 0;                  # am I inside a bibliography
+$in_glossary = 0;                      # am I inside a glossary
+$in_top = 0;                           # am I inside the top node
+$in_pre = 0;                           # am I inside a preformatted section
+$in_list = 0;                          # am I inside a list
+$in_html = 0;                          # am I inside an HTML section
+$first_line = 1;                       # is it the first line
+$dont_html = 0;                                # don't protect HTML on this line
+$split_num = 0;                                # split index
+$deferred_ref = '';                    # deferred reference for indexes
+@html_stack = ();                      # HTML elements stack
+$html_element = '';                    # current HTML element
+&html_reset;
+
+# build code for simple substitutions
+# the maps used (%simple_map and %things_map) MUST be aware of this
+# watch out for regexps, / and escaped characters!
+$subst_code = '';
+foreach (keys(%simple_map)) {
+    ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
+    $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
+}
+foreach (keys(%things_map)) {
+    $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
+}
+if ($use_acc) {
+    # accentuated characters
+    foreach (keys(%accent_map)) {
+       if ($_ eq "`") {
+           $subst_code .= "s/$;3";
+       } elsif ($_ eq "'") {
+           $subst_code .= "s/$;4";
+       } else {
+           $subst_code .= "s/\\\@\\$_";
+       }
+       $subst_code .= "([aeiou])/&\${1}$accent_map{$_};/gi;\n";
+    }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+while ($_ = &next_line) {
+    #
+    # remove \input on the first lines only
+    #
+    if ($first_line) {
+       next if /^\\input/;
+       $first_line = 0;
+    }
+    #
+    # parse texinfo tags
+    #
+    $tag = '';
+    $end_tag = '';
+    if (/^\@end\s+(\w+)\b/) {
+       $end_tag = $1;
+    } elsif (/^\@(\w+)\b/) {
+       $tag = $1;
+    }
+    #
+    # handle @ifhtml / @end ifhtml
+    #
+    if ($in_html) {
+       if ($end_tag eq 'ifhtml') {
+           $in_html = 0;
+       } else {
+           $tag2pro{$in_html} .= $_;
+       }
+       next;
+    } elsif ($tag eq 'ifhtml') {
+       $in_html = $PROTECTTAG . ++$html_num;
+       push(@lines, $in_html);
+       next;
+    }
+    #
+    # try to skip the line
+    #
+    if ($end_tag) {
+       next if $to_skip{"end $end_tag"};
+    } elsif ($tag) {
+       next if $to_skip{$tag};
+       last if $tag eq 'bye';
+    }
+    if ($in_top) {
+       # parsing the top node
+       if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) {
+           # no more in top
+           $in_top = 0;
+       } else {
+           # skip it
+           next;
+       }
+    }
+    #
+    # try to remove inlined comments
+    # syntax from tex-mode.el comment-start-skip
+    #
+    s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+    # non-@ substitutions cf. texinfmt.el
+    unless ($in_pre) {
+       s/``/“/g;
+       s/''/”/g;
+       s/([\w ])---([\w ])/$1--$2/g;
+    }
+    #
+    # analyze the tag
+    #
+    if ($tag) {
+       # skip lines
+       &skip_until($tag), next if $tag eq 'ignore';
+       if ($expandinfo) {
+           &skip_until($tag), next if $tag eq 'ifnotinfo';
+           &skip_until($tag), next if $tag eq 'iftex';
+           &skip_until($tag), next if $tag eq 'ifhtml';
+       } elsif ($expandtex) {
+           &skip_until($tag), next if $tag eq 'ifinfo';
+           &skip_until($tag), next if $tag eq 'ifnottex';
+           &skip_until($tag), next if $tag eq 'ifhtml';
+       } else {
+           &skip_until($tag), next if $tag eq 'ifinfo';
+           &skip_until($tag), next if $tag eq 'iftex';
+           &skip_until($tag), next if $tag eq 'ifnothtml';
+       }
+       &skip_until($tag), next if $tag eq 'tex';
+       # handle special tables
+       if ($tag =~ /^(|f|v|multi)table$/) {
+           $table_type = $1;
+           $tag = 'table';
+       }
+       # special cases
+       if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
+           $in_top = 1;
+           @lines = (); # ignore all lines before top (title page garbage)
+           next;
+       } elsif ($tag eq 'node') {
+           $in_top = 0;
+           warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+           $_ = &protect_html($_); # if node contains '&' for instance
+           s/^\@node\s+//;
+           ($node) = split(/,/);
+           &normalise_node($node);
+           if ($split_node) {
+               &next_doc;
+               push(@lines, $SPLITTAG) if $split_num++;
+               push(@sections, $node);
+           }
+           next;
+       } elsif ($tag eq 'include') {
+           if (/^\@include\s+($FILERE)\s*$/o) {
+               $file = $1;
+               unless (-e $file) {
+                   foreach $dir (@include_dirs) {
+                       $file = "$dir/$1";
+                       last if -e $file;
+                   }
+               }
+               if (-e $file) {
+                   &open($file);
+                   print "# including $file\n" if $verbose;
+               } else {
+                   warn "$ERROR Can't find $file, skipping";
+               }
+           } else {
+               warn "$ERROR Bad include line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifclear') {
+           if (/^\@ifclear\s+($VARRE)\s*$/o) {
+               next unless defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifclear line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifset') {
+           if (/^\@ifset\s+($VARRE)\s*$/o) {
+               next if defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifset line: $_";
+           }
+           next;
+       } elsif ($tag eq 'menu') {
+           unless ($show_menu) {
+               &skip_until($tag);
+               next;
+           }
+           &html_push_if($tag);
+           push(@lines, &html_debug("\n", __LINE__));
+       } elsif ($format_map{$tag}) {
+           $in_pre = 1 if $format_map{$tag} eq 'PRE';
+           &html_push_if($format_map{$tag});
+           push(@lines, &html_debug("\n", __LINE__));
+           $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+           push(@lines, &debug("<$format_map{$tag}>\n", __LINE__));
+           next;
+       } elsif ($tag eq 'table') {
+           if (/^\@(|f|v|multi)table\s+\@(\w+)/) {
+               $in_table = $2;
+               unshift(@tables, join($;, $table_type, $in_table));
+               if ($table_type eq "multi") {
+                   push(@lines, &debug("<TABLE BORDER>\n", __LINE__));
+                   &html_push_if('TABLE');
+               } else {
+                   push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+                   &html_push_if('DL');
+               }
+               push(@lines, &html_debug("\n", __LINE__));
+           } else {
+               warn "$ERROR Bad table line: $_";
+           }
+           next;
+       } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') {
+           if (/^\@$tag\s+(\w)\w\s+(\w)\w\s*$/) {
+               eval("*${1}index = *${2}index");
+           } else {
+               warn "$ERROR Bad syn*index line: $_";
+           }
+           next;
+       } elsif ($tag eq 'sp') {
+           push(@lines, &debug("<P>\n", __LINE__));
+           next;
+       } elsif ($tag eq 'setref') {
+           &protect_html; # if setref contains '&' for instance
+           if (/^\@$tag\s*{($NODERE)}\s*$/) {
+               $setref = $1;
+               $setref =~ s/\s+/ /g; # normalize
+               $setref =~ s/ $//;
+               $node2sec{$setref} = $name;
+               $node2href{$setref} = "$docu_doc#$docid";
+           } else {
+               warn "$ERROR Bad setref line: $_";
+           }
+           next;
+       } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') {
+           if (/^\@$tag\s+(\w\w)\s*$/) {
+               $valid_index{$1} = 1;
+           } else {
+               warn "$ERROR Bad defindex line: $_";
+           }
+           next;
+       } elsif (defined($def_map{$tag})) {
+           if ($def_map{$tag}) {
+               s/^\@$tag\s+//;
+               $tag = $def_map{$tag};
+               $_ = "\@$tag $_";
+               $tag =~ s/\s.*//;
+           }
+       } elsif (defined($user_sub{$tag})) {
+           s/^\@$tag\s+//;
+           $sub = $user_sub{$tag};
+           print "# user $tag = $sub, arg: $_" if $debug & $DEBUG_USER;
+           if (defined(&$sub)) {
+               chop($_);
+               &$sub($_);
+           } else {
+               warn "$ERROR Bad user sub for $tag: $sub\n";
+           }
+           next;
+       }
+       if (defined($def_map{$tag})) {
+           s/^\@$tag\s+//;
+           if ($tag =~ /x$/) {
+               # extra definition line
+               $tag = $`;
+               $is_extra = 1;
+           } else {
+               $is_extra = 0;
+           }
+           while (/\{([^\{\}]*)\}/) {
+               # this is a {} construct
+               ($before, $contents, $after) = ($`, $1, $');
+               # protect spaces
+               $contents =~ s/\s+/$;9/g;
+               # restore $_ protecting {}
+               $_ = "$before$;7$contents$;8$after";
+           }
+           @args = split(/\s+/, &protect_html($_));
+           foreach (@args) {
+               s/$;9/ /g;      # unprotect spaces
+               s/$;7/\{/g;     # ... {
+               s/$;8/\}/g;     # ... }
+           }
+           $type = shift(@args);
+           $type =~ s/^\{(.*)\}$/$1/;
+           print "# def ($tag): {$type} ", join(', ', @args), "\n"
+               if $debug & $DEBUG_DEF;
+           $type .= ':'; # it's nicer like this
+           $name = shift(@args);
+           $name =~ s/^\{(.*)\}$/$1/;
+           if ($is_extra) {
+               $_ = &debug("<DT>", __LINE__);
+           } else {
+               $_ = &debug("<DL>\n<DT>", __LINE__);
+           }
+           if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
+                    || $tag eq 'defcv' || $tag eq 'defop') {
+               $ftype = $name;
+               $name = shift(@args);
+               $name =~ s/^\{(.*)\}$/$1/;
+               $_ .= "<U>$type</U> $ftype <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } else {
+               warn "$ERROR Unknown definition type: $tag\n";
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           }
+           $_ .= &debug("\n<DD>", __LINE__);
+           $name = &unprotect_html($name);
+           if ($tag eq 'deffn' || $tag eq 'deftypefn') {
+               unshift(@input_spool, "\@findex $name\n");
+           } elsif ($tag eq 'defop') {
+               unshift(@input_spool, "\@findex $name on $ftype\n");
+           } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+               unshift(@input_spool, "\@vindex $name\n");
+           } else {
+               unshift(@input_spool, "\@tindex $name\n");
+           }
+           $dont_html = 1;
+       }
+    } elsif ($end_tag) {
+       if ($format_map{$end_tag}) {
+           $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
+           $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
+           &html_pop_if('LI', 'P');
+           &html_pop_if();
+           push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+           push(@lines, &html_debug("\n", __LINE__));
+       } elsif ($end_tag =~ /^(|f|v|multi)table$/) {
+           unless (@tables) {
+               warn "$ERROR \@end $end_tag without \@*table\n";
+               next;
+           }
+           ($table_type, $in_table) = split($;, shift(@tables));
+           unless ($1 eq $table_type) {
+               warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
+               next;
+           }
+           if ($table_type eq "multi") {
+               push(@lines, "</TR></TABLE>\n");
+               &html_pop_if('TR');
+           } else {
+               push(@lines, "</DL>\n");
+               &html_pop_if('DD');
+           }
+           &html_pop_if();
+           if (@tables) {
+               ($table_type, $in_table) = split($;, $tables[0]);
+           } else {
+               $in_table = 0;
+           }
+       } elsif (defined($def_map{$end_tag})) {
+           push(@lines, &debug("</DL>\n", __LINE__));
+       } elsif ($end_tag eq 'menu') {
+           &html_pop_if();
+           push(@lines, $_); # must keep it for pass 2
+       }
+       next;
+    }
+    #
+    # misc things
+    #
+    # protect texi and HTML things
+    &protect_texi;
+    $_ = &protect_html($_) unless $dont_html;
+    $dont_html = 0;
+    # substitution (unsupported things)
+    s/^\@center\s+//g;
+    s/^\@exdent\s+//g;
+    s/\@noindent\s+//g;
+    s/\@refill\s+//g;
+    # other substitutions
+    &simple_substitutions;
+    s/\@value{($VARRE)}/$value{$1}/eg;
+    s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
+    #
+    # analyze the tag again
+    #
+    if ($tag) {
+       if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
+           if (/^\@$tag\s+(.+)$/) {
+               $name = $1;
+               $name =~ s/\s+$//;
+               $level = $sec2level{$tag};
+               $name = &update_sec_num($tag, $level) . "  $name"
+                   if $number_sections && $tag !~ /^unnumbered/;
+               if ($tag =~ /heading$/) {
+                   push(@lines, &html_debug("\n", __LINE__));
+                   if ($html_element ne 'body') {
+                       # We are in a nice pickle here. We are trying to get a H? heading
+                       # even though we are not in the body level. So, we convert it to a
+                       # nice, bold, line by itself.
+                       $_ = &debug("\n\n<P><STRONG>$name</STRONG></P>\n\n", __LINE__);
+                   } else {
+                       $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+                       &html_push_if('body');
+                   }
+                   print "# heading, section $name, level $level\n"
+                       if $debug & $DEBUG_TOC;
+               } else {
+                   if ($split_chapter) {
+                       unless ($toplevel) {
+                           # first time we see a "section"
+                           unless ($level == 1) {
+                               warn "$ERROR The first section found is not of level 1: $_";
+                               warn "$ERROR I'll split on sections of level $level...\n";
+                           }
+                           $toplevel = $level;
+                       }
+                       if ($level == $toplevel) {
+                           &next_doc;
+                           push(@lines, $SPLITTAG) if $split_num++;
+                           push(@sections, $name);
+                       }
+                   }
+                   $sec_num++;
+                   $docid = "SEC$sec_num";
+                   $tocid = "TOC$sec_num";
+                   # check biblio and glossary
+                   $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
+                   $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
+                   # check node
+                   if ($node) {
+                       if ($node2sec{$node}) {
+                           warn "$ERROR Duplicate node found: $node\n";
+                       } else {
+                           $node2sec{$node} = $name;
+                           $node2href{$node} = "$docu_doc#$docid";
+                           print "# node $node, section $name, level $level\n"
+                               if $debug & $DEBUG_TOC;
+                       }
+                       $node = '';
+                   } else {
+                       print "# no node, section $name, level $level\n"
+                           if $debug & $DEBUG_TOC;
+                   }
+                   # update TOC
+                   while ($level > $curlevel) {
+                       $curlevel++;
+                       push(@toc_lines, "<UL>\n");
+                   }
+                   while ($level < $curlevel) {
+                       $curlevel--;
+                       push(@toc_lines, "</UL>\n");
+                   }
+                   $_ = "<LI>" . &anchor($tocid, "$docu_doc#$docid", $name, 1);
+                   push(@toc_lines, &substitute_style($_));
+                   # update DOC
+                   push(@lines, &html_debug("\n", __LINE__));
+                   &html_reset;
+                   $_ =  "<H$level>".&anchor($docid, "$docu_toc#$tocid", $name)."</H$level>\n";
+                   $_ = &debug($_, __LINE__);
+                   push(@lines, &html_debug("\n", __LINE__));
+               }
+               # update DOC
+               foreach $line (split(/\n+/, $_)) {
+                   push(@lines, "$line\n");
+               }
+               next;
+           } else {
+               warn "$ERROR Bad section line: $_";
+           }
+       } else {
+           # track variables
+           $value{$1} = $2, next if /^\@set\s+($VARRE)\s+(.*)$/o;
+           delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+           # store things
+           $value{'_setfilename'}   = $1, next if /^\@setfilename\s+(.*)$/;
+           $value{'_settitle'}      = $1, next if /^\@settitle\s+(.*)$/;
+           $value{'_author'}   .= "$1\n", next if /^\@author\s+(.*)$/;
+           $value{'_subtitle'} .= "$1\n", next if /^\@subtitle\s+(.*)$/;
+           $value{'_title'}    .= "$1\n", next if /^\@title\s+(.*)$/;
+           # index
+           if (/^\@(..?)index\s+/) {
+               unless ($valid_index{$1}) {
+                   warn "$ERROR Undefined index command: $_";
+                   next;
+               }
+               $id = 'IDX' . ++$idx_num;
+               $index = $1 . 'index';
+               $what = &substitute_style($');
+               $what =~ s/\s+$//;
+               print "# found $index for '$what' id $id\n"
+                   if $debug & $DEBUG_INDEX;
+               eval(<<EOC);
+               if (defined(\$$index\{\$what\})) {
+                   \$$index\{\$what\} .= "$;$docu_doc#$id";
+               } else {
+                   \$$index\{\$what\} = "$docu_doc#$id";
+               }
+EOC
+               #
+               # dirty hack to see if I can put an invisible anchor...
+               #
+               if ($html_element eq 'P' ||
+                   $html_element eq 'LI' ||
+                   $html_element eq 'DT' ||
+                   $html_element eq 'DD' ||
+                   $html_element eq 'ADDRESS' ||
+                   $html_element eq 'B' ||
+                   $html_element eq 'BLOCKQUOTE' ||
+                   $html_element eq 'PRE' ||
+                   $html_element eq 'SAMP') {
+                    push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+                } elsif ($html_element eq 'body') {
+                   push(@lines, &debug("<P>\n", __LINE__));
+                    push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+                   &html_push('P');
+               } elsif ($html_element eq 'DL' ||
+                        $html_element eq 'UL' ||
+                        $html_element eq 'OL' ) {
+                   $deferred_ref .= &anchor($id, '', $invisible_mark, !$in_pre) . " ";
+               }
+               next;
+           }
+           # list item
+           if (/^\@itemx?\s+/) {
+               $what = $';
+               $what =~ s/\s+$//;
+               if ($in_bibliography && $use_bibliography) {
+                   if ($what =~ /^$BIBRE$/o) {
+                       $id = 'BIB' . ++$bib_num;
+                       $bib2href{$what} = "$docu_doc#$id";
+                       print "# found bibliography for '$what' id $id\n"
+                           if $debug & $DEBUG_BIB;
+                       $what = &anchor($id, '', $what);
+                   }
+               } elsif ($in_glossary && $use_glossary) {
+                   $id = 'GLOSS' . ++$gloss_num;
+                   $entry = $what;
+                   $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+                   $gloss2href{$entry} = "$docu_doc#$id";
+                   print "# found glossary for '$entry' id $id\n"
+                       if $debug & $DEBUG_GLOSS;
+                   $what = &anchor($id, '', $what);
+               }
+               &html_pop_if('P');
+               if ($html_element eq 'DL' || $html_element eq 'DD') {
+                   if ($things_map{$in_table} && !$what) {
+                       # special case to allow @table @bullet for instance
+                       push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
+                   } else {
+                       push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
+                   }
+                   push(@lines, "<DD>");
+                   &html_push('DD') unless $html_element eq 'DD';
+                   if ($table_type) { # add also an index
+                       unshift(@input_spool, "\@${table_type}index $what\n");
+                   }
+               } elsif ($html_element eq 'TABLE') {
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+                   &html_push('TR');
+               } elsif ($html_element eq 'TR') {
+                   push(@lines, &debug("</TR>\n", __LINE__));
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+               } else {
+                   push(@lines, &debug("<LI>$what\n", __LINE__));
+                   &html_push('LI') unless $html_element eq 'LI';
+               }
+               push(@lines, &html_debug("\n", __LINE__));
+               if ($deferred_ref) {
+                   push(@lines, &debug("$deferred_ref\n", __LINE__));
+                   $deferred_ref = '';
+               }
+               next;
+           } elsif (/^\@tab\s+(.*)$/) {
+               push(@lines, "<TD>$1</TD>\n");
+               next;
+           }
+       }
+    }
+    # paragraph separator
+    if ($_ eq "\n") {
+       next if $#lines >= 0 && $lines[$#lines] eq "\n";
+       if ($html_element eq 'P') {
+           push(@lines, "\n");
+           $_ = &debug("</P>\n", __LINE__);
+           &html_pop;
+       }
+    } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') {
+       push(@lines, "<P>\n");
+       &html_push('P');
+       $_ = &debug($_, __LINE__);
+    }
+    # otherwise
+    push(@lines, $_);
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+    $curlevel--;
+    push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $verbose;
+
+#+++############################################################################
+#                                                                              #
+# Pass 2/3: handle style, menu, index, cross-reference                         #
+#                                                                              #
+#---############################################################################
+
+@lines2 = ();                          # whole document (2nd pass)
+@lines3 = ();                          # whole document (3rd pass)
+$in_menu = 0;                          # am I inside a menu
+
+while (@lines) {
+    $_ = shift(@lines);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines2, $_);
+       next;
+    }
+    #
+    # menu
+    #
+    $in_menu = 1, push(@lines2, &debug("<UL>\n", __LINE__)), next if /^\@menu\b/;
+    $in_menu = 0, push(@lines2, &debug("</UL>\n", __LINE__)), next if /^\@end\s+menu\b/;
+    if ($in_menu) {
+       if (/^\*\s+($NODERE)::/o) {
+           $descr = $';
+           chop($descr);
+           &menu_entry($1, $1, $descr);
+       } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) {
+           $descr = $';
+           chop($descr);
+           &menu_entry($1, $2, $descr);
+       } elsif (/^\*/) {
+           warn "$ERROR Bad menu line: $_";
+       } else { # description continued?
+           push(@lines2, $_);
+       }
+       next;
+    }
+    #
+    # printindex
+    #
+    if (/^\@printindex\s+(\w\w)\b/) {
+       local($index, *ary, @keys, $key, $letter, $last_letter, @refs);
+       if ($predefined_index{$1}) {
+           $index = $predefined_index{$1} . 'index';
+       } else {
+           $index = $1 . 'index';
+       }
+       eval("*ary = *$index");
+       @keys = keys(%ary);
+       foreach $key (@keys) {
+           $_ = $key;
+           1 while s/<(\w+)>\`(.*)\&acute;<\/\1>/$2/; # remove HTML tags with quotes
+           1 while s/<(\w+)>(.*)<\/\1>/$2/;     # remove HTML tags
+           $_ = &unprotect_html($_);
+           &unprotect_texi;
+           tr/A-Z/a-z/; # lowercase
+           $key2alpha{$key} = $_;
+           print "# index $key sorted as $_\n"
+               if $key ne $_ && $debug & $DEBUG_INDEX;
+       }
+       push(@lines2, "Jump to:\n");
+       $last_letter = undef;
+       foreach $key (sort byalpha @keys) {
+           $letter = substr($key2alpha{$key}, 0, 1);
+           $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;;
+           if (!defined($last_letter) || $letter ne $last_letter) {
+               push(@lines2, "-\n") if defined($last_letter);
+               push(@lines2, "<A HREF=\"#$index\_$letter\">" . &protect_html($letter) . "</A>\n");
+               $last_letter = $letter;
+           }
+       }
+       push(@lines2, "<P>\n");
+       $last_letter = undef;
+       foreach $key (sort byalpha @keys) {
+           $letter = substr($key2alpha{$key}, 0, 1);
+           $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;;
+           if (!defined($last_letter) || $letter ne $last_letter) {
+               push(@lines2, "</DIR>\n") if defined($last_letter);
+               push(@lines2, "<H2><A NAME=\"$index\_$letter\">" . &protect_html($letter) . "</A></H2>\n");
+               push(@lines2, "<DIR>\n");
+               $last_letter = $letter;
+           }
+           @refs = ();
+           foreach (split(/$;/, $ary{$key})) {
+               push(@refs, &anchor('', $_, $key, 0));
+           }
+           push(@lines2, "<LI>" . join(", ", @refs) . "\n");
+       }
+       push(@lines2, "</DIR>\n") if defined($last_letter);
+       next;
+    }
+    #
+    # simple style substitutions
+    #
+    $_ = &substitute_style($_);
+    #
+    # xref
+    #
+    while (/\@(x|px|info|)ref{($XREFRE)(}?)/o) {
+       # note: Texinfo may accept other characters
+       ($type, $nodes, $full) = ($1, $2, $3);
+       ($before, $after) = ($`, $');
+       if (! $full && $after) {
+           warn "$ERROR Bad xref (no ending } on line): $_";
+           $_ = "$before$;0${type}ref\{$nodes$after";
+           next; # while xref
+       }
+       if ($type eq 'x') {
+           $type = 'See ';
+       } elsif ($type eq 'px') {
+           $type = 'see ';
+       } elsif ($type eq 'info') {
+           $type = 'See Info';
+       } else {
+           $type = '';
+       }
+       unless ($full) {
+           $next = shift(@lines);
+           $next = &substitute_style($next);
+           chop($nodes); # remove final newline
+           if ($next =~ /\}/) { # split on 2 lines
+               $nodes .= " $`";
+               $after = $';
+           } else {
+               $nodes .= " $next";
+               $next = shift(@lines);
+               $next = &substitute_style($next);
+               chop($nodes);
+               if ($next =~ /\}/) { # split on 3 lines
+                   $nodes .= " $`";
+                   $after = $';
+               } else {
+                   warn "$ERROR Bad xref (no ending }): $_";
+                   $_ = "$before$;0xref\{$nodes$after";
+                   unshift(@lines, $next);
+                   next; # while xref
+               }
+           }
+       }
+       $nodes =~ s/\s+/ /g; # remove useless spaces
+       @args = split(/\s*,\s*/, $nodes);
+       $node = $args[0]; # the node is always the first arg
+       &normalise_node($node);
+       $sec = $node2sec{$node};
+       if (@args == 5) { # reference to another manual
+           $sec = $args[2] || $node;
+           $man = $args[4] || $args[3];
+           $_ = "${before}${type}section ‘$sec’ in \@cite{$man}$after";
+       } elsif ($type =~ /Info/) { # inforef
+           warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
+           ($nn, $_, $in) = @args;
+           $_ = "${before}${type} file ‘$in’, node ‘$nn’$after";
+       } elsif ($sec) {
+           $href = $node2href{$node};
+           $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after;
+       } else {
+           warn "$ERROR Undefined node ($node): $_";
+           $_ = "$before$;0xref{$nodes}$after";
+       }
+    }
+    #
+    # try to guess bibliography references or glossary terms
+    #
+    unless (/^<H\d><A NAME=\"SEC\d/) {
+       if ($use_bibliography) {
+           $done = '';
+           while (/$BIBRE/o) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $href = $bib2href{$what};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+       if ($use_glossary) {
+           $done = '';
+           while (/\b\w+\b/) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $entry = $what;
+               $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+               $href = $gloss2href{$entry};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+    }
+    # otherwise
+    push(@lines2, $_);
+}
+print "# end of pass 2\n" if $verbose;
+
+#
+# split style substitutions
+#
+while (@lines2) {
+    $_ = shift(@lines2);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines3, $_);
+       next;
+    }
+    #
+    # split style substitutions
+    #
+    $old = '';
+    while ($old ne $_) {
+        $old = $_;
+       if (/\@(\w+|"|\~|,|\^)\{/) {
+           ($before, $style, $after) = ($`, $1, $');
+           if (defined($style_map{$style})) {
+               $_ = $after;
+               $text = '';
+               $after = '';
+               $failed = 1;
+               while (@lines2) {
+                   if (/\}/) {
+                       $text .= $`;
+                       $after = $';
+                       $failed = 0;
+                       last;
+                   } else {
+                       $text .= $_;
+                       $_ = shift(@lines2);
+                   }
+               }
+               if ($failed) {
+                   die "* Bad syntax (\@$style) after: $before\n";
+               } else {
+                   $text = &apply_style($style, $text);
+                   $_ = "$before$text$after";
+               }
+           }
+       }
+    }
+    # otherwise
+    push(@lines3, $_);
+}
+print "# end of pass 3\n" if $verbose;
+
+#+++############################################################################
+#                                                                              #
+# Pass 4: foot notes, final cleanup                                            #
+#                                                                              #
+#---############################################################################
+
+@foot_lines = ();                      # footnotes
+@doc_lines = ();                       # final document
+$end_of_para = 0;                      # true if last line is <P>
+
+while (@lines3) {
+    $_ = shift(@lines3);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@doc_lines, $_);
+       $end_of_para = 0;
+       next;
+    }
+    #
+    # footnotes
+    #
+    while (/\@footnote([^\{\s]+)\{/) {
+       ($before, $d, $after) = ($`, $1, $');
+       $_ = $after;
+       $text = '';
+       $after = '';
+       $failed = 1;
+       while (@lines3) {
+           if (/\}/) {
+               $text .= $`;
+               $after = $';
+               $failed = 0;
+               last;
+           } else {
+               $text .= $_;
+               $_ = shift(@lines3);
+           }
+       }
+       if ($failed) {
+           die "* Bad syntax (\@footnote) after: $before\n";
+       } else {
+           $foot_num++;
+           $docid  = "DOCF$foot_num";
+           $footid = "FOOT$foot_num";
+           $foot = "($foot_num)";
+           push(@foot_lines, "<H3>" . &anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+           $text = "<P>$text" unless $text =~ /^\s*<P>/;
+           push(@foot_lines, "$text\n");
+           $_ = $before . &anchor($docid, "$docu_foot#$footid", $foot) . $after;
+       }
+    }
+    #
+    # remove unnecessary <P>
+    #
+    if (/^\s*<P>\s*$/) {
+       next if $end_of_para++;
+    } else {
+       $end_of_para = 0;
+    }
+    # otherwise
+    push(@doc_lines, $_);
+}
+print "# end of pass 4\n" if $verbose;
+
+#+++############################################################################
+#                                                                              #
+# Pass 5: print things                                                         #
+#                                                                              #
+#---############################################################################
+
+$header = <<EOT;
+<!-- This HTML file has been created by $THISPROG
+     from $docu on $TODAY -->
+EOT
+
+$full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$title = $value{'_settitle'} || $full_title;
+$_ = &substitute_style($full_title);
+&unprotect_texi;
+s/\n$//; # rmv last \n (if any)
+$full_title = "<H1>" . join("</H1>\n<H1>", split(/\n/, $_)) . "</H1>\n";
+
+#
+# print ToC
+#
+if (!$monolithic && @toc_lines) {
+    if (open(FILE, "> $docu_toc")) {
+       print "# creating $docu_toc...\n" if $verbose;
+       &print_toplevel_header("$title - Table of Contents");
+       &print_ruler;
+       &print(*toc_lines, FILE);
+       &print_toplevel_footer;
+       close(FILE);
+    } else {
+       warn "$ERROR Can't write to $docu_toc: $!\n";
+    }
+}
+
+#
+# print footnotes
+#
+if (!$monolithic && @foot_lines) {
+    if (open(FILE, "> $docu_foot")) {
+       print "# creating $docu_foot...\n" if $verbose;
+       &print_toplevel_header("$title - Footnotes");
+       &print_ruler;
+        &print(*foot_lines, FILE);
+       &print_toplevel_footer;
+       close(FILE);
+    } else {
+       warn "$ERROR Can't write to $docu_foot: $!\n";
+    }
+}
+
+#
+# print document
+#
+if ($split_chapter || $split_node) { # split
+    $doc_num = 0;
+    $last_num = scalar(@sections);
+    $first_doc = &doc_name(1);
+    $last_doc = &doc_name($last_num);
+    while (@sections) {
+       $section = shift(@sections);
+       &next_doc;
+       if (open(FILE, "> $docu_doc")) {
+           print "# creating $docu_doc...\n" if $verbose;
+           &print_header("$title - $section");
+           $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1));
+           $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1));
+           $navigation = "Go to the ";
+           $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first");
+           $navigation .= ", ";
+           $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous");
+           $navigation .= ", ";
+           $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next");
+           $navigation .= ", ";
+           $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last");
+           $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n";
+           print FILE $navigation;
+           &print_ruler;
+           # find corresponding lines
+            @tmp_lines = ();
+            while (@doc_lines) {
+               $_ = shift(@doc_lines);
+               last if ($_ eq $SPLITTAG);
+               push(@tmp_lines, $_);
+           }
+            &print(*tmp_lines, FILE);
+           &print_ruler;
+           print FILE $navigation;
+           &print_footer;
+           close(FILE);
+       } else {
+           warn "$ERROR Can't write to $docu_doc: $!\n";
+       }
+    }
+} else { # not split
+    if (open(FILE, "> $docu_doc")) {
+       print "# creating $docu_doc...\n" if $verbose;
+       if ($monolithic || !@toc_lines) {
+           &print_toplevel_header($title);
+       } else {
+           &print_header($title);
+           print FILE $full_title;
+       }
+       if ($monolithic && @toc_lines) {
+           &print_ruler;
+           print FILE "<H1>Table of Contents</H1>\n";
+           &print(*toc_lines, FILE);
+       }
+       &print_ruler;
+        &print(*doc_lines, FILE);
+       if ($monolithic && @foot_lines) {
+           &print_ruler;
+           print FILE "<H1>Footnotes</H1>\n";
+           &print(*foot_lines, FILE);
+       }
+       if ($monolithic || !@toc_lines) {
+           &print_toplevel_footer;
+       } else {
+           &print_footer;
+       }
+       close(FILE);
+    } else {
+       warn "$ERROR Can't write to $docu_doc: $!\n";
+    }
+}
+
+print "# that's all folks\n" if $verbose;
+
+#+++############################################################################
+#                                                                              #
+# Low level functions                                                          #
+#                                                                              #
+#---############################################################################
+
+sub update_sec_num {
+    local($name, $level) = @_;
+
+    $level--; # here we start at 0
+    if ($name =~ /^appendix/) {
+       # appendix style
+       if (defined(@appendix_sec_num)) {
+           &incr_sec_num($level, @appendix_sec_num);
+       } else {
+           @appendix_sec_num = ('A', 0, 0, 0);
+       }
+       return(join('.', @appendix_sec_num[0..$level]));
+    } else {
+       # normal style
+       if (defined(@normal_sec_num)) {
+           &incr_sec_num($level, @normal_sec_num);
+       } else {
+           @normal_sec_num = (1, 0, 0, 0);
+       }
+       return(join('.', @normal_sec_num[0..$level]));
+    }
+}
+
+sub incr_sec_num {
+    local($level, $l);
+    $level = shift(@_);
+    $_[$level]++;
+    foreach $l ($level+1 .. 3) {
+       $_[$l] = 0;
+    }
+}
+
+sub check {
+    local($_, %seen, %context, $before, $match, $after);
+
+    while (<>) {
+       if (/\@(\*|\.|\:|\@|\{|\})/) {
+           $seen{$&}++;
+           $context{$&} .= "> $_" if $verbose;
+           $_ = "$`XX$'";
+           redo;
+       }
+       if (/\@(\w+)/) {
+           ($before, $match, $after) = ($`, $&, $');
+           if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
+               $seen{'e-mail address'}++;
+               $context{'e-mail address'} .= "> $_" if $verbose;
+           } else {
+               $seen{$match}++;
+               $context{$match} .= "> $_" if $verbose;
+           }
+           $match =~ s/^\@/X/;
+           $_ = "$before$match$after";
+           redo;
+       }
+    }
+    
+    foreach (sort(keys(%seen))) {
+       if ($verbose) {
+           print "$_\n";
+           print $context{$_};
+       } else {
+           print "$_ ($seen{$_})\n";
+       }
+    }
+}
+
+sub open {
+    local($name) = @_;
+
+    ++$fh_name;
+    if (open($fh_name, $name)) {
+       unshift(@fhs, $fh_name);
+    } else {
+       warn "$ERROR Can't read file $name: $!\n";
+    }
+}
+
+sub init_input {
+    @fhs = ();                 # hold the file handles to read
+    @input_spool = ();         # spooled lines to read
+    $fh_name = 'FH000';
+    &open($docu);
+}
+
+sub next_line {
+    local($fh, $line);
+
+    if (@input_spool) {
+       $line = shift(@input_spool);
+       return($line);
+    }
+    while (@fhs) {
+       $fh = $fhs[0];
+       $line = <$fh>;
+       return($line) if $line;
+       close($fh);
+       shift(@fhs);
+    }
+    return(undef);
+}
+
+# used in pass 1, use &next_line
+sub skip_until {
+    local($tag) = @_;
+    local($_);
+
+    while ($_ = &next_line) {
+       return if /^\@end\s+$tag\s*$/;
+    }
+    die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+#
+# HTML stacking to have a better HTML output
+#
+
+sub html_reset {
+    @html_stack = ('html');
+    $html_element = 'body';
+}
+
+sub html_push {
+    local($what) = @_;
+    push(@html_stack, $html_element);
+    $html_element = $what;
+}
+
+sub html_push_if {
+    local($what) = @_;
+    push(@html_stack, $html_element)
+       if ($html_element && $html_element ne 'P');
+    $html_element = $what;
+}
+
+sub html_pop {
+    $html_element = pop(@html_stack);
+}
+
+sub html_pop_if {
+    local($elt);
+
+    if (@_) {
+       foreach $elt (@_) {
+           if ($elt eq $html_element) {
+               $html_element = pop(@html_stack) if @html_stack;
+               last;
+           }
+       }
+    } else {
+       $html_element = pop(@html_stack) if @html_stack;
+    }
+}
+
+sub html_debug {
+    local($what, $line) = @_;
+    return("<!-- $line @html_stack, $html_element -->$what")
+       if $debug & $DEBUG_HTML;
+    return($what);
+}
+
+# to debug the output...
+sub debug {
+    local($what, $line) = @_;
+    return("<!-- $line -->$what")
+       if $debug & $DEBUG_HTML;
+    return($what);
+}
+
+sub normalise_node {
+    $_[0] =~ s/\s+/ /g;
+    $_[0] =~ s/ $//;
+    $_[0] =~ s/^ //;
+}
+
+sub menu_entry {
+    local($entry, $node, $descr) = @_;
+    local($href);
+
+    &normalise_node($node);
+    $href = $node2href{$node};
+    if ($href) {
+       $descr =~ s/^\s+//;
+       $descr = ": $descr" if $descr;
+       push(@lines2, "<LI>" . &anchor('', $href, $entry) . "$descr\n");
+    } else {
+       warn "$ERROR Undefined node ($node): $_";
+    }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_email {
+    local($addr, $text) = split(/,\s*/, $_[0]);
+
+    $text = $addr unless $text;
+    &anchor('', "mailto:$addr", $text);
+}
+
+sub do_sc { "\U$_[0]\E" }
+
+sub do_uref {
+    local($url, $text) = split(/,\s*/, $_[0]);
+
+    $text = $url unless $text;
+    &anchor('', $url, $text);
+}
+
+sub do_url { &anchor('', $_[0], $_[0]) }
+
+sub do_diaeresis { return "&$_[0]uml;"; }
+sub do_acuteaccent { return "&$_[0]acute;"; }
+sub do_graveaccent { return "&$_[0]grave;"; }
+sub do_tildeaccent { return "&$_[0]tilde;"; }
+sub do_cedilla { return "&$_[0]cedil;"; }
+sub do_circumflex { return "&$_[0]circ;"; }
+
+sub apply_style {
+    local($texi_style, $text) = @_;
+    local($style);
+
+    $style = $style_map{$texi_style};
+    if (defined($style)) { # known style
+       if ($style =~ /^\"/) { # add quotes
+           $style = $';
+           $text = "\&lsquo;$text\&rsquo;";
+       }
+       if ($style =~ /^\&/) { # custom
+           $style = $';
+           $text = &$style($text);
+       } elsif ($style) { # good style
+           $text = "<$style>$text</$style>";
+       } else { # no style
+       }
+    } else { # unknown style
+       $text = undef;
+    }
+    return($text);
+}
+
+# remove Texinfo styles
+sub remove_style {
+    local($_) = @_;
+    s/\@\w+{([^\{\}]+)}/$1/g;
+    return($_);
+}
+
+sub substitute_style {
+    local($_) = @_;
+    local($changed, $done, $style, $text);
+
+    $changed = 1;
+    while ($changed) {
+       $changed = 0;
+       $done = '';
+       while (/\@(\w+|"|\~|,|\^){([^\{\}]+)}/) {
+           $text = &apply_style($1, $2);
+           if ($text) {
+               $_ = "$`$text$'";
+               $changed = 1;
+           } else {
+               $done .= "$`\@$1";
+               $_ = "{$2}$'";
+           }
+       }
+        $_ = $done . $_;
+    }
+    return($_);
+}
+
+sub anchor {
+    local($name, $href, $text, $newline) = @_;
+    local($result);
+
+    $result = "<A";
+    $result .= " NAME=\"$name\"" if $name;
+    $result .= " HREF=\"$href\"" if $href;
+    $result .= ">$text</A>";
+    $result .= "\n" if $newline;
+    return($result);
+}
+
+sub pretty_date {
+    local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    @MoY = ('January', 'February', 'March', 'April', 'May', 'June',
+           'July', 'August', 'September', 'October', 'November', 'December');
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    $year += ($year < 70) ? 2000 : 1900;
+    return("$mday $MoY[$mon] $year");
+}
+
+sub doc_name {
+    local($num) = @_;
+
+    return("${docu_name}_$num.html");
+}
+
+sub next_doc {
+    $docu_doc = &doc_name(++$doc_num);
+}
+
+sub print {
+    local(*lines, $fh) = @_;
+    local($_);
+
+    while (@lines) {
+       $_ = shift(@lines);
+       if (/^$PROTECTTAG/o) {
+           $_ = $tag2pro{$_};
+       } else {
+           &unprotect_texi;
+       }
+       print $fh $_;
+    }
+}
+
+sub print_ruler {
+    print FILE "<P><HR><P>\n";
+}
+
+sub print_header {
+    local($_);
+
+    # clean the title
+    $_ = &remove_style($_[0]);
+    &unprotect_texi;
+    # print the header
+    if ($doctype eq 'html2') {
+       print FILE $html2_doctype;
+    } elsif ($doctype) {
+       print FILE $doctype;
+    }
+    print FILE <<EOT;
+<HTML>
+<HEAD>
+$header
+<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
+<TITLE>$_</TITLE>
+</HEAD>
+<BODY>
+EOT
+}
+
+sub print_toplevel_header {
+    local($_);
+
+    &print_header; # pass given arg...
+    print FILE $full_title;
+    if ($value{'_subtitle'}) {
+       $value{'_subtitle'} =~ s/\n+$//;
+       foreach (split(/\n/, $value{'_subtitle'})) {
+           $_ = &substitute_style($_);
+           &unprotect_texi;
+           print FILE "<H2>$_</H2>\n";
+       }
+    }
+    if ($value{'_author'}) {
+       $value{'_author'} =~ s/\n+$//;
+       foreach (split(/\n/, $value{'_author'})) {
+           $_ = &substitute_style($_);
+           &unprotect_texi;
+           s/[\w.-]+\@[\w.-]+/<A HREF="mailto:$&">$&<\/A>/g;
+           print FILE "<ADDRESS>$_</ADDRESS>\n";
+       }
+    }
+    print FILE "<P>\n";
+}
+
+sub print_footer {
+    print FILE <<EOT;
+</BODY>
+</HTML>
+EOT
+}
+
+sub print_toplevel_footer {
+    &print_ruler;
+    print FILE <<EOT;
+This document was generated on $TODAY using the
+<A HREF=\"$HOMEPAGE\">texi2html</A>
+translator version 1.52b.</P>
+EOT
+    &print_footer;
+}
+
+sub protect_texi {
+    # protect @ { } ` '
+    s/\@\@/$;0/go;
+    s/\@\{/$;1/go;
+    s/\@\}/$;2/go;
+    s/\@\`/$;3/go;
+    s/\@\'/$;4/go;
+}
+
+sub protect_html {
+    local($what) = @_;
+    # protect & < >
+    $what =~ s/\&/\&\#38;/g;
+    $what =~ s/\</\&\#60;/g;
+    $what =~ s/\>/\&\#62;/g;
+    # but recognize some HTML things
+    $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g;            # </A>
+    $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g;     # <A [^&]+>
+    $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
+    return($what);
+}
+
+sub unprotect_texi {
+    s/$;0/\@/go;
+    s/$;1/\{/go;
+    s/$;2/\}/go;
+    s/$;3/\`/go;
+    s/$;4/\'/go;
+}
+
+sub unprotect_html {
+    local($what) = @_;
+    $what =~ s/\&\#38;/\&/g;
+    $what =~ s/\&\#60;/\</g;
+    $what =~ s/\&\#62;/\>/g;
+    return($what);
+}
+
+sub byalpha {
+    $key2alpha{$a} cmp $key2alpha{$b};
+}
+
+##############################################################################
+
+       # These next few lines are legal in both Perl and nroff.
+
+.00 ;                  # finish .ig
+'di                    \" finish diversion--previous line must be blank
+.nr nl 0-1             \" fake up transition to first page again
+.nr % 0                        \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+.TH TEXI2HTML 1 "01/05/98"
+.AT 3
+.SH NAME
+texi2html \- a Texinfo to HTML converter
+.SH SYNOPSIS
+.B texi2html [options] file
+.PP
+.B texi2html -check [-verbose] files
+.SH DESCRIPTION
+.I Texi2html
+converts the given Texinfo file to a set of HTML files. It tries to handle
+most of the Texinfo commands. It creates hypertext links for cross-references,
+footnotes...
+.PP
+It also tries to add links from a reference to its corresponding entry in the
+bibliography (if any). It may also handle a glossary (see the
+.B \-glossary
+option).
+.PP
+.I Texi2html
+creates several files depending on the contents of the Texinfo file and on
+the chosen options (see FILES).
+.PP
+The HTML files created by
+.I texi2html
+are closer to TeX than to Info, that's why
+.I texi2html
+converts @ifhtml sections and not @ifinfo or @iftex ones by default. You can
+change this with the \-expandinfo or \-expandtex options.
+.SH OPTIONS
+.TP 12
+.B \-check
+Check the given file and give the list of all things that may be Texinfo commands.
+This may be used to check the output of
+.I texi2html
+to find the Texinfo commands that have been left in the HTML file.
+.TP
+.B \-expandinfo
+Expand @ifinfo sections, not @ifhtml ones.
+.TP
+.B \-expandtex
+Expand @iftex sections, not @ifhtml ones.
+.TP
+.B \-glossary
+Use the section named 'Glossary' to build a list of terms and put links in the HTML
+document from each term toward its definition.
+.TP
+.B \-invisible \fIname\fP
+Use \fIname\fP to create invisible destination anchors for index links
+(you can for instance use the invisible.xbm file shipped with this program).
+This is a workaround for a known bug of many WWW browsers, including netscape.
+.TP
+.B \-I \fIdir\fP
+Look also in \fIdir\fP to find included files.
+.TP
+.B \-menu
+Show the Texinfo menus; by default they are ignored.
+.TP
+.B \-monolithic
+Output only one file, including the table of contents and footnotes.
+.TP
+.B \-number
+Number the sections.
+.TP
+.B \-split_chapter
+Split the output into several HTML files (one per main section:
+chapter, appendix...).
+.TP
+.B \-split_node
+Split the output into several HTML files (one per node).
+.TP
+.B \-usage
+Print usage instructions, listing the current available command-line options.
+.TP
+.B \-verbose
+Give a verbose output. Can be used with the
+.B \-check
+option.
+.PP
+.SH FILES
+By default
+.I texi2html
+creates the following files (foo being the name of the Texinfo file):
+.TP 16
+.B foo_toc.html
+The table of contents.
+.TP
+.B foo.html
+The document's contents.
+.TP
+.B foo_foot.html
+The footnotes (if any).
+.PP
+When used with the
+.B \-split
+option, it creates several files (one per chapter or node), named
+.B foo_n.html
+(n being the indice of the chapter or node), instead of the single
+.B foo.html
+file.
+.PP
+When used with the
+.B \-monolithic
+option, it creates only one file:
+.B foo.html
+.SH VARIABLES
+.I texi2html
+predefines the following variables: \fBhtml\fP, \fBtexi2html\fP.
+.SH ADDITIONAL COMMANDS
+.I texi2html
+implements the following non-Texinfo commands (maybe they are in Texinfo now...):
+.TP 16
+.B @ifhtml
+This indicates the start of an HTML section, this section will passed through
+without any modification.
+.TP
+.B @end ifhtml
+This indicates the end of an HTML section.
+.SH VERSION
+This is \fItexi2html\fP version 1.52b, 01/05/98.
+.PP
+The latest version of \fItexi2html\fP can be found in WWW, cf. URL
+http://wwwinfo.cern.ch/dis/texi2html/
+.SH AUTHOR
+The main author is Lionel Cons, CERN IT/DIS/OSE, Lionel.Cons@cern.ch.
+Many other people around the net contributed to this program.
+.SH COPYRIGHT
+This program is the intellectual property of the European
+Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is
+provided by CERN. No liability whatsoever is accepted for any loss or damage
+of any kind resulting from any defect or inaccuracy in this information or
+code.
+.PP
+CERN, 1211 Geneva 23, Switzerland
+.SH "SEE ALSO"
+GNU Texinfo Documentation Format,
+HyperText Markup Language (HTML),
+World Wide Web (WWW).
+.SH BUGS
+This program does not understand all Texinfo commands (yet).
+.ex
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
new file mode 100644 (file)
index 0000000..bac0726
--- /dev/null
@@ -0,0 +1,8997 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2008-04-18.10}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file 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.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <http://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+\let\ptextop=\top
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar  = `\-
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar  = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.  The solution is
+% described on page 260 of The TeXbook.  It involves outputting two
+% marks for the sectioning macros, one before the section break, and
+% one after.  I won't pretend I can describe this better than DEK...
+\def\domark{%
+  \toks0=\expandafter{\lastchapterdefs}%
+  \toks2=\expandafter{\lastsectiondefs}%
+  \toks4=\expandafter{\prevchapterdefs}%
+  \toks6=\expandafter{\prevsectiondefs}%
+  \toks8=\expandafter{\lastcolordefs}%
+  \mark{%
+                   \the\toks0 \the\toks2
+      \noexpand\or \the\toks4 \the\toks6
+    \noexpand\else \the\toks8
+  }%
+}
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+  \ifcase0\topmark\fi
+  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be 
+               % {\code {{\tt \backslashcurfont }acronym}
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \indexdummies
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%      is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+% 
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n   outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  % make the texinfo accent commands work in math mode
+  \let\"=\ddot
+  \let\'=\acute
+  \let\==\bar
+  \let\^=\hat
+  \let\`=\grave
+  \let\u=\breve
+  \let\v=\check
+  \let\~=\tilde
+  \let\dotaccent=\dot
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% Some math mode symbols.
+\def\bullet{$\ptexbullet$}
+\def\geq{\ifmmode \ge\else $\ge$\fi}
+\def\leq{\ifmmode \le\else $\le$\fi}
+\def\minus{\ifmmode -\else $-$\fi}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \iflinks
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   \openin 1 texinfo.cnf
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+% 
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+   @catcode`@\=@active
+   @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters.  hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo.  It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+% 
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+% 
+\def\HyPsdSubst#1#2#3{%
+  \def\HyPsdReplace##1#1##2\END{%
+    ##1%
+    \ifx\\##2\\%
+    \else
+      #2%
+      \HyReturnAfterFi{%
+        \HyPsdReplace##2\END
+      }%
+    \fi
+  }%
+  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+  \xdef#1{#1}% redefine it as its expansion; the definition is simply
+             % \lastnode when called from \setref -> \pdfmkdest.
+  \HyPsdSubst{(}{\realbackslash(}{#1}%
+  \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  %
+  % Color manipulation macros based on pdfcolor.tex.
+  \def\cmykDarkRed{0.28 1 1 0.35}
+  \def\cmykBlack{0 0 0 1}
+  %
+  \def\pdfsetcolor#1{\pdfliteral{#1 k}}
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\cmykBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\lastcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  %
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+    % others).  Let's try in that order.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.png \ifeof 1
+        \openin 1 #1.jpg \ifeof 1
+          \openin 1 #1.jpeg \ifeof 1
+            \openin 1 #1.JPG \ifeof 1
+              \openin 1 #1.pdf \ifeof 1
+                \openin 1 #1.PDF \ifeof 1
+                  \errhelp = \nopdfimagehelp
+                  \errmessage{Could not find image file #1 for pdf}%
+                \else \gdef\pdfimgext{PDF}%
+                \fi
+              \else \gdef\pdfimgext{pdf}%
+              \fi
+            \else \gdef\pdfimgext{JPG}%
+            \fi
+          \else \gdef\pdfimgext{jpeg}%
+          \fi
+        \else \gdef\pdfimgext{jpg}%
+        \fi
+      \else \gdef\pdfimgext{png}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, ancient pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \imagewidth \fi
+      \ifdim \wd2 >0pt height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \turnoffactive
+    \activebackslashdouble
+    \makevalueexpandable
+    \def\pdfdestname{#1}%
+    \backslashparens\pdfdestname
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }}
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use a color that is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.
+  \def\urlcolor{\cmykDarkRed}
+  \def\linkcolor{\cmykDarkRed}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      % Doubled backslashes in the name.
+      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+       \backslashparens\pdfoutlinedest}%
+    \fi
+    %
+    % Also double the backslashes in the display string.
+    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+     \backslashparens\pdfoutlinetext}%
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Thanh's hack / proper braces in bookmarks
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+       \def\thischapnum{##2}%
+       \def\thissecnum{0}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+       \advancenumber{chap\thischapnum}%
+       \def\thissecnum{##2}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+       \advancenumber{sec\thissecnum}%
+       \def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+       \advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \setupdatafile
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      % 
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      \leavevmode\setcolor{\urlcolor}%
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\setcolor = \gobble
+  \let\pdfsetcolor = \gobble
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\def\setleading#1{%
+  \dimen0 = #1\relax
+  \normalbaselineskip = \baselinefactor\dimen0
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\undefined \else
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+% emacs-page end of cmaps
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  This is the default in
+% Texinfo.
+% 
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+% 
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12 
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+% 
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  \wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  % 
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}{OT1}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+\def\key #1{{\nohyphenation \uppercase{#1}}\null}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  %
+  \global\def\code{\begingroup
+    \catcode\rquoteChar=\active \catcode\lquoteChar=\active
+    \let'\codequoteright \let`\codequoteleft
+    %
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\realdash
+     \let_\realunder
+    \fi
+    \codex
+  }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general.  @allowcodebreaks provides a way to control this.
+% 
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+  \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% Hacks for glyphs from the EC fonts similar to \euro.  We don't
+% use \let for the aliases, because sometimes we redefine the original
+% macro, and the alias should reflect the redefinition.
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+\def\ecfont{%
+  % We can't distinguish serif/sanserif and italic/slanted, but this
+  % is used for crude hacks anyway (like adding French and German
+  % quotes to documents typeset with CM, where we lose kerning), so
+  % hopefully nobody will notice/care.
+  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+  \ifx\curfontstyle\bfstylename
+    % bold:
+    \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
+  \else
+    % regular:
+    \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+  \fi
+  \thisecfont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+% 
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+        \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+       \finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+               \let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top     \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
+                          \headingmarks{odd}{heading}{#1} }
+\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
+                          \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+  \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%                                      --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+       % Maybe so, but it also creates really weird page breaks when the
+       % table breaks over pages. Wouldn't \vfil be better?  Wait until the
+       % problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+       % The first column will be indented with the surrounding text.
+       \advance\hsize by\leftskip
+      \else
+       \ifsetpercent \else
+         % If user has not set preamble in terms of percent of \hsize
+         % we will advance \hsize by \multitablecolspace.
+         \advance\hsize by \multitablecolspace
+       \fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty                      % Nothing found.
+    \let\next\doignoretextzzz
+  \else                                        % Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy          % ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0     % We have just found the outermost @end.
+    \let\next\enddoignore
+  \else                                % Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  %
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % I don't entirely understand this, but when an index entry is
+  % generated from a macro call, the \endinput which \scanmacro inserts
+  % causes processing to be prematurely terminated.  This is,
+  % apparently, because \indexsorttmp is fully expanded, and \endinput
+  % is an expandable command.  The redefinition below makes \endinput
+  % disappear altogether for that purpose -- although logging shows that
+  % processing continues to some further point.  On the other hand, it
+  % seems \endinput does not hurt in the printed index arg, since that
+  % is still getting written without apparent harm.
+  % 
+  % Sample source (mac-idx3.tex, reported by Graham Percival to
+  % help-texinfo, 22may06):
+  % @macro funindex {WORD}
+  % @findex xyz
+  % @end macro
+  % ...
+  % @funindex commtest
+  % 
+  % The above is not enough to reproduce the bug, but it gives the flavor.
+  % 
+  % Sample whatsit resulting:
+  % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+  % 
+  % So:
+  \let\endinput = \empty
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+  \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control% words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\L
+  \definedummyword\OE
+  \definedummyword\O
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\l
+  \definedummyword\oe
+  \definedummyword\o
+  \definedummyword\ss
+  \definedummyword\exclamdown
+  \definedummyword\questiondown
+  \definedummyword\ordf
+  \definedummyword\ordm
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\guillemetleft
+  \definedummyword\guillemetright
+  \definedummyword\guilsinglleft
+  \definedummyword\guilsinglright
+  \definedummyword\expansion
+  \definedummyword\minus
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\quotedblbase
+  \definedummyword\quotedblleft
+  \definedummyword\quotedblright
+  \definedummyword\quoteleft
+  \definedummyword\quoteright
+  \definedummyword\quotesinglbase
+  \definedummyword\result
+  \definedummyword\textdegree
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \definedummyletter\!%
+  \definedummyaccent\"%
+  \definedummyaccent\'%
+  \definedummyletter\*%
+  \definedummyaccent\,%
+  \definedummyletter\.%
+  \definedummyletter\/%
+  \definedummyletter\:%
+  \definedummyaccent\=%
+  \definedummyletter\?%
+  \definedummyaccent\^%
+  \definedummyaccent\`%
+  \definedummyaccent\~%
+  \definedummyword\u
+  \definedummyword\v
+  \definedummyword\H
+  \definedummyword\dotaccent
+  \definedummyword\ringaccent
+  \definedummyword\tieaccent
+  \definedummyword\ubaraccent
+  \definedummyword\udotaccent
+  \definedummyword\dotless
+  %
+  % Texinfo font commands.
+  \definedummyword\b
+  \definedummyword\i
+  \definedummyword\r
+  \definedummyword\sc
+  \definedummyword\t
+  %
+  % Commands that take arguments.
+  \definedummyword\acronym
+  \definedummyword\cite
+  \definedummyword\code
+  \definedummyword\command
+  \definedummyword\dfn
+  \definedummyword\emph
+  \definedummyword\env
+  \definedummyword\file
+  \definedummyword\kbd
+  \definedummyword\key
+  \definedummyword\math
+  \definedummyword\option
+  \definedummyword\pxref
+  \definedummyword\ref
+  \definedummyword\samp
+  \definedummyword\strong
+  \definedummyword\tie
+  \definedummyword\uref
+  \definedummyword\url
+  \definedummyword\var
+  \definedummyword\verb
+  \definedummyword\w
+  \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % Hopefully, all control words can become @asis.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\guillemetleft{<<}%
+  \def\guillemetright{>>}%
+  \def\guilsinglleft{<}%
+  \def\guilsinglright{>}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\quotedblbase{"}%
+  \def\quotedblleft{"}%
+  \def\quotedblright{"}%
+  \def\quoteleft{`}%
+  \def\quoteright{'}%
+  \def\quotesinglbase{,}%
+  \def\result{=>}%
+  \def\textdegree{degrees}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  % 
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  % 
+  \macrolist
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \safewhatsit\dosubindwrite
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+  }%
+  \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+  #1%
+\else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\whatsitskip glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\backslashcurfont}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%      \def\entry#1#2{...
+% But this freezes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
+    %
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
+    %
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \setbox\boxA = \hbox{#1}%
+    \ifdim\wd\boxA = 0pt
+      \ %
+    \else
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+       \pdfgettoks#1.%
+       \ \the\toksA
+      \else
+       \ #1%
+      \fi
+    \fi
+    \par
+  \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \pageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter.  Page headings and footings can use
+% these.  @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+       \errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+       \unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+         \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+         \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:                --kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong.  But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+  \chappager
+  \ifodd\pageno \else
+    \begingroup
+      \evenheadline={\hfil}\evenfootline={\hfil}%
+      \oddheadline={\hfil}\oddfootline={\hfil}%
+      \hbox to 0pt{}%
+      \chappager
+    \endgroup
+  \fi
+}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+  % Insert the first mark before the heading break (see notes for \domark).
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+                        \gdef\thissection{}}%
+  %
+  \def\temptype{#2}%
+  \ifx\temptype\Ynothingkeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{\thischaptername}}%
+  \else\ifx\temptype\Yomitfromtockeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{}}%
+  \else\ifx\temptype\Yappendixkeyword
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\appendixletter}%
+      \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \else
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\the\chapno}%
+      \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \fi\fi\fi
+  %
+  % Output the mark.  Pass it through \safewhatsit, to take care of
+  % the preceding space.
+  \safewhatsit\domark
+  %
+  % Insert the chapter heading break.
+  \pchapsepmacro
+  %
+  % Now the second mark, after the heading break.  No break points
+  % between here and the heading.
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \domark
+  %
+  {%
+    \chapfonts \rm
+    %
+    % Have to define \lastsection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\lastsection{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \nobreak % Avoid page breaks at the interline glue.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    % Insert first mark before the heading break (see notes for \domark).
+    \let\prevsectiondefs=\lastsectiondefs
+    \ifx\temptype\Ynothingkeyword
+      \ifx\sectionlevel\seckeyword
+        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+                              \gdef\thissection{\thissectionname}}%
+      \fi
+    \else\ifx\temptype\Yomitfromtockeyword
+      % Don't redefine \thissection.
+    \else\ifx\temptype\Yappendixkeyword
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \else
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \fi\fi\fi
+    %
+    % Output the mark.  Pass it through \safewhatsit, to take care of
+    % the preceding space.
+    \safewhatsit\domark
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Now the second mark, after the heading break.  No break points
+    % between here and the heading.
+    \let\prevsectiondefs=\lastsectiondefs
+    \domark
+    %
+    % Only insert the space after the number if we have a section number.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\lastsection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \lastsection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\lastsection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\lastsection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+% 
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+% 
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % outer
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+                               % side, and for 6pt waste from
+                               % each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+         \hskip\lskip
+         \vrule\kern3pt
+         \vbox\bgroup
+             \kern3pt
+             \hsize=\cartinner
+             \baselineskip=\normbskip
+             \lineskip=\normlskip
+             \parskip=\normpskip
+             \vskip -\parskip
+             \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+             \kern3pt
+         \egroup
+         \kern3pt\vrule
+         \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+  \nonfillstart
+  \tt\quoteexpand
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d).  The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report.  xpdf does work with the
+% regular 0x27.  
+% 
+\def\codequoteright{%
+  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+      '%
+    \else \char'15 \fi
+  \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+% 
+\def\codequoteleft{%
+  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+      `%
+    \else \char'22 \fi
+  \else \char'22 \fi
+}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+  \catcode`\'=\active
+  \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
+  %
+  \catcode`\`=\active
+  \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
+  %
+  \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  \quoteexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a minor refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+  \message{Warning: unbalanced parentheses in @def...}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \message{Warning: unbalanced square brackets in @def...}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+\def\scanmacro#1{%
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.                            --kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %                                                  --kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+       \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+         ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\lastsection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+    }%
+  \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    {\indexnofonts
+     \turnoffactive
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.
+     \getfilename{#4}%
+     %
+     % See comments at \activebackslashdouble.
+     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+      \backslashparens\pdfxrefdest}%
+     %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
+     \ifnum\filenamelength>0
+       goto file{\the\filename.pdf} name{\pdfxrefdest}%
+     \else
+       goto name{\pdfmkpgn{\pdfxrefdest}}%
+     \fi
+    }%
+    \setcolor{\linkcolor}%
+  \fi
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+    % insert empty discretionaries after hyphens, which means that it will
+    % not find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens, this
+    % is a loss.  Therefore, we give the text of the node name again, so it
+    % is as if TeX is seeing it for the first time.
+    \ifdim \wd1 > 0pt
+      \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+    \else
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% The node name might contain 8-bit characters, which in our current
+   % implementation are changed to commands like @'e.  Don't let these
+   % mess up the control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
+  {%
+    \count1=128
+    \def\loop{%
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
+    }%
+  }%
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\medskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+  \fi
+  %
+  % Leave vertical mode so that indentation from an enclosing
+  % environment such as @quotation is respected.  On the other hand, if
+  % it's at the top level, we don't want the normal paragraph indentation.
+  \noindent
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \medskip \fi  % space after the standalone image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \lastsection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\lastsection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+       \appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        %
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+       \scanexp{%
+         \xdef\noexpand\gtemp{%
+           \ifx\thisshortcaption\empty
+             \thiscaption
+           \else
+             \thisshortcaption
+           \fi
+         }%
+       }%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+         \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start floating, we have to issue warning
+  % whenever an insert appears inside a float which could possibly
+  % float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language (de) or locale (de_DE)
+% abbreviation.  It would be nice if we could set up a hyphenation file.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{\begingroup
+  \let_=\normalunderscore  % normal _ character for filenames
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore{#1_\finish}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup
+\endgroup}
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+% 
+\def\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone 
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \setnonasciicharscatcode\active
+     \utfeightchardefs
+  %
+  \else 
+    \message{Unknown document encoding #1, ignoring.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+% 
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdef^^a0{~} 
+  \gdef^^a1{\exclamdown}
+  \gdef^^a2{\missingcharmsg{CENT SIGN}} 
+  \gdef^^a3{{\pounds}}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\missingcharmsg{YEN SIGN}}
+  \gdef^^a6{\missingcharmsg{BROKEN BAR}} 
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}} 
+  \gdef^^a9{\copyright} 
+  \gdef^^aa{\ordf}
+  \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} 
+  \gdef^^ac{$\lnot$}
+  \gdef^^ad{\-} 
+  \gdef^^ae{\registeredsymbol} 
+  \gdef^^af{\={}}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{$\pm$}
+  \gdef^^b2{$^2$}
+  \gdef^^b3{$^3$}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{$\mu$}
+  \gdef^^b6{\P}
+  %
+  \gdef^^b7{$^.$}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{$^1$}
+  \gdef^^ba{\ordm}
+  %
+  \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+  \gdef^^bc{$1\over4$}
+  \gdef^^bd{$1\over2$}
+  \gdef^^be{$3\over4$}
+  \gdef^^bf{\questiondown}
+  %
+  \gdef^^c0{\`A}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\~A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\ringaccent A} 
+  \gdef^^c6{\AE}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\`E}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\^E}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\`I}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\"I}
+  %
+  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+  \gdef^^d1{\~N}
+  \gdef^^d2{\`O}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\~O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\O}
+  \gdef^^d9{\`U}
+  \gdef^^da{\'U}
+  \gdef^^db{\^U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\`a}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\~a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\ringaccent a}
+  \gdef^^e6{\ae}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\`e}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\^e}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\`{\dotless i}}
+  \gdef^^ed{\'{\dotless i}}
+  \gdef^^ee{\^{\dotless i}}
+  \gdef^^ef{\"{\dotless i}}
+  %
+  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+  \gdef^^f1{\~n}
+  \gdef^^f2{\`o}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\~o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\o}
+  \gdef^^f9{\`u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\^u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+  \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdef^^a4{\euro}
+  \gdef^^a6{\v S}
+  \gdef^^a8{\v s}
+  \gdef^^b4{\v Z}
+  \gdef^^b8{\v z}
+  \gdef^^bc{\OE}
+  \gdef^^bd{\oe}
+  \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdef^^a0{~}
+  \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+  \gdef^^a2{\u{}}
+  \gdef^^a3{\L}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\v L}
+  \gdef^^a6{\'S}
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}}
+  \gdef^^a9{\v S}
+  \gdef^^aa{\cedilla S}
+  \gdef^^ab{\v T}
+  \gdef^^ac{\'Z}
+  \gdef^^ad{\-}
+  \gdef^^ae{\v Z}
+  \gdef^^af{\dotaccent Z}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
+  \gdef^^b2{\missingcharmsg{OGONEK}}
+  \gdef^^b3{\l}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{\v l}
+  \gdef^^b6{\'s}
+  \gdef^^b7{\v{}}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{\v s}
+  \gdef^^ba{\cedilla s}
+  \gdef^^bb{\v t}
+  \gdef^^bc{\'z}
+  \gdef^^bd{\H{}}
+  \gdef^^be{\v z}
+  \gdef^^bf{\dotaccent z}
+  %
+  \gdef^^c0{\'R}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\u A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\'L}
+  \gdef^^c6{\'C}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\v C}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\v E}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\v D}
+  %
+  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}}
+  \gdef^^d1{\'N}
+  \gdef^^d2{\v N}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\H O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\v R}
+  \gdef^^d9{\ringaccent U} 
+  \gdef^^da{\'U}
+  \gdef^^db{\H U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\cedilla T}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\'r}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\u a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\'l}
+  \gdef^^e6{\'c}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\v c}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\v e}
+  \gdef^^ed{\'\i}
+  \gdef^^ee{\^\i}
+  \gdef^^ef{\v d}
+  %
+  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}}
+  \gdef^^f1{\'n}
+  \gdef^^f2{\v n}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\H o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\v r}
+  \gdef^^f9{\ringaccent u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\H u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\cedilla t}
+  \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+% 
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+% 
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+\begingroup
+  \catcode`\~13
+  \catcode`\"12
+
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+  \UTFviiiLoop
+\endgroup
+
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+
+  \gdef\DeclareUnicodeCharacter#1#2{%
+    \countUTFz = "#1\relax
+    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+    \begingroup
+      \parseXMLCharref
+      \def\UTFviiiTwoOctets##1##2{%
+        \csname u8:##1\string ##2\endcsname}%
+      \def\UTFviiiThreeOctets##1##2##3{%
+        \csname u8:##1\string ##2\string ##3\endcsname}%
+      \def\UTFviiiFourOctets##1##2##3##4{%
+        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+      \expandafter\expandafter\expandafter\expandafter
+       \expandafter\expandafter\expandafter
+       \gdef\UTFviiiTmp{#2}%
+    \endgroup}
+
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctets.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+    \fi\fi\fi
+  }
+
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz
+    \multiply\countUTFz by 64
+    \advance\countUTFx by -\countUTFz
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}
+  \DeclareUnicodeCharacter{00A3}{\pounds}
+  \DeclareUnicodeCharacter{00A8}{\"{ }}
+  \DeclareUnicodeCharacter{00A9}{\copyright}
+  \DeclareUnicodeCharacter{00AA}{\ordf}
+  \DeclareUnicodeCharacter{00AB}{\guillemetleft}
+  \DeclareUnicodeCharacter{00AD}{\-}
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+  \DeclareUnicodeCharacter{00AF}{\={ }}
+
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+  \DeclareUnicodeCharacter{00B4}{\'{ }}
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+  \DeclareUnicodeCharacter{00BA}{\ordm}
+  \DeclareUnicodeCharacter{00BB}{\guillemetright}
+  \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+  \DeclareUnicodeCharacter{00C0}{\`A}
+  \DeclareUnicodeCharacter{00C1}{\'A}
+  \DeclareUnicodeCharacter{00C2}{\^A}
+  \DeclareUnicodeCharacter{00C3}{\~A}
+  \DeclareUnicodeCharacter{00C4}{\"A}
+  \DeclareUnicodeCharacter{00C5}{\AA}
+  \DeclareUnicodeCharacter{00C6}{\AE}
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+  \DeclareUnicodeCharacter{00C8}{\`E}
+  \DeclareUnicodeCharacter{00C9}{\'E}
+  \DeclareUnicodeCharacter{00CA}{\^E}
+  \DeclareUnicodeCharacter{00CB}{\"E}
+  \DeclareUnicodeCharacter{00CC}{\`I}
+  \DeclareUnicodeCharacter{00CD}{\'I}
+  \DeclareUnicodeCharacter{00CE}{\^I}
+  \DeclareUnicodeCharacter{00CF}{\"I}
+
+  \DeclareUnicodeCharacter{00D1}{\~N}
+  \DeclareUnicodeCharacter{00D2}{\`O}
+  \DeclareUnicodeCharacter{00D3}{\'O}
+  \DeclareUnicodeCharacter{00D4}{\^O}
+  \DeclareUnicodeCharacter{00D5}{\~O}
+  \DeclareUnicodeCharacter{00D6}{\"O}
+  \DeclareUnicodeCharacter{00D8}{\O}
+  \DeclareUnicodeCharacter{00D9}{\`U}
+  \DeclareUnicodeCharacter{00DA}{\'U}
+  \DeclareUnicodeCharacter{00DB}{\^U}
+  \DeclareUnicodeCharacter{00DC}{\"U}
+  \DeclareUnicodeCharacter{00DD}{\'Y}
+  \DeclareUnicodeCharacter{00DF}{\ss}
+
+  \DeclareUnicodeCharacter{00E0}{\`a}
+  \DeclareUnicodeCharacter{00E1}{\'a}
+  \DeclareUnicodeCharacter{00E2}{\^a}
+  \DeclareUnicodeCharacter{00E3}{\~a}
+  \DeclareUnicodeCharacter{00E4}{\"a}
+  \DeclareUnicodeCharacter{00E5}{\aa}
+  \DeclareUnicodeCharacter{00E6}{\ae}
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+  \DeclareUnicodeCharacter{00E8}{\`e}
+  \DeclareUnicodeCharacter{00E9}{\'e}
+  \DeclareUnicodeCharacter{00EA}{\^e}
+  \DeclareUnicodeCharacter{00EB}{\"e}
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{00F1}{\~n}
+  \DeclareUnicodeCharacter{00F2}{\`o}
+  \DeclareUnicodeCharacter{00F3}{\'o}
+  \DeclareUnicodeCharacter{00F4}{\^o}
+  \DeclareUnicodeCharacter{00F5}{\~o}
+  \DeclareUnicodeCharacter{00F6}{\"o}
+  \DeclareUnicodeCharacter{00F8}{\o}
+  \DeclareUnicodeCharacter{00F9}{\`u}
+  \DeclareUnicodeCharacter{00FA}{\'u}
+  \DeclareUnicodeCharacter{00FB}{\^u}
+  \DeclareUnicodeCharacter{00FC}{\"u}
+  \DeclareUnicodeCharacter{00FD}{\'y}
+  \DeclareUnicodeCharacter{00FF}{\"y}
+
+  \DeclareUnicodeCharacter{0100}{\=A}
+  \DeclareUnicodeCharacter{0101}{\=a}
+  \DeclareUnicodeCharacter{0102}{\u{A}}
+  \DeclareUnicodeCharacter{0103}{\u{a}}
+  \DeclareUnicodeCharacter{0106}{\'C}
+  \DeclareUnicodeCharacter{0107}{\'c}
+  \DeclareUnicodeCharacter{0108}{\^C}
+  \DeclareUnicodeCharacter{0109}{\^c}
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+  \DeclareUnicodeCharacter{010C}{\v{C}}
+  \DeclareUnicodeCharacter{010D}{\v{c}}
+  \DeclareUnicodeCharacter{010E}{\v{D}}
+
+  \DeclareUnicodeCharacter{0112}{\=E}
+  \DeclareUnicodeCharacter{0113}{\=e}
+  \DeclareUnicodeCharacter{0114}{\u{E}}
+  \DeclareUnicodeCharacter{0115}{\u{e}}
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+  \DeclareUnicodeCharacter{011A}{\v{E}}
+  \DeclareUnicodeCharacter{011B}{\v{e}}
+  \DeclareUnicodeCharacter{011C}{\^G}
+  \DeclareUnicodeCharacter{011D}{\^g}
+  \DeclareUnicodeCharacter{011E}{\u{G}}
+  \DeclareUnicodeCharacter{011F}{\u{g}}
+
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+  \DeclareUnicodeCharacter{0124}{\^H}
+  \DeclareUnicodeCharacter{0125}{\^h}
+  \DeclareUnicodeCharacter{0128}{\~I}
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+  \DeclareUnicodeCharacter{012A}{\=I}
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+  \DeclareUnicodeCharacter{012C}{\u{I}}
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}
+  \DeclareUnicodeCharacter{0132}{IJ}
+  \DeclareUnicodeCharacter{0133}{ij}
+  \DeclareUnicodeCharacter{0134}{\^J}
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+  \DeclareUnicodeCharacter{0139}{\'L}
+  \DeclareUnicodeCharacter{013A}{\'l}
+
+  \DeclareUnicodeCharacter{0141}{\L}
+  \DeclareUnicodeCharacter{0142}{\l}
+  \DeclareUnicodeCharacter{0143}{\'N}
+  \DeclareUnicodeCharacter{0144}{\'n}
+  \DeclareUnicodeCharacter{0147}{\v{N}}
+  \DeclareUnicodeCharacter{0148}{\v{n}}
+  \DeclareUnicodeCharacter{014C}{\=O}
+  \DeclareUnicodeCharacter{014D}{\=o}
+  \DeclareUnicodeCharacter{014E}{\u{O}}
+  \DeclareUnicodeCharacter{014F}{\u{o}}
+
+  \DeclareUnicodeCharacter{0150}{\H{O}}
+  \DeclareUnicodeCharacter{0151}{\H{o}}
+  \DeclareUnicodeCharacter{0152}{\OE}
+  \DeclareUnicodeCharacter{0153}{\oe}
+  \DeclareUnicodeCharacter{0154}{\'R}
+  \DeclareUnicodeCharacter{0155}{\'r}
+  \DeclareUnicodeCharacter{0158}{\v{R}}
+  \DeclareUnicodeCharacter{0159}{\v{r}}
+  \DeclareUnicodeCharacter{015A}{\'S}
+  \DeclareUnicodeCharacter{015B}{\'s}
+  \DeclareUnicodeCharacter{015C}{\^S}
+  \DeclareUnicodeCharacter{015D}{\^s}
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+  \DeclareUnicodeCharacter{0160}{\v{S}}
+  \DeclareUnicodeCharacter{0161}{\v{s}}
+  \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+  \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+  \DeclareUnicodeCharacter{0164}{\v{T}}
+
+  \DeclareUnicodeCharacter{0168}{\~U}
+  \DeclareUnicodeCharacter{0169}{\~u}
+  \DeclareUnicodeCharacter{016A}{\=U}
+  \DeclareUnicodeCharacter{016B}{\=u}
+  \DeclareUnicodeCharacter{016C}{\u{U}}
+  \DeclareUnicodeCharacter{016D}{\u{u}}
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+  \DeclareUnicodeCharacter{0170}{\H{U}}
+  \DeclareUnicodeCharacter{0171}{\H{u}}
+  \DeclareUnicodeCharacter{0174}{\^W}
+  \DeclareUnicodeCharacter{0175}{\^w}
+  \DeclareUnicodeCharacter{0176}{\^Y}
+  \DeclareUnicodeCharacter{0177}{\^y}
+  \DeclareUnicodeCharacter{0178}{\"Y}
+  \DeclareUnicodeCharacter{0179}{\'Z}
+  \DeclareUnicodeCharacter{017A}{\'z}
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+  \DeclareUnicodeCharacter{017D}{\v{Z}}
+  \DeclareUnicodeCharacter{017E}{\v{z}}
+
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}
+  \DeclareUnicodeCharacter{01C7}{LJ}
+  \DeclareUnicodeCharacter{01C8}{Lj}
+  \DeclareUnicodeCharacter{01C9}{lj}
+  \DeclareUnicodeCharacter{01CA}{NJ}
+  \DeclareUnicodeCharacter{01CB}{Nj}
+  \DeclareUnicodeCharacter{01CC}{nj}
+  \DeclareUnicodeCharacter{01CD}{\v{A}}
+  \DeclareUnicodeCharacter{01CE}{\v{a}}
+  \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+  \DeclareUnicodeCharacter{01D1}{\v{O}}
+  \DeclareUnicodeCharacter{01D2}{\v{o}}
+  \DeclareUnicodeCharacter{01D3}{\v{U}}
+  \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}
+  \DeclareUnicodeCharacter{01E6}{\v{G}}
+  \DeclareUnicodeCharacter{01E7}{\v{g}}
+  \DeclareUnicodeCharacter{01E8}{\v{K}}
+  \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+  \DeclareUnicodeCharacter{01F1}{DZ}
+  \DeclareUnicodeCharacter{01F2}{Dz}
+  \DeclareUnicodeCharacter{01F3}{dz}
+  \DeclareUnicodeCharacter{01F4}{\'G}
+  \DeclareUnicodeCharacter{01F5}{\'g}
+  \DeclareUnicodeCharacter{01F8}{\`N}
+  \DeclareUnicodeCharacter{01F9}{\`n}
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+  \DeclareUnicodeCharacter{021E}{\v{H}}
+  \DeclareUnicodeCharacter{021F}{\v{h}}
+
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+  \DeclareUnicodeCharacter{0232}{\=Y}
+  \DeclareUnicodeCharacter{0233}{\=y}
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+  \DeclareUnicodeCharacter{1E20}{\=G}
+  \DeclareUnicodeCharacter{1E21}{\=g}
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+  \DeclareUnicodeCharacter{1E26}{\"H}
+  \DeclareUnicodeCharacter{1E27}{\"h}
+
+  \DeclareUnicodeCharacter{1E30}{\'K}
+  \DeclareUnicodeCharacter{1E31}{\'k}
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+  \DeclareUnicodeCharacter{1E3E}{\'M}
+  \DeclareUnicodeCharacter{1E3F}{\'m}
+
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+  \DeclareUnicodeCharacter{1E54}{\'P}
+  \DeclareUnicodeCharacter{1E55}{\'p}
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+  \DeclareUnicodeCharacter{1E7C}{\~V}
+  \DeclareUnicodeCharacter{1E7D}{\~v}
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+  \DeclareUnicodeCharacter{1E80}{\`W}
+  \DeclareUnicodeCharacter{1E81}{\`w}
+  \DeclareUnicodeCharacter{1E82}{\'W}
+  \DeclareUnicodeCharacter{1E83}{\'w}
+  \DeclareUnicodeCharacter{1E84}{\"W}
+  \DeclareUnicodeCharacter{1E85}{\"w}
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+  \DeclareUnicodeCharacter{1E8C}{\"X}
+  \DeclareUnicodeCharacter{1E8D}{\"x}
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+  \DeclareUnicodeCharacter{1E90}{\^Z}
+  \DeclareUnicodeCharacter{1E91}{\^z}
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+  \DeclareUnicodeCharacter{1E97}{\"t}
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+  \DeclareUnicodeCharacter{1EBC}{\~E}
+  \DeclareUnicodeCharacter{1EBD}{\~e}
+
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+  \DeclareUnicodeCharacter{1EF2}{\`Y}
+  \DeclareUnicodeCharacter{1EF3}{\`y}
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+  \DeclareUnicodeCharacter{1EF8}{\~Y}
+  \DeclareUnicodeCharacter{1EF9}{\~y}
+
+  \DeclareUnicodeCharacter{2013}{--}
+  \DeclareUnicodeCharacter{2014}{---}
+  \DeclareUnicodeCharacter{2018}{\quoteleft}
+  \DeclareUnicodeCharacter{2019}{\quoteright}
+  \DeclareUnicodeCharacter{201A}{\quotesinglbase}
+  \DeclareUnicodeCharacter{201C}{\quotedblleft}
+  \DeclareUnicodeCharacter{201D}{\quotedblright}
+  \DeclareUnicodeCharacter{201E}{\quotedblbase}
+  \DeclareUnicodeCharacter{2022}{\bullet}
+  \DeclareUnicodeCharacter{2026}{\dots}
+  \DeclareUnicodeCharacter{2039}{\guilsinglleft}
+  \DeclareUnicodeCharacter{203A}{\guilsinglright}
+  \DeclareUnicodeCharacter{20AC}{\euro}
+
+  \DeclareUnicodeCharacter{2192}{\expansion}
+  \DeclareUnicodeCharacter{21D2}{\result}
+
+  \DeclareUnicodeCharacter{2212}{\minus}
+  \DeclareUnicodeCharacter{2217}{\point}
+  \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{607.2pt}{6in}% that's 46 lines
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1\relax
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+%  @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+% 
+@def@normalturnoffactive{%
+  @let\=@normalbackslash
+  @let"=@normaldoublequote
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644 (file)
index 0000000..b7b96ee
--- /dev/null
@@ -0,0 +1,114 @@
+# Makefile for gperf/lib
+
+# Copyright (C) 1989, 1992, 1993, 1998, 2002 Free Software Foundation, Inc.
+# Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+# and Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Directories used by "make":
+srcdir = @srcdir@
+
+# Directories used by "make install":
+prefix = @prefix@
+local_prefix = /usr/local
+exec_prefix = @exec_prefix@
+
+# Programs used by "make":
+# C compiler
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+# C++ compiler
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CXXCPP = @CXXCPP@
+# Both C and C++ compiler
+OBJEXT = @OBJEXT@
+# Other
+AR = ar
+AR_FLAGS = rc
+RANLIB = @RANLIB@
+MV = mv
+LN = ln
+RM = rm -f
+@SET_MAKE@
+
+# Programs used by "make install":
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+VPATH = $(srcdir)
+
+OBJECTS  = getopt.$(OBJEXT) getopt1.$(OBJEXT) getline.$(OBJEXT) hash.$(OBJEXT)
+CPPFLAGS = -I$(srcdir)
+
+TARGETLIB = libgp.a
+
+all : $(TARGETLIB)
+
+$(TARGETLIB): $(OBJECTS)
+       $(RM) $@
+       $(AR) $(AR_FLAGS) $@ $(OBJECTS)
+       $(RANLIB) $@
+
+# Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always
+# expand $< correctly in this context.
+#
+#%.o : %.c
+#      $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+#
+#%.o : %.cc
+#      $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
+
+getopt.o : getopt.c getopt.h
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt.c
+
+getopt1.o : getopt1.c getopt.h
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt1.c
+
+getline.o : getline.cc getline.h
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/getline.cc
+
+hash.o : hash.cc hash.h
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash.cc
+
+install : all
+
+installdirs :
+
+uninstall :
+
+check : all
+
+mostlyclean : clean
+
+clean : force
+       $(RM) *~ *.s *.o *.a $(TARGETLIB) core
+
+distclean : clean
+       $(RM) config.status config.log config.cache Makefile
+
+maintainer-clean : distclean
+
+force :
diff --git a/lib/configure b/lib/configure
new file mode 100755 (executable)
index 0000000..3312620
--- /dev/null
@@ -0,0 +1,4593 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="hash.cc"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+CPP
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXCPP
+RANLIB
+INSTALL
+INSTALL_PROGRAM
+INSTALL_DATA
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+                      # Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${cl_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           if test $ac_prog = installbsd &&
+             strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then
+             # AIX installbsd doesn't work without option "-g".
+             :
+           else
+             cl_cv_path_install="$ac_dir/$ac_prog -c"
+             break 2
+           fi
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use cp.
+  test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
+
+fi
+  INSTALL="$cl_cv_path_install"
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
+if test -z "$INSTALL_DATA"; then
+  case "$INSTALL" in
+    cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
+    * )         INSTALL_DATA='$(INSTALL) -m 644' ;;
+  esac
+fi
+
+                      ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+CPP!$CPP$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXCPP!$CXXCPP$ac_delim
+RANLIB!$RANLIB$ac_delim
+INSTALL!$INSTALL$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 56; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/lib/configure.ac b/lib/configure.ac
new file mode 100644 (file)
index 0000000..b3df1cd
--- /dev/null
@@ -0,0 +1,43 @@
+dnl autoconf configuration for gperf/lib
+
+dnl Copyright (C) 1998, 2002, 2005, 2007, 2009 Free Software Foundation, Inc.
+dnl Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+dnl and Bruno Haible <bruno@clisp.org>.
+dnl
+dnl This file is part of GNU GPERF.
+dnl
+dnl This program is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (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 You should have received a copy of the GNU General Public License
+dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_PREREQ([2.60])
+AC_INIT([hash.cc])
+AC_PROG_MAKE_SET
+dnl
+dnl           checks for programs
+dnl
+AC_PROG_CC
+                      dnl sets variable CC
+AC_PROG_CPP
+                      dnl sets variable CPP
+AC_PROG_CXX
+                      dnl sets variable CXX
+AC_PROG_CXXCPP
+                      dnl sets variable CXXCPP
+AC_PROG_RANLIB
+                      dnl sets variable RANLIB
+CL_PROG_INSTALL
+                      dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
+dnl
+dnl           That's it.
+dnl
+AC_OUTPUT([Makefile])
diff --git a/lib/getline.cc b/lib/getline.cc
new file mode 100644 (file)
index 0000000..c57c633
--- /dev/null
@@ -0,0 +1,117 @@
+/* getline.c -- Replacement for GNU C library function getline
+
+   Copyright (C) 1993, 1996, 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Jan Brittenson, bson@gnu.ai.mit.edu.  */
+
+/* Specification.  */
+#include "getline.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* Always add at least this many bytes when extending the buffer.  */
+#define MIN_CHUNK 64
+
+/* Reads up to (and including) a TERMINATOR from STREAM into *LINEPTR + OFFSET
+   (and null-terminate it). *LINEPTR is a pointer returned from new [] (or
+   NULL), pointing to *N characters of space.  It is realloc'd as
+   necessary.  Returns the number of characters read (not including the
+   null terminator), or -1 on error or immediate EOF.
+   NOTE: There is another getstr() function declared in <curses.h>.  */
+
+static int
+getstr (char **lineptr, size_t *n, FILE *stream, char terminator, size_t offset)
+{
+  size_t nchars_avail;          /* Allocated but unused chars in *LINEPTR.  */
+  char *read_pos;               /* Where we're reading into *LINEPTR. */
+
+  if (!lineptr || !n || !stream)
+    return -1;
+
+  if (!*lineptr)
+    {
+      *n = MIN_CHUNK;
+      *lineptr = new char[*n];
+    }
+
+  nchars_avail = *n - offset;
+  read_pos = *lineptr + offset;
+
+  for (;;)
+    {
+      register int c = getc (stream);
+
+      /* We always want at least one char left in the buffer, since we
+         always (unless we get an error while reading the first char)
+         NUL-terminate the line buffer.  */
+
+      assert (*n - nchars_avail == (size_t) (read_pos - *lineptr));
+      if (nchars_avail < 2)
+        {
+          if (*n > MIN_CHUNK)
+            *n *= 2;
+          else
+            *n += MIN_CHUNK;
+
+          nchars_avail = *n + *lineptr - read_pos;
+          char *new_line = new char[*n];
+          if (*lineptr)
+            {
+              memcpy (new_line, *lineptr, read_pos - *lineptr);
+              delete[] *lineptr;
+            }
+          *lineptr = new_line;
+          read_pos = *n - nchars_avail + *lineptr;
+          assert (*n - nchars_avail == (size_t) (read_pos - *lineptr));
+        }
+
+      if (c == EOF || ferror (stream))
+        {
+          /* Return partial line, if any.  */
+          if (read_pos == *lineptr)
+            return -1;
+          else
+            break;
+        }
+
+      *read_pos++ = c;
+      nchars_avail--;
+
+      if (c == terminator)
+        /* Return the line.  */
+        break;
+    }
+
+  /* Done - NUL terminate and return the number of chars read.  */
+  *read_pos = '\0';
+
+  return read_pos - (*lineptr + offset);
+}
+
+int
+get_line (char **lineptr, size_t *n, FILE *stream)
+{
+  return getstr (lineptr, n, stream, '\n', 0);
+}
+
+int
+get_delim (char **lineptr, size_t *n, int delimiter, FILE *stream)
+{
+  return getstr (lineptr, n, stream, delimiter, 0);
+}
diff --git a/lib/getline.h b/lib/getline.h
new file mode 100644 (file)
index 0000000..0d5b945
--- /dev/null
@@ -0,0 +1,39 @@
+/*  Copyright (C) 1995, 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef GETLINE_H_
+# define GETLINE_H_ 1
+
+# include <stddef.h>
+# include <stdio.h>
+
+/* Like the glibc functions get_line and get_delim, except that the result
+   must be freed using delete[], not free().  */
+
+/* Reads up to (and including) a newline from STREAM into *LINEPTR
+   (and null-terminate it). *LINEPTR is a pointer returned from new [] (or
+   NULL), pointing to *N characters of space.  It is realloc'd as
+   necessary.  Returns the number of characters read (not including the
+   null terminator), or -1 on error or immediate EOF.  */
+extern int get_line (char **lineptr, size_t *n, FILE *stream);
+
+/* Reads up to (and including) a DELIMITER from STREAM into *LINEPTR
+   (and null-terminate it). *LINEPTR is a pointer returned from new [] (or
+   NULL), pointing to *N characters of space.  It is realloc'd as
+   necessary.  Returns the number of characters read (not including the
+   null terminator), or -1 on error or immediate EOF.  */
+extern int get_delim (char **lineptr, size_t *n, int delimiter, FILE *stream);
+
+#endif /* not GETLINE_H_ */
diff --git a/lib/getopt.c b/lib/getopt.c
new file mode 100644 (file)
index 0000000..32d6efc
--- /dev/null
@@ -0,0 +1,1040 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
+       Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+\f
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#include <unistd.h>
+#endif /* GNU C library.  */
+
+#ifdef VMS
+#include <unixlib.h>
+#if HAVE_STRING_H - 0
+#include <string.h>
+#endif
+#endif
+
+#ifndef _
+/* This is for other GNU distributions with internationalized messages.
+   When compiling libc, the _ macro is predefined.  */
+#ifdef HAVE_LIBINTL_H
+# include <libintl.h>
+# define _(msgid)      gettext (msgid)
+#else
+# define _(msgid)      (msgid)
+#endif
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = NULL;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Formerly, initialization of getopt depended on optind==0, which
+   causes problems with re-calling getopt as programs generally don't
+   know that. */
+
+int __getopt_initialized = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+#include <string.h>
+#define        my_index        strchr
+#else
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+extern char *getenv ();
+extern int strncmp ();
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+#if !defined __STDC__ || !__STDC__
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+#endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+#ifdef _LIBC
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+
+static int nonoption_flags_max_len;
+static int nonoption_flags_len;
+
+static int original_argc;
+static char *const *original_argv;
+
+/* Make sure the environment variable bash 2.0 puts in the environment
+   is valid for the getopt call we must make sure that the ARGV passed
+   to getopt is that one passed to the process.  */
+static void
+__attribute__ ((unused))
+store_args_and_env (int argc, char *const *argv)
+{
+  /* XXX This is no good solution.  We should rather copy the args so
+     that we can compare them later.  But we must not use malloc(3).  */
+  original_argc = argc;
+  original_argv = argv;
+}
+# ifdef text_set_element
+text_set_element (__libc_subinit, store_args_and_env);
+# endif /* text_set_element */
+
+# define SWAP_FLAGS(ch1, ch2) \
+  if (nonoption_flags_len > 0)                                               \
+    {                                                                        \
+      char __tmp = __getopt_nonoption_flags[ch1];                            \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+      __getopt_nonoption_flags[ch2] = __tmp;                                 \
+    }
+#else  /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+#if defined __STDC__ && __STDC__
+static void exchange (char **);
+#endif
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#ifdef _LIBC
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+        presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+       nonoption_flags_len = nonoption_flags_max_len = 0;
+      else
+       {
+         memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                            nonoption_flags_max_len),
+                 '\0', top + 1 - nonoption_flags_max_len);
+         nonoption_flags_max_len = top + 1;
+         __getopt_nonoption_flags = new_str;
+       }
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+             SWAP_FLAGS (bottom + i, middle + i);
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+#if defined __STDC__ && __STDC__
+static const char *_getopt_initialize (int, char *const *, const char *);
+#endif
+static const char *
+_getopt_initialize (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = optind;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+#ifdef _LIBC
+  if (posixly_correct == NULL
+      && argc == original_argc && argv == original_argv)
+    {
+      if (nonoption_flags_max_len == 0)
+       {
+         if (__getopt_nonoption_flags == NULL
+             || __getopt_nonoption_flags[0] == '\0')
+           nonoption_flags_max_len = -1;
+         else
+           {
+             const char *orig_str = __getopt_nonoption_flags;
+             int len = nonoption_flags_max_len = strlen (orig_str);
+             if (nonoption_flags_max_len < argc)
+               nonoption_flags_max_len = argc;
+             __getopt_nonoption_flags =
+               (char *) malloc (nonoption_flags_max_len);
+             if (__getopt_nonoption_flags == NULL)
+               nonoption_flags_max_len = -1;
+             else
+               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                       '\0', nonoption_flags_max_len - len);
+           }
+       }
+      nonoption_flags_len = nonoption_flags_max_len;
+    }
+  else
+    nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  optarg = NULL;
+
+  if (optind == 0 || !__getopt_initialized)
+    {
+      if (optind == 0)
+       optind = 1;     /* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring);
+      __getopt_initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#ifdef _LIBC
+#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'       \
+                    || (optind < nonoption_flags_len                         \
+                        && __getopt_nonoption_flags[optind] == '1'))
+#else
+#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#endif
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+        moved back by the user (who may also have changed the arguments).  */
+      if (last_nonopt > optind)
+       last_nonopt = optind;
+      if (first_nonopt > optind)
+       first_nonopt = optind;
+
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != optind)
+           first_nonopt = optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (optind < argc && NONOPTION_P)
+           optind++;
+         last_nonopt = optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+       {
+         optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = optind;
+         last_nonopt = argc;
+
+         optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           optind = first_nonopt;
+         return -1;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+       {
+         if (ordering == REQUIRE_ORDER)
+           return -1;
+         optarg = argv[optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Skip the initial punctuation.  */
+
+      nextchar = (argv[optind] + 1
+                 + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[optind][1] == '-'
+         || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+        or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, nextchar, nameend - nextchar))
+         {
+           if ((unsigned int) (nameend - nextchar)
+               == (unsigned int) strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (opterr)
+           fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+                    argv[0], argv[optind]);
+         nextchar += strlen (nextchar);
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               optarg = nameend + 1;
+             else
+               {
+                 if (opterr)
+                  if (argv[optind - 1][1] == '-')
+                   /* --option */
+                   fprintf (stderr,
+                    _("%s: option `--%s' doesn't allow an argument\n"),
+                    argv[0], pfound->name);
+                  else
+                   /* +option or -option */
+                   fprintf (stderr,
+                    _("%s: option `%c%s' doesn't allow an argument\n"),
+                    argv[0], argv[optind - 1][0], pfound->name);
+
+                 nextchar += strlen (nextchar);
+
+                 optopt = pfound->val;
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (optind < argc)
+               optarg = argv[optind++];
+             else
+               {
+                 if (opterr)
+                   fprintf (stderr,
+                          _("%s: option `%s' requires an argument\n"),
+                          argv[0], argv[optind - 1]);
+                 nextchar += strlen (nextchar);
+                 optopt = pfound->val;
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (opterr)
+           {
+             if (argv[optind][1] == '-')
+               /* --option */
+               fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+                        argv[0], argv[optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (opterr)
+         {
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, _("%s: illegal option -- %c\n"),
+                      argv[0], c);
+           else
+             fprintf (stderr, _("%s: invalid option -- %c\n"),
+                      argv[0], c);
+         }
+       optopt = c;
+       return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+       char *nameend;
+       const struct option *p;
+       const struct option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = 0;
+       int option_index;
+
+       /* This is an option that requires an argument.  */
+       if (*nextchar != '\0')
+         {
+           optarg = nextchar;
+           /* If we end this ARGV-element by taking the rest as an arg,
+              we must advance to the next element now.  */
+           optind++;
+         }
+       else if (optind == argc)
+         {
+           if (opterr)
+             {
+               /* 1003.2 specifies the format of this message.  */
+               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                        argv[0], c);
+             }
+           optopt = c;
+           if (optstring[0] == ':')
+             c = ':';
+           else
+             c = '?';
+           return c;
+         }
+       else
+         /* We already incremented `optind' once;
+            increment it again when taking next ARGV-elt as argument.  */
+         optarg = argv[optind++];
+
+       /* optarg is now the argument, see if it's in the
+          table of longopts.  */
+
+       for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
+         /* Do nothing.  */ ;
+
+       /* Test all long options for either exact match
+          or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+         if (!strncmp (p->name, nextchar, nameend - nextchar))
+           {
+             if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+               {
+                 /* Exact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+                 exact = 1;
+                 break;
+               }
+             else if (pfound == NULL)
+               {
+                 /* First nonexact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+               }
+             else
+               /* Second or later nonexact match found.  */
+               ambig = 1;
+           }
+       if (ambig && !exact)
+         {
+           if (opterr)
+             fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+                      argv[0], argv[optind]);
+           nextchar += strlen (nextchar);
+           optind++;
+           return '?';
+         }
+       if (pfound != NULL)
+         {
+           option_index = indfound;
+           if (*nameend)
+             {
+               /* Don't test has_arg with >, because some C compilers don't
+                  allow it to be used on enums.  */
+               if (pfound->has_arg)
+                 optarg = nameend + 1;
+               else
+                 {
+                   if (opterr)
+                     fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+                              argv[0], pfound->name);
+
+                   nextchar += strlen (nextchar);
+                   return '?';
+                 }
+             }
+           else if (pfound->has_arg == 1)
+             {
+               if (optind < argc)
+                 optarg = argv[optind++];
+               else
+                 {
+                   if (opterr)
+                     fprintf (stderr,
+                              _("%s: option `%s' requires an argument\n"),
+                              argv[0], argv[optind - 1]);
+                   nextchar += strlen (nextchar);
+                   return optstring[0] == ':' ? ':' : '?';
+                 }
+             }
+           nextchar += strlen (nextchar);
+           if (longind != NULL)
+             *longind = option_index;
+           if (pfound->flag)
+             {
+               *(pfound->flag) = pfound->val;
+               return 0;
+             }
+           return pfound->val;
+         }
+         nextchar = NULL;
+         return 'W';   /* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               optind++;
+             }
+           else
+             optarg = NULL;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               optind++;
+             }
+           else if (optind == argc)
+             {
+               if (opterr)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr,
+                          _("%s: option requires an argument -- %c\n"),
+                          argv[0], c);
+                 }
+               optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             optarg = argv[optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/getopt.c.patch b/lib/getopt.c.patch
new file mode 100644 (file)
index 0000000..6fedd84
--- /dev/null
@@ -0,0 +1,25 @@
+getopt.c is a modified version of the getopt.c found in the glibc snapshot
+on 1998-04-14. Below the patch that has been applied to this file. The glibc
+maintainer has been informed of these patches.
+
+diff -c3 getopt.c.orig getopt.c
+*** getopt.c.orig      Sun Mar  8 16:06:55 1998
+--- getopt.c   Thu Apr 16 00:09:41 1998
+***************
+*** 201,207 ****
+  /* Avoid depending on library functions or files
+     whose names are inconsistent.  */
+  
+! char *getenv ();
+  
+  static char *
+  my_index (str, chr)
+--- 201,208 ----
+  /* Avoid depending on library functions or files
+     whose names are inconsistent.  */
+  
+! extern char *getenv ();
+! extern int strncmp ();
+  
+  static char *
+  my_index (str, chr)
diff --git a/lib/getopt.h b/lib/getopt.h
new file mode 100644 (file)
index 0000000..30e69b8
--- /dev/null
@@ -0,0 +1,136 @@
+/* Declarations for getopt.
+   Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
+#ifdef __cplusplus
+/* SunOS4 declares getopt with the following prototype:
+   extern int getopt (int argc, const char *const *argv, const char *shortopts);
+   We cannot redeclare it when compiling C++ code. */
+#define getopt(x,y,z) getopt_long(x, y, z, (const struct option *) 0, (int *) 0)
+#else /* not __cplusplus */
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+#endif /* __cplusplus */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* getopt.h */
diff --git a/lib/getopt.h.patch b/lib/getopt.h.patch
new file mode 100644 (file)
index 0000000..8094b1a
--- /dev/null
@@ -0,0 +1,70 @@
+getopt.h is a modified version of the getopt.h found in the glibc snapshot
+on 1998-04-14. Below the patch that has been applied to this file. The glibc
+maintainer has been informed of these patches.
+
+diff -c3 getopt.h.orig getopt.h
+*** getopt.h.orig      Sat Jun 21 03:01:53 1997
+--- getopt.h   Mon Aug 28 12:36:27 2000
+***************
+*** 1,5 ****
+  /* Declarations for getopt.
+!    Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+     This file is part of the GNU C Library.
+  
+     The GNU C Library is free software; you can redistribute it and/or
+--- 1,5 ----
+  /* Declarations for getopt.
+!    Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
+     This file is part of the GNU C Library.
+  
+     The GNU C Library is free software; you can redistribute it and/or
+***************
+*** 78,84 ****
+  
+  struct option
+  {
+! #if defined (__STDC__) && __STDC__
+    const char *name;
+  #else
+    char *name;
+--- 78,84 ----
+  
+  struct option
+  {
+! #if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
+    const char *name;
+  #else
+    char *name;
+***************
+*** 96,102 ****
+  #define required_argument    1
+  #define optional_argument    2
+  
+! #if defined (__STDC__) && __STDC__
+  #ifdef __GNU_LIBRARY__
+  /* Many other libraries have conflicting prototypes for getopt, with
+     differences in the consts, in stdlib.h.  To avoid compilation
+--- 96,108 ----
+  #define required_argument    1
+  #define optional_argument    2
+  
+! #if (defined (__STDC__) && __STDC__) || defined (__cplusplus)
+! #ifdef __cplusplus
+! /* SunOS4 declares getopt with the following prototype:
+!    extern int getopt (int argc, const char *const *argv, const char *shortopts);
+!    We cannot redeclare it when compiling C++ code. */
+! #define getopt(x,y,z) getopt_long(x, y, z, (const struct option *) 0, (int *) 0)
+! #else /* not __cplusplus */
+  #ifdef __GNU_LIBRARY__
+  /* Many other libraries have conflicting prototypes for getopt, with
+     differences in the consts, in stdlib.h.  To avoid compilation
+***************
+*** 105,110 ****
+--- 111,117 ----
+  #else /* not __GNU_LIBRARY__ */
+  extern int getopt ();
+  #endif /* __GNU_LIBRARY__ */
++ #endif /* __cplusplus */
+  extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+  extern int getopt_long_only (int argc, char *const *argv,
diff --git a/lib/getopt1.c b/lib/getopt1.c
new file mode 100644 (file)
index 0000000..06a0b66
--- /dev/null
@@ -0,0 +1,186 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+     Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "getopt.h"
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/hash.cc b/lib/hash.cc
new file mode 100644 (file)
index 0000000..1795cee
--- /dev/null
@@ -0,0 +1,27 @@
+/* 
+Copyright (C) 1990, 2000, 2002 Free Software Foundation
+    written by Doug Lea <dl@rocky.oswego.edu>
+*/
+
+#include <hash.h>
+
+/*
+ Some useful hash function.
+ It's not a particularly good hash function (<< 5 would be better than << 4),
+ but people believe in it because it comes from Dragon book.
+*/
+
+unsigned int
+hashpjw (const unsigned char *x, unsigned int len) // From Dragon book, p436
+{
+  unsigned int h = 0;
+  unsigned int g;
+
+  for (; len > 0; len--)
+    {
+      h = (h << 4) + *x++;
+      if ((g = h & 0xf0000000) != 0)
+        h = (h ^ (g >> 24)) ^ g;
+    }
+  return h;
+}
diff --git a/lib/hash.h b/lib/hash.h
new file mode 100644 (file)
index 0000000..d202e72
--- /dev/null
@@ -0,0 +1,15 @@
+// This may look like C code, but it is really -*- C++ -*-
+
+/* 
+Copyright (C) 1988, 1992, 2000, 2002 Free Software Foundation
+    written by Doug Lea <dl@rocky.oswego.edu>
+*/
+
+#ifndef _hash_h
+#define _hash_h 1
+
+/* a hash function for char[] arrays using the
+   method described in Aho, Sethi, & Ullman, p 436. */
+extern unsigned int hashpjw (const unsigned char *string, unsigned int len);
+
+#endif
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..4f58503
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644 (file)
index 0000000..91d0c33
--- /dev/null
@@ -0,0 +1,143 @@
+# Makefile for gperf/src
+
+# Copyright (C) 1989, 1992, 1993, 1998, 2000, 2002, 2006 Free Software Foundation, Inc.
+# Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+# and Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Directories used by "make":
+srcdir = @srcdir@
+
+# Directories used by "make install":
+prefix = @prefix@
+local_prefix = /usr/local
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+
+# Programs used by "make":
+# C compiler
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+# C++ compiler
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CXXCPP = @CXXCPP@
+# Both C and C++ compiler
+LDFLAGS = @LDFLAGS@
+OBJEXT = @OBJEXT@
+EXEEXT = @EXEEXT@
+# Other
+MV = mv
+LN = ln
+RM = rm -f
+@SET_MAKE@
+
+# Programs used by "make install":
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(SHELL) $(srcdir)/../mkinstalldirs
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+VPATH = $(srcdir)
+
+OBJECTS  = version.$(OBJEXT) positions.$(OBJEXT) options.$(OBJEXT) keyword.$(OBJEXT) keyword-list.$(OBJEXT) \
+           input.$(OBJEXT) bool-array.$(OBJEXT) hash-table.$(OBJEXT) search.$(OBJEXT) output.$(OBJEXT) main.$(OBJEXT)
+LIBS     = ../lib/libgp.a @GPERF_LIBM@
+CPPFLAGS = -I. -I$(srcdir)/../lib
+
+TARGETPROG = gperf$(EXEEXT)
+
+all : $(TARGETPROG)
+
+$(TARGETPROG): $(OBJECTS)
+       $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
+
+# Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always
+# expand $< correctly in this context.
+#
+#%.o : %.c
+#      $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+#
+#%.o : %.cc
+#      $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
+
+# Dependencies.
+CONFIG_H = config.h
+VERSION_H = version.h
+POSITIONS_H = positions.h positions.icc
+OPTIONS_H = options.h options.icc $(POSITIONS_H)
+KEYWORD_H = keyword.h keyword.icc
+KEYWORD_LIST_H = keyword-list.h keyword-list.icc $(KEYWORD_H)
+INPUT_H = input.h $(KEYWORD_LIST_H)
+BOOL_ARRAY_H = bool-array.h bool-array.icc $(OPTIONS_H)
+HASH_TABLE_H = hash-table.h $(KEYWORD_H)
+SEARCH_H = search.h $(KEYWORD_LIST_H) $(POSITIONS_H) $(BOOL_ARRAY_H)
+OUTPUT_H = output.h $(KEYWORD_LIST_H) $(POSITIONS_H)
+
+version.$(OBJEXT): version.cc $(VERSION_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/version.cc
+positions.$(OBJEXT): positions.cc $(POSITIONS_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/positions.cc
+options.$(OBJEXT): options.cc $(OPTIONS_H) $(VERSION_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/options.cc
+keyword.$(OBJEXT): keyword.cc $(KEYWORD_H) $(POSITIONS_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/keyword.cc
+keyword-list.$(OBJEXT): keyword-list.cc $(KEYWORD_LIST_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/keyword-list.cc
+input.$(OBJEXT): input.cc $(INPUT_H) $(OPTIONS_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/input.cc
+bool-array.$(OBJEXT): bool-array.cc $(BOOL_ARRAY_H) $(OPTIONS_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/bool-array.cc
+hash-table.$(OBJEXT): hash-table.cc $(HASH_TABLE_H) $(OPTIONS_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash-table.cc
+search.$(OBJEXT): search.cc $(SEARCH_H) $(OPTIONS_H) $(HASH_TABLE_H) $(CONFIG_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/search.cc
+output.$(OBJEXT): output.cc $(OUTPUT_H) $(OPTIONS_H) $(VERSION_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/output.cc
+main.$(OBJEXT): main.cc $(OPTIONS_H) $(INPUT_H) $(SEARCH_H) $(OUTPUT_H)
+       $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/main.cc
+
+install : all force
+       $(MKINSTALLDIRS) $(DESTDIR)$(bindir)
+       $(INSTALL_PROGRAM) $(TARGETPROG) $(DESTDIR)$(bindir)/$(TARGETPROG)
+
+installdirs : force
+       $(MKINSTALLDIRS) $(DESTDIR)$(bindir)
+
+uninstall : force
+       $(RM) $(DESTDIR)$(bindir)/$(TARGETPROG)
+
+check : all
+
+mostlyclean : clean
+
+clean : force
+       $(RM) *~ *.s *.$(OBJEXT) *.a $(TARGETPROG) core
+
+distclean : clean
+       $(RM) config.status config.log config.cache Makefile config.h
+
+maintainer-clean : distclean
+
+force :
diff --git a/src/bool-array.cc b/src/bool-array.cc
new file mode 100644 (file)
index 0000000..d0e3364
--- /dev/null
@@ -0,0 +1,45 @@
+/* Fast lookup table abstraction implemented as an Iteration Number Array
+   Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "bool-array.h"
+
+#include <stdio.h>
+#include <string.h>
+#include "options.h"
+
+/* Frees this object.  */
+Bool_Array::~Bool_Array ()
+{
+  /* Print out debugging diagnostics. */
+  if (option[DEBUG])
+    fprintf (stderr, "\ndumping boolean array information\n"
+             "size = %d\niteration number = %d\nend of array dump\n",
+             _size, _iteration_number);
+  delete[] const_cast<unsigned int *>(_storage_array);
+}
+
+#ifndef __OPTIMIZE__
+
+#define INLINE /* not inline */
+#include "bool-array.icc"
+#undef INLINE
+
+#endif /* not defined __OPTIMIZE__ */
diff --git a/src/bool-array.h b/src/bool-array.h
new file mode 100644 (file)
index 0000000..33472fe
--- /dev/null
@@ -0,0 +1,77 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Simple lookup table abstraction implemented as an Iteration Number Array.
+
+   Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef bool_array_h
+#define bool_array_h 1
+
+/* A Bool_Array instance is a bit array of fixed size, optimized for being
+   filled sparsely and cleared frequently.  For example, when processing
+   tests/chill.gperf, the array will be:
+     - of size 15391,
+     - clear will be called 3509 times,
+     - set_bit will be called 300394 times.
+   With a conventional bit array implementation, clear would be too slow.
+   With a tree/hash based bit array implementation, set_bit would be slower. */
+
+class Bool_Array
+{
+public:
+  /* Initializes the bit array with room for SIZE bits, numbered from
+     0 to SIZE-1. */
+                        Bool_Array (unsigned int size);
+
+  /* Frees this object.  */
+                        ~Bool_Array ();
+
+  /* Resets all bits to zero.  */
+  void                  clear ();
+
+  /* Sets the specified bit to true.
+     Returns its previous value (false or true).  */
+  bool                  set_bit (unsigned int index);
+
+private:
+  /* Size of array.  */
+  unsigned int const    _size;
+
+  /* Current iteration number.  Always nonzero.  Starts out as 1, and is
+     incremented each time clear() is called.  */
+  unsigned int          _iteration_number;
+
+  /* For each index, we store in storage_array[index] the iteration_number at
+     the time set_bit(index) was last called.  */
+  unsigned int * const  _storage_array;
+};
+
+#ifdef __OPTIMIZE__  /* efficiency hack! */
+
+#include <stdio.h>
+#include <string.h>
+#include "options.h"
+#define INLINE inline
+#include "bool-array.icc"
+#undef INLINE
+
+#endif
+
+#endif
diff --git a/src/bool-array.icc b/src/bool-array.icc
new file mode 100644 (file)
index 0000000..84dd37e
--- /dev/null
@@ -0,0 +1,76 @@
+/* Inline Functions for bool-array.{h,cc}.
+
+   Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+// This needs:
+//#include <stdio.h>
+//#include <string.h>
+//#include "options.h"
+
+/* Initializes the bit array with room for SIZE bits, numbered from
+   0 to SIZE-1. */
+INLINE
+Bool_Array::Bool_Array (unsigned int size)
+  : _size (size),
+    _iteration_number (1),
+    _storage_array (new unsigned int [size])
+{
+  memset (_storage_array, 0, size * sizeof (_storage_array[0]));
+  if (option[DEBUG])
+    fprintf (stderr, "\nbool array size = %d, total bytes = %d\n",
+             _size,
+             static_cast<unsigned int> (_size * sizeof (_storage_array[0])));
+}
+
+/* Sets the specified bit to true.
+   Returns its previous value (false or true).  */
+INLINE bool
+Bool_Array::set_bit (unsigned int index)
+{
+  if (_storage_array[index] == _iteration_number)
+    /* The bit was set since the last clear() call.  */
+    return true;
+  else
+    {
+      /* The last operation on this bit was clear().  Set it now.  */
+      _storage_array[index] = _iteration_number;
+      return false;
+    }
+}
+
+/* Resets all bits to zero.  */
+INLINE void
+Bool_Array::clear ()
+{
+  /* If we wrap around it's time to zero things out again!  However, this only
+     occurs once about every 2^32 iterations, so it will not happen more
+     frequently than once per second.  */
+
+  if (++_iteration_number == 0)
+    {
+      _iteration_number = 1;
+      memset (_storage_array, 0, _size * sizeof (_storage_array[0]));
+      if (option[DEBUG])
+        {
+          fprintf (stderr, "(re-initialized bool_array)\n");
+          fflush (stderr);
+        }
+    }
+}
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644 (file)
index 0000000..1f3dc58
--- /dev/null
@@ -0,0 +1,20 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if the C++ compiler supports stack-allocated variable-size arrays.
+   */
+#undef HAVE_DYNAMIC_ARRAY
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
diff --git a/src/config.h.msvc b/src/config.h.msvc
new file mode 100644 (file)
index 0000000..1f3dc58
--- /dev/null
@@ -0,0 +1,20 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if the C++ compiler supports stack-allocated variable-size arrays.
+   */
+#undef HAVE_DYNAMIC_ARRAY
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
diff --git a/src/config.h_vms b/src/config.h_vms
new file mode 100644 (file)
index 0000000..1f3dc58
--- /dev/null
@@ -0,0 +1,20 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if the C++ compiler supports stack-allocated variable-size arrays.
+   */
+#undef HAVE_DYNAMIC_ARRAY
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
diff --git a/src/configure b/src/configure
new file mode 100755 (executable)
index 0000000..590836f
--- /dev/null
@@ -0,0 +1,4725 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="main.cc"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+CPP
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXCPP
+INSTALL
+INSTALL_PROGRAM
+INSTALL_DATA
+GPERF_LIBM
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      # Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${cl_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           if test $ac_prog = installbsd &&
+             strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then
+             # AIX installbsd doesn't work without option "-g".
+             :
+           else
+             cl_cv_path_install="$ac_dir/$ac_prog -c"
+             break 2
+           fi
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use cp.
+  test -z "$cl_cv_path_install" && cl_cv_path_install="cp"
+
+fi
+  INSTALL="$cl_cv_path_install"
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='$(INSTALL)'
+if test -z "$INSTALL_DATA"; then
+  case "$INSTALL" in
+    cp | */cp ) INSTALL_DATA='$(INSTALL)' ;;
+    * )         INSTALL_DATA='$(INSTALL) -m 644' ;;
+  esac
+fi
+
+                      { echo "$as_me:$LINENO: checking for stack-allocated variable-size arrays" >&5
+echo $ECHO_N "checking for stack-allocated variable-size arrays... $ECHO_C" >&6; }
+
+if test "${gp_cv_cxx_dynamic_array+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+int func (int n) { int dynamic_array[n]; }
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  gp_cv_cxx_dynamic_array=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gp_cv_cxx_dynamic_array=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+
+{ echo "$as_me:$LINENO: result: $gp_cv_cxx_dynamic_array" >&5
+echo "${ECHO_T}$gp_cv_cxx_dynamic_array" >&6; }
+if test $gp_cv_cxx_dynamic_array = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DYNAMIC_ARRAY 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for rand in -lm" >&5
+echo $ECHO_N "checking for rand in -lm... $ECHO_C" >&6; }
+if test "${ac_cv_lib_m_rand+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rand ();
+int
+main ()
+{
+return rand ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_m_rand=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_m_rand=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_rand" >&5
+echo "${ECHO_T}$ac_cv_lib_m_rand" >&6; }
+if test $ac_cv_lib_m_rand = yes; then
+  GPERF_LIBM="-lm"
+else
+  GPERF_LIBM=""
+fi
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                  instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+CPP!$CPP$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXCPP!$CXXCPP$ac_delim
+INSTALL!$INSTALL$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+GPERF_LIBM!$GPERF_LIBM$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 56; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([  #]*\\)[^        ]*\\([  ]*'
+ac_dB='\\)[     (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+       t rset
+       :rset
+       s/^[     ]*#[    ]*define[       ][      ]*//
+       t ok
+       d
+       :ok
+       s/[\\&,]/\\&/g
+       s/^\('"$ac_word_re"'\)\(([^()]*)\)[      ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+       s/^\('"$ac_word_re"'\)[  ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[    #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:         sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:        sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:    sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[     ]*#[    ]*undef[        ][      ]*$ac_word_re[  ]*\$/b def
+/^[     ]*#[    ]*define[       ][      ]*$ac_word_re[(         ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+ ;;
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/src/configure.ac b/src/configure.ac
new file mode 100644 (file)
index 0000000..33f4983
--- /dev/null
@@ -0,0 +1,66 @@
+dnl autoconf configuration for gperf/src
+
+dnl Copyright (C) 1998, 2000, 2002-2003, 2007, 2009 Free Software Foundation, Inc.
+dnl Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+dnl and Bruno Haible <bruno@clisp.org>.
+dnl
+dnl This file is part of GNU GPERF.
+dnl
+dnl This program is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (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 You should have received a copy of the GNU General Public License
+dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_PREREQ([2.60])
+AC_INIT([main.cc])
+AC_CONFIG_HEADER([config.h])
+AC_PROG_MAKE_SET
+dnl
+dnl           checks for programs
+dnl
+AC_PROG_CC
+                      dnl sets variable CC
+AC_PROG_CPP
+                      dnl sets variable CPP
+AC_PROG_CXX
+                      dnl sets variable CXX
+AC_PROG_CXXCPP
+                      dnl sets variable CXXCPP
+CL_PROG_INSTALL
+                      dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
+dnl
+dnl           checks for compiler characteristics
+dnl
+AC_MSG_CHECKING([for stack-allocated variable-size arrays])
+AC_CACHE_VAL([gp_cv_cxx_dynamic_array], [
+AC_LANG_SAVE()
+AC_LANG_CPLUSPLUS()
+AC_TRY_COMPILE([int func (int n) { int dynamic_array[n]; }], [],
+  [gp_cv_cxx_dynamic_array=yes], [gp_cv_cxx_dynamic_array=no])
+AC_LANG_RESTORE()
+])
+AC_MSG_RESULT([$gp_cv_cxx_dynamic_array])
+if test $gp_cv_cxx_dynamic_array = yes; then
+  AC_DEFINE([HAVE_DYNAMIC_ARRAY], [1],
+    [Define if the C++ compiler supports stack-allocated variable-size arrays.])
+fi
+dnl
+dnl           checks for functions and declarations
+dnl
+dnl
+dnl           checks for libraries
+dnl
+AC_CHECK_LIB([m], [rand], [GPERF_LIBM="-lm"], [GPERF_LIBM=""])
+AC_SUBST([GPERF_LIBM])
+dnl
+dnl           That's it.
+dnl
+AC_OUTPUT([Makefile])
diff --git a/src/hash-table.cc b/src/hash-table.cc
new file mode 100644 (file)
index 0000000..1b2b40d
--- /dev/null
@@ -0,0 +1,165 @@
+/* Hash table for checking keyword links.  Implemented using double hashing.
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "hash-table.h"
+
+#include <stdio.h>
+#include <string.h> /* declares memset(), strcmp() */
+#include <hash.h>
+#include "options.h"
+
+/* We use a hash table with double hashing.  This is the simplest kind of
+   hash table, given that we always only insert and never remove entries
+   from the hash table.  */
+
+/* To make double hashing efficient, there need to be enough spare entries.  */
+static const int size_factor = 10;
+
+/* We make the size of the hash table a power of 2.  This allows for two
+   optimizations: It eliminates the modulo instruction, and allows for an
+   easy secondary hashing function.  */
+
+/* Constructor.  */
+Hash_Table::Hash_Table (unsigned int size, bool ignore_length)
+  : _ignore_length (ignore_length),
+    _collisions (0)
+{
+  /* There need to be enough spare entries.  */
+  size = size * size_factor;
+
+  /* Find smallest power of 2 that is >= size.  */
+  unsigned int shift = 0;
+  if ((size >> 16) > 0)
+    {
+      size = size >> 16;
+      shift += 16;
+    }
+  if ((size >> 8) > 0)
+    {
+      size = size >> 8;
+      shift += 8;
+    }
+  if ((size >> 4) > 0)
+    {
+      size = size >> 4;
+      shift += 4;
+    }
+  if ((size >> 2) > 0)
+    {
+      size = size >> 2;
+      shift += 2;
+    }
+  if ((size >> 1) > 0)
+    {
+      size = size >> 1;
+      shift += 1;
+    }
+  _log_size = shift;
+  _size = 1 << shift;
+
+  /* Allocate table.  */
+  _table = new KeywordExt*[_size];
+  memset (_table, 0, _size * sizeof (*_table));
+}
+
+/* Destructor.  */
+Hash_Table::~Hash_Table ()
+{
+  delete[] _table;
+}
+
+/* Print the table's contents.  */
+void
+Hash_Table::dump () const
+{
+  int field_width;
+
+  field_width = 0;
+  {
+    for (int i = _size - 1; i >= 0; i--)
+      if (_table[i])
+        if (field_width < _table[i]->_selchars_length)
+          field_width = _table[i]->_selchars_length;
+  }
+
+  fprintf (stderr,
+           "\ndumping the hash table\n"
+           "total available table slots = %d, total bytes = %d, total collisions = %d\n"
+           "location, %*s, keyword\n",
+           _size, _size * static_cast<unsigned int>(sizeof (*_table)),
+           _collisions, field_width, "keysig");
+
+  for (int i = _size - 1; i >= 0; i--)
+    if (_table[i])
+      {
+        fprintf (stderr, "%8d, ", i);
+        if (field_width > _table[i]->_selchars_length)
+          fprintf (stderr, "%*s", field_width - _table[i]->_selchars_length, "");
+        for (int j = 0; j < _table[i]->_selchars_length; j++)
+          putc (_table[i]->_selchars[j], stderr);
+        fprintf (stderr, ", %.*s\n",
+                 _table[i]->_allchars_length, _table[i]->_allchars);
+      }
+
+  fprintf (stderr, "\nend dumping hash table\n\n");
+}
+
+/* Compares two items.  */
+inline bool
+Hash_Table::equal (KeywordExt *item1, KeywordExt *item2) const
+{
+  return item1->_selchars_length == item2->_selchars_length
+         && memcmp (item1->_selchars, item2->_selchars,
+                    item2->_selchars_length * sizeof (unsigned int))
+            == 0
+         && (_ignore_length
+             || item1->_allchars_length == item2->_allchars_length);
+}
+
+/* Attempts to insert ITEM in the table.  If there is already an equal
+   entry in it, returns it.  Otherwise inserts ITEM and returns NULL.  */
+KeywordExt *
+Hash_Table::insert (KeywordExt *item)
+{
+  unsigned hash_val =
+    hashpjw (reinterpret_cast<const unsigned char *>(item->_selchars),
+             item->_selchars_length * sizeof (unsigned int));
+  unsigned int probe = hash_val & (_size - 1);
+  unsigned int increment =
+    (((hash_val >> _log_size)
+      ^ (_ignore_length ? 0 : item->_allchars_length))
+     << 1) + 1;
+  /* Note that because _size is a power of 2 and increment is odd,
+     we have gcd(increment,_size) = 1, which guarantees that we'll find
+     an empty entry during the loop.  */
+
+  while (_table[probe] != NULL)
+    {
+      if (equal (_table[probe], item))
+        return _table[probe];
+
+      _collisions++;
+      probe = (probe + increment) & (_size - 1);
+    }
+
+  _table[probe] = item;
+  return NULL;
+}
diff --git a/src/hash-table.h b/src/hash-table.h
new file mode 100644 (file)
index 0000000..1ff5fcc
--- /dev/null
@@ -0,0 +1,64 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Hash table used to check for duplicate keyword entries.
+
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef hash_table_h
+#define hash_table_h 1
+
+#include "keyword.h"
+
+/* Hash table of KeywordExt* entries.
+   Two entries are considered equal if their _selchars are the same and
+   - if !ignore_length - if their _allchars_length are the same.  */
+
+class Hash_Table
+{
+public:
+  /* Constructor.
+     size is the maximum number of entries.
+     ignore_length determines a detail in the comparison function.  */
+                        Hash_Table (unsigned int size, bool ignore_length);
+  /* Destructor.  */
+                        ~Hash_Table ();
+  /* Attempts to insert ITEM in the table.  If there is already an equal
+     entry in it, returns it.  Otherwise inserts ITEM and returns NULL.  */
+  KeywordExt *          insert (KeywordExt *item);
+  /* Print the table's contents.  */
+  void                  dump () const;
+
+private:
+  /* Vector of entries.  */
+  KeywordExt **         _table;
+  /* Size of the vector.  */
+  unsigned int          _size;
+  /* log2(_size).  */
+  unsigned int          _log_size;
+  /* A detail of the comparison function.  */
+  bool const            _ignore_length;
+  /* Statistics: Number of collisions so far.  */
+  unsigned int          _collisions;
+
+  /* Compares two items.  */
+  bool                  equal (KeywordExt *item1, KeywordExt *item2) const;
+};
+
+#endif
diff --git a/src/input.cc b/src/input.cc
new file mode 100644 (file)
index 0000000..e8a7831
--- /dev/null
@@ -0,0 +1,1003 @@
+/* Input routines.
+   Copyright (C) 1989-1998, 2002-2004 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "input.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* declares exit() */
+#include <string.h> /* declares strncpy(), strchr() */
+#include <limits.h> /* defines UCHAR_MAX etc. */
+#include "options.h"
+#include "getline.h"
+
+Input::Input (FILE *stream, Keyword_Factory *keyword_factory)
+  : _stream (stream), _factory (keyword_factory)
+{
+}
+
+/* Returns a pretty representation of the input file name, for error and
+   warning messages.  */
+static const char *
+pretty_input_file_name ()
+{
+  if (option.get_input_file_name ())
+    return option.get_input_file_name ();
+  else
+    return "(standard input)";
+}
+
+/* Returns true if the given line contains a "%DECL" declaration.  */
+static bool
+is_declaration (const char *line, const char *line_end, unsigned int lineno,
+                const char *decl)
+{
+  /* Skip '%'.  */
+  line++;
+
+  /* Skip DECL.  */
+  for (const char *d = decl; *d; d++)
+    {
+      if (!(line < line_end))
+        return false;
+      if (!(*line == *d || (*d == '-' && *line == '_')))
+        return false;
+      line++;
+    }
+  if (line < line_end
+      && ((*line >= 'A' && *line <= 'Z')
+          || (*line >= 'a' && *line <= 'z')
+          || *line == '-' || *line == '_'))
+    return false;
+
+  /* OK, found DECL.  */
+
+  /* Skip whitespace.  */
+  while (line < line_end && (*line == ' ' || *line == '\t'))
+    line++;
+
+  /* Expect end of line.  */
+  if (line < line_end && *line != '\n')
+    {
+      fprintf (stderr, "%s:%u: junk after declaration\n",
+               pretty_input_file_name (), lineno);
+      exit (1);
+    }
+
+  return true;
+}
+
+/* Tests if the given line contains a "%DECL=ARG" declaration.
+   If yes, it sets *ARGP to the argument, and returns true.
+   Otherwise, it returns false.  */
+static bool
+is_declaration_with_arg (const char *line, const char *line_end,
+                         unsigned int lineno,
+                         const char *decl, char **argp)
+{
+  /* Skip '%'.  */
+  line++;
+
+  /* Skip DECL.  */
+  for (const char *d = decl; *d; d++)
+    {
+      if (!(line < line_end))
+        return false;
+      if (!(*line == *d || (*d == '-' && *line == '_')))
+        return false;
+      line++;
+    }
+  if (line < line_end
+      && ((*line >= 'A' && *line <= 'Z')
+          || (*line >= 'a' && *line <= 'z')
+          || *line == '-' || *line == '_'))
+    return false;
+
+  /* OK, found DECL.  */
+
+  /* Skip '='.  */
+  if (!(line < line_end && *line == '='))
+    {
+      fprintf (stderr, "%s:%u: missing argument in %%%s=ARG declaration.\n",
+               pretty_input_file_name (), lineno, decl);
+      exit (1);
+    }
+  line++;
+
+  /* The next word is the argument.  */
+  char *arg = new char[line_end - line + 1];
+  char *p = arg;
+  while (line < line_end && !(*line == ' ' || *line == '\t' || *line == '\n'))
+    *p++ = *line++;
+  *p = '\0';
+
+  /* Skip whitespace.  */
+  while (line < line_end && (*line == ' ' || *line == '\t'))
+    line++;
+
+  /* Expect end of line.  */
+  if (line < line_end && *line != '\n')
+    {
+      fprintf (stderr, "%s:%u: junk after declaration\n",
+               pretty_input_file_name (), lineno);
+      exit (1);
+    }
+
+  *argp = arg;
+  return true;
+}
+
+/* Tests if the given line contains a "%define DECL ARG" declaration.
+   If yes, it sets *ARGP to the argument, and returns true.
+   Otherwise, it returns false.  */
+static bool
+is_define_declaration (const char *line, const char *line_end,
+                       unsigned int lineno,
+                       const char *decl, char **argp)
+{
+  /* Skip '%'.  */
+  line++;
+
+  /* Skip "define".  */
+  {
+    for (const char *d = "define"; *d; d++)
+      {
+        if (!(line < line_end))
+          return false;
+        if (!(*line == *d))
+          return false;
+        line++;
+      }
+    if (!(line < line_end && (*line == ' ' || *line == '\t')))
+      return false;
+  }
+
+  /* Skip whitespace.  */
+  while (line < line_end && (*line == ' ' || *line == '\t'))
+    line++;
+
+  /* Skip DECL.  */
+  for (const char *d = decl; *d; d++)
+    {
+      if (!(line < line_end))
+        return false;
+      if (!(*line == *d || (*d == '-' && *line == '_')))
+        return false;
+      line++;
+    }
+  if (line < line_end
+      && ((*line >= 'A' && *line <= 'Z')
+          || (*line >= 'a' && *line <= 'z')
+          || *line == '-' || *line == '_'))
+    return false;
+
+  /* OK, found DECL.  */
+
+  /* Skip whitespace.  */
+  if (!(line < line_end && (*line == ' ' || *line == '\t')))
+    {
+      fprintf (stderr, "%s:%u:"
+               " missing argument in %%define %s ARG declaration.\n",
+               pretty_input_file_name (), lineno, decl);
+      exit (1);
+    }
+  do
+    line++;
+  while (line < line_end && (*line == ' ' || *line == '\t'));
+
+  /* The next word is the argument.  */
+  char *arg = new char[line_end - line + 1];
+  char *p = arg;
+  while (line < line_end && !(*line == ' ' || *line == '\t' || *line == '\n'))
+    *p++ = *line++;
+  *p = '\0';
+
+  /* Skip whitespace.  */
+  while (line < line_end && (*line == ' ' || *line == '\t'))
+    line++;
+
+  /* Expect end of line.  */
+  if (line < line_end && *line != '\n')
+    {
+      fprintf (stderr, "%s:%u: junk after declaration\n",
+               pretty_input_file_name (), lineno);
+      exit (1);
+    }
+
+  *argp = arg;
+  return true;
+}
+
+/* Reads the entire input file.  */
+void
+Input::read_input ()
+{
+  /* The input file has the following structure:
+        DECLARATIONS
+        %%
+        KEYWORDS
+        %%
+        ADDITIONAL_CODE
+     Since the DECLARATIONS and the ADDITIONAL_CODE sections are optional,
+     we have to read the entire file in the case there is only one %%
+     separator line, in order to determine whether the structure is
+        DECLARATIONS
+        %%
+        KEYWORDS
+     or
+        KEYWORDS
+        %%
+        ADDITIONAL_CODE
+     When the option -t is given or when the first section contains
+     declaration lines starting with %, we go for the first interpretation,
+     otherwise for the second interpretation.  */
+
+  char *input = NULL;
+  size_t input_size = 0;
+  int input_length = get_delim (&input, &input_size, EOF, _stream);
+  if (input_length < 0)
+    {
+      if (ferror (_stream))
+        fprintf (stderr, "%s: error while reading input file\n",
+                 pretty_input_file_name ());
+      else
+        fprintf (stderr, "%s: The input file is empty!\n",
+                 pretty_input_file_name ());
+      exit (1);
+    }
+
+  /* We use input_end as a limit, in order to cope with NUL bytes in the
+     input.  But note that one trailing NUL byte has been added after
+     input_end, for convenience.  */
+  char *input_end = input + input_length;
+
+  const char *declarations;
+  const char *declarations_end;
+  const char *keywords;
+  const char *keywords_end;
+  unsigned int keywords_lineno;
+
+  /* Break up the input into the three sections.  */
+  {
+    const char *separator[2] = { NULL, NULL };
+    unsigned int separator_lineno[2] = { 0, 0 };
+    int separators = 0;
+    {
+      unsigned int lineno = 1;
+      for (const char *p = input; p < input_end; )
+        {
+          if (p[0] == '%' && p[1] == '%')
+            {
+              separator[separators] = p;
+              separator_lineno[separators] = lineno;
+              if (++separators == 2)
+                break;
+            }
+          lineno++;
+          p = (const char *) memchr (p, '\n', input_end - p);
+          if (p != NULL)
+            p++;
+          else
+            p = input_end;
+        }
+    }
+
+    bool has_declarations;
+    if (separators == 1)
+      {
+        if (option[TYPE])
+          has_declarations = true;
+        else
+          {
+            has_declarations = false;
+            for (const char *p = input; p < separator[0]; )
+              {
+                if (p[0] == '%')
+                  {
+                    has_declarations = true;
+                    break;
+                  }
+                p = (const char *) memchr (p, '\n', separator[0] - p);
+                if (p != NULL)
+                  p++;
+                else
+                  p = separator[0];
+              }
+          }
+      }
+    else
+      has_declarations = (separators > 0);
+
+    if (has_declarations)
+      {
+        declarations = input;
+        declarations_end = separator[0];
+        /* Give a warning if the separator line is nonempty.  */
+        bool nonempty_line = false;
+        const char *p;
+        for (p = declarations_end + 2; p < input_end; )
+          {
+            if (*p == '\n')
+              {
+                p++;
+                break;
+              }
+            if (!(*p == ' ' || *p == '\t'))
+              nonempty_line = true;
+            p++;
+          }
+        if (nonempty_line)
+          fprintf (stderr, "%s:%u: warning: junk after %%%% is ignored\n",
+                   pretty_input_file_name (), separator_lineno[0]);
+        keywords = p;
+        keywords_lineno = separator_lineno[0] + 1;
+      }
+    else
+      {
+        declarations = NULL;
+        declarations_end = NULL;
+        keywords = input;
+        keywords_lineno = 1;
+      }
+
+    if (separators > (has_declarations ? 1 : 0))
+      {
+        keywords_end = separator[separators-1];
+        _verbatim_code = separator[separators-1] + 2;
+        _verbatim_code_end = input_end;
+        _verbatim_code_lineno = separator_lineno[separators-1];
+      }
+    else
+      {
+        keywords_end = input_end;
+        _verbatim_code = NULL;
+        _verbatim_code_end = NULL;
+        _verbatim_code_lineno = 0;
+      }
+  }
+
+  /* Parse the declarations section.  */
+
+  _verbatim_declarations = NULL;
+  _verbatim_declarations_end = NULL;
+  _verbatim_declarations_lineno = 0;
+  _struct_decl = NULL;
+  _struct_decl_lineno = 0;
+  _return_type = NULL;
+  _struct_tag = NULL;
+  {
+    unsigned int lineno = 1;
+    char *struct_decl = NULL;
+    unsigned int *struct_decl_linenos = NULL;
+    unsigned int struct_decl_linecount = 0;
+    for (const char *line = declarations; line < declarations_end; )
+      {
+        const char *line_end;
+        line_end = (const char *) memchr (line, '\n', declarations_end - line);
+        if (line_end != NULL)
+          line_end++;
+        else
+          line_end = declarations_end;
+
+        if (*line == '%')
+          {
+            if (line[1] == '{')
+              {
+                /* Handle %{.  */
+                if (_verbatim_declarations != NULL)
+                  {
+                    fprintf (stderr, "%s:%u:\n%s:%u:"
+                             " only one %%{...%%} section is allowed\n",
+                             pretty_input_file_name (),
+                             _verbatim_declarations_lineno,
+                             pretty_input_file_name (), lineno);
+                    exit (1);
+                  }
+                _verbatim_declarations = line + 2;
+                _verbatim_declarations_lineno = lineno;
+              }
+            else if (line[1] == '}')
+              {
+                /* Handle %}.  */
+                if (_verbatim_declarations == NULL)
+                  {
+                    fprintf (stderr, "%s:%u:"
+                             " %%} outside of %%{...%%} section\n",
+                             pretty_input_file_name (), lineno);
+                    exit (1);
+                  }
+                if (_verbatim_declarations_end != NULL)
+                  {
+                    fprintf (stderr, "%s:%u:"
+                             " %%{...%%} section already closed\n",
+                             pretty_input_file_name (), lineno);
+                    exit (1);
+                  }
+                _verbatim_declarations_end = line;
+                /* Give a warning if the rest of the line is nonempty.  */
+                bool nonempty_line = false;
+                const char *q;
+                for (q = line + 2; q < line_end; q++)
+                  {
+                    if (*q == '\n')
+                      {
+                        q++;
+                        break;
+                      }
+                    if (!(*q == ' ' || *q == '\t'))
+                      nonempty_line = true;
+                  }
+                if (nonempty_line)
+                  fprintf (stderr, "%s:%u:"
+                           " warning: junk after %%} is ignored\n",
+                           pretty_input_file_name (), lineno);
+              }
+            else if (_verbatim_declarations != NULL
+                     && _verbatim_declarations_end == NULL)
+              {
+                fprintf (stderr, "%s:%u:"
+                         " warning: %% directives are ignored"
+                         " inside the %%{...%%} section\n",
+                         pretty_input_file_name (), lineno);
+              }
+            else
+              {
+                char *arg;
+
+                if (is_declaration_with_arg (line, line_end, lineno,
+                                             "delimiters", &arg))
+                  option.set_delimiters (arg);
+                else
+
+                if (is_declaration (line, line_end, lineno, "struct-type"))
+                  option.set (TYPE);
+                else
+
+                if (is_declaration (line, line_end, lineno, "ignore-case"))
+                  option.set (UPPERLOWER);
+                else
+
+                if (is_declaration_with_arg (line, line_end, lineno,
+                                             "language", &arg))
+                  option.set_language (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "slot-name", &arg))
+                  option.set_slot_name (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "initializer-suffix", &arg))
+                  option.set_initializer_suffix (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "hash-function-name", &arg))
+                  option.set_hash_name (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "lookup-function-name", &arg))
+                  option.set_function_name (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "class-name", &arg))
+                  option.set_class_name (arg);
+                else
+
+                if (is_declaration (line, line_end, lineno, "7bit"))
+                  option.set (SEVENBIT);
+                else
+
+                if (is_declaration (line, line_end, lineno, "compare-lengths"))
+                  option.set (LENTABLE);
+                else
+
+                if (is_declaration (line, line_end, lineno, "compare-strncmp"))
+                  option.set (COMP);
+                else
+
+                if (is_declaration (line, line_end, lineno, "readonly-tables"))
+                  option.set (CONST);
+                else
+
+                if (is_declaration (line, line_end, lineno, "enum"))
+                  option.set (ENUM);
+                else
+
+                if (is_declaration (line, line_end, lineno, "includes"))
+                  option.set (INCLUDE);
+                else
+
+                if (is_declaration (line, line_end, lineno, "global-table"))
+                  option.set (GLOBAL);
+                else
+
+                if (is_declaration (line, line_end, lineno, "pic"))
+                  option.set (SHAREDLIB);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "string-pool-name", &arg))
+                  option.set_stringpool_name (arg);
+                else
+
+                if (is_declaration (line, line_end, lineno, "null-strings"))
+                  option.set (NULLSTRINGS);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "word-array-name", &arg))
+                  option.set_wordlist_name (arg);
+                else
+
+                if (is_define_declaration (line, line_end, lineno,
+                                           "length-table-name", &arg))
+                  option.set_lengthtable_name (arg);
+                else
+
+                if (is_declaration_with_arg (line, line_end, lineno,
+                                             "switch", &arg))
+                  {
+                    option.set_total_switches (atoi (arg));
+                    if (option.get_total_switches () <= 0)
+                      {
+                        fprintf (stderr, "%s:%u: number of switches %s"
+                                 " must be a positive number\n",
+                                 pretty_input_file_name (), lineno, arg);
+                        exit (1);
+                      }
+                  }
+                else
+
+                if (is_declaration (line, line_end, lineno, "omit-struct-type"))
+                  option.set (NOTYPE);
+                else
+
+                  {
+                    fprintf (stderr, "%s:%u: unrecognized %% directive\n",
+                             pretty_input_file_name (), lineno);
+                    exit (1);
+                  }
+              }
+          }
+        else if (!(_verbatim_declarations != NULL
+                   && _verbatim_declarations_end == NULL))
+          {
+            /* Append the line to struct_decl.  */
+            size_t old_len = (struct_decl ? strlen (struct_decl) : 0);
+            size_t line_len = line_end - line;
+            size_t new_len = old_len + line_len + 1;
+            char *new_struct_decl = new char[new_len];
+            if (old_len > 0)
+              memcpy (new_struct_decl, struct_decl, old_len);
+            memcpy (new_struct_decl + old_len, line, line_len);
+            new_struct_decl[old_len + line_len] = '\0';
+            if (struct_decl)
+              delete[] struct_decl;
+            struct_decl = new_struct_decl;
+            /* Append the lineno to struct_decl_linenos.  */
+            unsigned int *new_struct_decl_linenos =
+              new unsigned int[struct_decl_linecount + 1];
+            if (struct_decl_linecount > 0)
+              memcpy (new_struct_decl_linenos, struct_decl_linenos,
+                      struct_decl_linecount * sizeof (unsigned int));
+            new_struct_decl_linenos[struct_decl_linecount] = lineno;
+            if (struct_decl_linenos)
+              delete[] struct_decl_linenos;
+            struct_decl_linenos = new_struct_decl_linenos;
+            /* Increment struct_decl_linecount.  */
+            struct_decl_linecount++;
+          }
+        lineno++;
+        line = line_end;
+      }
+    if (_verbatim_declarations != NULL && _verbatim_declarations_end == NULL)
+      {
+        fprintf (stderr, "%s:%u: unterminated %%{ section\n",
+                 pretty_input_file_name (), _verbatim_declarations_lineno);
+        exit (1);
+      }
+
+    /* Determine _struct_decl, _return_type, _struct_tag.  */
+    if (option[TYPE])
+      {
+        if (struct_decl)
+          {
+            /* Drop leading whitespace and comments.  */
+            {
+              char *p = struct_decl;
+              unsigned int *l = struct_decl_linenos;
+              for (;;)
+                {
+                  if (p[0] == ' ' || p[0] == '\t')
+                    {
+                      p++;
+                      continue;
+                    }
+                  if (p[0] == '\n')
+                    {
+                      l++;
+                      p++;
+                      continue;
+                    }
+                  if (p[0] == '/')
+                    {
+                      if (p[1] == '*')
+                        {
+                          /* Skip over ANSI C style comment.  */
+                          p += 2;
+                          while (p[0] != '\0')
+                            {
+                              if (p[0] == '*' && p[1] == '/')
+                                {
+                                  p += 2;
+                                  break;
+                                }
+                              if (p[0] == '\n')
+                                l++;
+                              p++;
+                            }
+                          continue;
+                        }
+                      if (p[1] == '/')
+                        {
+                          /* Skip over ISO C99 or C++ style comment.  */
+                          p += 2;
+                          while (p[0] != '\0' && p[0] != '\n')
+                            p++;
+                          if (p[0] == '\n')
+                            {
+                              l++;
+                              p++;
+                            }
+                          continue;
+                        }
+                    }
+                  break;
+                }
+              if (p != struct_decl)
+                {
+                  size_t len = strlen (p);
+                  char *new_struct_decl = new char[len + 1];
+                  memcpy (new_struct_decl, p, len + 1);
+                  delete[] struct_decl;
+                  struct_decl = new_struct_decl;
+                }
+              _struct_decl_lineno = *l;
+            }
+            /* Drop trailing whitespace.  */
+            for (char *p = struct_decl + strlen (struct_decl); p > struct_decl;)
+              if (p[-1] == '\n' || p[-1] == ' ' || p[-1] == '\t')
+                *--p = '\0';
+              else
+                break;
+          }
+        if (struct_decl == NULL || struct_decl[0] == '\0')
+          {
+            fprintf (stderr, "%s: missing struct declaration"
+                     " for option --struct-type\n",
+                     pretty_input_file_name ());
+            exit (1);
+          }
+        {
+          /* Ensure trailing semicolon.  */
+          size_t old_len = strlen (struct_decl);
+          if (struct_decl[old_len - 1] != ';')
+            {
+              char *new_struct_decl = new char[old_len + 2];
+              memcpy (new_struct_decl, struct_decl, old_len);
+              new_struct_decl[old_len] = ';';
+              new_struct_decl[old_len + 1] = '\0';
+              delete[] struct_decl;
+              struct_decl = new_struct_decl;
+            }
+        }
+        /* Set _struct_decl to the entire declaration.  */
+        _struct_decl = struct_decl;
+        /* Set _struct_tag to the naked "struct something".  */
+        const char *p;
+        for (p = struct_decl; *p && *p != '{' && *p != ';' && *p != '\n'; p++)
+          ;
+        for (; p > struct_decl;)
+          if (p[-1] == '\n' || p[-1] == ' ' || p[-1] == '\t')
+            --p;
+          else
+            break;
+        size_t struct_tag_length = p - struct_decl;
+        char *struct_tag = new char[struct_tag_length + 1];
+        memcpy (struct_tag, struct_decl, struct_tag_length);
+        struct_tag[struct_tag_length] = '\0';
+        _struct_tag = struct_tag;
+        /* The return type of the lookup function is "struct something *".
+           No "const" here, because if !option[CONST], some user code might
+           want to modify the structure. */
+        char *return_type = new char[struct_tag_length + 3];
+        memcpy (return_type, struct_decl, struct_tag_length);
+        return_type[struct_tag_length] = ' ';
+        return_type[struct_tag_length + 1] = '*';
+        return_type[struct_tag_length + 2] = '\0';
+        _return_type = return_type;
+      }
+
+    if (struct_decl_linenos)
+      delete[] struct_decl_linenos;
+  }
+
+  /* Parse the keywords section.  */
+  {
+    Keyword_List **list_tail = &_head;
+    const char *delimiters = option.get_delimiters ();
+    unsigned int lineno = keywords_lineno;
+    bool charset_dependent = false;
+    for (const char *line = keywords; line < keywords_end; )
+      {
+        const char *line_end;
+        line_end = (const char *) memchr (line, '\n', keywords_end - line);
+        if (line_end != NULL)
+          line_end++;
+        else
+          line_end = keywords_end;
+
+        if (line[0] == '#')
+          ; /* Comment line.  */
+        else if (line[0] == '%')
+          {
+            fprintf (stderr, "%s:%u:"
+                     " declarations are not allowed in the keywords section.\n"
+                     "To declare a keyword starting with %%, enclose it in"
+                     " double-quotes.\n",
+                     pretty_input_file_name (), lineno);
+            exit (1);
+          }
+        else
+          {
+            /* An input line carrying a keyword.  */
+            const char *keyword;
+            size_t keyword_length;
+            const char *rest;
+
+            if (line[0] == '"')
+              {
+                /* Parse a string in ANSI C syntax.  */
+                char *kp = new char[line_end-line];
+                keyword = kp;
+                const char *lp = line + 1;
+
+                for (;;)
+                  {
+                    if (lp == line_end)
+                      {
+                        fprintf (stderr, "%s:%u: unterminated string\n",
+                                 pretty_input_file_name (), lineno);
+                        exit (1);
+                      }
+
+                    char c = *lp;
+                    if (c == '\\')
+                      {
+                        c = *++lp;
+                        switch (c)
+                          {
+                          case '0': case '1': case '2': case '3':
+                          case '4': case '5': case '6': case '7':
+                            {
+                              int code = 0;
+                              int count = 0;
+                              while (count < 3 && *lp >= '0' && *lp <= '7')
+                                {
+                                  code = (code << 3) + (*lp - '0');
+                                  lp++;
+                                  count++;
+                                }
+                              if (code > UCHAR_MAX)
+                                fprintf (stderr,
+                                         "%s:%u: octal escape out of range\n",
+                                         pretty_input_file_name (), lineno);
+                              *kp = static_cast<char>(code);
+                              break;
+                            }
+                          case 'x':
+                            {
+                              int code = 0;
+                              int count = 0;
+                              lp++;
+                              while ((*lp >= '0' && *lp <= '9')
+                                     || (*lp >= 'A' && *lp <= 'F')
+                                     || (*lp >= 'a' && *lp <= 'f'))
+                                {
+                                  code = (code << 4)
+                                         + (*lp >= 'A' && *lp <= 'F'
+                                            ? *lp - 'A' + 10 :
+                                            *lp >= 'a' && *lp <= 'f'
+                                            ? *lp - 'a' + 10 :
+                                            *lp - '0');
+                                  lp++;
+                                  count++;
+                                }
+                              if (count == 0)
+                                fprintf (stderr, "%s:%u: hexadecimal escape"
+                                         " without any hex digits\n",
+                                         pretty_input_file_name (), lineno);
+                              if (code > UCHAR_MAX)
+                                fprintf (stderr, "%s:%u: hexadecimal escape"
+                                         " out of range\n",
+                                         pretty_input_file_name (), lineno);
+                              *kp = static_cast<char>(code);
+                              break;
+                            }
+                          case '\\': case '\'': case '"':
+                            *kp = c;
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'n':
+                            *kp = '\n';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 't':
+                            *kp = '\t';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'r':
+                            *kp = '\r';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'f':
+                            *kp = '\f';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'b':
+                            *kp = '\b';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'a':
+                            *kp = '\a';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          case 'v':
+                            *kp = '\v';
+                            lp++;
+                            charset_dependent = true;
+                            break;
+                          default:
+                            fprintf (stderr, "%s:%u: invalid escape sequence"
+                                     " in string\n",
+                                     pretty_input_file_name (), lineno);
+                            exit (1);
+                          }
+                      }
+                    else if (c == '"')
+                      break;
+                    else
+                      {
+                        *kp = c;
+                        lp++;
+                        charset_dependent = true;
+                      }
+                    kp++;
+                  }
+                lp++;
+                if (lp < line_end && *lp != '\n')
+                  {
+                    if (strchr (delimiters, *lp) == NULL)
+                      {
+                        fprintf (stderr, "%s:%u: string not followed"
+                                 " by delimiter\n",
+                                 pretty_input_file_name (), lineno);
+                        exit (1);
+                      }
+                    lp++;
+                  }
+                keyword_length = kp - keyword;
+                if (option[TYPE])
+                  {
+                    char *line_rest = new char[line_end - lp + 1];
+                    memcpy (line_rest, lp, line_end - lp);
+                    line_rest[line_end - lp -
+                              (line_end > lp && line_end[-1] == '\n' ? 1 : 0)]
+                      = '\0';
+                    rest = line_rest;
+                  }
+                else
+                  rest = empty_string;
+              }
+            else
+              {
+                /* Not a string.  Look for the delimiter.  */
+                const char *lp = line;
+                for (;;)
+                  {
+                    if (!(lp < line_end && *lp != '\n'))
+                      {
+                        keyword = line;
+                        keyword_length = lp - line;
+                        rest = empty_string;
+                        break;
+                      }
+                    if (strchr (delimiters, *lp) != NULL)
+                      {
+                        keyword = line;
+                        keyword_length = lp - line;
+                        lp++;
+                        if (option[TYPE])
+                          {
+                            char *line_rest = new char[line_end - lp + 1];
+                            memcpy (line_rest, lp, line_end - lp);
+                            line_rest[line_end - lp -
+                                      (line_end > lp && line_end[-1] == '\n'
+                                       ? 1 : 0)]
+                              = '\0';
+                            rest = line_rest;
+                          }
+                        else
+                          rest = empty_string;
+                        break;
+                      }
+                    lp++;
+                  }
+                if (keyword_length > 0)
+                  charset_dependent = true;
+              }
+
+            /* Allocate Keyword and add it to the list.  */
+            Keyword *new_kw = _factory->create_keyword (keyword, keyword_length,
+                                                        rest);
+            new_kw->_lineno = lineno;
+            *list_tail = new Keyword_List (new_kw);
+            list_tail = &(*list_tail)->rest();
+          }
+
+        lineno++;
+        line = line_end;
+      }
+    *list_tail = NULL;
+
+    if (_head == NULL)
+      {
+        fprintf (stderr, "%s: No keywords in input file!\n",
+                 pretty_input_file_name ());
+        exit (1);
+      }
+
+    _charset_dependent = charset_dependent;
+  }
+
+  /* To be freed in the destructor.  */
+  _input = input;
+  _input_end = input_end;
+}
+
+Input::~Input ()
+{
+  /* Free allocated memory.  */
+  delete[] const_cast<char*>(_return_type);
+  delete[] const_cast<char*>(_struct_tag);
+  delete[] const_cast<char*>(_struct_decl);
+  delete[] _input;
+}
diff --git a/src/input.h b/src/input.h
new file mode 100644 (file)
index 0000000..aebd250
--- /dev/null
@@ -0,0 +1,67 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Input routines.
+
+   Copyright (C) 1989-1998, 2002-2003 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef input_h
+#define input_h 1
+
+#include <stdio.h>
+#include "keyword-list.h"
+
+class Input
+{
+public:
+                        Input (FILE *stream, Keyword_Factory *keyword_factory);
+                        ~Input ();
+  void                  read_input ();
+private:
+  /* Input stream.  */
+  FILE *                _stream;
+  /* Creates the keywords.  */
+  Keyword_Factory * const _factory;
+public:
+  /* Memory block containing the entire input.  */
+  char *                _input;
+  char *                _input_end;
+  /* The C code from the declarations section.  */
+  const char *          _verbatim_declarations;
+  const char *          _verbatim_declarations_end;
+  unsigned int          _verbatim_declarations_lineno;
+  /* The C code from the end of the file.  */
+  const char *          _verbatim_code;
+  const char *          _verbatim_code_end;
+  unsigned int          _verbatim_code_lineno;
+  /* Declaration of struct type for a keyword and its attributes.  */
+  const char *          _struct_decl;
+  unsigned int          _struct_decl_lineno;
+  /* Return type of the lookup function.  */
+  const char *          _return_type;
+  /* Shorthand for user-defined struct tag type.  */
+  const char *          _struct_tag;
+  /* List of all keywords.  */
+  Keyword_List *        _head;
+  /* Whether the keyword chars would have different values in a different
+     character set.  */
+  bool                  _charset_dependent;
+};
+
+#endif
diff --git a/src/keyword-list.cc b/src/keyword-list.cc
new file mode 100644 (file)
index 0000000..235edd5
--- /dev/null
@@ -0,0 +1,173 @@
+/* Keyword list.
+
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "keyword-list.h"
+
+#include <stddef.h>
+
+/* -------------------------- Keyword_List class --------------------------- */
+
+/* Constructor.  */
+Keyword_List::Keyword_List (Keyword *car)
+  : _cdr (NULL), _car (car)
+{
+}
+
+/* ------------------------- KeywordExt_List class ------------------------- */
+
+/* Constructor.  */
+KeywordExt_List::KeywordExt_List (KeywordExt *car)
+  : Keyword_List (car)
+{
+}
+
+/* ------------------------ Keyword_List functions ------------------------- */
+
+/* Copies a linear list, sharing the list elements.  */
+Keyword_List *
+copy_list (Keyword_List *list)
+{
+  Keyword_List *result;
+  Keyword_List **lastp = &result;
+  while (list != NULL)
+    {
+      Keyword_List *new_cons = new Keyword_List (list->first());
+      *lastp = new_cons;
+      lastp = &new_cons->rest();
+      list = list->rest();
+    }
+  *lastp = NULL;
+  return result;
+}
+
+/* Copies a linear list, sharing the list elements.  */
+KeywordExt_List *
+copy_list (KeywordExt_List *list)
+{
+  return static_cast<KeywordExt_List *> (copy_list (static_cast<Keyword_List *> (list)));
+}
+
+/* Deletes a linear list, keeping the list elements in memory.  */
+void
+delete_list (Keyword_List *list)
+{
+  while (list != NULL)
+    {
+      Keyword_List *rest = list->rest();
+      delete list;
+      list = rest;
+    }
+}
+
+/* Type of a comparison function.  */
+typedef bool (*Keyword_Comparison) (Keyword *keyword1, Keyword *keyword2);
+
+/* Merges two sorted lists together to form one sorted list.  */
+static Keyword_List *
+merge (Keyword_List *list1, Keyword_List *list2, Keyword_Comparison less)
+{
+  Keyword_List *result;
+  Keyword_List **resultp = &result;
+  for (;;)
+    {
+      if (!list1)
+        {
+          *resultp = list2;
+          break;
+        }
+      if (!list2)
+        {
+          *resultp = list1;
+          break;
+        }
+      if (less (list2->first(), list1->first()))
+        {
+          *resultp = list2;
+          resultp = &list2->rest();
+          /* We would have a stable sorting if the next line would read:
+             list2 = *resultp;  */
+          list2 = list1; list1 = *resultp;
+        }
+      else
+        {
+          *resultp = list1;
+          resultp = &list1->rest();
+          list1 = *resultp;
+        }
+    }
+  return result;
+}
+
+/* Sorts a linear list, given a comparison function.
+   Note: This uses a variant of mergesort that is *not* a stable sorting
+   algorithm.  */
+Keyword_List *
+mergesort_list (Keyword_List *list, Keyword_Comparison less)
+{
+  if (list == NULL || list->rest() == NULL)
+    /* List of length 0 or 1.  Nothing to do.  */
+    return list;
+  else
+    {
+      /* Determine a list node in the middle.  */
+      Keyword_List *middle = list;
+      for (Keyword_List *temp = list->rest();;)
+        {
+          temp = temp->rest();
+          if (temp == NULL)
+            break;
+          temp = temp->rest();
+          middle = middle->rest();
+          if (temp == NULL)
+            break;
+        }
+
+      /* Cut the list into two halves.
+         If the list has n elements, the left half has ceiling(n/2) elements
+         and the right half has floor(n/2) elements.  */
+      Keyword_List *right_half = middle->rest();
+      middle->rest() = NULL;
+
+      /* Sort the two halves, then merge them.  */
+      return merge (mergesort_list (list, less),
+                    mergesort_list (right_half, less),
+                    less);
+    }
+}
+
+KeywordExt_List *
+mergesort_list (KeywordExt_List *list,
+                bool (*less) (KeywordExt *keyword1, KeywordExt *keyword2))
+{
+  return
+    static_cast<KeywordExt_List *>
+      (mergesort_list (static_cast<Keyword_List *> (list),
+                       reinterpret_cast<Keyword_Comparison> (less)));
+}
+
+
+#ifndef __OPTIMIZE__
+
+#define INLINE /* not inline */
+#include "keyword-list.icc"
+#undef INLINE
+
+#endif /* not defined __OPTIMIZE__ */
diff --git a/src/keyword-list.h b/src/keyword-list.h
new file mode 100644 (file)
index 0000000..ca2ada6
--- /dev/null
@@ -0,0 +1,83 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Keyword list.
+
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef keyword_list_h
+#define keyword_list_h 1
+
+#include "keyword.h"
+
+/* List node of a linear list of Keyword.  */
+class Keyword_List
+{
+public:
+  /* Constructor.  */
+                        Keyword_List (Keyword *car);
+
+  /* Access to first element of list.  */
+  Keyword *             first () const;
+  /* Access to next element of list.  */
+  Keyword_List *&       rest ();
+
+protected:
+  Keyword_List *        _cdr;
+  Keyword * const       _car;
+};
+
+/* List node of a linear list of KeywordExt.  */
+class KeywordExt_List : public Keyword_List
+{
+public:
+  /* Constructor.  */
+                        KeywordExt_List (KeywordExt *car);
+
+  /* Access to first element of list.  */
+  KeywordExt *          first () const;
+  /* Access to next element of list.  */
+  KeywordExt_List *&    rest ();
+};
+
+/* Copies a linear list, sharing the list elements.  */
+extern Keyword_List * copy_list (Keyword_List *list);
+extern KeywordExt_List * copy_list (KeywordExt_List *list);
+
+/* Deletes a linear list, keeping the list elements in memory.  */
+extern void delete_list (Keyword_List *list);
+
+/* Sorts a linear list, given a comparison function.
+   Note: This uses a variant of mergesort that is *not* a stable sorting
+   algorithm.  */
+extern Keyword_List * mergesort_list (Keyword_List *list,
+                                      bool (*less) (Keyword *keyword1,
+                                                    Keyword *keyword2));
+extern KeywordExt_List * mergesort_list (KeywordExt_List *list,
+                                         bool (*less) (KeywordExt *keyword1,
+                                                       KeywordExt *keyword2));
+
+#ifdef __OPTIMIZE__
+
+#define INLINE inline
+#include "keyword-list.icc"
+#undef INLINE
+
+#endif
+
+#endif
diff --git a/src/keyword-list.icc b/src/keyword-list.icc
new file mode 100644 (file)
index 0000000..6a21509
--- /dev/null
@@ -0,0 +1,51 @@
+/* Inline Functions for keyword-list.{h,cc}.
+
+   Copyright (C) 2002-2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* -------------------------- Keyword_List class --------------------------- */
+
+/* Access to first element of list.  */
+INLINE Keyword *
+Keyword_List::first () const
+{
+  return _car;
+}
+
+/* Access to next element of list.  */
+INLINE Keyword_List *&
+Keyword_List::rest ()
+{
+  return _cdr;
+}
+
+/* ------------------------- KeywordExt_List class ------------------------- */
+
+/* Access to first element of list.  */
+INLINE KeywordExt *
+KeywordExt_List::first () const
+{
+  return static_cast<KeywordExt*>(_car);
+}
+
+/* Access to next element of list.  */
+INLINE KeywordExt_List *&
+KeywordExt_List::rest ()
+{
+  return *reinterpret_cast<KeywordExt_List**>(&_cdr);
+}
diff --git a/src/keyword.cc b/src/keyword.cc
new file mode 100644 (file)
index 0000000..82f1077
--- /dev/null
@@ -0,0 +1,159 @@
+/* Keyword data.
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "keyword.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "positions.h"
+
+
+/* --------------------------- KeywordExt class --------------------------- */
+
+/* Sort a small set of 'unsigned int', base[0..len-1], in place.  */
+static inline void sort_char_set (unsigned int *base, int len)
+{
+  /* Bubble sort is sufficient here.  */
+  for (int i = 1; i < len; i++)
+    {
+      int j;
+      unsigned int tmp;
+
+      for (j = i, tmp = base[j]; j > 0 && tmp < base[j - 1]; j--)
+        base[j] = base[j - 1];
+
+      base[j] = tmp;
+    }
+}
+
+/* Initializes selchars and selchars_length.
+
+   General idea:
+     The hash function will be computed as
+         asso_values[allchars[key_pos[0]]] +
+         asso_values[allchars[key_pos[1]]] + ...
+     We compute selchars as the multiset
+         { allchars[key_pos[0]], allchars[key_pos[1]], ... }
+     so that the hash function becomes
+         asso_values[selchars[0]] + asso_values[selchars[1]] + ...
+   Furthermore we sort the selchars array, to ease detection of duplicates
+   later.
+
+   More in detail: The arguments alpha_unify (used for case-insensitive
+   hash functions) and alpha_inc (used to disambiguate permutations)
+   apply slight modifications. The hash function will be computed as
+       sum (j=0,1,...: k = key_pos[j]:
+            asso_values[alpha_unify[allchars[k]+alpha_inc[k]]])
+       + (allchars_length if !option[NOLENGTH], 0 otherwise).
+   We compute selchars as the multiset
+       { alpha_unify[allchars[k]+alpha_inc[k]] : j=0,1,..., k = key_pos[j] }
+   so that the hash function becomes
+       asso_values[selchars[0]] + asso_values[selchars[1]] + ...
+       + (allchars_length if !option[NOLENGTH], 0 otherwise).
+ */
+
+unsigned int *
+KeywordExt::init_selchars_low (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc)
+{
+  /* Iterate through the list of positions, initializing selchars
+     (via ptr).  */
+  PositionIterator iter = positions.iterator(_allchars_length);
+
+  unsigned int *key_set = new unsigned int[iter.remaining()];
+  unsigned int *ptr = key_set;
+
+  for (int i; (i = iter.next ()) != PositionIterator::EOS; )
+    {
+      unsigned int c;
+      if (i == Positions::LASTCHAR)
+        /* Special notation for last KEY position, i.e. '$'.  */
+        c = static_cast<unsigned char>(_allchars[_allchars_length - 1]);
+      else if (i < _allchars_length)
+        {
+          /* Within range of KEY length, so we'll keep it.  */
+          c = static_cast<unsigned char>(_allchars[i]);
+          if (alpha_inc)
+            c += alpha_inc[i];
+        }
+      else
+        /* Out of range of KEY length, the iterator should not have
+           produced this.  */
+        abort ();
+      if (alpha_unify)
+        c = alpha_unify[c];
+      *ptr = c;
+      ptr++;
+    }
+
+  _selchars = key_set;
+  _selchars_length = ptr - key_set;
+
+  return key_set;
+}
+
+void
+KeywordExt::init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify)
+{
+  init_selchars_low (positions, alpha_unify, NULL);
+}
+
+void
+KeywordExt::init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc)
+{
+  unsigned int *selchars =
+    init_selchars_low (positions, alpha_unify, alpha_inc);
+
+  /* Sort the selchars elements alphabetically.  */
+  sort_char_set (selchars, _selchars_length);
+}
+
+/* Deletes selchars.  */
+void
+KeywordExt::delete_selchars ()
+{
+  delete[] const_cast<unsigned int *>(_selchars);
+}
+
+
+/* ------------------------- Keyword_Factory class ------------------------- */
+
+Keyword_Factory::Keyword_Factory ()
+{
+}
+
+Keyword_Factory::~Keyword_Factory ()
+{
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+char empty_string[1] = "";
+
+
+#ifndef __OPTIMIZE__
+
+#define INLINE /* not inline */
+#include "keyword.icc"
+#undef INLINE
+
+#endif /* not defined __OPTIMIZE__ */
diff --git a/src/keyword.h b/src/keyword.h
new file mode 100644 (file)
index 0000000..e4421cf
--- /dev/null
@@ -0,0 +1,114 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Keyword data.
+
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef keyword_h
+#define keyword_h 1
+
+/* Class defined in "positions.h".  */
+class Positions;
+
+/* An instance of this class is a keyword, as specified in the input file.  */
+
+struct Keyword
+{
+  /* Constructor.  */
+                        Keyword (const char *allchars, int allchars_length,
+                                 const char *rest);
+
+  /* Data members defined immediately by the input file.  */
+  /* The keyword as a string, possibly containing NUL bytes.  */
+  const char *const     _allchars;
+  int const             _allchars_length;
+  /* Additional stuff seen on the same line of the input file.  */
+  const char *const     _rest;
+  /* Line number of this keyword in the input file.  */
+  unsigned int          _lineno;
+};
+
+/* A keyword, in the context of a given keyposition list.  */
+
+struct KeywordExt : public Keyword
+{
+  /* Constructor.  */
+                        KeywordExt (const char *allchars, int allchars_length,
+                                    const char *rest);
+
+  /* Data members depending on the keyposition list.  */
+  /* The selected characters that participate for the hash function,
+     selected according to the keyposition list, as a canonically reordered
+     multiset.  */
+  const unsigned int *  _selchars;
+  int                   _selchars_length;
+  /* Chained list of keywords having the same _selchars and
+     - if !option[NOLENGTH] - also the same _allchars_length.
+     Note that these duplicates are not members of the main keyword list.  */
+  KeywordExt *          _duplicate_link;
+
+  /* Methods depending on the keyposition list.  */
+  /* Initializes selchars and selchars_length, without reordering.  */
+  void                  init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify);
+  /* Initializes selchars and selchars_length, with reordering.  */
+  void                  init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc);
+  /* Deletes selchars.  */
+  void                  delete_selchars ();
+
+  /* Data members used by the algorithm.  */
+  int                   _hash_value; /* Hash value for the keyword.  */
+
+  /* Data members used by the output routines.  */
+  int                   _final_index;
+
+private:
+  unsigned int *        init_selchars_low (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc);
+};
+
+/* An abstract factory for creating Keyword instances.
+   This factory is used to make the Input class independent of the concrete
+   class KeywordExt.  */
+
+class Keyword_Factory
+{
+public:
+  /* Constructor.  */
+                        Keyword_Factory ();
+  /* Destructor.  */
+  virtual               ~Keyword_Factory ();
+
+  /* Creates a new Keyword.  */
+  virtual /*abstract*/ Keyword *
+                        create_keyword (const char *allchars, int allchars_length,
+                                        const char *rest) = 0;
+};
+
+/* A statically allocated empty string.  */
+extern char empty_string[1];
+
+#ifdef __OPTIMIZE__
+
+#define INLINE inline
+#include "keyword.icc"
+#undef INLINE
+
+#endif
+
+#endif
diff --git a/src/keyword.icc b/src/keyword.icc
new file mode 100644 (file)
index 0000000..5255874
--- /dev/null
@@ -0,0 +1,40 @@
+/* Inline Functions for keyword.{h,cc}.
+
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* ----------------------------- Keyword class ----------------------------- */
+
+/* Constructor.  */
+INLINE
+Keyword::Keyword (const char *allchars, int allchars_length, const char *rest)
+  : _allchars (allchars), _allchars_length (allchars_length), _rest (rest)
+{
+}
+
+
+/* --------------------------- KeywordExt class --------------------------- */
+
+/* Constructor.  */
+INLINE
+KeywordExt::KeywordExt (const char *allchars, int allchars_length, const char *rest)
+  : Keyword (allchars, allchars_length, rest),
+    _final_index (-1)
+{
+}
diff --git a/src/main.cc b/src/main.cc
new file mode 100644 (file)
index 0000000..34b59ee
--- /dev/null
@@ -0,0 +1,154 @@
+/* Driver program for the hash function generator
+   Copyright (C) 1989-1998, 2000, 2002-2003, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "options.h"
+#include "input.h"
+#include "search.h"
+#include "output.h"
+
+
+/* ------------------------------------------------------------------------- */
+
+/* This Keyword factory produces KeywordExt instances.  */
+
+class KeywordExt_Factory : public Keyword_Factory
+{
+virtual Keyword *       create_keyword (const char *allchars, int allchars_length,
+                                        const char *rest);
+};
+
+Keyword *
+KeywordExt_Factory::create_keyword (const char *allchars, int allchars_length, const char *rest)
+{
+  return new KeywordExt (allchars, allchars_length, rest);
+}
+
+/* ------------------------------------------------------------------------- */
+
+int
+main (int argc, char *argv[])
+{
+  int exitcode;
+
+  /* Set the Options.  Open the input file and assign stdin to it.  */
+  option.parse_options (argc, argv);
+
+  /* Open the input file.  */
+  if (option.get_input_file_name ())
+    if (!freopen (option.get_input_file_name (), "r", stdin))
+      {
+        fprintf (stderr, "Cannot open input file '%s'\n",
+                 option.get_input_file_name ());
+        exit (1);
+      }
+
+  {
+    /* Initialize the keyword list.  */
+    KeywordExt_Factory factory;
+    Input inputter (stdin, &factory);
+    inputter.read_input ();
+    /* We can cast the keyword list to KeywordExt_List* because its list
+       elements were created by KeywordExt_Factory.  */
+    KeywordExt_List* list = static_cast<KeywordExt_List*>(inputter._head);
+
+    {
+      /* Search for a good hash function.  */
+      Search searcher (list);
+      searcher.optimize ();
+      list = searcher._head;
+
+      /* Open the output file.  */
+      if (option.get_output_file_name ())
+        if (strcmp (option.get_output_file_name (), "-") != 0)
+          if (!freopen (option.get_output_file_name (), "w", stdout))
+            {
+              fprintf (stderr, "Cannot open output file '%s'\n",
+                       option.get_output_file_name ());
+              exit (1);
+            }
+
+      {
+        /* Output the hash function code.  */
+        Output outputter (searcher._head,
+                          inputter._struct_decl,
+                          inputter._struct_decl_lineno,
+                          inputter._return_type,
+                          inputter._struct_tag,
+                          inputter._verbatim_declarations,
+                          inputter._verbatim_declarations_end,
+                          inputter._verbatim_declarations_lineno,
+                          inputter._verbatim_code,
+                          inputter._verbatim_code_end,
+                          inputter._verbatim_code_lineno,
+                          inputter._charset_dependent,
+                          searcher._total_keys,
+                          searcher._max_key_len,
+                          searcher._min_key_len,
+                          searcher._hash_includes_len,
+                          searcher._key_positions,
+                          searcher._alpha_inc,
+                          searcher._total_duplicates,
+                          searcher._alpha_size,
+                          searcher._asso_values);
+        outputter.output ();
+
+        /* Check for write error on stdout.  */
+        exitcode = 0;
+        if (fflush (stdout) || ferror (stdout))
+          {
+            fprintf (stderr, "error while writing output file\n");
+            exitcode = 1;
+          }
+
+        /* Here we run the Output destructor.  */
+      }
+      /* Here we run the Search destructor.  */
+    }
+
+    /* Also delete the list that was allocated inside Input and reordered
+       inside Search.  */
+    for (KeywordExt_List *ptr = list; ptr; ptr = ptr->rest())
+      {
+        KeywordExt *keyword = ptr->first();
+        do
+          {
+            KeywordExt *next_keyword = keyword->_duplicate_link;
+            delete[] const_cast<unsigned int *>(keyword->_selchars);
+            if (keyword->_rest != empty_string)
+              delete[] const_cast<char*>(keyword->_rest);
+            if (!(keyword->_allchars >= inputter._input
+                  && keyword->_allchars < inputter._input_end))
+              delete[] const_cast<char*>(keyword->_allchars);
+            delete keyword;
+            keyword = next_keyword;
+          }
+        while (keyword != NULL);
+      }
+    delete_list (list);
+
+    /* Here we run the Input destructor.  */
+  }
+
+  /* Don't use exit() here, it skips the destructors.  */
+  return exitcode;
+}
diff --git a/src/options.cc b/src/options.cc
new file mode 100644 (file)
index 0000000..a60446d
--- /dev/null
@@ -0,0 +1,1072 @@
+/* Handles parsing the Options provided to the user.
+   Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "options.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* declares atoi(), abs(), exit() */
+#include <string.h> /* declares strcmp() */
+#include <ctype.h>  /* declares isdigit() */
+#include <limits.h> /* defines CHAR_MAX */
+#include "getopt.h"
+#include "version.h"
+
+/* Global option coordinator for the entire program.  */
+Options option;
+
+/* Records the program name.  */
+const char *program_name;
+
+/* Size to jump on a collision.  */
+static const int DEFAULT_JUMP_VALUE = 5;
+
+/* Default name for generated lookup function.  */
+static const char *const DEFAULT_FUNCTION_NAME = "in_word_set";
+
+/* Default name for the key component.  */
+static const char *const DEFAULT_SLOT_NAME = "name";
+
+/* Default struct initializer suffix.  */
+static const char *const DEFAULT_INITIALIZER_SUFFIX = "";
+
+/* Default name for the generated class.  */
+static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash";
+
+/* Default name for generated hash function.  */
+static const char *const DEFAULT_HASH_NAME = "hash";
+
+/* Default name for generated hash table array.  */
+static const char *const DEFAULT_WORDLIST_NAME = "wordlist";
+
+/* Default name for generated length table array.  */
+static const char *const DEFAULT_LENGTHTABLE_NAME = "lengthtable";
+
+/* Default name for string pool.  */
+static const char *const DEFAULT_STRINGPOOL_NAME = "stringpool";
+
+/* Default delimiters that separate keywords from their attributes.  */
+static const char *const DEFAULT_DELIMITERS = ",";
+
+/* Prints program usage to given stream.  */
+
+void
+Options::short_usage (FILE * stream)
+{
+  fprintf (stream,
+           "Try '%s --help' for more information.\n", program_name);
+}
+
+void
+Options::long_usage (FILE * stream)
+{
+  fprintf (stream,
+           "GNU 'gperf' generates perfect hash functions.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Usage: %s [OPTION]... [INPUT-FILE]\n",
+           program_name);
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "If a long option shows an argument as mandatory, then it is mandatory\n"
+           "for the equivalent short option also.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Output file location:\n");
+  fprintf (stream,
+           "      --output-file=FILE Write output to specified file.\n");
+  fprintf (stream,
+           "The results are written to standard output if no output file is specified\n"
+           "or if it is -.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Input file interpretation:\n");
+  fprintf (stream,
+           "  -e, --delimiters=DELIMITER-LIST\n"
+           "                         Allow user to provide a string containing delimiters\n"
+           "                         used to separate keywords from their attributes.\n"
+           "                         Default is \",\".\n");
+  fprintf (stream,
+           "  -t, --struct-type      Allows the user to include a structured type\n"
+           "                         declaration for generated code. Any text before %%%%\n"
+           "                         is considered part of the type declaration. Key\n"
+           "                         words and additional fields may follow this, one\n"
+           "                         group of fields per line.\n");
+  fprintf (stream,
+           "      --ignore-case      Consider upper and lower case ASCII characters as\n"
+           "                         equivalent. Note that locale dependent case mappings\n"
+           "                         are ignored.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Language for the output code:\n");
+  fprintf (stream,
+           "  -L, --language=LANGUAGE-NAME\n"
+           "                         Generates code in the specified language. Languages\n"
+           "                         handled are currently C++, ANSI-C, C, and KR-C. The\n"
+           "                         default is C.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Details in the output code:\n");
+  fprintf (stream,
+           "  -K, --slot-name=NAME   Select name of the keyword component in the keyword\n"
+           "                         structure.\n");
+  fprintf (stream,
+           "  -F, --initializer-suffix=INITIALIZERS\n"
+           "                         Initializers for additional components in the keyword\n"
+           "                         structure.\n");
+  fprintf (stream,
+           "  -H, --hash-function-name=NAME\n"
+           "                         Specify name of generated hash function. Default is\n"
+           "                         'hash'.\n");
+  fprintf (stream,
+           "  -N, --lookup-function-name=NAME\n"
+           "                         Specify name of generated lookup function. Default\n"
+           "                         name is 'in_word_set'.\n");
+  fprintf (stream,
+           "  -Z, --class-name=NAME  Specify name of generated C++ class. Default name is\n"
+           "                         'Perfect_Hash'.\n");
+  fprintf (stream,
+           "  -7, --seven-bit        Assume 7-bit characters.\n");
+  fprintf (stream,
+           "  -l, --compare-lengths  Compare key lengths before trying a string\n"
+           "                         comparison. This is necessary if the keywords\n"
+           "                         contain NUL bytes. It also helps cut down on the\n"
+           "                         number of string comparisons made during the lookup.\n");
+  fprintf (stream,
+           "  -c, --compare-strncmp  Generate comparison code using strncmp rather than\n"
+           "                         strcmp.\n");
+  fprintf (stream,
+           "  -C, --readonly-tables  Make the contents of generated lookup tables\n"
+           "                         constant, i.e., readonly.\n");
+  fprintf (stream,
+           "  -E, --enum             Define constant values using an enum local to the\n"
+           "                         lookup function rather than with defines.\n");
+  fprintf (stream,
+           "  -I, --includes         Include the necessary system include file <string.h>\n"
+           "                         at the beginning of the code.\n");
+  fprintf (stream,
+           "  -G, --global-table     Generate the static table of keywords as a static\n"
+           "                         global variable, rather than hiding it inside of the\n"
+           "                         lookup function (which is the default behavior).\n");
+  fprintf (stream,
+           "  -P, --pic              Optimize the generated table for inclusion in shared\n"
+           "                         libraries.  This reduces the startup time of programs\n"
+           "                         using a shared library containing the generated code.\n");
+  fprintf (stream,
+           "  -Q, --string-pool-name=NAME\n"
+           "                         Specify name of string pool generated by option --pic.\n"
+           "                         Default name is 'stringpool'.\n");
+  fprintf (stream,
+           "      --null-strings     Use NULL strings instead of empty strings for empty\n"
+           "                         keyword table entries.\n");
+  fprintf (stream,
+           "  -W, --word-array-name=NAME\n"
+           "                         Specify name of word list array. Default name is\n"
+           "                         'wordlist'.\n");
+  fprintf (stream,
+           "      --length-table-name=NAME\n"
+           "                         Specify name of length table array. Default name is\n"
+           "                         'lengthtable'.\n");
+  fprintf (stream,
+           "  -S, --switch=COUNT     Causes the generated C code to use a switch\n"
+           "                         statement scheme, rather than an array lookup table.\n"
+           "                         This can lead to a reduction in both time and space\n"
+           "                         requirements for some keyfiles. The COUNT argument\n"
+           "                         determines how many switch statements are generated.\n"
+           "                         A value of 1 generates 1 switch containing all the\n"
+           "                         elements, a value of 2 generates 2 tables with 1/2\n"
+           "                         the elements in each table, etc. If COUNT is very\n"
+           "                         large, say 1000000, the generated C code does a\n"
+           "                         binary search.\n");
+  fprintf (stream,
+           "  -T, --omit-struct-type\n"
+           "                         Prevents the transfer of the type declaration to the\n"
+           "                         output file. Use this option if the type is already\n"
+           "                         defined elsewhere.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Algorithm employed by gperf:\n");
+  fprintf (stream,
+           "  -k, --key-positions=KEYS\n"
+           "                         Select the key positions used in the hash function.\n"
+           "                         The allowable choices range between 1-%d, inclusive.\n"
+           "                         The positions are separated by commas, ranges may be\n"
+           "                         used, and key positions may occur in any order.\n"
+           "                         Also, the meta-character '*' causes the generated\n"
+           "                         hash function to consider ALL key positions, and $\n"
+           "                         indicates the \"final character\" of a key, e.g.,\n"
+           "                         $,1,2,4,6-10.\n",
+           Positions::MAX_KEY_POS);
+  fprintf (stream,
+           "  -D, --duplicates       Handle keywords that hash to duplicate values. This\n"
+           "                         is useful for certain highly redundant keyword sets.\n");
+  fprintf (stream,
+           "  -m, --multiple-iterations=ITERATIONS\n"
+           "                         Perform multiple choices of the -i and -j values,\n"
+           "                         and choose the best results. This increases the\n"
+           "                         running time by a factor of ITERATIONS but does a\n"
+           "                         good job minimizing the generated table size.\n");
+  fprintf (stream,
+           "  -i, --initial-asso=N   Provide an initial value for the associate values\n"
+           "                         array. Default is 0. Setting this value larger helps\n"
+           "                         inflate the size of the final table.\n");
+  fprintf (stream,
+           "  -j, --jump=JUMP-VALUE  Affects the \"jump value\", i.e., how far to advance\n"
+           "                         the associated character value upon collisions. Must\n"
+           "                         be an odd number, default is %d.\n",
+           DEFAULT_JUMP_VALUE);
+  fprintf (stream,
+           "  -n, --no-strlen        Do not include the length of the keyword when\n"
+           "                         computing the hash function.\n");
+  fprintf (stream,
+           "  -r, --random           Utilizes randomness to initialize the associated\n"
+           "                         values table.\n");
+  fprintf (stream,
+           "  -s, --size-multiple=N  Affects the size of the generated hash table. The\n"
+           "                         numeric argument N indicates \"how many times larger\n"
+           "                         or smaller\" the associated value range should be,\n"
+           "                         in relationship to the number of keys, e.g. a value\n"
+           "                         of 3 means \"allow the maximum associated value to\n"
+           "                         be about 3 times larger than the number of input\n"
+           "                         keys\". Conversely, a value of 1/3 means \"make the\n"
+           "                         maximum associated value about 3 times smaller than\n"
+           "                         the number of input keys\". A larger table should\n"
+           "                         decrease the time required for an unsuccessful\n"
+           "                         search, at the expense of extra table space. Default\n"
+           "                         value is 1.\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Informative output:\n"
+           "  -h, --help             Print this message.\n"
+           "  -v, --version          Print the gperf version number.\n"
+           "  -d, --debug            Enables the debugging option (produces verbose\n"
+           "                         output to the standard error).\n");
+  fprintf (stream, "\n");
+  fprintf (stream,
+           "Report bugs to <bug-gnu-gperf@gnu.org>.\n");
+}
+
+/* Prints the given options.  */
+
+void
+Options::print_options () const
+{
+  printf ("/* Command-line: ");
+
+  for (int i = 0; i < _argument_count; i++)
+    {
+      const char *arg = _argument_vector[i];
+
+      /* Escape arg if it contains shell metacharacters.  */
+      if (*arg == '-')
+        {
+          putchar (*arg);
+          arg++;
+          if (*arg >= 'A' && *arg <= 'Z' || *arg >= 'a' && *arg <= 'z')
+            {
+              putchar (*arg);
+              arg++;
+            }
+          else if (*arg == '-')
+            {
+              do
+                {
+                  putchar (*arg);
+                  arg++;
+                }
+              while (*arg >= 'A' && *arg <= 'Z' || *arg >= 'a' && *arg <= 'z' || *arg == '-');
+              if (*arg == '=')
+                {
+                  putchar (*arg);
+                  arg++;
+                }
+            }
+        }
+      if (strpbrk (arg, "\t\n !\"#$&'()*;<>?[\\]`{|}~") != NULL)
+        {
+          if (strchr (arg, '\'') != NULL)
+            {
+              putchar ('"');
+              for (; *arg; arg++)
+                {
+                  if (*arg == '\"' || *arg == '\\' || *arg == '$' || *arg == '`')
+                    putchar ('\\');
+                  putchar (*arg);
+                }
+              putchar ('"');
+            }
+          else
+            {
+              putchar ('\'');
+              for (; *arg; arg++)
+                {
+                  if (*arg == '\\')
+                    putchar ('\\');
+                  putchar (*arg);
+                }
+              putchar ('\'');
+            }
+        }
+      else
+        printf ("%s", arg);
+
+      printf (" ");
+    }
+
+  printf (" */");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Parses a string denoting key positions.  */
+
+class PositionStringParser
+{
+public:
+  /* Initializes a key position string parser for string STR.  */
+                        PositionStringParser (const char *str,
+                                              int low_bound, int high_bound,
+                                              int end_word_marker, int error_value, int end_marker);
+  /* Returns the next key position from the given string.  */
+  int                   nextPosition ();
+private:
+  /* A pointer to the string provided by the user.  */
+  const char *          _str;
+  /* Smallest possible value, inclusive.  */
+  int const             _low_bound;
+  /* Greatest possible value, inclusive.  */
+  int const             _high_bound;
+  /* A value marking the abstract "end of word" ( usually '$').  */
+  int const             _end_word_marker;
+  /* Error value returned when input is syntactically erroneous.  */
+  int const             _error_value;
+  /* Value returned after last key is processed.  */
+  int const             _end_marker;
+  /* Intermediate state for producing a range of positions.  */
+  bool                  _in_range;           /* True while producing a range of positions.  */
+  int                   _range_upper_bound;  /* Upper bound (inclusive) of the range.  */
+  int                   _range_curr_value;   /* Last value returned.  */
+};
+
+/* Initializes a key position strng parser for string STR.  */
+PositionStringParser::PositionStringParser (const char *str,
+                                            int low_bound, int high_bound,
+                                            int end_word_marker, int error_value, int end_marker)
+  : _str (str),
+    _low_bound (low_bound),
+    _high_bound (high_bound),
+    _end_word_marker (end_word_marker),
+    _error_value (error_value),
+    _end_marker (end_marker),
+    _in_range (false)
+{
+}
+
+/* Returns the next key position from the given string.  */
+int
+PositionStringParser::nextPosition ()
+{
+  if (_in_range)
+    {
+      /* We are inside a range.  Return the next value from the range.  */
+      if (++_range_curr_value >= _range_upper_bound)
+        _in_range = false;
+      return _range_curr_value;
+    }
+  else
+    {
+      /* Continue parsing the given string.  */
+      while (*_str)
+        switch (*_str)
+          {
+          case ',':
+            /* Skip the comma.  */
+            _str++;
+            break;
+          case '$':
+            /* Valid key position.  */
+            _str++;
+            return _end_word_marker;
+          case '0': case '1': case '2': case '3': case '4':
+          case '5': case '6': case '7': case '8': case '9':
+            /* Valid key position.  */
+            {
+              int curr_value;
+              for (curr_value = 0; isdigit (static_cast<unsigned char>(*_str)); _str++)
+                curr_value = curr_value * 10 + (*_str - '0');
+
+              if (*_str == '-')
+                {
+                  _str++;
+                  /* Starting a range of key positions.  */
+                  _in_range = true;
+
+                  for (_range_upper_bound = 0;
+                       isdigit (static_cast<unsigned char>(*_str));
+                       _str++)
+                    _range_upper_bound = _range_upper_bound * 10 + (*_str - '0');
+
+                  /* Verify range's upper bound.  */
+                  if (!(_range_upper_bound > curr_value && _range_upper_bound <= _high_bound))
+                    return _error_value;
+                  _range_curr_value = curr_value;
+                }
+
+              /* Verify range's lower bound.  */
+              if (!(curr_value >= _low_bound && curr_value <= _high_bound))
+                return _error_value;
+              return curr_value;
+            }
+          default:
+            /* Invalid syntax.  */
+            return _error_value;
+          }
+
+      return _end_marker;
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Sets the default Options.  */
+
+Options::Options ()
+  : _option_word (C),
+    _input_file_name (NULL),
+    _output_file_name (NULL),
+    _language (NULL),
+    _jump (DEFAULT_JUMP_VALUE),
+    _initial_asso_value (0),
+    _asso_iterations (0),
+    _total_switches (1),
+    _size_multiple (1),
+    _function_name (DEFAULT_FUNCTION_NAME),
+    _slot_name (DEFAULT_SLOT_NAME),
+    _initializer_suffix (DEFAULT_INITIALIZER_SUFFIX),
+    _class_name (DEFAULT_CLASS_NAME),
+    _hash_name (DEFAULT_HASH_NAME),
+    _wordlist_name (DEFAULT_WORDLIST_NAME),
+    _lengthtable_name (DEFAULT_LENGTHTABLE_NAME),
+    _stringpool_name (DEFAULT_STRINGPOOL_NAME),
+    _delimiters (DEFAULT_DELIMITERS),
+    _key_positions ()
+{
+}
+
+/* Dumps option status when debugging is enabled.  */
+
+Options::~Options ()
+{
+  if (_option_word & DEBUG)
+    {
+      fprintf (stderr, "\ndumping Options:"
+               "\nTYPE is........: %s"
+               "\nUPPERLOWER is..: %s"
+               "\nKRC is.........: %s"
+               "\nC is...........: %s"
+               "\nANSIC is.......: %s"
+               "\nCPLUSPLUS is...: %s"
+               "\nSEVENBIT is....: %s"
+               "\nLENTABLE is....: %s"
+               "\nCOMP is........: %s"
+               "\nCONST is.......: %s"
+               "\nENUM is........: %s"
+               "\nINCLUDE is.....: %s"
+               "\nGLOBAL is......: %s"
+               "\nNULLSTRINGS is.: %s"
+               "\nSHAREDLIB is...: %s"
+               "\nSWITCH is......: %s"
+               "\nNOTYPE is......: %s"
+               "\nDUP is.........: %s"
+               "\nNOLENGTH is....: %s"
+               "\nRANDOM is......: %s"
+               "\nDEBUG is.......: %s"
+               "\nlookup function name = %s"
+               "\nhash function name = %s"
+               "\nword list name = %s"
+               "\nlength table name = %s"
+               "\nstring pool name = %s"
+               "\nslot name = %s"
+               "\ninitializer suffix = %s"
+               "\nasso_values iterations = %d"
+               "\njump value = %d"
+               "\nhash table size multiplier = %g"
+               "\ninitial associated value = %d"
+               "\ndelimiters = %s"
+               "\nnumber of switch statements = %d\n",
+               _option_word & TYPE ? "enabled" : "disabled",
+               _option_word & UPPERLOWER ? "enabled" : "disabled",
+               _option_word & KRC ? "enabled" : "disabled",
+               _option_word & C ? "enabled" : "disabled",
+               _option_word & ANSIC ? "enabled" : "disabled",
+               _option_word & CPLUSPLUS ? "enabled" : "disabled",
+               _option_word & SEVENBIT ? "enabled" : "disabled",
+               _option_word & LENTABLE ? "enabled" : "disabled",
+               _option_word & COMP ? "enabled" : "disabled",
+               _option_word & CONST ? "enabled" : "disabled",
+               _option_word & ENUM ? "enabled" : "disabled",
+               _option_word & INCLUDE ? "enabled" : "disabled",
+               _option_word & GLOBAL ? "enabled" : "disabled",
+               _option_word & NULLSTRINGS ? "enabled" : "disabled",
+               _option_word & SHAREDLIB ? "enabled" : "disabled",
+               _option_word & SWITCH ? "enabled" : "disabled",
+               _option_word & NOTYPE ? "enabled" : "disabled",
+               _option_word & DUP ? "enabled" : "disabled",
+               _option_word & NOLENGTH ? "enabled" : "disabled",
+               _option_word & RANDOM ? "enabled" : "disabled",
+               _option_word & DEBUG ? "enabled" : "disabled",
+               _function_name, _hash_name, _wordlist_name, _lengthtable_name,
+               _stringpool_name, _slot_name, _initializer_suffix,
+               _asso_iterations, _jump, _size_multiple, _initial_asso_value,
+               _delimiters, _total_switches);
+      if (_key_positions.is_useall())
+        fprintf (stderr, "all characters are used in the hash function\n");
+      else
+        {
+          fprintf (stderr, "maximum keysig size = %d\nkey positions are: \n",
+                   _key_positions.get_size());
+
+          PositionIterator iter = _key_positions.iterator();
+          for (int pos; (pos = iter.next()) != PositionIterator::EOS; )
+            if (pos == Positions::LASTCHAR)
+              fprintf (stderr, "$\n");
+            else
+              fprintf (stderr, "%d\n", pos + 1);
+        }
+
+      fprintf (stderr, "finished dumping Options\n");
+    }
+}
+
+
+/* Sets the output language, if not already set.  */
+void
+Options::set_language (const char *language)
+{
+  if (_language == NULL)
+    {
+      _language = language;
+      _option_word &= ~(KRC | C | ANSIC | CPLUSPLUS);
+      if (!strcmp (language, "KR-C"))
+        _option_word |= KRC;
+      else if (!strcmp (language, "C"))
+        _option_word |= C;
+      else if (!strcmp (language, "ANSI-C"))
+        _option_word |= ANSIC;
+      else if (!strcmp (language, "C++"))
+        _option_word |= CPLUSPLUS;
+      else
+        {
+          fprintf (stderr, "unsupported language option %s, defaulting to C\n",
+                   language);
+          _option_word |= C;
+        }
+    }
+}
+
+/* Sets the total number of switch statements, if not already set.  */
+void
+Options::set_total_switches (int total_switches)
+{
+  if (!(_option_word & SWITCH))
+    {
+      _option_word |= SWITCH;
+      _total_switches = total_switches;
+    }
+}
+
+/* Sets the generated function name, if not already set.  */
+void
+Options::set_function_name (const char *name)
+{
+  if (_function_name == DEFAULT_FUNCTION_NAME)
+    _function_name = name;
+}
+
+/* Sets the keyword key name, if not already set.  */
+void
+Options::set_slot_name (const char *name)
+{
+  if (_slot_name == DEFAULT_SLOT_NAME)
+    _slot_name = name;
+}
+
+/* Sets the struct initializer suffix, if not already set.  */
+void
+Options::set_initializer_suffix (const char *initializers)
+{
+  if (_initializer_suffix == DEFAULT_INITIALIZER_SUFFIX)
+    _initializer_suffix = initializers;
+}
+
+/* Sets the generated class name, if not already set.  */
+void
+Options::set_class_name (const char *name)
+{
+  if (_class_name == DEFAULT_CLASS_NAME)
+    _class_name = name;
+}
+
+/* Sets the hash function name, if not already set.  */
+void
+Options::set_hash_name (const char *name)
+{
+  if (_hash_name == DEFAULT_HASH_NAME)
+    _hash_name = name;
+}
+
+/* Sets the hash table array name, if not already set.  */
+void
+Options::set_wordlist_name (const char *name)
+{
+  if (_wordlist_name == DEFAULT_WORDLIST_NAME)
+    _wordlist_name = name;
+}
+
+/* Sets the length table array name, if not already set.  */
+void
+Options::set_lengthtable_name (const char *name)
+{
+  if (_lengthtable_name == DEFAULT_LENGTHTABLE_NAME)
+    _lengthtable_name = name;
+}
+
+/* Sets the string pool name, if not already set.  */
+void
+Options::set_stringpool_name (const char *name)
+{
+  if (_stringpool_name == DEFAULT_STRINGPOOL_NAME)
+    _stringpool_name = name;
+}
+
+/* Sets the delimiters string, if not already set.  */
+void
+Options::set_delimiters (const char *delimiters)
+{
+  if (_delimiters == DEFAULT_DELIMITERS)
+    _delimiters = delimiters;
+}
+
+
+/* Parses the command line Options and sets appropriate flags in option_word.  */
+
+static const struct option long_options[] =
+{
+  { "output-file", required_argument, NULL, CHAR_MAX + 1 },
+  { "ignore-case", no_argument, NULL, CHAR_MAX + 2 },
+  { "delimiters", required_argument, NULL, 'e' },
+  { "struct-type", no_argument, NULL, 't' },
+  { "language", required_argument, NULL, 'L' },
+  { "slot-name", required_argument, NULL, 'K' },
+  { "initializer-suffix", required_argument, NULL, 'F' },
+  { "hash-fn-name", required_argument, NULL, 'H' }, /* backward compatibility */
+  { "hash-function-name", required_argument, NULL, 'H' },
+  { "lookup-fn-name", required_argument, NULL, 'N' }, /* backward compatibility */
+  { "lookup-function-name", required_argument, NULL, 'N' },
+  { "class-name", required_argument, NULL, 'Z' },
+  { "seven-bit", no_argument, NULL, '7' },
+  { "compare-strncmp", no_argument, NULL, 'c' },
+  { "readonly-tables", no_argument, NULL, 'C' },
+  { "enum", no_argument, NULL, 'E' },
+  { "includes", no_argument, NULL, 'I' },
+  { "global-table", no_argument, NULL, 'G' },
+  { "word-array-name", required_argument, NULL, 'W' },
+  { "length-table-name", required_argument, NULL, CHAR_MAX + 4 },
+  { "switch", required_argument, NULL, 'S' },
+  { "omit-struct-type", no_argument, NULL, 'T' },
+  { "key-positions", required_argument, NULL, 'k' },
+  { "compare-strlen", no_argument, NULL, 'l' }, /* backward compatibility */
+  { "compare-lengths", no_argument, NULL, 'l' },
+  { "duplicates", no_argument, NULL, 'D' },
+  { "fast", required_argument, NULL, 'f' },
+  { "initial-asso", required_argument, NULL, 'i' },
+  { "jump", required_argument, NULL, 'j' },
+  { "multiple-iterations", required_argument, NULL, 'm' },
+  { "no-strlen", no_argument, NULL, 'n' },
+  { "occurrence-sort", no_argument, NULL, 'o' },
+  { "optimized-collision-resolution", no_argument, NULL, 'O' },
+  { "pic", no_argument, NULL, 'P' },
+  { "string-pool-name", required_argument, NULL, 'Q' },
+  { "null-strings", no_argument, NULL, CHAR_MAX + 3 },
+  { "random", no_argument, NULL, 'r' },
+  { "size-multiple", required_argument, NULL, 's' },
+  { "help", no_argument, NULL, 'h' },
+  { "version", no_argument, NULL, 'v' },
+  { "debug", no_argument, NULL, 'd' },
+  { NULL, no_argument, NULL, 0 }
+};
+
+void
+Options::parse_options (int argc, char *argv[])
+{
+  int option_char;
+
+  program_name = argv[0];
+  _argument_count  = argc;
+  _argument_vector = argv;
+
+  while ((option_char =
+            getopt_long (_argument_count, _argument_vector,
+                         "acCdDe:Ef:F:gGhH:i:Ij:k:K:lL:m:nN:oOpPQ:rs:S:tTvW:Z:7",
+                         long_options, NULL))
+         != -1)
+    {
+      switch (option_char)
+        {
+        case 'a':               /* Generated code uses the ANSI prototype format.  */
+          break;                /* This is now the default.  */
+        case 'c':               /* Generate strncmp rather than strcmp.  */
+          {
+            _option_word |= COMP;
+            break;
+          }
+        case 'C':               /* Make the generated tables readonly (const).  */
+          {
+            _option_word |= CONST;
+            break;
+          }
+        case 'd':               /* Enable debugging option.  */
+          {
+            _option_word |= DEBUG;
+            fprintf (stderr, "Starting program %s, version %s, with debugging on.\n",
+                             program_name, version_string);
+            break;
+          }
+        case 'D':               /* Enable duplicate option.  */
+          {
+            _option_word |= DUP;
+            break;
+          }
+        case 'e':               /* Specify keyword/attribute separator */
+          {
+            _delimiters = /*getopt*/optarg;
+            break;
+          }
+        case 'E':
+          {
+            _option_word |= ENUM;
+            break;
+          }
+        case 'f':               /* Generate the hash table "fast".  */
+          break;                /* Not needed any more.  */
+        case 'F':
+          {
+            _initializer_suffix = /*getopt*/optarg;
+            break;
+          }
+        case 'g':               /* Use the 'inline' keyword for generated sub-routines, ifdef __GNUC__.  */
+          break;                /* This is now the default.  */
+        case 'G':               /* Make the keyword table a global variable.  */
+          {
+            _option_word |= GLOBAL;
+            break;
+          }
+        case 'h':               /* Displays a list of helpful Options to the user.  */
+          {
+            long_usage (stdout);
+            exit (0);
+          }
+        case 'H':               /* Sets the name for the hash function.  */
+          {
+            _hash_name = /*getopt*/optarg;
+            break;
+          }
+        case 'i':               /* Sets the initial value for the associated values array.  */
+          {
+            if ((_initial_asso_value = atoi (/*getopt*/optarg)) < 0)
+              fprintf (stderr, "Initial value %d should be non-zero, ignoring and continuing.\n", _initial_asso_value);
+            if (option[RANDOM])
+              fprintf (stderr, "warning, -r option superceeds -i, ignoring -i option and continuing\n");
+            break;
+          }
+        case 'I':               /* Enable #include statements.  */
+          {
+            _option_word |= INCLUDE;
+            break;
+          }
+        case 'j':               /* Sets the jump value, must be odd for later algorithms.  */
+          {
+            if ((_jump = atoi (/*getopt*/optarg)) < 0)
+              {
+                fprintf (stderr, "Jump value %d must be a positive number.\n", _jump);
+                short_usage (stderr);
+                exit (1);
+              }
+            else if (_jump && ((_jump % 2) == 0))
+              fprintf (stderr, "Jump value %d should be odd, adding 1 and continuing...\n", _jump++);
+            break;
+          }
+        case 'k':               /* Sets key positions used for hash function.  */
+          {
+            _option_word |= POSITIONS;
+            const int BAD_VALUE = -3;
+            const int EOS = PositionIterator::EOS;
+            int       value;
+            PositionStringParser sparser (/*getopt*/optarg, 1, Positions::MAX_KEY_POS, Positions::LASTCHAR, BAD_VALUE, EOS);
+
+            if (/*getopt*/optarg [0] == '*') /* Use all the characters for hashing!!!! */
+              _key_positions.set_useall(true);
+            else
+              {
+                _key_positions.set_useall(false);
+                int *key_positions = _key_positions.pointer();
+                int *key_pos;
+
+                for (key_pos = key_positions; (value = sparser.nextPosition()) != EOS; key_pos++)
+                  {
+                    if (value == BAD_VALUE)
+                      {
+                        fprintf (stderr, "Invalid position value or range, use 1,2,3-%d,'$' or '*'.\n",
+                                         Positions::MAX_KEY_POS);
+                        short_usage (stderr);
+                        exit (1);
+                      }
+                    if (key_pos - key_positions == Positions::MAX_SIZE)
+                      {
+                        /* More than Positions::MAX_SIZE key positions.
+                           Since all key positions are in the range
+                           0..Positions::MAX_KEY_POS-1 or == Positions::LASTCHAR,
+                           there must be duplicates.  */
+                        fprintf (stderr, "Duplicate key positions selected\n");
+                        short_usage (stderr);
+                        exit (1);
+                      }
+                    if (value != Positions::LASTCHAR)
+                      /* We use 0-based indices in the class Positions.  */
+                      value = value - 1;
+                    *key_pos = value;
+                  }
+
+                unsigned int total_keysig_size = key_pos - key_positions;
+                if (total_keysig_size == 0)
+                  {
+                    fprintf (stderr, "No key positions selected.\n");
+                    short_usage (stderr);
+                    exit (1);
+                  }
+                _key_positions.set_size (total_keysig_size);
+
+                /* Sorts the key positions *IN REVERSE ORDER!!*
+                   This makes further routines more efficient.  Especially
+                   when generating code.  */
+                if (! _key_positions.sort())
+                  {
+                    fprintf (stderr, "Duplicate key positions selected\n");
+                    short_usage (stderr);
+                    exit (1);
+                  }
+              }
+            break;
+          }
+        case 'K':               /* Make this the keyname for the keyword component field.  */
+          {
+            _slot_name = /*getopt*/optarg;
+            break;
+          }
+        case 'l':               /* Create length table to avoid extra string compares.  */
+          {
+            _option_word |= LENTABLE;
+            break;
+          }
+        case 'L':               /* Deal with different generated languages.  */
+          {
+            _language = NULL;
+            set_language (/*getopt*/optarg);
+            break;
+          }
+        case 'm':               /* Multiple iterations for finding good asso_values.  */
+          {
+            if ((_asso_iterations = atoi (/*getopt*/optarg)) < 0)
+              {
+                fprintf (stderr, "asso_iterations value must not be negative, assuming 0\n");
+                _asso_iterations = 0;
+              }
+            break;
+          }
+        case 'n':               /* Don't include the length when computing hash function.  */
+          {
+            _option_word |= NOLENGTH;
+            break;
+          }
+        case 'N':               /* Make generated lookup function name be optarg.  */
+          {
+            _function_name = /*getopt*/optarg;
+            break;
+          }
+        case 'o':               /* Order input by frequency of key set occurrence.  */
+          break;                /* Not needed any more.  */
+        case 'O':               /* Optimized choice during collision resolution.  */
+          break;                /* Not needed any more.  */
+        case 'p':               /* Generated lookup function a pointer instead of int.  */
+          break;                /* This is now the default.  */
+        case 'P':               /* Optimize for position-independent code.  */
+          {
+            _option_word |= SHAREDLIB;
+            break;
+          }
+        case 'Q':               /* Sets the name for the string pool.  */
+          {
+            _stringpool_name = /*getopt*/optarg;
+            break;
+          }
+        case 'r':               /* Utilize randomness to initialize the associated values table.  */
+          {
+            _option_word |= RANDOM;
+            if (_initial_asso_value != 0)
+              fprintf (stderr, "warning, -r option supersedes -i, disabling -i option and continuing\n");
+            break;
+          }
+        case 's':               /* Range of associated values, determines size of final table.  */
+          {
+            float numerator;
+            float denominator = 1;
+            bool invalid = false;
+            char *endptr;
+
+            numerator = strtod (/*getopt*/optarg, &endptr);
+            if (endptr == /*getopt*/optarg)
+              invalid = true;
+            else if (*endptr != '\0')
+              {
+                if (*endptr == '/')
+                  {
+                    char *denomptr = endptr + 1;
+                    denominator = strtod (denomptr, &endptr);
+                    if (endptr == denomptr || *endptr != '\0')
+                      invalid = true;
+                  }
+                else
+                  invalid = true;
+              }
+            if (invalid)
+              {
+                fprintf (stderr, "Invalid value for option -s.\n");
+                short_usage (stderr);
+                exit (1);
+              }
+            _size_multiple = numerator / denominator;
+            /* Backward compatibility: -3 means 1/3.  */
+            if (_size_multiple < 0)
+              _size_multiple = 1 / (-_size_multiple);
+            /* Catch stupid users.  */
+            if (_size_multiple == 0)
+              _size_multiple = 1;
+            /* Warnings.  */
+            if (_size_multiple > 50)
+              fprintf (stderr, "Size multiple %g is excessive, did you really mean this?! (try '%s --help' for help)\n", _size_multiple, program_name);
+            else if (_size_multiple < 0.01f)
+              fprintf (stderr, "Size multiple %g is extremely small, did you really mean this?! (try '%s --help' for help)\n", _size_multiple, program_name);
+            break;
+          }
+        case 'S':               /* Generate switch statement output, rather than lookup table.  */
+          {
+            _option_word |= SWITCH;
+            _total_switches = atoi (/*getopt*/optarg);
+            if (_total_switches <= 0)
+              {
+                fprintf (stderr, "number of switches %s must be a positive number\n", /*getopt*/optarg);
+                short_usage (stderr);
+                exit (1);
+              }
+            break;
+          }
+        case 't':               /* Enable the TYPE mode, allowing arbitrary user structures.  */
+          {
+            _option_word |= TYPE;
+            break;
+          }
+        case 'T':               /* Don't print structure definition.  */
+          {
+            _option_word |= NOTYPE;
+            break;
+          }
+        case 'v':               /* Print out the version and quit.  */
+          fprintf (stdout, "GNU gperf %s\n", version_string);
+          fprintf (stdout, "Copyright (C) %s Free Software Foundation, Inc.\n\
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n\
+",
+                   "1989-1998, 2000-2004, 2006-2009");
+          fprintf (stdout, "Written by %s and %s.\n",
+                   "Douglas C. Schmidt", "Bruno Haible");
+          exit (0);
+        case 'W':               /* Sets the name for the hash table array.  */
+          {
+            _wordlist_name = /*getopt*/optarg;
+            break;
+          }
+        case 'Z':               /* Set the class name.  */
+          {
+            _class_name = /*getopt*/optarg;
+            break;
+          }
+        case '7':               /* Assume 7-bit characters.  */
+          {
+            _option_word |= SEVENBIT;
+            break;
+          }
+        case CHAR_MAX + 1:      /* Set the output file name.  */
+          {
+            _output_file_name = /*getopt*/optarg;
+            break;
+          }
+        case CHAR_MAX + 2:      /* Case insignificant.  */
+          {
+            _option_word |= UPPERLOWER;
+            break;
+          }
+        case CHAR_MAX + 3:      /* Use NULL instead of "".  */
+          {
+            _option_word |= NULLSTRINGS;
+            break;
+          }
+        case CHAR_MAX + 4:      /* Sets the name for the length table array.  */
+          {
+            _lengthtable_name = /*getopt*/optarg;
+            break;
+          }
+        default:
+          short_usage (stderr);
+          exit (1);
+        }
+
+    }
+
+  if (/*getopt*/optind < argc)
+    _input_file_name = argv[/*getopt*/optind++];
+
+  if (/*getopt*/optind < argc)
+    {
+      fprintf (stderr, "Extra trailing arguments to %s.\n", program_name);
+      short_usage (stderr);
+      exit (1);
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+#ifndef __OPTIMIZE__
+
+#define INLINE /* not inline */
+#include "options.icc"
+#undef INLINE
+
+#endif /* not defined __OPTIMIZE__ */
diff --git a/src/options.h b/src/options.h
new file mode 100644 (file)
index 0000000..be1b29f
--- /dev/null
@@ -0,0 +1,295 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Handles parsing the Options provided to the user.
+
+   Copyright (C) 1989-1998, 2000, 2002-2004 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* This module provides a uniform interface to the various options available
+   to a user of the gperf hash function generator.  */
+
+#ifndef options_h
+#define options_h 1
+
+#include <stdio.h>
+#include "positions.h"
+
+/* Enumeration of the possible boolean options.  */
+
+enum Option_Type
+{
+  /* --- Input file interpretation --- */
+
+  /* Handle user-defined type structured keyword input.  */
+  TYPE         = 1 << 0,
+
+  /* Ignore case of ASCII characters.  */
+  UPPERLOWER   = 1 << 1,
+
+  /* --- Language for the output code --- */
+
+  /* Generate K&R C code: no prototypes, no const.  */
+  KRC          = 1 << 2,
+
+  /* Generate C code: no prototypes, but const (user can #define it away).  */
+  C            = 1 << 3,
+
+  /* Generate ISO/ANSI C code: prototypes and const, but no class.  */
+  ANSIC        = 1 << 4,
+
+  /* Generate C++ code: prototypes, const, class, inline, enum.  */
+  CPLUSPLUS    = 1 << 5,
+
+  /* --- Details in the output code --- */
+
+  /* Assume 7-bit, not 8-bit, characters.  */
+  SEVENBIT     = 1 << 6,
+
+  /* Generate a length table for string comparison.  */
+  LENTABLE     = 1 << 7,
+
+  /* Generate strncmp rather than strcmp.  */
+  COMP         = 1 << 8,
+
+  /* Make the generated tables readonly (const).  */
+  CONST        = 1 << 9,
+
+  /* Use enum for constants.  */
+  ENUM         = 1 << 10,
+
+  /* Generate #include statements.  */
+  INCLUDE      = 1 << 11,
+
+  /* Make the keyword table a global variable.  */
+  GLOBAL       = 1 << 12,
+
+  /* Use NULL strings instead of empty strings for empty table entries.  */
+  NULLSTRINGS  = 1 << 13,
+
+  /* Optimize for position-independent code.  */
+  SHAREDLIB    = 1 << 14,
+
+  /* Generate switch output to save space.  */
+  SWITCH       = 1 << 15,
+
+  /* Don't include user-defined type definition in output -- it's already
+     defined elsewhere.  */
+  NOTYPE       = 1 << 16,
+
+  /* --- Algorithm employed by gperf --- */
+
+  /* Use the given key positions.  */
+  POSITIONS    = 1 << 17,
+
+  /* Handle duplicate hash values for keywords.  */
+  DUP          = 1 << 18,
+
+  /* Don't include keyword length in hash computations.  */
+  NOLENGTH     = 1 << 19,
+
+  /* Randomly initialize the associated values table.  */
+  RANDOM       = 1 << 20,
+
+  /* --- Informative output --- */
+
+  /* Enable debugging (prints diagnostics to stderr).  */
+  DEBUG        = 1 << 21
+};
+
+/* Class manager for gperf program Options.  */
+
+class Options
+{
+public:
+  /* Constructor.  */
+                        Options ();
+
+  /* Destructor.  */
+                        ~Options ();
+
+  /* Parses the options given in the command-line arguments.  */
+  void                  parse_options (int argc, char *argv[]);
+
+  /* Prints the given options.  */
+  void                  print_options () const;
+
+  /* Accessors.  */
+
+  /* Tests a given boolean option.  Returns true if set, false otherwise.  */
+  bool                  operator[] (Option_Type option) const;
+  /* Sets a given boolean option.  */
+  void                  set (Option_Type option);
+
+  /* Returns the input file name.  */
+  const char *          get_input_file_name () const;
+
+  /* Returns the output file name.  */
+  const char *          get_output_file_name () const;
+
+  /* Sets the output language, if not already set.  */
+  void                  set_language (const char *language);
+
+  /* Returns the jump value.  */
+  int                   get_jump () const;
+
+  /* Returns the initial associated character value.  */
+  int                   get_initial_asso_value () const;
+
+  /* Returns the number of iterations for finding good asso_values.  */
+  int                   get_asso_iterations () const;
+
+  /* Returns the total number of switch statements to generate.  */
+  int                   get_total_switches () const;
+  /* Sets the total number of switch statements, if not already set.  */
+  void                  set_total_switches (int total_switches);
+
+  /* Returns the factor by which to multiply the generated table's size.  */
+  float                 get_size_multiple () const;
+
+  /* Returns the generated function name.  */
+  const char *          get_function_name () const;
+  /* Sets the generated function name, if not already set.  */
+  void                  set_function_name (const char *name);
+
+  /* Returns the keyword key name.  */
+  const char *          get_slot_name () const;
+  /* Sets the keyword key name, if not already set.  */
+  void                  set_slot_name (const char *name);
+
+  /* Returns the struct initializer suffix.  */
+  const char *          get_initializer_suffix () const;
+  /* Sets the struct initializer suffix, if not already set.  */
+  void                  set_initializer_suffix (const char *initializers);
+
+  /* Returns the generated class name.  */
+  const char *          get_class_name () const;
+  /* Sets the generated class name, if not already set.  */
+  void                  set_class_name (const char *name);
+
+  /* Returns the hash function name.  */
+  const char *          get_hash_name () const;
+  /* Sets the hash function name, if not already set.  */
+  void                  set_hash_name (const char *name);
+
+  /* Returns the hash table array name.  */
+  const char *          get_wordlist_name () const;
+  /* Sets the hash table array name, if not already set.  */
+  void                  set_wordlist_name (const char *name);
+
+  /* Returns the length table array name.  */
+  const char *          get_lengthtable_name () const;
+  /* Sets the length table array name, if not already set.  */
+  void                  set_lengthtable_name (const char *name);
+
+  /* Returns the string pool name.  */
+  const char *          get_stringpool_name () const;
+  /* Sets the string pool name, if not already set.  */
+  void                  set_stringpool_name (const char *name);
+
+  /* Returns the string used to delimit keywords from other attributes.  */
+  const char *          get_delimiters () const;
+  /* Sets the delimiters string, if not already set.  */
+  void                  set_delimiters (const char *delimiters);
+
+  /* Returns key positions.  */
+  const Positions&      get_key_positions () const;
+
+private:
+  /* Prints program usage to given stream.  */
+  static void           short_usage (FILE * stream);
+
+  /* Prints program usage to given stream.  */
+  static void           long_usage (FILE * stream);
+
+  /* Records count of command-line arguments.  */
+  int                   _argument_count;
+
+  /* Stores a pointer to command-line argument vector.  */
+  char **               _argument_vector;
+
+  /* Holds the boolean options.  */
+  int                   _option_word;
+
+  /* Name of input file.  */
+  char *                _input_file_name;
+
+  /* Name of output file.  */
+  char *                _output_file_name;
+
+  /* The output language.  */
+  const char *          _language;
+
+  /* Jump length when trying alternative values.  */
+  int                   _jump;
+
+  /* Initial value for asso_values table.  */
+  int                   _initial_asso_value;
+
+  /* Number of attempts at finding good asso_values.  */
+  int                   _asso_iterations;
+
+  /* Number of switch statements to generate.  */
+  int                   _total_switches;
+
+  /* Factor by which to multiply the generated table's size.  */
+  float                 _size_multiple;
+
+  /* Names used for generated lookup function.  */
+  const char *          _function_name;
+
+  /* Name used for keyword key.  */
+  const char *          _slot_name;
+
+  /* Suffix for empty struct initializers.  */
+  const char *          _initializer_suffix;
+
+  /* Name used for generated C++ class.  */
+  const char *          _class_name;
+
+  /* Name used for generated hash function.  */
+  const char *          _hash_name;
+
+  /* Name used for hash table array.  */
+  const char *          _wordlist_name;
+
+  /* Name used for length table array.  */
+  const char *          _lengthtable_name;
+
+  /* Name used for the string pool.  */
+  const char *          _stringpool_name;
+
+  /* Separates keywords from other attributes.  */
+  const char *          _delimiters;
+
+  /* Contains user-specified key choices.  */
+  Positions             _key_positions;
+};
+
+/* Global option coordinator for the entire program.  */
+extern Options option;
+
+#ifdef __OPTIMIZE__
+
+#define INLINE inline
+#include "options.icc"
+#undef INLINE
+
+#endif
+
+#endif
diff --git a/src/options.icc b/src/options.icc
new file mode 100644 (file)
index 0000000..6b8bc43
--- /dev/null
@@ -0,0 +1,155 @@
+/* Inline Functions for options.{h,cc}.
+
+   Copyright (C) 1989-1998, 2000, 2002-2004 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* ----------------------------- Class Options ----------------------------- */
+
+/* Tests a given boolean option.  Returns true if set, false otherwise.  */
+INLINE bool
+Options::operator[] (Option_Type option) const
+{
+  return _option_word & option;
+}
+
+/* Sets a given boolean option.  */
+INLINE void
+Options::set (Option_Type option)
+{
+  _option_word |= option;
+}
+
+/* Returns the input file name.  */
+INLINE const char *
+Options::get_input_file_name () const
+{
+  return _input_file_name;
+}
+
+/* Returns the output file name.  */
+INLINE const char *
+Options::get_output_file_name () const
+{
+  return _output_file_name;
+}
+
+/* Returns the jump value.  */
+INLINE int
+Options::get_jump () const
+{
+  return _jump;
+}
+
+/* Returns the initial associated character value.  */
+INLINE int
+Options::get_initial_asso_value () const
+{
+  return _initial_asso_value;
+}
+
+/* Returns the number of iterations for finding finding good asso_values.  */
+INLINE int
+Options::get_asso_iterations () const
+{
+  return _asso_iterations;
+}
+
+/* Returns the total number of switch statements to generate.  */
+INLINE int
+Options::get_total_switches () const
+{
+  return _total_switches;
+}
+
+/* Returns the factor by which to multiply the generated table's size.  */
+INLINE float
+Options::get_size_multiple () const
+{
+  return _size_multiple;
+}
+
+/* Returns the generated function name.  */
+INLINE const char *
+Options::get_function_name () const
+{
+  return _function_name;
+}
+
+/* Returns the keyword key name.  */
+INLINE const char *
+Options::get_slot_name () const
+{
+  return _slot_name;
+}
+
+/* Returns the struct initializer suffix.  */
+INLINE const char *
+Options::get_initializer_suffix () const
+{
+  return _initializer_suffix;
+}
+
+/* Returns the generated class name.  */
+INLINE const char *
+Options::get_class_name () const
+{
+  return _class_name;
+}
+
+/* Returns the hash function name.  */
+INLINE const char *
+Options::get_hash_name () const
+{
+  return _hash_name;
+}
+
+/* Returns the hash table array name.  */
+INLINE const char *
+Options::get_wordlist_name () const
+{
+  return _wordlist_name;
+}
+
+/* Returns the length table array name.  */
+INLINE const char *
+Options::get_lengthtable_name () const
+{
+  return _lengthtable_name;
+}
+
+/* Returns the string pool name.  */
+INLINE const char *
+Options::get_stringpool_name () const
+{
+  return _stringpool_name;
+}
+
+/* Returns the string used to delimit keywords from other attributes.  */
+INLINE const char *
+Options::get_delimiters () const
+{
+  return _delimiters;
+}
+
+/* Returns key positions.  */
+INLINE const Positions&
+Options::get_key_positions () const
+{
+  return _key_positions;
+}
diff --git a/src/output.cc b/src/output.cc
new file mode 100644 (file)
index 0000000..2afabe3
--- /dev/null
@@ -0,0 +1,2105 @@
+/* Output routines.
+   Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2007, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "output.h"
+
+#include <stdio.h>
+#include <string.h> /* declares strncpy(), strchr() */
+#include <ctype.h>  /* declares isprint() */
+#include <assert.h> /* defines assert() */
+#include <limits.h> /* defines SCHAR_MAX etc. */
+#include "options.h"
+#include "version.h"
+
+/* The "const " qualifier.  */
+static const char *const_always;
+
+/* The "const " qualifier, for read-only arrays.  */
+static const char *const_readonly_array;
+
+/* The "const " qualifier, for the array type.  */
+static const char *const_for_struct;
+
+/* Returns the smallest unsigned C type capable of holding integers
+   up to N.  */
+
+static const char *
+smallest_integral_type (int n)
+{
+  if (n <= UCHAR_MAX) return "unsigned char";
+  if (n <= USHRT_MAX) return "unsigned short";
+  return "unsigned int";
+}
+
+/* Returns the smallest signed C type capable of holding integers
+   from MIN to MAX.  */
+
+static const char *
+smallest_integral_type (int min, int max)
+{
+  if (option[ANSIC] | option[CPLUSPLUS])
+    if (min >= SCHAR_MIN && max <= SCHAR_MAX) return "signed char";
+  if (min >= SHRT_MIN && max <= SHRT_MAX) return "short";
+  return "int";
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Constructor.
+   Note about the keyword list starting at head:
+   - The list is ordered by increasing _hash_value.  This has been achieved
+     by Search::sort().
+   - Duplicates, i.e. keywords with the same _selchars set, are chained
+     through the _duplicate_link pointer.  Only one representative per
+     duplicate equivalence class remains on the linear keyword list.
+   - Accidental duplicates, i.e. keywords for which the _asso_values[] search
+     couldn't achieve different hash values, cannot occur on the linear
+     keyword list.  Search::optimize would catch this mistake.
+ */
+Output::Output (KeywordExt_List *head, const char *struct_decl,
+                unsigned int struct_decl_lineno, const char *return_type,
+                const char *struct_tag, const char *verbatim_declarations,
+                const char *verbatim_declarations_end,
+                unsigned int verbatim_declarations_lineno,
+                const char *verbatim_code, const char *verbatim_code_end,
+                unsigned int verbatim_code_lineno, bool charset_dependent,
+                int total_keys, int max_key_len, int min_key_len,
+                bool hash_includes_len, const Positions& positions,
+                const unsigned int *alpha_inc, int total_duplicates,
+                unsigned int alpha_size, const int *asso_values)
+  : _head (head), _struct_decl (struct_decl),
+    _struct_decl_lineno (struct_decl_lineno), _return_type (return_type),
+    _struct_tag (struct_tag),
+    _verbatim_declarations (verbatim_declarations),
+    _verbatim_declarations_end (verbatim_declarations_end),
+    _verbatim_declarations_lineno (verbatim_declarations_lineno),
+    _verbatim_code (verbatim_code),
+    _verbatim_code_end (verbatim_code_end),
+    _verbatim_code_lineno (verbatim_code_lineno),
+    _charset_dependent (charset_dependent),
+    _total_keys (total_keys),
+    _max_key_len (max_key_len), _min_key_len (min_key_len),
+    _hash_includes_len (hash_includes_len),
+    _key_positions (positions), _alpha_inc (alpha_inc),
+    _total_duplicates (total_duplicates), _alpha_size (alpha_size),
+    _asso_values (asso_values)
+{
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Computes the minimum and maximum hash values, and stores them
+   in _min_hash_value and _max_hash_value.  */
+
+void
+Output::compute_min_max ()
+{
+  /* Since the list is already sorted by hash value all we need to do is
+     to look at the first and the last element of the list.  */
+
+  _min_hash_value = _head->first()->_hash_value;
+
+  KeywordExt_List *temp;
+  for (temp = _head; temp->rest(); temp = temp->rest())
+    ;
+  _max_hash_value = temp->first()->_hash_value;
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Returns the number of different hash values.  */
+
+int
+Output::num_hash_values () const
+{
+  /* Since the list is already sorted by hash value and doesn't contain
+     duplicates, we can simply count the number of keywords on the list.  */
+  int count = 0;
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    count++;
+  return count;
+}
+
+/* -------------------- Output_Constants and subclasses -------------------- */
+
+/* This class outputs an enumeration defining some constants.  */
+
+struct Output_Constants
+{
+  virtual void          output_start () = 0;
+  virtual void          output_item (const char *name, int value) = 0;
+  virtual void          output_end () = 0;
+                        Output_Constants () {}
+  virtual               ~Output_Constants () {}
+};
+
+/* This class outputs an enumeration in #define syntax.  */
+
+struct Output_Defines : public Output_Constants
+{
+  virtual void          output_start ();
+  virtual void          output_item (const char *name, int value);
+  virtual void          output_end ();
+                        Output_Defines () {}
+  virtual               ~Output_Defines () {}
+};
+
+void Output_Defines::output_start ()
+{
+  printf ("\n");
+}
+
+void Output_Defines::output_item (const char *name, int value)
+{
+  printf ("#define %s %d\n", name, value);
+}
+
+void Output_Defines::output_end ()
+{
+}
+
+/* This class outputs an enumeration using 'enum'.  */
+
+struct Output_Enum : public Output_Constants
+{
+  virtual void          output_start ();
+  virtual void          output_item (const char *name, int value);
+  virtual void          output_end ();
+                        Output_Enum (const char *indent)
+                          : _indentation (indent) {}
+  virtual               ~Output_Enum () {}
+private:
+  const char *_indentation;
+  bool _pending_comma;
+};
+
+void Output_Enum::output_start ()
+{
+  printf ("%senum\n"
+          "%s  {\n",
+          _indentation, _indentation);
+  _pending_comma = false;
+}
+
+void Output_Enum::output_item (const char *name, int value)
+{
+  if (_pending_comma)
+    printf (",\n");
+  printf ("%s    %s = %d", _indentation, name, value);
+  _pending_comma = true;
+}
+
+void Output_Enum::output_end ()
+{
+  if (_pending_comma)
+    printf ("\n");
+  printf ("%s  };\n\n", _indentation);
+}
+
+/* Outputs the maximum and minimum hash values etc.  */
+
+void
+Output::output_constants (struct Output_Constants& style) const
+{
+  style.output_start ();
+  style.output_item ("TOTAL_KEYWORDS", _total_keys);
+  style.output_item ("MIN_WORD_LENGTH", _min_key_len);
+  style.output_item ("MAX_WORD_LENGTH", _max_key_len);
+  style.output_item ("MIN_HASH_VALUE", _min_hash_value);
+  style.output_item ("MAX_HASH_VALUE", _max_hash_value);
+  style.output_end ();
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* We use a downcase table because when called repeatedly, the code
+       gperf_downcase[c]
+   is faster than
+       if (c >= 'A' && c <= 'Z')
+         c += 'a' - 'A';
+ */
+#define USE_DOWNCASE_TABLE 1
+
+#if USE_DOWNCASE_TABLE
+
+/* Output gperf's ASCII-downcase table.  */
+
+static void
+output_upperlower_table ()
+{
+  unsigned int c;
+
+  printf ("#ifndef GPERF_DOWNCASE\n"
+          "#define GPERF_DOWNCASE 1\n"
+          "static unsigned char gperf_downcase[256] =\n"
+          "  {");
+  for (c = 0; c < 256; c++)
+    {
+      if ((c % 15) == 0)
+        printf ("\n   ");
+      printf (" %3d", c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c);
+      if (c < 255)
+        printf (",");
+    }
+  printf ("\n"
+          "  };\n"
+          "#endif\n\n");
+}
+
+#endif
+
+/* Output gperf's ASCII-case insensitive strcmp replacement.  */
+
+static void
+output_upperlower_strcmp ()
+{
+  printf ("#ifndef GPERF_CASE_STRCMP\n"
+          "#define GPERF_CASE_STRCMP 1\n"
+          "static int\n"
+          "gperf_case_strcmp ");
+  printf (option[KRC] ?
+               "(s1, s2)\n"
+          "     register char *s1;\n"
+          "     register char *s2;\n" :
+          option[C] ?
+               "(s1, s2)\n"
+          "     register const char *s1;\n"
+          "     register const char *s2;\n" :
+          option[ANSIC] | option[CPLUSPLUS] ?
+               "(register const char *s1, register const char *s2)\n" :
+          "");
+  #if USE_DOWNCASE_TABLE
+  printf ("{\n"
+          "  for (;;)\n"
+          "    {\n"
+          "      unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n"
+          "      unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n"
+          "      if (c1 != 0 && c1 == c2)\n"
+          "        continue;\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "}\n");
+  #else
+  printf ("{\n"
+          "  for (;;)\n"
+          "    {\n"
+          "      unsigned char c1 = *s1++;\n"
+          "      unsigned char c2 = *s2++;\n"
+          "      if (c1 >= 'A' && c1 <= 'Z')\n"
+          "        c1 += 'a' - 'A';\n"
+          "      if (c2 >= 'A' && c2 <= 'Z')\n"
+          "        c2 += 'a' - 'A';\n"
+          "      if (c1 != 0 && c1 == c2)\n"
+          "        continue;\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "}\n");
+  #endif
+  printf ("#endif\n\n");
+}
+
+/* Output gperf's ASCII-case insensitive strncmp replacement.  */
+
+static void
+output_upperlower_strncmp ()
+{
+  printf ("#ifndef GPERF_CASE_STRNCMP\n"
+          "#define GPERF_CASE_STRNCMP 1\n"
+          "static int\n"
+          "gperf_case_strncmp ");
+  printf (option[KRC] ?
+               "(s1, s2, n)\n"
+          "     register char *s1;\n"
+          "     register char *s2;\n"
+          "     register unsigned int n;\n" :
+          option[C] ?
+               "(s1, s2, n)\n"
+          "     register const char *s1;\n"
+          "     register const char *s2;\n"
+          "     register unsigned int n;\n" :
+          option[ANSIC] | option[CPLUSPLUS] ?
+               "(register const char *s1, register const char *s2, register unsigned int n)\n" :
+          "");
+  #if USE_DOWNCASE_TABLE
+  printf ("{\n"
+          "  for (; n > 0;)\n"
+          "    {\n"
+          "      unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n"
+          "      unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n"
+          "      if (c1 != 0 && c1 == c2)\n"
+          "        {\n"
+          "          n--;\n"
+          "          continue;\n"
+          "        }\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "  return 0;\n"
+          "}\n");
+  #else
+  printf ("{\n"
+          "  for (; n > 0;)\n"
+          "    {\n"
+          "      unsigned char c1 = *s1++;\n"
+          "      unsigned char c2 = *s2++;\n"
+          "      if (c1 >= 'A' && c1 <= 'Z')\n"
+          "        c1 += 'a' - 'A';\n"
+          "      if (c2 >= 'A' && c2 <= 'Z')\n"
+          "        c2 += 'a' - 'A';\n"
+          "      if (c1 != 0 && c1 == c2)\n"
+          "        {\n"
+          "          n--;\n"
+          "          continue;\n"
+          "        }\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "  return 0;\n"
+          "}\n");
+  #endif
+  printf ("#endif\n\n");
+}
+
+/* Output gperf's ASCII-case insensitive memcmp replacement.  */
+
+static void
+output_upperlower_memcmp ()
+{
+  printf ("#ifndef GPERF_CASE_MEMCMP\n"
+          "#define GPERF_CASE_MEMCMP 1\n"
+          "static int\n"
+          "gperf_case_memcmp ");
+  printf (option[KRC] ?
+               "(s1, s2, n)\n"
+          "     register char *s1;\n"
+          "     register char *s2;\n"
+          "     register unsigned int n;\n" :
+          option[C] ?
+               "(s1, s2, n)\n"
+          "     register const char *s1;\n"
+          "     register const char *s2;\n"
+          "     register unsigned int n;\n" :
+          option[ANSIC] | option[CPLUSPLUS] ?
+               "(register const char *s1, register const char *s2, register unsigned int n)\n" :
+          "");
+  #if USE_DOWNCASE_TABLE
+  printf ("{\n"
+          "  for (; n > 0;)\n"
+          "    {\n"
+          "      unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n"
+          "      unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n"
+          "      if (c1 == c2)\n"
+          "        {\n"
+          "          n--;\n"
+          "          continue;\n"
+          "        }\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "  return 0;\n"
+          "}\n");
+  #else
+  printf ("{\n"
+          "  for (; n > 0;)\n"
+          "    {\n"
+          "      unsigned char c1 = *s1++;\n"
+          "      unsigned char c2 = *s2++;\n"
+          "      if (c1 >= 'A' && c1 <= 'Z')\n"
+          "        c1 += 'a' - 'A';\n"
+          "      if (c2 >= 'A' && c2 <= 'Z')\n"
+          "        c2 += 'a' - 'A';\n"
+          "      if (c1 == c2)\n"
+          "        {\n"
+          "          n--;\n"
+          "          continue;\n"
+          "        }\n"
+          "      return (int)c1 - (int)c2;\n"
+          "    }\n"
+          "  return 0;\n"
+          "}\n");
+  #endif
+  printf ("#endif\n\n");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Outputs a keyword, as a string: enclosed in double quotes, escaping
+   backslashes, double quote and unprintable characters.  */
+
+static void
+output_string (const char *key, int len)
+{
+  putchar ('"');
+  for (; len > 0; len--)
+    {
+      unsigned char c = static_cast<unsigned char>(*key++);
+      if (isprint (c))
+        {
+          if (c == '"' || c == '\\')
+            putchar ('\\');
+          putchar (c);
+        }
+      else
+        {
+          /* Use octal escapes, not hexadecimal escapes, because some old
+             C compilers didn't understand hexadecimal escapes, and because
+             hexadecimal escapes are not limited to 2 digits, thus needing
+             special care if the following character happens to be a digit.  */
+          putchar ('\\');
+          putchar ('0' + ((c >> 6) & 7));
+          putchar ('0' + ((c >> 3) & 7));
+          putchar ('0' + (c & 7));
+        }
+    }
+  putchar ('"');
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Outputs a #line directive, referring to the given line number.  */
+
+static void
+output_line_directive (unsigned int lineno)
+{
+  const char *file_name = option.get_input_file_name ();
+  if (file_name != NULL)
+    {
+      printf ("#line %u ", lineno);
+      output_string (file_name, strlen (file_name));
+      printf ("\n");
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Outputs a type and a const specifier (i.e. "const " or "").
+   The output is terminated with a space.  */
+
+static void
+output_const_type (const char *const_string, const char *type_string)
+{
+  if (type_string[strlen(type_string)-1] == '*')
+    /* For pointer types, put the 'const' after the type.  */
+    printf ("%s %s", type_string, const_string);
+  else
+    /* For scalar or struct types, put the 'const' before the type.  */
+    printf ("%s%s ", const_string, type_string);
+}
+
+/* ----------------------- Output_Expr and subclasses ----------------------- */
+
+/* This class outputs a general expression.  */
+
+struct Output_Expr
+{
+  virtual void          output_expr () const = 0;
+                        Output_Expr () {}
+  virtual               ~Output_Expr () {}
+};
+
+/* This class outputs an expression formed by a single string.  */
+
+struct Output_Expr1 : public Output_Expr
+{
+  virtual void          output_expr () const;
+                        Output_Expr1 (const char *piece1) : _p1 (piece1) {}
+  virtual               ~Output_Expr1 () {}
+private:
+  const char *_p1;
+};
+
+void Output_Expr1::output_expr () const
+{
+  printf ("%s", _p1);
+}
+
+#if 0 /* unused */
+
+/* This class outputs an expression formed by the concatenation of two
+   strings.  */
+
+struct Output_Expr2 : public Output_Expr
+{
+  virtual void          output_expr () const;
+                        Output_Expr2 (const char *piece1, const char *piece2)
+                          : _p1 (piece1), _p2 (piece2) {}
+  virtual               ~Output_Expr2 () {}
+private:
+  const char *_p1;
+  const char *_p2;
+};
+
+void Output_Expr2::output_expr () const
+{
+  printf ("%s%s", _p1, _p2);
+}
+
+#endif
+
+/* --------------------- Output_Compare and subclasses --------------------- */
+
+/* This class outputs a comparison expression.  */
+
+struct Output_Compare
+{
+  /* Outputs the comparison expression.
+     expr1 outputs a simple expression of type 'const char *' referring to
+     the string being looked up.  expr2 outputs a simple expression of type
+     'const char *' referring to the constant string stored in the gperf
+     generated hash table.  */
+  virtual void          output_comparison (const Output_Expr& expr1,
+                                           const Output_Expr& expr2) const = 0;
+  /* Outputs the comparison expression for the first byte.
+     Returns true if the this comparison is complete.  */
+  bool                  output_firstchar_comparison (const Output_Expr& expr1,
+                                                     const Output_Expr& expr2) const;
+                        Output_Compare () {}
+  virtual               ~Output_Compare () {}
+};
+
+bool Output_Compare::output_firstchar_comparison (const Output_Expr& expr1,
+                                                  const Output_Expr& expr2) const
+{
+  /* First, we emit a comparison of the first byte of the two strings.
+     This catches most cases where the string being looked up is not in the
+     hash table but happens to have the same hash code as an element of the
+     hash table.  */
+  if (option[UPPERLOWER])
+    {
+      /* Incomplete comparison, just for speedup.  */
+      printf ("(((unsigned char)*");
+      expr1.output_expr ();
+      printf (" ^ (unsigned char)*");
+      expr2.output_expr ();
+      printf (") & ~32) == 0");
+      return false;
+    }
+  else
+    {
+      /* Complete comparison.  */
+      printf ("*");
+      expr1.output_expr ();
+      printf (" == *");
+      expr2.output_expr ();
+      return true;
+    }
+}
+
+/* This class outputs a comparison using strcmp.  */
+
+struct Output_Compare_Strcmp : public Output_Compare
+{
+  virtual void          output_comparison (const Output_Expr& expr1,
+                                           const Output_Expr& expr2) const;
+                        Output_Compare_Strcmp () {}
+  virtual               ~Output_Compare_Strcmp () {}
+};
+
+void Output_Compare_Strcmp::output_comparison (const Output_Expr& expr1,
+                                               const Output_Expr& expr2) const
+{
+  bool firstchar_done = output_firstchar_comparison (expr1, expr2);
+  printf (" && !");
+  if (option[UPPERLOWER])
+    printf ("gperf_case_");
+  printf ("strcmp (");
+  if (firstchar_done)
+    {
+      expr1.output_expr ();
+      printf (" + 1, ");
+      expr2.output_expr ();
+      printf (" + 1");
+    }
+  else
+    {
+      expr1.output_expr ();
+      printf (", ");
+      expr2.output_expr ();
+    }
+  printf (")");
+}
+
+/* This class outputs a comparison using strncmp.
+   Note that the length of expr1 will be available through the local variable
+   'len'.  */
+
+struct Output_Compare_Strncmp : public Output_Compare
+{
+  virtual void          output_comparison (const Output_Expr& expr1,
+                                           const Output_Expr& expr2) const;
+                        Output_Compare_Strncmp () {}
+  virtual               ~Output_Compare_Strncmp () {}
+};
+
+void Output_Compare_Strncmp::output_comparison (const Output_Expr& expr1,
+                                                const Output_Expr& expr2) const
+{
+  bool firstchar_done = output_firstchar_comparison (expr1, expr2);
+  printf (" && !");
+  if (option[UPPERLOWER])
+    printf ("gperf_case_");
+  printf ("strncmp (");
+  if (firstchar_done)
+    {
+      expr1.output_expr ();
+      printf (" + 1, ");
+      expr2.output_expr ();
+      printf (" + 1, len - 1");
+    }
+  else
+    {
+      expr1.output_expr ();
+      printf (", ");
+      expr2.output_expr ();
+      printf (", len");
+    }
+  printf (") && ");
+  expr2.output_expr ();
+  printf ("[len] == '\\0'");
+}
+
+/* This class outputs a comparison using memcmp.
+   Note that the length of expr1 (available through the local variable 'len')
+   must be verified to be equal to the length of expr2 prior to this
+   comparison.  */
+
+struct Output_Compare_Memcmp : public Output_Compare
+{
+  virtual void          output_comparison (const Output_Expr& expr1,
+                                           const Output_Expr& expr2) const;
+                        Output_Compare_Memcmp () {}
+  virtual               ~Output_Compare_Memcmp () {}
+};
+
+void Output_Compare_Memcmp::output_comparison (const Output_Expr& expr1,
+                                               const Output_Expr& expr2) const
+{
+  bool firstchar_done = output_firstchar_comparison (expr1, expr2);
+  printf (" && !");
+  if (option[UPPERLOWER])
+    printf ("gperf_case_");
+  printf ("memcmp (");
+  if (firstchar_done)
+    {
+      expr1.output_expr ();
+      printf (" + 1, ");
+      expr2.output_expr ();
+      printf (" + 1, len - 1");
+    }
+  else
+    {
+      expr1.output_expr ();
+      printf (", ");
+      expr2.output_expr ();
+      printf (", len");
+    }
+  printf (")");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Generates a C expression for an asso_values[] reference.  */
+
+void
+Output::output_asso_values_ref (int pos) const
+{
+  printf ("asso_values[");
+  /* Always cast to unsigned char.  This is necessary when the alpha_inc
+     is nonzero, and also avoids a gcc warning "subscript has type 'char'".  */
+  printf ("(unsigned char)");
+  if (pos == Positions::LASTCHAR)
+    printf ("str[len - 1]");
+  else
+    {
+      printf ("str[%d]", pos);
+      if (_alpha_inc[pos])
+        printf ("+%u", _alpha_inc[pos]);
+    }
+  printf ("]");
+}
+
+/* Generates C code for the hash function that returns the
+   proper encoding for each keyword.
+   The hash function has the signature
+     unsigned int <hash> (const char *str, unsigned int len).  */
+
+void
+Output::output_hash_function () const
+{
+  /* Output the function's head.  */
+  if (option[CPLUSPLUS])
+    printf ("inline ");
+  else if (option[KRC] | option[C] | option[ANSIC])
+    printf ("#ifdef __GNUC__\n"
+            "__inline\n"
+            "#else\n"
+            "#ifdef __cplusplus\n"
+            "inline\n"
+            "#endif\n"
+            "#endif\n");
+
+  if (/* The function does not use the 'str' argument?  */
+      _key_positions.get_size() == 0
+      || /* The function uses 'str', but not the 'len' argument?  */
+         (!_hash_includes_len
+          && _key_positions[0] < _min_key_len
+          && _key_positions[_key_positions.get_size() - 1] != Positions::LASTCHAR))
+    /* Pacify lint.  */
+    printf ("/*ARGSUSED*/\n");
+
+  if (option[KRC] | option[C] | option[ANSIC])
+    printf ("static ");
+  printf ("unsigned int\n");
+  if (option[CPLUSPLUS])
+    printf ("%s::", option.get_class_name ());
+  printf ("%s ", option.get_hash_name ());
+  printf (option[KRC] ?
+                 "(str, len)\n"
+            "     register char *str;\n"
+            "     register unsigned int len;\n" :
+          option[C] ?
+                 "(str, len)\n"
+            "     register const char *str;\n"
+            "     register unsigned int len;\n" :
+          option[ANSIC] | option[CPLUSPLUS] ?
+                 "(register const char *str, register unsigned int len)\n" :
+          "");
+
+  /* Note that when the hash function is called, it has already been verified
+     that  min_key_len <= len <= max_key_len.  */
+
+  /* Output the function's body.  */
+  printf ("{\n");
+
+  /* First the asso_values array.  */
+  if (_key_positions.get_size() > 0)
+    {
+      printf ("  static %s%s asso_values[] =\n"
+              "    {",
+              const_readonly_array,
+              smallest_integral_type (_max_hash_value + 1));
+
+      const int columns = 10;
+
+      /* Calculate maximum number of digits required for MAX_HASH_VALUE.  */
+      int field_width = 2;
+      for (int trunc = _max_hash_value; (trunc /= 10) > 0;)
+        field_width++;
+
+      for (unsigned int count = 0; count < _alpha_size; count++)
+        {
+          if (count > 0)
+            printf (",");
+          if ((count % columns) == 0)
+            printf ("\n     ");
+          printf ("%*d", field_width, _asso_values[count]);
+        }
+
+      printf ("\n"
+              "    };\n");
+    }
+
+  if (_key_positions.get_size() == 0)
+    {
+      /* Trivial case: No key positions at all.  */
+      printf ("  return %s;\n",
+              _hash_includes_len ? "len" : "0");
+    }
+  else
+    {
+      /* Iterate through the key positions.  Remember that Positions::sort()
+         has sorted them in decreasing order, with Positions::LASTCHAR coming
+         last.  */
+      PositionIterator iter = _key_positions.iterator(_max_key_len);
+      int key_pos;
+
+      /* Get the highest key position.  */
+      key_pos = iter.next ();
+
+      if (key_pos == Positions::LASTCHAR || key_pos < _min_key_len)
+        {
+          /* We can perform additional optimizations here:
+             Write it out as a single expression. Note that the values
+             are added as 'int's even though the asso_values array may
+             contain 'unsigned char's or 'unsigned short's.  */
+
+          printf ("  return %s",
+                  _hash_includes_len ? "len + " : "");
+
+          if (_key_positions.get_size() == 2
+              && _key_positions[0] == 0
+              && _key_positions[1] == Positions::LASTCHAR)
+            /* Optimize special case of "-k 1,$".  */
+            {
+              output_asso_values_ref (Positions::LASTCHAR);
+              printf (" + ");
+              output_asso_values_ref (0);
+            }
+          else
+            {
+              for (; key_pos != Positions::LASTCHAR; )
+                {
+                  output_asso_values_ref (key_pos);
+                  if ((key_pos = iter.next ()) != PositionIterator::EOS)
+                    printf (" + ");
+                  else
+                    break;
+                }
+
+              if (key_pos == Positions::LASTCHAR)
+                output_asso_values_ref (Positions::LASTCHAR);
+            }
+
+          printf (";\n");
+        }
+      else
+        {
+          /* We've got to use the correct, but brute force, technique.  */
+          printf ("  register int hval = %s;\n\n"
+                  "  switch (%s)\n"
+                  "    {\n"
+                  "      default:\n",
+                  _hash_includes_len ? "len" : "0",
+                  _hash_includes_len ? "hval" : "len");
+
+          while (key_pos != Positions::LASTCHAR && key_pos >= _max_key_len)
+            if ((key_pos = iter.next ()) == PositionIterator::EOS)
+              break;
+
+          if (key_pos != PositionIterator::EOS && key_pos != Positions::LASTCHAR)
+            {
+              int i = key_pos;
+              do
+                {
+                  if (i > key_pos)
+                    printf ("      /*FALLTHROUGH*/\n"); /* Pacify lint.  */
+                  for ( ; i > key_pos; i--)
+                    printf ("      case %d:\n", i);
+
+                  printf ("        hval += ");
+                  output_asso_values_ref (key_pos);
+                  printf (";\n");
+
+                  key_pos = iter.next ();
+                }
+              while (key_pos != PositionIterator::EOS && key_pos != Positions::LASTCHAR);
+
+              if (i >= _min_key_len)
+                printf ("      /*FALLTHROUGH*/\n"); /* Pacify lint.  */
+              for ( ; i >= _min_key_len; i--)
+                printf ("      case %d:\n", i);
+            }
+
+          printf ("        break;\n"
+                  "    }\n"
+                  "  return hval");
+          if (key_pos == Positions::LASTCHAR)
+            {
+              printf (" + ");
+              output_asso_values_ref (Positions::LASTCHAR);
+            }
+          printf (";\n");
+        }
+    }
+  printf ("}\n\n");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Prints out a table of keyword lengths, for use with the
+   comparison code in generated function 'in_word_set'.
+   Only called if option[LENTABLE].  */
+
+void
+Output::output_keylength_table () const
+{
+  const int columns = 14;
+  const char * const indent = option[GLOBAL] ? "" : "  ";
+
+  printf ("%sstatic %s%s %s[] =\n"
+          "%s  {",
+          indent, const_readonly_array,
+          smallest_integral_type (_max_key_len),
+          option.get_lengthtable_name (),
+          indent);
+
+  /* Generate an array of lengths, similar to output_keyword_table.  */
+  int index;
+  int column;
+  KeywordExt_List *temp;
+
+  column = 0;
+  for (temp = _head, index = 0; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      /* If generating a switch statement, and there is no user defined type,
+         we generate non-duplicates directly in the code.  Only duplicates go
+         into the table.  */
+      if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
+        continue;
+
+      if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP])
+        {
+          /* Some blank entries.  */
+          for ( ; index < keyword->_hash_value; index++)
+            {
+              if (index > 0)
+                printf (",");
+              if ((column++ % columns) == 0)
+                printf ("\n%s   ", indent);
+              printf ("%3d", 0);
+            }
+        }
+
+      if (index > 0)
+        printf (",");
+      if ((column++ % columns) == 0)
+        printf("\n%s   ", indent);
+      printf ("%3d", keyword->_allchars_length);
+      index++;
+
+      /* Deal with duplicates specially.  */
+      if (keyword->_duplicate_link) // implies option[DUP]
+        for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
+          {
+            printf (",");
+            if ((column++ % columns) == 0)
+              printf("\n%s   ", indent);
+            printf ("%3d", links->_allchars_length);
+            index++;
+          }
+    }
+
+  printf ("\n%s  };\n", indent);
+  if (option[GLOBAL])
+    printf ("\n");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Prints out the string pool, containing the strings of the keyword table.
+   Only called if option[SHAREDLIB].  */
+
+void
+Output::output_string_pool () const
+{
+  const char * const indent = option[TYPE] || option[GLOBAL] ? "" : "  ";
+  int index;
+  KeywordExt_List *temp;
+
+  printf ("%sstruct %s_t\n"
+          "%s  {\n",
+          indent, option.get_stringpool_name (), indent);
+  for (temp = _head, index = 0; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      /* If generating a switch statement, and there is no user defined type,
+         we generate non-duplicates directly in the code.  Only duplicates go
+         into the table.  */
+      if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
+        continue;
+
+      if (!option[SWITCH] && !option[DUP])
+        index = keyword->_hash_value;
+
+      printf ("%s    char %s_str%d[sizeof(",
+              indent, option.get_stringpool_name (), index);
+      output_string (keyword->_allchars, keyword->_allchars_length);
+      printf (")];\n");
+
+      /* Deal with duplicates specially.  */
+      if (keyword->_duplicate_link) // implies option[DUP]
+        for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
+          if (!(links->_allchars_length == keyword->_allchars_length
+                && memcmp (links->_allchars, keyword->_allchars,
+                           keyword->_allchars_length) == 0))
+            {
+              index++;
+              printf ("%s    char %s_str%d[sizeof(",
+                      indent, option.get_stringpool_name (), index);
+              output_string (links->_allchars, links->_allchars_length);
+              printf (")];\n");
+            }
+
+      index++;
+    }
+  printf ("%s  };\n",
+          indent);
+
+  printf ("%sstatic %sstruct %s_t %s_contents =\n"
+          "%s  {\n",
+          indent, const_readonly_array, option.get_stringpool_name (),
+          option.get_stringpool_name (), indent);
+  for (temp = _head, index = 0; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      /* If generating a switch statement, and there is no user defined type,
+         we generate non-duplicates directly in the code.  Only duplicates go
+         into the table.  */
+      if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
+        continue;
+
+      if (index > 0)
+        printf (",\n");
+
+      if (!option[SWITCH] && !option[DUP])
+        index = keyword->_hash_value;
+
+      printf ("%s    ",
+              indent);
+      output_string (keyword->_allchars, keyword->_allchars_length);
+
+      /* Deal with duplicates specially.  */
+      if (keyword->_duplicate_link) // implies option[DUP]
+        for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
+          if (!(links->_allchars_length == keyword->_allchars_length
+                && memcmp (links->_allchars, keyword->_allchars,
+                           keyword->_allchars_length) == 0))
+            {
+              index++;
+              printf (",\n");
+              printf ("%s    ",
+                      indent);
+              output_string (links->_allchars, links->_allchars_length);
+            }
+
+      index++;
+    }
+  if (index > 0)
+    printf ("\n");
+  printf ("%s  };\n",
+          indent);
+  printf ("%s#define %s ((%schar *) &%s_contents)\n",
+          indent, option.get_stringpool_name (), const_always,
+          option.get_stringpool_name ());
+  if (option[GLOBAL])
+    printf ("\n");
+}
+
+/* ------------------------------------------------------------------------- */
+
+static void
+output_keyword_entry (KeywordExt *temp, int stringpool_index, const char *indent)
+{
+  if (option[TYPE])
+    output_line_directive (temp->_lineno);
+  printf ("%s    ", indent);
+  if (option[TYPE])
+    printf ("{");
+  if (option[SHAREDLIB])
+    printf ("(int)(long)&((struct %s_t *)0)->%s_str%d",
+            option.get_stringpool_name (), option.get_stringpool_name (),
+            stringpool_index);
+  else
+    output_string (temp->_allchars, temp->_allchars_length);
+  if (option[TYPE])
+    {
+      if (strlen (temp->_rest) > 0)
+        printf (",%s", temp->_rest);
+      printf ("}");
+    }
+  if (option[DEBUG])
+    printf (" /* hash value = %d, index = %d */",
+            temp->_hash_value, temp->_final_index);
+}
+
+static void
+output_keyword_blank_entries (int count, const char *indent)
+{
+  int columns;
+  if (option[TYPE])
+    {
+      columns = 58 / (4 + (option[SHAREDLIB] ? 2 : option[NULLSTRINGS] ? 8 : 2)
+                        + strlen (option.get_initializer_suffix()));
+      if (columns == 0)
+        columns = 1;
+    }
+  else
+    {
+      columns = (option[SHAREDLIB] ? 9 : option[NULLSTRINGS] ? 4 : 9);
+    }
+  int column = 0;
+  for (int i = 0; i < count; i++)
+    {
+      if ((column % columns) == 0)
+        {
+          if (i > 0)
+            printf (",\n");
+          printf ("%s    ", indent);
+        }
+      else
+        {
+          if (i > 0)
+            printf (", ");
+        }
+      if (option[TYPE])
+        printf ("{");
+      if (option[SHAREDLIB])
+        printf ("-1");
+      else
+        {
+          if (option[NULLSTRINGS])
+            printf ("(char*)0");
+          else
+            printf ("\"\"");
+        }
+      if (option[TYPE])
+        printf ("%s}", option.get_initializer_suffix());
+      column++;
+    }
+}
+
+/* Prints out the array containing the keywords for the hash function.  */
+
+void
+Output::output_keyword_table () const
+{
+  const char *indent  = option[GLOBAL] ? "" : "  ";
+  int index;
+  KeywordExt_List *temp;
+
+  printf ("%sstatic ",
+          indent);
+  output_const_type (const_readonly_array, _wordlist_eltype);
+  printf ("%s[] =\n"
+          "%s  {\n",
+          option.get_wordlist_name (),
+          indent);
+
+  /* Generate an array of reserved words at appropriate locations.  */
+
+  for (temp = _head, index = 0; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      /* If generating a switch statement, and there is no user defined type,
+         we generate non-duplicates directly in the code.  Only duplicates go
+         into the table.  */
+      if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
+        continue;
+
+      if (index > 0)
+        printf (",\n");
+
+      if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP])
+        {
+          /* Some blank entries.  */
+          output_keyword_blank_entries (keyword->_hash_value - index, indent);
+          printf (",\n");
+          index = keyword->_hash_value;
+        }
+
+      keyword->_final_index = index;
+
+      output_keyword_entry (keyword, index, indent);
+
+      /* Deal with duplicates specially.  */
+      if (keyword->_duplicate_link) // implies option[DUP]
+        for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
+          {
+            links->_final_index = ++index;
+            printf (",\n");
+            int stringpool_index =
+              (links->_allchars_length == keyword->_allchars_length
+               && memcmp (links->_allchars, keyword->_allchars,
+                          keyword->_allchars_length) == 0
+               ? keyword->_final_index
+               : links->_final_index);
+            output_keyword_entry (links, stringpool_index, indent);
+          }
+
+      index++;
+    }
+  if (index > 0)
+    printf ("\n");
+
+  printf ("%s  };\n\n", indent);
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Generates the large, sparse table that maps hash values into
+   the smaller, contiguous range of the keyword table.  */
+
+void
+Output::output_lookup_array () const
+{
+  if (option[DUP])
+    {
+      const int DEFAULT_VALUE = -1;
+
+      /* Because of the way output_keyword_table works, every duplicate set is
+         stored contiguously in the wordlist array.  */
+      struct duplicate_entry
+        {
+          int hash_value; /* Hash value for this particular duplicate set.  */
+          int index;      /* Index into the main keyword storage array.  */
+          int count;      /* Number of consecutive duplicates at this index.  */
+        };
+
+      duplicate_entry *duplicates = new duplicate_entry[_total_duplicates];
+      int *lookup_array = new int[_max_hash_value + 1 + 2*_total_duplicates];
+      int lookup_array_size = _max_hash_value + 1;
+      duplicate_entry *dup_ptr = &duplicates[0];
+      int *lookup_ptr = &lookup_array[_max_hash_value + 1 + 2*_total_duplicates];
+
+      while (lookup_ptr > lookup_array)
+        *--lookup_ptr = DEFAULT_VALUE;
+
+      /* Now dup_ptr = &duplicates[0] and lookup_ptr = &lookup_array[0].  */
+
+      for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+        {
+          int hash_value = temp->first()->_hash_value;
+          lookup_array[hash_value] = temp->first()->_final_index;
+          if (option[DEBUG])
+            fprintf (stderr, "keyword = %.*s, index = %d\n",
+                     temp->first()->_allchars_length, temp->first()->_allchars, temp->first()->_final_index);
+          if (temp->first()->_duplicate_link)
+            {
+              /* Start a duplicate entry.  */
+              dup_ptr->hash_value = hash_value;
+              dup_ptr->index = temp->first()->_final_index;
+              dup_ptr->count = 1;
+
+              for (KeywordExt *ptr = temp->first()->_duplicate_link; ptr; ptr = ptr->_duplicate_link)
+                {
+                  dup_ptr->count++;
+                  if (option[DEBUG])
+                    fprintf (stderr,
+                             "static linked keyword = %.*s, index = %d\n",
+                             ptr->_allchars_length, ptr->_allchars, ptr->_final_index);
+                }
+              assert (dup_ptr->count >= 2);
+              dup_ptr++;
+            }
+        }
+
+      while (dup_ptr > duplicates)
+        {
+          dup_ptr--;
+
+          if (option[DEBUG])
+            fprintf (stderr,
+                     "dup_ptr[%d]: hash_value = %d, index = %d, count = %d\n",
+                     dup_ptr - duplicates,
+                     dup_ptr->hash_value, dup_ptr->index, dup_ptr->count);
+
+          int i;
+          /* Start searching for available space towards the right part
+             of the lookup array.  */
+          for (i = dup_ptr->hash_value; i < lookup_array_size-1; i++)
+            if (lookup_array[i] == DEFAULT_VALUE
+                && lookup_array[i + 1] == DEFAULT_VALUE)
+              goto found_i;
+          /* If we didn't find it to the right look to the left instead...  */
+          for (i = dup_ptr->hash_value-1; i >= 0; i--)
+            if (lookup_array[i] == DEFAULT_VALUE
+                && lookup_array[i + 1] == DEFAULT_VALUE)
+              goto found_i;
+          /* Append to the end of lookup_array.  */
+          i = lookup_array_size;
+          lookup_array_size += 2;
+        found_i:
+          /* Put in an indirection from dup_ptr->_hash_value to i.
+             At i and i+1 store dup_ptr->_final_index and dup_ptr->count.  */
+          assert (lookup_array[dup_ptr->hash_value] == dup_ptr->index);
+          lookup_array[dup_ptr->hash_value] = - 1 - _total_keys - i;
+          lookup_array[i] = - _total_keys + dup_ptr->index;
+          lookup_array[i + 1] = - dup_ptr->count;
+          /* All these three values are <= -2, distinct from DEFAULT_VALUE.  */
+        }
+
+      /* The values of the lookup array are now known.  */
+
+      int min = INT_MAX;
+      int max = INT_MIN;
+      lookup_ptr = lookup_array + lookup_array_size;
+      while (lookup_ptr > lookup_array)
+        {
+          int val = *--lookup_ptr;
+          if (min > val)
+            min = val;
+          if (max < val)
+            max = val;
+        }
+
+      const char *indent = option[GLOBAL] ? "" : "  ";
+      printf ("%sstatic %s%s lookup[] =\n"
+              "%s  {",
+              indent, const_readonly_array, smallest_integral_type (min, max),
+              indent);
+
+      int field_width;
+      /* Calculate maximum number of digits required for MIN..MAX.  */
+      {
+        field_width = 2;
+        for (int trunc = max; (trunc /= 10) > 0;)
+          field_width++;
+      }
+      if (min < 0)
+        {
+          int neg_field_width = 2;
+          for (int trunc = -min; (trunc /= 10) > 0;)
+            neg_field_width++;
+          neg_field_width++; /* account for the minus sign */
+          if (field_width < neg_field_width)
+            field_width = neg_field_width;
+        }
+
+      const int columns = 42 / field_width;
+      int column;
+
+      column = 0;
+      for (int i = 0; i < lookup_array_size; i++)
+        {
+          if (i > 0)
+            printf (",");
+          if ((column++ % columns) == 0)
+            printf("\n%s   ", indent);
+          printf ("%*d", field_width, lookup_array[i]);
+        }
+      printf ("\n%s  };\n\n", indent);
+
+      delete[] duplicates;
+      delete[] lookup_array;
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Generate all pools needed for the lookup function.  */
+
+void
+Output::output_lookup_pools () const
+{
+  if (option[SWITCH])
+    {
+      if (option[TYPE] || (option[DUP] && _total_duplicates > 0))
+        output_string_pool ();
+    }
+  else
+    {
+      output_string_pool ();
+    }
+}
+
+/* Generate all the tables needed for the lookup function.  */
+
+void
+Output::output_lookup_tables () const
+{
+  if (option[SWITCH])
+    {
+      /* Use the switch in place of lookup table.  */
+      if (option[LENTABLE] && (option[DUP] && _total_duplicates > 0))
+        output_keylength_table ();
+      if (option[TYPE] || (option[DUP] && _total_duplicates > 0))
+        output_keyword_table ();
+    }
+  else
+    {
+      /* Use the lookup table, in place of switch.  */
+      if (option[LENTABLE])
+        output_keylength_table ();
+      output_keyword_table ();
+      output_lookup_array ();
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Output a single switch case (including duplicates).  Advance list.  */
+
+static KeywordExt_List *
+output_switch_case (KeywordExt_List *list, int indent, int *jumps_away)
+{
+  if (option[DEBUG])
+    printf ("%*s/* hash value = %4d, keyword = \"%.*s\" */\n",
+            indent, "", list->first()->_hash_value, list->first()->_allchars_length, list->first()->_allchars);
+
+  if (option[DUP] && list->first()->_duplicate_link)
+    {
+      if (option[LENTABLE])
+        printf ("%*slengthptr = &%s[%d];\n",
+                indent, "", option.get_lengthtable_name (), list->first()->_final_index);
+      printf ("%*swordptr = &%s[%d];\n",
+              indent, "", option.get_wordlist_name (), list->first()->_final_index);
+
+      int count = 0;
+      for (KeywordExt *links = list->first(); links; links = links->_duplicate_link)
+        count++;
+
+      printf ("%*swordendptr = wordptr + %d;\n"
+              "%*sgoto multicompare;\n",
+              indent, "", count,
+              indent, "");
+      *jumps_away = 1;
+    }
+  else
+    {
+      if (option[LENTABLE])
+        {
+          printf ("%*sif (len == %d)\n"
+                  "%*s  {\n",
+                  indent, "", list->first()->_allchars_length,
+                  indent, "");
+          indent += 4;
+        }
+      printf ("%*sresword = ",
+              indent, "");
+      if (option[TYPE])
+        printf ("&%s[%d]", option.get_wordlist_name (), list->first()->_final_index);
+      else
+        output_string (list->first()->_allchars, list->first()->_allchars_length);
+      printf (";\n");
+      printf ("%*sgoto compare;\n",
+              indent, "");
+      if (option[LENTABLE])
+        {
+          indent -= 4;
+          printf ("%*s  }\n",
+                  indent, "");
+        }
+      else
+        *jumps_away = 1;
+    }
+
+  return list->rest();
+}
+
+/* Output a total of size cases, grouped into num_switches switch statements,
+   where 0 < num_switches <= size.  */
+
+static void
+output_switches (KeywordExt_List *list, int num_switches, int size, int min_hash_value, int max_hash_value, int indent)
+{
+  if (option[DEBUG])
+    printf ("%*s/* know %d <= key <= %d, contains %d cases */\n",
+            indent, "", min_hash_value, max_hash_value, size);
+
+  if (num_switches > 1)
+    {
+      int part1 = num_switches / 2;
+      int part2 = num_switches - part1;
+      int size1 = static_cast<int>(static_cast<double>(size) / static_cast<double>(num_switches) * static_cast<double>(part1) + 0.5);
+      int size2 = size - size1;
+
+      KeywordExt_List *temp = list;
+      for (int count = size1; count > 0; count--)
+        temp = temp->rest();
+
+      printf ("%*sif (key < %d)\n"
+              "%*s  {\n",
+              indent, "", temp->first()->_hash_value,
+              indent, "");
+
+      output_switches (list, part1, size1, min_hash_value, temp->first()->_hash_value-1, indent+4);
+
+      printf ("%*s  }\n"
+              "%*selse\n"
+              "%*s  {\n",
+              indent, "", indent, "", indent, "");
+
+      output_switches (temp, part2, size2, temp->first()->_hash_value, max_hash_value, indent+4);
+
+      printf ("%*s  }\n",
+              indent, "");
+    }
+  else
+    {
+      /* Output a single switch.  */
+      int lowest_case_value = list->first()->_hash_value;
+      if (size == 1)
+        {
+          int jumps_away = 0;
+          assert (min_hash_value <= lowest_case_value);
+          assert (lowest_case_value <= max_hash_value);
+          if (min_hash_value == max_hash_value)
+            output_switch_case (list, indent, &jumps_away);
+          else
+            {
+              printf ("%*sif (key == %d)\n"
+                      "%*s  {\n",
+                      indent, "", lowest_case_value,
+                      indent, "");
+              output_switch_case (list, indent+4, &jumps_away);
+              printf ("%*s  }\n",
+                      indent, "");
+            }
+        }
+      else
+        {
+          if (lowest_case_value == 0)
+            printf ("%*sswitch (key)\n", indent, "");
+          else
+            printf ("%*sswitch (key - %d)\n", indent, "", lowest_case_value);
+          printf ("%*s  {\n",
+                  indent, "");
+          for (; size > 0; size--)
+            {
+              int jumps_away = 0;
+              printf ("%*s    case %d:\n",
+                      indent, "", list->first()->_hash_value - lowest_case_value);
+              list = output_switch_case (list, indent+6, &jumps_away);
+              if (!jumps_away)
+                printf ("%*s      break;\n",
+                        indent, "");
+            }
+          printf ("%*s  }\n",
+                  indent, "");
+        }
+    }
+}
+
+/* Generates C code to perform the keyword lookup.  */
+
+void
+Output::output_lookup_function_body (const Output_Compare& comparison) const
+{
+  printf ("  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)\n"
+          "    {\n"
+          "      register int key = %s (str, len);\n\n",
+          option.get_hash_name ());
+
+  if (option[SWITCH])
+    {
+      int switch_size = num_hash_values ();
+      int num_switches = option.get_total_switches ();
+      if (num_switches > switch_size)
+        num_switches = switch_size;
+
+      printf ("      if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)\n"
+              "        {\n");
+      if (option[DUP] && _total_duplicates > 0)
+        {
+          if (option[LENTABLE])
+            printf ("          register %s%s *lengthptr;\n",
+                    const_always, smallest_integral_type (_max_key_len));
+          printf ("          register ");
+          output_const_type (const_readonly_array, _wordlist_eltype);
+          printf ("*wordptr;\n");
+          printf ("          register ");
+          output_const_type (const_readonly_array, _wordlist_eltype);
+          printf ("*wordendptr;\n");
+        }
+      if (option[TYPE])
+        {
+          printf ("          register ");
+          output_const_type (const_readonly_array, _struct_tag);
+          printf ("*resword;\n\n");
+        }
+      else
+        printf ("          register %sresword;\n\n",
+                _struct_tag);
+
+      output_switches (_head, num_switches, switch_size, _min_hash_value, _max_hash_value, 10);
+
+      printf ("          return 0;\n");
+      if (option[DUP] && _total_duplicates > 0)
+        {
+          int indent = 8;
+          printf ("%*smulticompare:\n"
+                  "%*s  while (wordptr < wordendptr)\n"
+                  "%*s    {\n",
+                  indent, "", indent, "", indent, "");
+          if (option[LENTABLE])
+            {
+              printf ("%*s      if (len == *lengthptr)\n"
+                      "%*s        {\n",
+                      indent, "", indent, "");
+              indent += 4;
+            }
+          printf ("%*s      register %schar *s = ",
+                  indent, "", const_always);
+          if (option[TYPE])
+            printf ("wordptr->%s", option.get_slot_name ());
+          else
+            printf ("*wordptr");
+          if (option[SHAREDLIB])
+            printf (" + %s",
+                    option.get_stringpool_name ());
+          printf (";\n\n"
+                  "%*s      if (",
+                  indent, "");
+          comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
+          printf (")\n"
+                  "%*s        return %s;\n",
+                  indent, "",
+                  option[TYPE] ? "wordptr" : "s");
+          if (option[LENTABLE])
+            {
+              indent -= 4;
+              printf ("%*s        }\n",
+                      indent, "");
+            }
+          if (option[LENTABLE])
+            printf ("%*s      lengthptr++;\n",
+                    indent, "");
+          printf ("%*s      wordptr++;\n"
+                  "%*s    }\n"
+                  "%*s  return 0;\n",
+                  indent, "", indent, "", indent, "");
+        }
+      printf ("        compare:\n");
+      if (option[TYPE])
+        {
+          printf ("          {\n"
+                  "            register %schar *s = resword->%s",
+                  const_always, option.get_slot_name ());
+          if (option[SHAREDLIB])
+            printf (" + %s",
+                    option.get_stringpool_name ());
+          printf (";\n\n"
+                  "            if (");
+          comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
+          printf (")\n"
+                  "              return resword;\n"
+                  "          }\n");
+        }
+      else
+        {
+          printf ("          if (");
+          comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("resword"));
+          printf (")\n"
+                  "            return resword;\n");
+        }
+      printf ("        }\n");
+    }
+  else
+    {
+      printf ("      if (key <= MAX_HASH_VALUE && key >= 0)\n");
+
+      if (option[DUP])
+        {
+          int indent = 8;
+          printf ("%*s{\n"
+                  "%*s  register int index = lookup[key];\n\n"
+                  "%*s  if (index >= 0)\n",
+                  indent, "", indent, "", indent, "");
+          if (option[LENTABLE])
+            {
+              printf ("%*s    {\n"
+                      "%*s      if (len == %s[index])\n",
+                      indent, "", indent, "", option.get_lengthtable_name ());
+              indent += 4;
+            }
+          printf ("%*s    {\n"
+                  "%*s      register %schar *s = %s[index]",
+                  indent, "",
+                  indent, "", const_always, option.get_wordlist_name ());
+          if (option[TYPE])
+            printf (".%s", option.get_slot_name ());
+          if (option[SHAREDLIB])
+            printf (" + %s",
+                    option.get_stringpool_name ());
+          printf (";\n\n"
+                  "%*s      if (",
+                  indent, "");
+          comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
+          printf (")\n"
+                  "%*s        return ",
+                  indent, "");
+          if (option[TYPE])
+            printf ("&%s[index]", option.get_wordlist_name ());
+          else
+            printf ("s");
+          printf (";\n"
+                  "%*s    }\n",
+                  indent, "");
+          if (option[LENTABLE])
+            {
+              indent -= 4;
+              printf ("%*s    }\n", indent, "");
+            }
+          if (_total_duplicates > 0)
+            {
+              printf ("%*s  else if (index < -TOTAL_KEYWORDS)\n"
+                      "%*s    {\n"
+                      "%*s      register int offset = - 1 - TOTAL_KEYWORDS - index;\n",
+                      indent, "", indent, "", indent, "");
+              if (option[LENTABLE])
+                printf ("%*s      register %s%s *lengthptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n",
+                        indent, "", const_always, smallest_integral_type (_max_key_len),
+                        option.get_lengthtable_name ());
+              printf ("%*s      register ",
+                      indent, "");
+              output_const_type (const_readonly_array, _wordlist_eltype);
+              printf ("*wordptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n",
+                      option.get_wordlist_name ());
+              printf ("%*s      register ",
+                      indent, "");
+              output_const_type (const_readonly_array, _wordlist_eltype);
+              printf ("*wordendptr = wordptr + -lookup[offset + 1];\n\n");
+              printf ("%*s      while (wordptr < wordendptr)\n"
+                      "%*s        {\n",
+                      indent, "", indent, "");
+              if (option[LENTABLE])
+                {
+                  printf ("%*s          if (len == *lengthptr)\n"
+                          "%*s            {\n",
+                          indent, "", indent, "");
+                  indent += 4;
+                }
+              printf ("%*s          register %schar *s = ",
+                      indent, "", const_always);
+              if (option[TYPE])
+                printf ("wordptr->%s", option.get_slot_name ());
+              else
+                printf ("*wordptr");
+              if (option[SHAREDLIB])
+                printf (" + %s",
+                        option.get_stringpool_name ());
+              printf (";\n\n"
+                      "%*s          if (",
+                      indent, "");
+              comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
+              printf (")\n"
+                      "%*s            return %s;\n",
+                      indent, "",
+                      option[TYPE] ? "wordptr" : "s");
+              if (option[LENTABLE])
+                {
+                  indent -= 4;
+                  printf ("%*s            }\n",
+                          indent, "");
+                }
+              if (option[LENTABLE])
+                printf ("%*s          lengthptr++;\n",
+                        indent, "");
+              printf ("%*s          wordptr++;\n"
+                      "%*s        }\n"
+                      "%*s    }\n",
+                      indent, "", indent, "", indent, "");
+            }
+          printf ("%*s}\n",
+                  indent, "");
+        }
+      else
+        {
+          int indent = 8;
+          if (option[LENTABLE])
+            {
+              printf ("%*sif (len == %s[key])\n",
+                      indent, "", option.get_lengthtable_name ());
+              indent += 2;
+            }
+
+          if (option[SHAREDLIB])
+            {
+              if (!option[LENTABLE])
+                {
+                  printf ("%*s{\n"
+                          "%*s  register int o = %s[key]",
+                          indent, "",
+                          indent, "", option.get_wordlist_name ());
+                  if (option[TYPE])
+                    printf (".%s", option.get_slot_name ());
+                  printf (";\n"
+                          "%*s  if (o >= 0)\n"
+                          "%*s    {\n",
+                          indent, "",
+                          indent, "");
+                  indent += 4;
+                  printf ("%*s  register %schar *s = o",
+                          indent, "", const_always);
+                }
+              else
+                {
+                  /* No need for the (o >= 0) test, because the
+                     (len == lengthtable[key]) test already guarantees that
+                     key points to nonempty table entry.  */
+                  printf ("%*s{\n"
+                          "%*s  register %schar *s = %s[key]",
+                          indent, "",
+                          indent, "", const_always,
+                          option.get_wordlist_name ());
+                  if (option[TYPE])
+                    printf (".%s", option.get_slot_name ());
+                }
+              printf (" + %s",
+                      option.get_stringpool_name ());
+            }
+          else
+            {
+              printf ("%*s{\n"
+                      "%*s  register %schar *s = %s[key]",
+                      indent, "",
+                      indent, "", const_always, option.get_wordlist_name ());
+              if (option[TYPE])
+                printf (".%s", option.get_slot_name ());
+            }
+
+          printf (";\n\n"
+                  "%*s  if (",
+                  indent, "");
+          if (!option[SHAREDLIB] && option[NULLSTRINGS])
+            printf ("s && ");
+          comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
+          printf (")\n"
+                  "%*s    return ",
+                  indent, "");
+          if (option[TYPE])
+            printf ("&%s[key]", option.get_wordlist_name ());
+          else
+            printf ("s");
+          printf (";\n");
+          if (option[SHAREDLIB] && !option[LENTABLE])
+            {
+              indent -= 4;
+              printf ("%*s    }\n",
+                      indent, "");
+            }
+          printf ("%*s}\n",
+                  indent, "");
+        }
+    }
+  printf ("    }\n"
+          "  return 0;\n");
+}
+
+/* Generates C code for the lookup function.  */
+
+void
+Output::output_lookup_function () const
+{
+  /* Output the function's head.  */
+  if (option[KRC] | option[C] | option[ANSIC])
+    /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+       inline semantics, unless -fgnu89-inline is used.  It defines a macro
+       __GNUC_STDC_INLINE__ to indicate this situation or a macro
+       __GNUC_GNU_INLINE__ to indicate the opposite situation.
+       GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+       semantics but warns, unless -fgnu89-inline is used:
+         warning: C99 inline functions are not supported; using GNU89
+         warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+       It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.  */
+    printf ("#ifdef __GNUC__\n"
+            "__inline\n"
+            "#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__\n"
+            "__attribute__ ((__gnu_inline__))\n"
+            "#endif\n"
+            "#endif\n");
+
+  printf ("%s%s\n",
+          const_for_struct, _return_type);
+  if (option[CPLUSPLUS])
+    printf ("%s::", option.get_class_name ());
+  printf ("%s ", option.get_function_name ());
+  printf (option[KRC] ?
+                 "(str, len)\n"
+            "     register char *str;\n"
+            "     register unsigned int len;\n" :
+          option[C] ?
+                 "(str, len)\n"
+            "     register const char *str;\n"
+            "     register unsigned int len;\n" :
+          option[ANSIC] | option[CPLUSPLUS] ?
+                 "(register const char *str, register unsigned int len)\n" :
+          "");
+
+  /* Output the function's body.  */
+  printf ("{\n");
+
+  if (option[ENUM] && !option[GLOBAL])
+    {
+      Output_Enum style ("  ");
+      output_constants (style);
+    }
+
+  if (option[SHAREDLIB] && !(option[GLOBAL] || option[TYPE]))
+    output_lookup_pools ();
+  if (!option[GLOBAL])
+    output_lookup_tables ();
+
+  if (option[LENTABLE])
+    output_lookup_function_body (Output_Compare_Memcmp ());
+  else
+    {
+      if (option[COMP])
+        output_lookup_function_body (Output_Compare_Strncmp ());
+      else
+        output_lookup_function_body (Output_Compare_Strcmp ());
+    }
+
+  printf ("}\n");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Generates the hash function and the key word recognizer function
+   based upon the user's Options.  */
+
+void
+Output::output ()
+{
+  compute_min_max ();
+
+  if (option[C] | option[ANSIC] | option[CPLUSPLUS])
+    {
+      const_always = "const ";
+      const_readonly_array = (option[CONST] ? "const " : "");
+      const_for_struct = ((option[CONST] && option[TYPE]) ? "const " : "");
+    }
+  else
+    {
+      const_always = "";
+      const_readonly_array = "";
+      const_for_struct = "";
+    }
+
+  if (!option[TYPE])
+    {
+      _return_type = (const_always[0] ? "const char *" : "char *");
+      _struct_tag = (const_always[0] ? "const char *" : "char *");
+    }
+
+  _wordlist_eltype = (option[SHAREDLIB] && !option[TYPE] ? "int" : _struct_tag);
+
+  printf ("/* ");
+  if (option[KRC])
+    printf ("KR-C");
+  else if (option[C])
+    printf ("C");
+  else if (option[ANSIC])
+    printf ("ANSI-C");
+  else if (option[CPLUSPLUS])
+    printf ("C++");
+  printf (" code produced by gperf version %s */\n", version_string);
+  option.print_options ();
+  printf ("\n");
+  if (!option[POSITIONS])
+    {
+      printf ("/* Computed positions: -k'");
+      _key_positions.print();
+      printf ("' */\n");
+    }
+  printf ("\n");
+
+  if (_charset_dependent
+      && (_key_positions.get_size() > 0 || option[UPPERLOWER]))
+    {
+      /* The generated tables assume that the execution character set is
+         based on ISO-646, not EBCDIC.  */
+      printf ("#if !((' ' == 32) && ('!' == 33) && ('\"' == 34) && ('#' == 35) \\\n"
+              "      && ('%%' == 37) && ('&' == 38) && ('\\'' == 39) && ('(' == 40) \\\n"
+              "      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \\\n"
+              "      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \\\n"
+              "      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \\\n"
+              "      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \\\n"
+              "      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \\\n"
+              "      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \\\n"
+              "      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \\\n"
+              "      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \\\n"
+              "      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \\\n"
+              "      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \\\n"
+              "      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \\\n"
+              "      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \\\n"
+              "      && ('Z' == 90) && ('[' == 91) && ('\\\\' == 92) && (']' == 93) \\\n"
+              "      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \\\n"
+              "      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \\\n"
+              "      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \\\n"
+              "      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \\\n"
+              "      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \\\n"
+              "      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \\\n"
+              "      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \\\n"
+              "      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))\n"
+              "/* The character set is not based on ISO-646.  */\n");
+      printf ("%s \"gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>.\"\n", option[KRC] || option[C] ? "error" : "#error");
+      printf ("#endif\n\n");
+    }
+
+  if (_verbatim_declarations < _verbatim_declarations_end)
+    {
+      output_line_directive (_verbatim_declarations_lineno);
+      fwrite (_verbatim_declarations, 1,
+              _verbatim_declarations_end - _verbatim_declarations, stdout);
+    }
+
+  if (option[TYPE] && !option[NOTYPE]) /* Output type declaration now, reference it later on.... */
+    {
+      output_line_directive (_struct_decl_lineno);
+      printf ("%s\n", _struct_decl);
+    }
+
+  if (option[INCLUDE])
+    printf ("#include <string.h>\n"); /* Declare strlen(), strcmp(), strncmp(). */
+
+  if (!option[ENUM])
+    {
+      Output_Defines style;
+      output_constants (style);
+    }
+  else if (option[GLOBAL])
+    {
+      Output_Enum style ("");
+      output_constants (style);
+    }
+
+  printf ("/* maximum key range = %d, duplicates = %d */\n\n",
+          _max_hash_value - _min_hash_value + 1, _total_duplicates);
+
+  if (option[UPPERLOWER])
+    {
+      #if USE_DOWNCASE_TABLE
+      output_upperlower_table ();
+      #endif
+
+      if (option[LENTABLE])
+        output_upperlower_memcmp ();
+      else
+        {
+          if (option[COMP])
+            output_upperlower_strncmp ();
+          else
+            output_upperlower_strcmp ();
+        }
+    }
+
+  if (option[CPLUSPLUS])
+    printf ("class %s\n"
+            "{\n"
+            "private:\n"
+            "  static inline unsigned int %s (const char *str, unsigned int len);\n"
+            "public:\n"
+            "  static %s%s%s (const char *str, unsigned int len);\n"
+            "};\n"
+            "\n",
+            option.get_class_name (), option.get_hash_name (),
+            const_for_struct, _return_type, option.get_function_name ());
+
+  output_hash_function ();
+
+  if (option[SHAREDLIB] && (option[GLOBAL] || option[TYPE]))
+    output_lookup_pools ();
+  if (option[GLOBAL])
+    output_lookup_tables ();
+
+  output_lookup_function ();
+
+  if (_verbatim_code < _verbatim_code_end)
+    {
+      output_line_directive (_verbatim_code_lineno);
+      fwrite (_verbatim_code, 1, _verbatim_code_end - _verbatim_code, stdout);
+    }
+
+  fflush (stdout);
+}
diff --git a/src/output.h b/src/output.h
new file mode 100644 (file)
index 0000000..6f61a04
--- /dev/null
@@ -0,0 +1,155 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Output routines.
+
+   Copyright (C) 1989-1998, 2000, 2002-2003, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef output_h
+#define output_h 1
+
+#include "keyword-list.h"
+#include "positions.h"
+
+/* OSF/1 cxx needs these forward declarations. */
+struct Output_Constants;
+struct Output_Compare;
+
+class Output
+{
+public:
+  /* Constructor.  */
+                        Output (KeywordExt_List *head,
+                                const char *struct_decl,
+                                unsigned int struct_decl_lineno,
+                                const char *return_type,
+                                const char *struct_tag,
+                                const char *verbatim_declarations,
+                                const char *verbatim_declarations_end,
+                                unsigned int verbatim_declarations_lineno,
+                                const char *verbatim_code,
+                                const char *verbatim_code_end,
+                                unsigned int verbatim_code_lineno,
+                                bool charset_dependent,
+                                int total_keys,
+                                int max_key_len, int min_key_len,
+                                bool hash_includes_len,
+                                const Positions& positions,
+                                const unsigned int *alpha_inc,
+                                int total_duplicates,
+                                unsigned int alpha_size,
+                                const int *asso_values);
+
+  /* Generates the hash function and the key word recognizer function.  */
+  void                  output ();
+
+private:
+
+  /* Computes the minimum and maximum hash values, and stores them
+     in _min_hash_value and _max_hash_value.  */
+  void                  compute_min_max ();
+
+  /* Returns the number of different hash values.  */
+  int                   num_hash_values () const;
+
+  /* Outputs the maximum and minimum hash values etc.  */
+  void                  output_constants (struct Output_Constants&) const;
+
+  /* Generates a C expression for an asso_values[] reference.  */
+  void                  output_asso_values_ref (int pos) const;
+
+  /* Generates C code for the hash function that returns the
+     proper encoding for each keyword.  */
+  void                  output_hash_function () const;
+
+  /* Prints out a table of keyword lengths, for use with the
+     comparison code in generated function 'in_word_set'.  */
+  void                  output_keylength_table () const;
+
+  /* Prints out the string pool, containing the strings of the keyword table.
+   */
+  void                  output_string_pool () const;
+
+  /* Prints out the array containing the keywords for the hash function.  */
+  void                  output_keyword_table () const;
+
+  /* Generates the large, sparse table that maps hash values into
+     the smaller, contiguous range of the keyword table.  */
+  void                  output_lookup_array () const;
+
+  /* Generate all pools needed for the lookup function.  */
+  void                  output_lookup_pools () const;
+
+  /* Generate all the tables needed for the lookup function.  */
+  void                  output_lookup_tables () const;
+
+  /* Generates C code to perform the keyword lookup.  */
+  void                  output_lookup_function_body (const struct Output_Compare&) const;
+
+  /* Generates C code for the lookup function.  */
+  void                  output_lookup_function () const;
+
+  /* Linked list of keywords.  */
+  KeywordExt_List *     _head;
+
+  /* Declaration of struct type for a keyword and its attributes.  */
+  const char * const    _struct_decl;
+  unsigned int const    _struct_decl_lineno;
+  /* Pointer to return type for lookup function. */
+  const char *          _return_type;
+  /* Shorthand for user-defined struct tag type. */
+  const char *          _struct_tag;
+  /* Element type of keyword array.  */
+  const char *          _wordlist_eltype;
+  /* The C code from the declarations section.  */
+  const char * const    _verbatim_declarations;
+  const char * const    _verbatim_declarations_end;
+  unsigned int const    _verbatim_declarations_lineno;
+  /* The C code from the end of the file.  */
+  const char * const    _verbatim_code;
+  const char * const    _verbatim_code_end;
+  unsigned int const    _verbatim_code_lineno;
+  /* Whether the keyword chars would have different values in a different
+     character set.  */
+  bool                  _charset_dependent;
+  /* Total number of keys, counting duplicates. */
+  int const             _total_keys;
+  /* Maximum length of the longest keyword. */
+  int const             _max_key_len;
+  /* Minimum length of the shortest keyword. */
+  int const             _min_key_len;
+  /* Whether the hash function includes the length.  */
+  bool                  _hash_includes_len;
+  /* Key positions.  */
+  Positions const       _key_positions;
+  /* Adjustments to add to bytes add specific key positions.  */
+  const unsigned int * const _alpha_inc;
+  /* Total number of duplicate hash values. */
+  int const             _total_duplicates;
+  /* Minimum hash value for all keywords. */
+  int                   _min_hash_value;
+  /* Maximum hash value for all keywords. */
+  int                   _max_hash_value;
+  /* Size of alphabet. */
+  unsigned int const    _alpha_size;
+  /* Value associated with each character. */
+  const int * const     _asso_values;
+};
+
+#endif
diff --git a/src/positions.cc b/src/positions.cc
new file mode 100644 (file)
index 0000000..1fb6883
--- /dev/null
@@ -0,0 +1,175 @@
+/* A set of byte positions.
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "positions.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* declares exit() */
+#include <string.h>
+
+/* ---------------------------- Class Positions ---------------------------- */
+
+/* Set operations.  Assumes the array is in reverse order.  */
+
+bool
+Positions::contains (int pos) const
+{
+  unsigned int count = _size;
+  const int *p = _positions + _size - 1;
+
+  for (; count > 0; p--, count--)
+    {
+      if (*p == pos)
+        return true;
+      if (*p > pos)
+        break;
+    }
+  return false;
+}
+
+void
+Positions::add (int pos)
+{
+  set_useall (false);
+
+  unsigned int count = _size;
+
+  if (count == MAX_SIZE)
+    {
+      fprintf (stderr, "Positions::add internal error: overflow\n");
+      exit (1);
+    }
+
+  int *p = _positions + _size - 1;
+
+  for (; count > 0; p--, count--)
+    {
+      if (*p == pos)
+        {
+          fprintf (stderr, "Positions::add internal error: duplicate\n");
+          exit (1);
+        }
+      if (*p > pos)
+        break;
+      p[1] = p[0];
+    }
+  p[1] = pos;
+  _size++;
+}
+
+void
+Positions::remove (int pos)
+{
+  set_useall (false);
+
+  unsigned int count = _size;
+  if (count > 0)
+    {
+      int *p = _positions + _size - 1;
+
+      if (*p == pos)
+        {
+          _size--;
+          return;
+        }
+      if (*p < pos)
+        {
+          int prev = *p;
+
+          for (;;)
+            {
+              p--;
+              count--;
+              if (count == 0)
+                break;
+              if (*p == pos)
+                {
+                  *p = prev;
+                  _size--;
+                  return;
+                }
+              if (*p > pos)
+                break;
+              int curr = *p;
+              *p = prev;
+              prev = curr;
+            }
+        }
+    }
+  fprintf (stderr, "Positions::remove internal error: not found\n");
+  exit (1);
+}
+
+/* Output in external syntax.  */
+void
+Positions::print () const
+{
+  if (_useall)
+    printf ("*");
+  else
+    {
+      bool first = true;
+      bool seen_LASTCHAR = false;
+      unsigned int count = _size;
+      const int *p = _positions + _size - 1;
+
+      for (; count > 0; p--)
+        {
+          count--;
+          if (*p == LASTCHAR)
+            seen_LASTCHAR = true;
+          else
+            {
+              if (!first)
+                printf (",");
+              printf ("%d", *p + 1);
+              if (count > 0 && p[-1] == *p + 1)
+                {
+                  printf ("-");
+                  do
+                    {
+                      p--;
+                      count--;
+                    }
+                  while (count > 0 && p[-1] == *p + 1);
+                  printf ("%d", *p + 1);
+                }
+              first = false;
+            }
+        }
+      if (seen_LASTCHAR)
+        {
+          if (!first)
+            printf (",");
+          printf ("$");
+        }
+    }
+}
+
+/* ------------------------------------------------------------------------- */
+
+#ifndef __OPTIMIZE__
+
+#define INLINE /* not inline */
+#include "positions.icc"
+#undef INLINE
+
+#endif /* not defined __OPTIMIZE__ */
diff --git a/src/positions.h b/src/positions.h
new file mode 100644 (file)
index 0000000..05c3cf3
--- /dev/null
@@ -0,0 +1,173 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* A set of byte positions.
+
+   Copyright (C) 1989-1998, 2000, 2002, 2005 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef positions_h
+#define positions_h 1
+
+/* Classes defined below.  */
+class PositionIterator;
+class PositionReverseIterator;
+
+/* This class denotes a set of byte positions, used to access a keyword.  */
+
+class Positions
+{
+  friend class PositionIterator;
+  friend class PositionReverseIterator;
+public:
+  /* Denotes the last char of a keyword, depending on the keyword's length.  */
+  enum {                LASTCHAR = -1 };
+
+  /* Maximum key position specifiable by the user, 1-based.
+     Note that MAX_KEY_POS-1 must fit into the element type of _positions[],
+     below.  */
+  enum {                MAX_KEY_POS = 255 };
+
+  /* Maximum possible size.  Since duplicates are eliminated and the possible
+     0-based positions are -1 .. MAX_KEY_POS-1, this is:  */
+  enum {                MAX_SIZE = MAX_KEY_POS + 1 };
+
+  /* Constructors.  */
+                        Positions ();
+                        Positions (int pos1);
+                        Positions (int pos1, int pos2);
+
+  /* Copy constructor.  */
+                        Positions (const Positions& src);
+
+  /* Assignment operator.  */
+  Positions&            operator= (const Positions& src);
+
+  /* Accessors.  */
+  bool                  is_useall () const;
+  int                   operator[] (unsigned int index) const;
+  unsigned int          get_size () const;
+
+  /* Write access.  */
+  void                  set_useall (bool useall);
+  int *                 pointer ();
+  void                  set_size (unsigned int size);
+
+  /* Sorts the array in reverse order.
+     Returns true if there are no duplicates, false otherwise.  */
+  bool                  sort ();
+
+  /* Creates an iterator, returning the positions in descending order.  */
+  PositionIterator      iterator () const;
+  /* Creates an iterator, returning the positions in descending order,
+     that apply to strings of length <= maxlen.  */
+  PositionIterator      iterator (int maxlen) const;
+  /* Creates an iterator, returning the positions in ascending order.  */
+  PositionReverseIterator reviterator () const;
+  /* Creates an iterator, returning the positions in ascending order,
+     that apply to strings of length <= maxlen.  */
+  PositionReverseIterator reviterator (int maxlen) const;
+
+  /* Set operations.  Assumes the array is in reverse order.  */
+  bool                  contains (int pos) const;
+  void                  add (int pos);
+  void                  remove (int pos);
+
+  /* Output in external syntax.  */
+  void                  print () const;
+
+private:
+  /* The special case denoted by '*'.  */
+  bool                  _useall;
+  /* Number of positions.  */
+  unsigned int          _size;
+  /* Array of positions.  0 for the first char, 1 for the second char etc.,
+     LASTCHAR for the last char.  */
+  int                   _positions[MAX_SIZE];
+};
+
+/* This class denotes an iterator through a set of byte positions.  */
+
+class PositionIterator
+{
+  friend class Positions;
+public:
+  /* Copy constructor.  */
+                        PositionIterator (const PositionIterator& src);
+
+  /* End of iteration marker.  */
+  enum {                EOS = -2 };
+
+  /* Retrieves the next position, or EOS past the end.  */
+  int                   next ();
+
+  /* Returns the number of remaining positions, i.e. how often next() will
+     return a value != EOS.  */
+  unsigned int          remaining () const;
+
+private:
+  /* Initializes an iterator through POSITIONS.  */
+                        PositionIterator (Positions const& positions);
+  /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen.  */
+                        PositionIterator (Positions const& positions, int maxlen);
+
+  const Positions&      _set;
+  unsigned int          _index;
+};
+
+/* This class denotes an iterator in reverse direction through a set of
+   byte positions.  */
+
+class PositionReverseIterator
+{
+  friend class Positions;
+public:
+  /* Copy constructor.  */
+                        PositionReverseIterator (const PositionReverseIterator& src);
+
+  /* End of iteration marker.  */
+  enum {                EOS = -2 };
+
+  /* Retrieves the next position, or EOS past the end.  */
+  int                   next ();
+
+  /* Returns the number of remaining positions, i.e. how often next() will
+     return a value != EOS.  */
+  unsigned int          remaining () const;
+
+private:
+  /* Initializes an iterator through POSITIONS.  */
+                        PositionReverseIterator (Positions const& positions);
+  /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen.  */
+                        PositionReverseIterator (Positions const& positions, int maxlen);
+
+  const Positions&      _set;
+  unsigned int          _index;
+  unsigned int          _minindex;
+};
+
+#ifdef __OPTIMIZE__
+
+#include <string.h>
+#define INLINE inline
+#include "positions.icc"
+#undef INLINE
+
+#endif
+
+#endif
diff --git a/src/positions.icc b/src/positions.icc
new file mode 100644 (file)
index 0000000..9c9f5ce
--- /dev/null
@@ -0,0 +1,283 @@
+/* Inline Functions for positions.{h,cc}.
+
+   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+// This needs:
+//#include <string.h>
+
+/* ---------------------------- Class Positions ---------------------------- */
+
+/* Constructors.  */
+
+INLINE
+Positions::Positions ()
+  : _useall (false),
+    _size (0)
+{
+}
+
+INLINE
+Positions::Positions (int pos1)
+  : _useall (false),
+    _size (1)
+{
+  _positions[0] = pos1;
+}
+
+INLINE
+Positions::Positions (int pos1, int pos2)
+  : _useall (false),
+    _size (2)
+{
+  _positions[0] = pos1;
+  _positions[1] = pos2;
+}
+
+/* Copy constructor.  */
+
+INLINE
+Positions::Positions (const Positions& src)
+  : _useall (src._useall),
+    _size (src._size)
+{
+  memcpy (_positions, src._positions, _size * sizeof (_positions[0]));
+}
+
+/* Assignment operator.  */
+
+INLINE Positions&
+Positions::operator= (const Positions& src)
+{
+  _useall = src._useall;
+  _size = src._size;
+  memcpy (_positions, src._positions, _size * sizeof (_positions[0]));
+  return *this;
+}
+
+/* Accessors.  */
+
+INLINE bool
+Positions::is_useall () const
+{
+  return _useall;
+}
+
+INLINE int
+Positions::operator[] (unsigned int index) const
+{
+  return _positions[index];
+}
+
+INLINE unsigned int
+Positions::get_size () const
+{
+  return _size;
+}
+
+/* Write access.  */
+
+INLINE void
+Positions::set_useall (bool useall)
+{
+  _useall = useall;
+  if (useall)
+    {
+      /* The positions are 0, 1, ..., MAX_KEY_POS-1, in descending order.  */
+      _size = MAX_KEY_POS;
+      int *ptr = _positions;
+      for (int i = MAX_KEY_POS - 1; i >= 0; i--)
+        *ptr++ = i;
+    }
+}
+
+INLINE int *
+Positions::pointer ()
+{
+  return _positions;
+}
+
+INLINE void
+Positions::set_size (unsigned int size)
+{
+  _size = size;
+}
+
+/* Sorts the array in reverse order.
+   Returns true if there are no duplicates, false otherwise.  */
+INLINE bool
+Positions::sort ()
+{
+  if (_useall)
+    return true;
+
+  /* Bubble sort.  */
+  bool duplicate_free = true;
+  int *base = _positions;
+  unsigned int len = _size;
+
+  for (unsigned int i = 1; i < len; i++)
+    {
+      unsigned int j;
+      int tmp;
+
+      for (j = i, tmp = base[j]; j > 0 && tmp >= base[j - 1]; j--)
+        if ((base[j] = base[j - 1]) == tmp) /* oh no, a duplicate!!! */
+          duplicate_free = false;
+
+      base[j] = tmp;
+    }
+
+  return duplicate_free;
+}
+
+/* Creates an iterator, returning the positions in descending order.  */
+INLINE PositionIterator
+Positions::iterator () const
+{
+  return PositionIterator (*this);
+}
+
+/* Creates an iterator, returning the positions in descending order,
+   that apply to strings of length <= maxlen.  */
+INLINE PositionIterator
+Positions::iterator (int maxlen) const
+{
+  return PositionIterator (*this, maxlen);
+}
+
+/* Creates an iterator, returning the positions in ascending order.  */
+INLINE PositionReverseIterator
+Positions::reviterator () const
+{
+  return PositionReverseIterator (*this);
+}
+
+/* Creates an iterator, returning the positions in ascending order,
+   that apply to strings of length <= maxlen.  */
+INLINE PositionReverseIterator
+Positions::reviterator (int maxlen) const
+{
+  return PositionReverseIterator (*this, maxlen);
+}
+
+/* ------------------------- Class PositionIterator ------------------------ */
+
+/* Initializes an iterator through POSITIONS.  */
+INLINE
+PositionIterator::PositionIterator (Positions const& positions)
+  : _set (positions),
+    _index (0)
+{
+}
+
+/* Initializes an iterator through POSITIONS, ignoring positions >= maxlen.  */
+INLINE
+PositionIterator::PositionIterator (Positions const& positions, int maxlen)
+  : _set (positions)
+{
+  if (positions._useall)
+    _index = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0);
+  else
+    {
+      unsigned int index;
+      for (index = 0;
+           index < positions._size && positions._positions[index] >= maxlen;
+           index++)
+        ;
+      _index = index;
+    }
+}
+
+/* Retrieves the next position, or EOS past the end.  */
+INLINE int
+PositionIterator::next ()
+{
+  return (_index < _set._size ? _set._positions[_index++] : EOS);
+}
+
+/* Returns the number of remaining positions, i.e. how often next() will
+   return a value != EOS.  */
+INLINE unsigned int
+PositionIterator::remaining () const
+{
+  return _set._size - _index;
+}
+
+/* Copy constructor.  */
+INLINE
+PositionIterator::PositionIterator (const PositionIterator& src)
+  : _set (src._set),
+    _index (src._index)
+{
+}
+
+/* --------------------- Class PositionReverseIterator --------------------- */
+
+/* Initializes an iterator through POSITIONS.  */
+INLINE
+PositionReverseIterator::PositionReverseIterator (Positions const& positions)
+  : _set (positions),
+    _index (_set._size),
+    _minindex (0)
+{
+}
+
+/* Initializes an iterator through POSITIONS, ignoring positions >= maxlen.  */
+INLINE
+PositionReverseIterator::PositionReverseIterator (Positions const& positions, int maxlen)
+  : _set (positions),
+    _index (_set._size)
+{
+  if (positions._useall)
+    _minindex = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0);
+  else
+    {
+      unsigned int index;
+      for (index = 0;
+           index < positions._size && positions._positions[index] >= maxlen;
+           index++)
+        ;
+      _minindex = index;
+    }
+}
+
+/* Retrieves the next position, or EOS past the end.  */
+INLINE int
+PositionReverseIterator::next ()
+{
+  return (_index > _minindex ? _set._positions[--_index] : EOS);
+}
+
+/* Returns the number of remaining positions, i.e. how often next() will
+   return a value != EOS.  */
+INLINE unsigned int
+PositionReverseIterator::remaining () const
+{
+  return _index - _minindex;
+}
+
+/* Copy constructor.  */
+INLINE
+PositionReverseIterator::PositionReverseIterator (const PositionReverseIterator& src)
+  : _set (src._set),
+    _index (src._index),
+    _minindex (src._minindex)
+{
+}
diff --git a/src/search.cc b/src/search.cc
new file mode 100644 (file)
index 0000000..804662d
--- /dev/null
@@ -0,0 +1,1685 @@
+/* Search algorithm.
+   Copyright (C) 1989-1998, 2000, 2002, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "search.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* declares exit(), rand(), srand() */
+#include <string.h> /* declares memset(), memcmp() */
+#include <time.h> /* declares time() */
+#include <math.h> /* declares exp() */
+#include <limits.h> /* defines INT_MIN, INT_MAX, UINT_MAX */
+#include "options.h"
+#include "hash-table.h"
+#include "config.h"
+
+/* ============================== Portability ============================== */
+
+/* Assume ISO C++ 'for' scoping rule.  */
+#define for if (0) ; else for
+
+/* Dynamically allocated array with dynamic extent:
+
+   Example:
+       DYNAMIC_ARRAY (my_array, int, n);
+       ...
+       FREE_DYNAMIC_ARRAY (my_array);
+
+   Attention: depending on your implementation my_array is either the array
+   itself or a pointer to the array! Always use my_array only as expression!
+ */
+#if HAVE_DYNAMIC_ARRAY
+  #define DYNAMIC_ARRAY(var,eltype,size) eltype var[size]
+  #define FREE_DYNAMIC_ARRAY(var)
+#else
+  #define DYNAMIC_ARRAY(var,eltype,size) eltype *var = new eltype[size]
+  #define FREE_DYNAMIC_ARRAY(var) delete[] var
+#endif
+
+/* ================================ Theory ================================= */
+
+/* The general form of the hash function is
+
+      hash (keyword) = sum (asso_values[keyword[i] + alpha_inc[i]] : i in Pos)
+                       + len (keyword)
+
+   where Pos is a set of byte positions,
+   each alpha_inc[i] is a nonnegative integer,
+   each asso_values[c] is a nonnegative integer,
+   len (keyword) is the keyword's length if _hash_includes_len, or 0 otherwise.
+
+   Theorem 1: If all keywords are different, there is a set Pos such that
+   all tuples (keyword[i] : i in Pos) are different.
+
+   Theorem 2: If all tuples (keyword[i] : i in Pos) are different, there
+   are nonnegative integers alpha_inc[i] such that all multisets
+   {keyword[i] + alpha_inc[i] : i in Pos} are different.
+
+   Define selchars[keyword] := {keyword[i] + alpha_inc[i] : i in Pos}.
+
+   Theorem 3: If all multisets selchars[keyword] are different, there are
+   nonnegative integers asso_values[c] such that all hash values
+   sum (asso_values[c] : c in selchars[keyword]) are different.
+
+   Based on these three facts, we find the hash function in three steps:
+
+   Step 1 (Finding good byte positions):
+   Find a set Pos, as small as possible, such that all tuples
+   (keyword[i] : i in Pos) are different.
+
+   Step 2 (Finding good alpha increments):
+   Find nonnegative integers alpha_inc[i], as many of them as possible being
+   zero, and the others being as small as possible, such that all multisets
+   {keyword[i] + alpha_inc[i] : i in Pos} are different.
+
+   Step 3 (Finding good asso_values):
+   Find asso_values[c] such that all hash (keyword) are different.
+
+   In other words, each step finds a projection that is injective on the
+   given finite set:
+     proj1 : String --> Map (Pos --> N)
+     proj2 : Map (Pos --> N) --> Map (Pos --> N) / S(Pos)
+     proj3 : Map (Pos --> N) / S(Pos) --> N
+   where
+     N denotes the set of nonnegative integers,
+     Map (A --> B) := Hom_Set (A, B) is the set of maps from A to B, and
+     S(Pos) is the symmetric group over Pos.
+
+   This was the theory for !_hash_includes_len; if _hash_includes_len, slight
+   modifications apply:
+     proj1 : String --> Map (Pos --> N) x N
+     proj2 : Map (Pos --> N) x N --> Map (Pos --> N) / S(Pos) x N
+     proj3 : Map (Pos --> N) / S(Pos) x N --> N
+
+   For a case-insensitive hash function, the general form is
+
+      hash (keyword) =
+        sum (asso_values[alpha_unify[keyword[i] + alpha_inc[i]]] : i in Pos)
+        + len (keyword)
+
+   where alpha_unify[c] is chosen so that an upper/lower case change in
+   keyword[i] doesn't change  alpha_unify[keyword[i] + alpha_inc[i]].
+ */
+
+/* ==================== Initialization and Preparation ===================== */
+
+Search::Search (KeywordExt_List *list)
+  : _head (list)
+{
+}
+
+void
+Search::prepare ()
+{
+  /* Compute the total number of keywords.  */
+  _total_keys = 0;
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    _total_keys++;
+
+  /* Compute the minimum and maximum keyword length.  */
+  _max_key_len = INT_MIN;
+  _min_key_len = INT_MAX;
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      if (_max_key_len < keyword->_allchars_length)
+        _max_key_len = keyword->_allchars_length;
+      if (_min_key_len > keyword->_allchars_length)
+        _min_key_len = keyword->_allchars_length;
+    }
+
+  /* Exit program if an empty string is used as keyword, since the comparison
+     expressions don't work correctly for looking up an empty string.  */
+  if (_min_key_len == 0)
+    {
+      fprintf (stderr, "Empty input keyword is not allowed.\n"
+               "To recognize an empty input keyword, your code should check for\n"
+               "len == 0 before calling the gperf generated lookup function.\n");
+      exit (1);
+    }
+
+  /* Exit program if the characters in the keywords are not in the required
+     range.  */
+  if (option[SEVENBIT])
+    for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+      {
+        KeywordExt *keyword = temp->first();
+
+        const char *k = keyword->_allchars;
+        for (int i = keyword->_allchars_length; i > 0; k++, i--)
+          if (!(static_cast<unsigned char>(*k) < 128))
+            {
+              fprintf (stderr, "Option --seven-bit has been specified,\n"
+                       "but keyword \"%.*s\" contains non-ASCII characters.\n"
+                       "Try removing option --seven-bit.\n",
+                       keyword->_allchars_length, keyword->_allchars);
+              exit (1);
+            }
+      }
+
+  /* Determine whether the hash function shall include the length.  */
+  _hash_includes_len = !(option[NOLENGTH] || (_min_key_len == _max_key_len));
+}
+
+/* ====================== Finding good byte positions ====================== */
+
+/* Computes the upper bound on the indices passed to asso_values[],
+   assuming no alpha_increments.  */
+unsigned int
+Search::compute_alpha_size () const
+{
+  return (option[SEVENBIT] ? 128 : 256);
+}
+
+/* Computes the unification rules between different asso_values[c],
+   assuming no alpha_increments.  */
+unsigned int *
+Search::compute_alpha_unify () const
+{
+  if (option[UPPERLOWER])
+    {
+      /* Uppercase to lowercase mapping.  */
+      unsigned int alpha_size = compute_alpha_size();
+      unsigned int *alpha_unify = new unsigned int[alpha_size];
+      for (unsigned int c = 0; c < alpha_size; c++)
+        alpha_unify[c] = c;
+      for (unsigned int c = 'A'; c <= 'Z'; c++)
+        alpha_unify[c] = c + ('a'-'A');
+      return alpha_unify;
+    }
+  else
+    /* Identity mapping.  */
+    return NULL;
+}
+
+/* Initializes each keyword's _selchars array.  */
+void
+Search::init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify) const
+{
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    temp->first()->init_selchars_tuple(positions, alpha_unify);
+}
+
+/* Deletes each keyword's _selchars array.  */
+void
+Search::delete_selchars () const
+{
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    temp->first()->delete_selchars();
+}
+
+/* Count the duplicate keywords that occur with a given set of positions.
+   In other words, it returns the difference
+     # K - # proj1 (K)
+   where K is the multiset of given keywords.  */
+unsigned int
+Search::count_duplicates_tuple (const Positions& positions, const unsigned int *alpha_unify) const
+{
+  /* Run through the keyword list and count the duplicates incrementally.
+     The result does not depend on the order of the keyword list, thanks to
+     the formula above.  */
+  init_selchars_tuple (positions, alpha_unify);
+
+  unsigned int count = 0;
+  {
+    Hash_Table representatives (_total_keys, !_hash_includes_len);
+    for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+      {
+        KeywordExt *keyword = temp->first();
+        if (representatives.insert (keyword))
+          count++;
+      }
+  }
+
+  delete_selchars ();
+
+  return count;
+}
+
+/* Find good key positions.  */
+
+void
+Search::find_positions ()
+{
+  /* If the user gave the key positions, we use them.  */
+  if (option[POSITIONS])
+    {
+      _key_positions = option.get_key_positions();
+      return;
+    }
+
+  /* Compute preliminary alpha_unify table.  */
+  unsigned int *alpha_unify = compute_alpha_unify ();
+
+  /* 1. Find positions that must occur in order to distinguish duplicates.  */
+  Positions mandatory;
+
+  if (!option[DUP])
+    {
+      for (KeywordExt_List *l1 = _head; l1 && l1->rest(); l1 = l1->rest())
+        {
+          KeywordExt *keyword1 = l1->first();
+          for (KeywordExt_List *l2 = l1->rest(); l2; l2 = l2->rest())
+            {
+              KeywordExt *keyword2 = l2->first();
+
+              /* If keyword1 and keyword2 have the same length and differ
+                 in just one position, and it is not the last character,
+                 this position is mandatory.  */
+              if (keyword1->_allchars_length == keyword2->_allchars_length)
+                {
+                  int n = keyword1->_allchars_length;
+                  int i;
+                  for (i = 0; i < n - 1; i++)
+                    {
+                      unsigned char c1 = keyword1->_allchars[i];
+                      unsigned char c2 = keyword2->_allchars[i];
+                      if (option[UPPERLOWER])
+                        {
+                          if (c1 >= 'A' && c1 <= 'Z')
+                            c1 += 'a' - 'A';
+                          if (c2 >= 'A' && c2 <= 'Z')
+                            c2 += 'a' - 'A';
+                        }
+                      if (c1 != c2)
+                        break;
+                    }
+                  if (i < n - 1)
+                    {
+                      int j;
+                      for (j = i + 1; j < n; j++)
+                        {
+                          unsigned char c1 = keyword1->_allchars[j];
+                          unsigned char c2 = keyword2->_allchars[j];
+                          if (option[UPPERLOWER])
+                            {
+                              if (c1 >= 'A' && c1 <= 'Z')
+                                c1 += 'a' - 'A';
+                              if (c2 >= 'A' && c2 <= 'Z')
+                                c2 += 'a' - 'A';
+                            }
+                          if (c1 != c2)
+                            break;
+                        }
+                      if (j >= n)
+                        {
+                          /* Position i is mandatory.  */
+                          if (!mandatory.contains (i))
+                            mandatory.add (i);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+  /* 2. Add positions, as long as this decreases the duplicates count.  */
+  int imax = (_max_key_len - 1 < Positions::MAX_KEY_POS - 1
+              ? _max_key_len - 1 : Positions::MAX_KEY_POS - 1);
+  Positions current = mandatory;
+  unsigned int current_duplicates_count =
+    count_duplicates_tuple (current, alpha_unify);
+  for (;;)
+    {
+      Positions best;
+      unsigned int best_duplicates_count = UINT_MAX;
+
+      for (int i = imax; i >= -1; i--)
+        if (!current.contains (i))
+          {
+            Positions tryal = current;
+            tryal.add (i);
+            unsigned int try_duplicates_count =
+              count_duplicates_tuple (tryal, alpha_unify);
+
+            /* We prefer 'try' to 'best' if it produces less duplicates,
+               or if it produces the same number of duplicates but with
+               a more efficient hash function.  */
+            if (try_duplicates_count < best_duplicates_count
+                || (try_duplicates_count == best_duplicates_count && i >= 0))
+              {
+                best = tryal;
+                best_duplicates_count = try_duplicates_count;
+              }
+          }
+
+      /* Stop adding positions when it gives no improvement.  */
+      if (best_duplicates_count >= current_duplicates_count)
+        break;
+
+      current = best;
+      current_duplicates_count = best_duplicates_count;
+    }
+
+  /* 3. Remove positions, as long as this doesn't increase the duplicates
+     count.  */
+  for (;;)
+    {
+      Positions best;
+      unsigned int best_duplicates_count = UINT_MAX;
+
+      for (int i = imax; i >= -1; i--)
+        if (current.contains (i) && !mandatory.contains (i))
+          {
+            Positions tryal = current;
+            tryal.remove (i);
+            unsigned int try_duplicates_count =
+              count_duplicates_tuple (tryal, alpha_unify);
+
+            /* We prefer 'try' to 'best' if it produces less duplicates,
+               or if it produces the same number of duplicates but with
+               a more efficient hash function.  */
+            if (try_duplicates_count < best_duplicates_count
+                || (try_duplicates_count == best_duplicates_count && i == -1))
+              {
+                best = tryal;
+                best_duplicates_count = try_duplicates_count;
+              }
+          }
+
+      /* Stop removing positions when it gives no improvement.  */
+      if (best_duplicates_count > current_duplicates_count)
+        break;
+
+      current = best;
+      current_duplicates_count = best_duplicates_count;
+    }
+
+  /* 4. Replace two positions by one, as long as this doesn't increase the
+     duplicates count.  */
+  for (;;)
+    {
+      Positions best;
+      unsigned int best_duplicates_count = UINT_MAX;
+
+      for (int i1 = imax; i1 >= -1; i1--)
+        if (current.contains (i1) && !mandatory.contains (i1))
+          for (int i2 = imax; i2 >= -1; i2--)
+            if (current.contains (i2) && !mandatory.contains (i2) && i2 != i1)
+              for (int i3 = imax; i3 >= 0; i3--)
+                if (!current.contains (i3))
+                  {
+                    Positions tryal = current;
+                    tryal.remove (i1);
+                    tryal.remove (i2);
+                    tryal.add (i3);
+                    unsigned int try_duplicates_count =
+                      count_duplicates_tuple (tryal, alpha_unify);
+
+                    /* We prefer 'try' to 'best' if it produces less duplicates,
+                       or if it produces the same number of duplicates but with
+                       a more efficient hash function.  */
+                    if (try_duplicates_count < best_duplicates_count
+                        || (try_duplicates_count == best_duplicates_count
+                            && (i1 == -1 || i2 == -1 || i3 >= 0)))
+                      {
+                        best = tryal;
+                        best_duplicates_count = try_duplicates_count;
+                      }
+                  }
+
+      /* Stop removing positions when it gives no improvement.  */
+      if (best_duplicates_count > current_duplicates_count)
+        break;
+
+      current = best;
+      current_duplicates_count = best_duplicates_count;
+    }
+
+  /* That's it.  Hope it's good enough.  */
+  _key_positions = current;
+
+  if (option[DEBUG])
+    {
+      /* Print the result.  */
+      fprintf (stderr, "\nComputed positions: ");
+      PositionReverseIterator iter = _key_positions.reviterator();
+      bool seen_lastchar = false;
+      bool first = true;
+      for (int i; (i = iter.next ()) != PositionReverseIterator::EOS; )
+        {
+          if (!first)
+            fprintf (stderr, ", ");
+          if (i == Positions::LASTCHAR)
+            seen_lastchar = true;
+          else
+            {
+              fprintf (stderr, "%d", i + 1);
+              first = false;
+            }
+        }
+      if (seen_lastchar)
+        {
+          if (!first)
+            fprintf (stderr, ", ");
+          fprintf (stderr, "$");
+        }
+      fprintf (stderr, "\n");
+    }
+
+  /* Free preliminary alpha_unify table.  */
+  delete[] alpha_unify;
+}
+
+/* Count the duplicate keywords that occur with the found set of positions.
+   In other words, it returns the difference
+     # K - # proj1 (K)
+   where K is the multiset of given keywords.  */
+unsigned int
+Search::count_duplicates_tuple () const
+{
+  unsigned int *alpha_unify = compute_alpha_unify ();
+  unsigned int count = count_duplicates_tuple (_key_positions, alpha_unify);
+  delete[] alpha_unify;
+  return count;
+}
+
+/* ===================== Finding good alpha increments ===================== */
+
+/* Computes the upper bound on the indices passed to asso_values[].  */
+unsigned int
+Search::compute_alpha_size (const unsigned int *alpha_inc) const
+{
+  unsigned int max_alpha_inc = 0;
+  for (int i = 0; i < _max_key_len; i++)
+    if (max_alpha_inc < alpha_inc[i])
+      max_alpha_inc = alpha_inc[i];
+  return (option[SEVENBIT] ? 128 : 256) + max_alpha_inc;
+}
+
+/* Computes the unification rules between different asso_values[c].  */
+unsigned int *
+Search::compute_alpha_unify (const Positions& positions, const unsigned int *alpha_inc) const
+{
+  if (option[UPPERLOWER])
+    {
+      /* Without alpha increments, we would simply unify
+           'A' -> 'a', ..., 'Z' -> 'z'.
+         But when a keyword contains at position i a character c,
+         we have the constraint
+            asso_values[tolower(c) + alpha_inc[i]] ==
+            asso_values[toupper(c) + alpha_inc[i]].
+         This introduces a unification
+           toupper(c) + alpha_inc[i] -> tolower(c) + alpha_inc[i].
+         Note that this unification can extend outside the range of
+         ASCII letters!  But still every unified character pair is at
+         a distance of 'a'-'A' = 32, or (after chained unification)
+         at a multiple of 32.  So in the end the alpha_unify vector has
+         the form    c -> c + 32 * f(c)   where f(c) is a nonnegative
+         integer.  */
+      unsigned int alpha_size = compute_alpha_size (alpha_inc);
+
+      unsigned int *alpha_unify = new unsigned int[alpha_size];
+      for (unsigned int c = 0; c < alpha_size; c++)
+        alpha_unify[c] = c;
+
+      for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+        {
+          KeywordExt *keyword = temp->first();
+
+          /* Iterate through the selected character positions.  */
+          PositionIterator iter = positions.iterator(keyword->_allchars_length);
+
+          for (int i; (i = iter.next ()) != PositionIterator::EOS; )
+            {
+              unsigned int c;
+              if (i == Positions::LASTCHAR)
+                c = static_cast<unsigned char>(keyword->_allchars[keyword->_allchars_length - 1]);
+              else if (i < keyword->_allchars_length)
+                c = static_cast<unsigned char>(keyword->_allchars[i]);
+              else
+                abort ();
+              if (c >= 'A' && c <= 'Z')
+                c += 'a' - 'A';
+              if (c >= 'a' && c <= 'z')
+                {
+                  if (i != Positions::LASTCHAR)
+                    c += alpha_inc[i];
+                  /* Unify c with c - ('a'-'A').  */
+                  unsigned int d = alpha_unify[c];
+                  unsigned int b = c - ('a'-'A');
+                  for (int a = b; a >= 0 && alpha_unify[a] == b; a -= ('a'-'A'))
+                    alpha_unify[a] = d;
+                }
+            }
+        }
+      return alpha_unify;
+    }
+  else
+    /* Identity mapping.  */
+    return NULL;
+}
+
+/* Initializes each keyword's _selchars array.  */
+void
+Search::init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) const
+{
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    temp->first()->init_selchars_multiset(positions, alpha_unify, alpha_inc);
+}
+
+/* Count the duplicate keywords that occur with the given set of positions
+   and a given alpha_inc[] array.
+   In other words, it returns the difference
+     # K - # proj2 (proj1 (K))
+   where K is the multiset of given keywords.  */
+unsigned int
+Search::count_duplicates_multiset (const unsigned int *alpha_inc) const
+{
+  /* Run through the keyword list and count the duplicates incrementally.
+     The result does not depend on the order of the keyword list, thanks to
+     the formula above.  */
+  unsigned int *alpha_unify = compute_alpha_unify (_key_positions, alpha_inc);
+  init_selchars_multiset (_key_positions, alpha_unify, alpha_inc);
+
+  unsigned int count = 0;
+  {
+    Hash_Table representatives (_total_keys, !_hash_includes_len);
+    for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+      {
+        KeywordExt *keyword = temp->first();
+        if (representatives.insert (keyword))
+          count++;
+      }
+  }
+
+  delete_selchars ();
+  delete[] alpha_unify;
+
+  return count;
+}
+
+/* Find good _alpha_inc[].  */
+
+void
+Search::find_alpha_inc ()
+{
+  /* The goal is to choose _alpha_inc[] such that it doesn't introduce
+     artificial duplicates.
+     In other words, the goal is  # proj2 (proj1 (K)) = # proj1 (K).  */
+  unsigned int duplicates_goal = count_duplicates_tuple ();
+
+  /* Start with zero increments.  This is sufficient in most cases.  */
+  unsigned int *current = new unsigned int [_max_key_len];
+  for (int i = 0; i < _max_key_len; i++)
+    current[i] = 0;
+  unsigned int current_duplicates_count = count_duplicates_multiset (current);
+
+  if (current_duplicates_count > duplicates_goal)
+    {
+      /* Look which _alpha_inc[i] we are free to increment.  */
+      unsigned int nindices;
+      {
+        nindices = 0;
+        PositionIterator iter = _key_positions.iterator(_max_key_len);
+        for (;;)
+          {
+            int key_pos = iter.next ();
+            if (key_pos == PositionIterator::EOS)
+              break;
+            if (key_pos != Positions::LASTCHAR)
+              nindices++;
+          }
+      }
+
+      DYNAMIC_ARRAY (indices, unsigned int, nindices);
+      {
+        unsigned int j = 0;
+        PositionIterator iter = _key_positions.iterator(_max_key_len);
+        for (;;)
+          {
+            int key_pos = iter.next ();
+            if (key_pos == PositionIterator::EOS)
+              break;
+            if (key_pos != Positions::LASTCHAR)
+              indices[j++] = key_pos;
+          }
+        if (!(j == nindices))
+          abort ();
+      }
+
+      /* Perform several rounds of searching for a good alpha increment.
+         Each round reduces the number of artificial collisions by adding
+         an increment in a single key position.  */
+      DYNAMIC_ARRAY (best, unsigned int, _max_key_len);
+      DYNAMIC_ARRAY (tryal, unsigned int, _max_key_len);
+      do
+        {
+          /* An increment of 1 is not always enough.  Try higher increments
+             also.  */
+          for (unsigned int inc = 1; ; inc++)
+            {
+              unsigned int best_duplicates_count = UINT_MAX;
+
+              for (unsigned int j = 0; j < nindices; j++)
+                {
+                  memcpy (tryal, current, _max_key_len * sizeof (unsigned int));
+                  tryal[indices[j]] += inc;
+                  unsigned int try_duplicates_count =
+                    count_duplicates_multiset (tryal);
+
+                  /* We prefer 'try' to 'best' if it produces less
+                     duplicates.  */
+                  if (try_duplicates_count < best_duplicates_count)
+                    {
+                      memcpy (best, tryal, _max_key_len * sizeof (unsigned int));
+                      best_duplicates_count = try_duplicates_count;
+                    }
+                }
+
+              /* Stop this round when we got an improvement.  */
+              if (best_duplicates_count < current_duplicates_count)
+                {
+                  memcpy (current, best, _max_key_len * sizeof (unsigned int));
+                  current_duplicates_count = best_duplicates_count;
+                  break;
+                }
+            }
+        }
+      while (current_duplicates_count > duplicates_goal);
+      FREE_DYNAMIC_ARRAY (tryal);
+      FREE_DYNAMIC_ARRAY (best);
+
+      if (option[DEBUG])
+        {
+          /* Print the result.  */
+          fprintf (stderr, "\nComputed alpha increments: ");
+          bool first = true;
+          for (unsigned int j = nindices; j-- > 0; )
+            if (current[indices[j]] != 0)
+              {
+                if (!first)
+                  fprintf (stderr, ", ");
+                fprintf (stderr, "%u:+%u",
+                         indices[j] + 1, current[indices[j]]);
+                first = false;
+              }
+          fprintf (stderr, "\n");
+        }
+      FREE_DYNAMIC_ARRAY (indices);
+    }
+
+  _alpha_inc = current;
+  _alpha_size = compute_alpha_size (_alpha_inc);
+  _alpha_unify = compute_alpha_unify (_key_positions, _alpha_inc);
+}
+
+/* ======================= Finding good asso_values ======================== */
+
+/* Initializes the asso_values[] related parameters.  */
+
+void
+Search::prepare_asso_values ()
+{
+  KeywordExt_List *temp;
+
+  /* Initialize each keyword's _selchars array.  */
+  init_selchars_multiset(_key_positions, _alpha_unify, _alpha_inc);
+
+  /* Compute the maximum _selchars_length over all keywords.  */
+  _max_selchars_length = _key_positions.iterator(_max_key_len).remaining();
+
+  /* Check for duplicates, i.e. keywords with the same _selchars array
+     (and - if _hash_includes_len - also the same length).
+     We deal with these by building an equivalence class, so that only
+     1 keyword is representative of the entire collection.  Only this
+     representative remains in the keyword list; the others are accessible
+     through the _duplicate_link chain, starting at the representative.
+     This *greatly* simplifies processing during later stages of the program.
+     Set _total_duplicates and _list_len = _total_keys - _total_duplicates.  */
+  {
+    _list_len = _total_keys;
+    _total_duplicates = 0;
+    /* Make hash table for efficiency.  */
+    Hash_Table representatives (_list_len, !_hash_includes_len);
+
+    KeywordExt_List *prev = NULL; /* list node before temp */
+    for (temp = _head; temp; )
+      {
+        KeywordExt *keyword = temp->first();
+        KeywordExt *other_keyword = representatives.insert (keyword);
+        KeywordExt_List *garbage = NULL;
+
+        if (other_keyword)
+          {
+            _total_duplicates++;
+            _list_len--;
+            /* Remove keyword from the main list.  */
+            prev->rest() = temp->rest();
+            garbage = temp;
+            /* And insert it on other_keyword's duplicate list.  */
+            keyword->_duplicate_link = other_keyword->_duplicate_link;
+            other_keyword->_duplicate_link = keyword;
+
+            /* Complain if user hasn't enabled the duplicate option. */
+            if (!option[DUP] || option[DEBUG])
+              {
+                fprintf (stderr, "Key link: \"%.*s\" = \"%.*s\", with key set \"",
+                         keyword->_allchars_length, keyword->_allchars,
+                         other_keyword->_allchars_length, other_keyword->_allchars);
+                for (int j = 0; j < keyword->_selchars_length; j++)
+                  putc (keyword->_selchars[j], stderr);
+                fprintf (stderr, "\".\n");
+              }
+          }
+        else
+          {
+            keyword->_duplicate_link = NULL;
+            prev = temp;
+          }
+        temp = temp->rest();
+        if (garbage)
+          delete garbage;
+      }
+    if (option[DEBUG])
+      representatives.dump();
+  }
+
+  /* Exit program if duplicates exists and option[DUP] not set, since we
+     don't want to continue in this case.  (We don't want to turn on
+     option[DUP] implicitly, because the generated code is usually much
+     slower.  */
+  if (_total_duplicates)
+    {
+      if (option[DUP])
+        fprintf (stderr, "%d input keys have identical hash values, examine output carefully...\n",
+                         _total_duplicates);
+      else
+        {
+          fprintf (stderr, "%d input keys have identical hash values,\n",
+                           _total_duplicates);
+          if (option[POSITIONS])
+            fprintf (stderr, "try different key positions or use option -D.\n");
+          else
+            fprintf (stderr, "use option -D.\n");
+          exit (1);
+        }
+    }
+
+  /* Compute the occurrences of each character in the alphabet.  */
+  _occurrences = new int[_alpha_size];
+  memset (_occurrences, 0, _alpha_size * sizeof (_occurrences[0]));
+  for (temp = _head; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+      const unsigned int *ptr = keyword->_selchars;
+      for (int count = keyword->_selchars_length; count > 0; ptr++, count--)
+        _occurrences[*ptr]++;
+    }
+
+  /* Memory allocation.  */
+  _asso_values = new int[_alpha_size];
+
+  int non_linked_length = _list_len;
+  unsigned int asso_value_max;
+
+  asso_value_max =
+    static_cast<unsigned int>(non_linked_length * option.get_size_multiple());
+  /* Round up to the next power of two.  This makes it easy to ensure
+     an _asso_value[c] is >= 0 and < asso_value_max.  Also, the jump value
+     being odd, it guarantees that Search::try_asso_value() will iterate
+     through different values for _asso_value[c].  */
+  if (asso_value_max == 0)
+    asso_value_max = 1;
+  asso_value_max |= asso_value_max >> 1;
+  asso_value_max |= asso_value_max >> 2;
+  asso_value_max |= asso_value_max >> 4;
+  asso_value_max |= asso_value_max >> 8;
+  asso_value_max |= asso_value_max >> 16;
+  asso_value_max++;
+  _asso_value_max = asso_value_max;
+
+  /* Given the bound for _asso_values[c], we have a bound for the possible
+     hash values, as computed in compute_hash().  */
+  _max_hash_value = (_hash_includes_len ? _max_key_len : 0)
+                    + (_asso_value_max - 1) * _max_selchars_length;
+  /* Allocate a sparse bit vector for detection of collisions of hash
+     values.  */
+  _collision_detector = new Bool_Array (_max_hash_value + 1);
+
+  if (option[DEBUG])
+    {
+      fprintf (stderr, "total non-linked keys = %d\nmaximum associated value is %d"
+               "\nmaximum size of generated hash table is %d\n",
+               non_linked_length, asso_value_max, _max_hash_value);
+
+      int field_width;
+
+      field_width = 0;
+      {
+        for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+          {
+            KeywordExt *keyword = temp->first();
+            if (field_width < keyword->_selchars_length)
+              field_width = keyword->_selchars_length;
+          }
+      }
+
+      fprintf (stderr, "\ndumping the keyword list without duplicates\n");
+      fprintf (stderr, "keyword #, %*s, keyword\n", field_width, "keysig");
+      int i = 0;
+      for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+        {
+          KeywordExt *keyword = temp->first();
+          fprintf (stderr, "%9d, ", ++i);
+          if (field_width > keyword->_selchars_length)
+            fprintf (stderr, "%*s", field_width - keyword->_selchars_length, "");
+          for (int j = 0; j < keyword->_selchars_length; j++)
+            putc (keyword->_selchars[j], stderr);
+          fprintf (stderr, ", %.*s\n",
+                   keyword->_allchars_length, keyword->_allchars);
+        }
+      fprintf (stderr, "\nend of keyword list\n\n");
+    }
+
+  if (option[RANDOM] || option.get_jump () == 0)
+    /* We will use rand(), so initialize the random number generator.  */
+    srand (static_cast<long>(time (0)));
+
+  _initial_asso_value = (option[RANDOM] ? -1 : option.get_initial_asso_value ());
+  _jump = option.get_jump ();
+}
+
+/* Finds some _asso_values[] that fit.  */
+
+/* The idea is to choose the _asso_values[] one by one, in a way that
+   a choice that has been made never needs to be undone later.  This
+   means that we split the work into several steps.  Each step chooses
+   one or more _asso_values[c].  The result of choosing one or more
+   _asso_values[c] is that the partitioning of the keyword set gets
+   broader.
+   Look at this partitioning:  After every step, the _asso_values[] of a
+   certain set C of characters are undetermined.  (At the beginning, C
+   is the set of characters c with _occurrences[c] > 0.  At the end, C
+   is empty.)  To each keyword K, we associate the multiset of _selchars
+   for which the _asso_values[] are undetermined:
+                    K  -->  K->_selchars intersect C.
+   Consider two keywords equivalent if their value under this mapping is
+   the same.  This introduces an equivalence relation on the set of
+   keywords.  The equivalence classes partition the keyword set.  (At the
+   beginning, the partition is the finest possible: each K is an equivalence
+   class by itself, because all K have a different _selchars.  At the end,
+   all K have been merged into a single equivalence class.)
+   The partition before a step is always a refinement of the partition
+   after the step.
+   We choose the steps in such a way that the partition really becomes
+   broader at each step.  (A step that only chooses an _asso_values[c]
+   without changing the partition is better merged with the previous step,
+   to avoid useless backtracking.)  */
+
+struct EquivalenceClass
+{
+  /* The keywords in this equivalence class.  */
+  KeywordExt_List *     _keywords;
+  KeywordExt_List *     _keywords_last;
+  /* The number of keywords in this equivalence class.  */
+  unsigned int          _cardinality;
+  /* The undetermined selected characters for the keywords in this
+     equivalence class, as a canonically reordered multiset.  */
+  unsigned int *        _undetermined_chars;
+  unsigned int          _undetermined_chars_length;
+
+  EquivalenceClass *    _next;
+};
+
+struct Step
+{
+  /* The characters whose values are being determined in this step.  */
+  unsigned int          _changing_count;
+  unsigned int *        _changing;
+  /* Exclusive upper bound for the _asso_values[c] of this step.
+     A power of 2.  */
+  unsigned int          _asso_value_max;
+  /* The characters whose values will be determined after this step.  */
+  bool *                _undetermined;
+  /* The keyword set partition after this step.  */
+  EquivalenceClass *    _partition;
+  /* The expected number of iterations in this step.  */
+  double                _expected_lower;
+  double                _expected_upper;
+
+  Step *                _next;
+};
+
+static inline bool
+equals (const unsigned int *ptr1, const unsigned int *ptr2, unsigned int len)
+{
+  while (len > 0)
+    {
+      if (*ptr1 != *ptr2)
+        return false;
+      ptr1++;
+      ptr2++;
+      len--;
+    }
+  return true;
+}
+
+EquivalenceClass *
+Search::compute_partition (bool *undetermined) const
+{
+  EquivalenceClass *partition = NULL;
+  EquivalenceClass *partition_last = NULL;
+  for (KeywordExt_List *temp = _head; temp; temp = temp->rest())
+    {
+      KeywordExt *keyword = temp->first();
+
+      /* Compute the undetermined characters for this keyword.  */
+      unsigned int *undetermined_chars =
+        new unsigned int[keyword->_selchars_length];
+      unsigned int undetermined_chars_length = 0;
+
+      for (int i = 0; i < keyword->_selchars_length; i++)
+        if (undetermined[keyword->_selchars[i]])
+          undetermined_chars[undetermined_chars_length++] = keyword->_selchars[i];
+
+      /* Look up the equivalence class to which this keyword belongs.  */
+      EquivalenceClass *equclass;
+      for (equclass = partition; equclass; equclass = equclass->_next)
+        if (equclass->_undetermined_chars_length == undetermined_chars_length
+            && equals (equclass->_undetermined_chars, undetermined_chars,
+                       undetermined_chars_length))
+          break;
+      if (equclass == NULL)
+        {
+          equclass = new EquivalenceClass();
+          equclass->_keywords = NULL;
+          equclass->_keywords_last = NULL;
+          equclass->_cardinality = 0;
+          equclass->_undetermined_chars = undetermined_chars;
+          equclass->_undetermined_chars_length = undetermined_chars_length;
+          equclass->_next = NULL;
+          if (partition)
+            partition_last->_next = equclass;
+          else
+            partition = equclass;
+          partition_last = equclass;
+        }
+      else
+        delete[] undetermined_chars;
+
+      /* Add the keyword to the equivalence class.  */
+      KeywordExt_List *cons = new KeywordExt_List(keyword);
+      if (equclass->_keywords)
+        equclass->_keywords_last->rest() = cons;
+      else
+        equclass->_keywords = cons;
+      equclass->_keywords_last = cons;
+      equclass->_cardinality++;
+    }
+
+  /* Free some of the allocated memory.  The caller doesn't need it.  */
+  for (EquivalenceClass *cls = partition; cls; cls = cls->_next)
+    delete[] cls->_undetermined_chars;
+
+  return partition;
+}
+
+static void
+delete_partition (EquivalenceClass *partition)
+{
+  while (partition != NULL)
+    {
+      EquivalenceClass *equclass = partition;
+      partition = equclass->_next;
+      delete_list (equclass->_keywords);
+      //delete[] equclass->_undetermined_chars; // already freed above
+      delete equclass;
+    }
+}
+
+/* Compute the possible number of collisions when _asso_values[c] is
+   chosen, leading to the given partition.  */
+unsigned int
+Search::count_possible_collisions (EquivalenceClass *partition, unsigned int c) const
+{
+  /* Every equivalence class p is split according to the frequency of
+     occurrence of c, leading to equivalence classes p1, p2, ...
+     This leads to   (|p|^2 - |p1|^2 - |p2|^2 - ...)/2  possible collisions.
+     Return the sum of this expression over all equivalence classes.  */
+  unsigned int sum = 0;
+  unsigned int m = _max_selchars_length;
+  DYNAMIC_ARRAY (split_cardinalities, unsigned int, m + 1);
+  for (EquivalenceClass *cls = partition; cls; cls = cls->_next)
+    {
+      for (unsigned int i = 0; i <= m; i++)
+        split_cardinalities[i] = 0;
+
+      for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest())
+        {
+          KeywordExt *keyword = temp->first();
+
+          unsigned int count = 0;
+          for (int i = 0; i < keyword->_selchars_length; i++)
+            if (keyword->_selchars[i] == c)
+              count++;
+
+          split_cardinalities[count]++;
+        }
+
+      sum += cls->_cardinality * cls->_cardinality;
+      for (unsigned int i = 0; i <= m; i++)
+        sum -= split_cardinalities[i] * split_cardinalities[i];
+    }
+  FREE_DYNAMIC_ARRAY (split_cardinalities);
+  return sum;
+}
+
+/* Test whether adding c to the undetermined characters changes the given
+   partition.  */
+bool
+Search::unchanged_partition (EquivalenceClass *partition, unsigned int c) const
+{
+  for (EquivalenceClass *cls = partition; cls; cls = cls->_next)
+    {
+      unsigned int first_count = UINT_MAX;
+
+      for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest())
+        {
+          KeywordExt *keyword = temp->first();
+
+          unsigned int count = 0;
+          for (int i = 0; i < keyword->_selchars_length; i++)
+            if (keyword->_selchars[i] == c)
+              count++;
+
+          if (temp == cls->_keywords)
+            first_count = count;
+          else if (count != first_count)
+            /* c would split this equivalence class.  */
+            return false;
+        }
+    }
+  return true;
+}
+
+void
+Search::find_asso_values ()
+{
+  Step *steps;
+
+  /* Determine the steps, starting with the last one.  */
+  {
+    bool *undetermined;
+    bool *determined;
+
+    steps = NULL;
+
+    undetermined = new bool[_alpha_size];
+    for (unsigned int c = 0; c < _alpha_size; c++)
+      undetermined[c] = false;
+
+    determined = new bool[_alpha_size];
+    for (unsigned int c = 0; c < _alpha_size; c++)
+      determined[c] = true;
+
+    for (;;)
+      {
+        /* Compute the partition that needs to be refined.  */
+        EquivalenceClass *partition = compute_partition (undetermined);
+
+        /* Determine the main character to be chosen in this step.
+           Choosing such a character c has the effect of splitting every
+           equivalence class (according the the frequency of occurrence of c).
+           We choose the c with the minimum number of possible collisions,
+           so that characters which lead to a large number of collisions get
+           handled early during the search.  */
+        unsigned int chosen_c;
+        unsigned int chosen_possible_collisions;
+        {
+          unsigned int best_c = 0;
+          unsigned int best_possible_collisions = UINT_MAX;
+          for (unsigned int c = 0; c < _alpha_size; c++)
+            if (_occurrences[c] > 0 && determined[c])
+              {
+                unsigned int possible_collisions =
+                  count_possible_collisions (partition, c);
+                if (possible_collisions < best_possible_collisions)
+                  {
+                    best_c = c;
+                    best_possible_collisions = possible_collisions;
+                  }
+              }
+          if (best_possible_collisions == UINT_MAX)
+            {
+              /* All c with _occurrences[c] > 0 are undetermined.  We are
+                 are the starting situation and don't need any more step.  */
+              delete_partition (partition);
+              break;
+            }
+          chosen_c = best_c;
+          chosen_possible_collisions = best_possible_collisions;
+        }
+
+        /* We need one more step.  */
+        Step *step = new Step();
+
+        step->_undetermined = new bool[_alpha_size];
+        memcpy (step->_undetermined, undetermined, _alpha_size*sizeof(bool));
+
+        step->_partition = partition;
+
+        /* Now determine how the equivalence classes will be before this
+           step.  */
+        undetermined[chosen_c] = true;
+        partition = compute_partition (undetermined);
+
+        /* Now determine which other characters should be determined in this
+           step, because they will not change the equivalence classes at
+           this point.  It is the set of all c which, for all equivalence
+           classes, have the same frequency of occurrence in every keyword
+           of the equivalence class.  */
+        for (unsigned int c = 0; c < _alpha_size; c++)
+          if (_occurrences[c] > 0 && determined[c]
+              && unchanged_partition (partition, c))
+            {
+              undetermined[c] = true;
+              determined[c] = false;
+            }
+
+        /* main_c must be one of these.  */
+        if (determined[chosen_c])
+          abort ();
+
+        /* Now the set of changing characters of this step.  */
+        unsigned int changing_count;
+
+        changing_count = 0;
+        for (unsigned int c = 0; c < _alpha_size; c++)
+          if (undetermined[c] && !step->_undetermined[c])
+            changing_count++;
+
+        unsigned int *changing = new unsigned int[changing_count];
+        changing_count = 0;
+        for (unsigned int c = 0; c < _alpha_size; c++)
+          if (undetermined[c] && !step->_undetermined[c])
+            changing[changing_count++] = c;
+
+        step->_changing = changing;
+        step->_changing_count = changing_count;
+
+        step->_asso_value_max = _asso_value_max;
+
+        step->_expected_lower =
+          exp (static_cast<double>(chosen_possible_collisions)
+               / static_cast<double>(_max_hash_value));
+        step->_expected_upper =
+          exp (static_cast<double>(chosen_possible_collisions)
+               / static_cast<double>(_asso_value_max));
+
+        delete_partition (partition);
+
+        step->_next = steps;
+        steps = step;
+      }
+
+    delete[] determined;
+    delete[] undetermined;
+  }
+
+  if (option[DEBUG])
+    {
+      unsigned int stepno = 0;
+      for (Step *step = steps; step; step = step->_next)
+        {
+          stepno++;
+          fprintf (stderr, "Step %u chooses _asso_values[", stepno);
+          for (unsigned int i = 0; i < step->_changing_count; i++)
+            {
+              if (i > 0)
+                fprintf (stderr, ",");
+              fprintf (stderr, "'%c'", step->_changing[i]);
+            }
+          fprintf (stderr, "], expected number of iterations between %g and %g.\n",
+                   step->_expected_lower, step->_expected_upper);
+          fprintf (stderr, "Keyword equivalence classes:\n");
+          for (EquivalenceClass *cls = step->_partition; cls; cls = cls->_next)
+            {
+              fprintf (stderr, "\n");
+              for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest())
+                {
+                  KeywordExt *keyword = temp->first();
+                  fprintf (stderr, "  %.*s\n",
+                           keyword->_allchars_length, keyword->_allchars);
+                }
+            }
+          fprintf (stderr, "\n");
+        }
+    }
+
+  /* Initialize _asso_values[].  (The value given here matters only
+     for those c which occur in all keywords with equal multiplicity.)  */
+  for (unsigned int c = 0; c < _alpha_size; c++)
+    _asso_values[c] = 0;
+
+  unsigned int stepno = 0;
+  for (Step *step = steps; step; step = step->_next)
+    {
+      stepno++;
+
+      /* Initialize the asso_values[].  */
+      unsigned int k = step->_changing_count;
+      for (unsigned int i = 0; i < k; i++)
+        {
+          unsigned int c = step->_changing[i];
+          _asso_values[c] =
+            (_initial_asso_value < 0 ? rand () : _initial_asso_value)
+            & (step->_asso_value_max - 1);
+        }
+
+      unsigned int iterations = 0;
+      DYNAMIC_ARRAY (iter, unsigned int, k);
+      for (unsigned int i = 0; i < k; i++)
+        iter[i] = 0;
+      unsigned int ii = (_jump != 0 ? k - 1 : 0);
+
+      for (;;)
+        {
+          /* Test whether these asso_values[] lead to collisions among
+             the equivalence classes that should be collision-free.  */
+          bool has_collision = false;
+          for (EquivalenceClass *cls = step->_partition; cls; cls = cls->_next)
+            {
+              /* Iteration Number array is a win, O(1) initialization time!  */
+              _collision_detector->clear ();
+
+              for (KeywordExt_List *ptr = cls->_keywords; ptr; ptr = ptr->rest())
+                {
+                  KeywordExt *keyword = ptr->first();
+
+                  /* Compute the new hash code for the keyword, leaving apart
+                     the yet undetermined asso_values[].  */
+                  int hashcode;
+                  {
+                    int sum = _hash_includes_len ? keyword->_allchars_length : 0;
+                    const unsigned int *p = keyword->_selchars;
+                    int i = keyword->_selchars_length;
+                    for (; i > 0; p++, i--)
+                      if (!step->_undetermined[*p])
+                        sum += _asso_values[*p];
+                    hashcode = sum;
+                  }
+
+                  /* See whether it collides with another keyword's hash code,
+                     from the same equivalence class.  */
+                  if (_collision_detector->set_bit (hashcode))
+                    {
+                      has_collision = true;
+                      break;
+                    }
+                }
+
+              /* Don't need to continue looking at the other equivalence
+                 classes if we already have found a collision.  */
+              if (has_collision)
+                break;
+            }
+
+          iterations++;
+          if (!has_collision)
+            break;
+
+          /* Try other asso_values[].  */
+          if (_jump != 0)
+            {
+              /* The way we try various values for
+                   asso_values[step->_changing[0],...step->_changing[k-1]]
+                 is like this:
+                 for (bound = 0,1,...)
+                   for (ii = 0,...,k-1)
+                     iter[ii] := bound
+                     iter[0..ii-1] := values <= bound
+                     iter[ii+1..k-1] := values < bound
+                 and
+                   asso_values[step->_changing[i]] =
+                     _initial_asso_value + iter[i] * _jump.
+                 This makes it more likely to find small asso_values[].
+               */
+              unsigned int bound = iter[ii];
+              unsigned int i = 0;
+              while (i < ii)
+                {
+                  unsigned int c = step->_changing[i];
+                  iter[i]++;
+                  _asso_values[c] =
+                    (_asso_values[c] + _jump) & (step->_asso_value_max - 1);
+                  if (iter[i] <= bound)
+                    goto found_next;
+                  _asso_values[c] =
+                    (_asso_values[c] - iter[i] * _jump)
+                    & (step->_asso_value_max - 1);
+                  iter[i] = 0;
+                  i++;
+                }
+              i = ii + 1;
+              while (i < k)
+                {
+                  unsigned int c = step->_changing[i];
+                  iter[i]++;
+                  _asso_values[c] =
+                    (_asso_values[c] + _jump) & (step->_asso_value_max - 1);
+                  if (iter[i] < bound)
+                    goto found_next;
+                  _asso_values[c] =
+                    (_asso_values[c] - iter[i] * _jump)
+                    & (step->_asso_value_max - 1);
+                  iter[i] = 0;
+                  i++;
+                }
+              /* Switch from one ii to the next.  */
+              {
+                unsigned int c = step->_changing[ii];
+                _asso_values[c] =
+                  (_asso_values[c] - bound * _jump)
+                  & (step->_asso_value_max - 1);
+                iter[ii] = 0;
+              }
+              /* Here all iter[i] == 0.  */
+              ii++;
+              if (ii == k)
+                {
+                  ii = 0;
+                  bound++;
+                  if (bound == step->_asso_value_max)
+                    {
+                      /* Out of search space!  We can either backtrack, or
+                         increase the available search space of this step.
+                         It seems simpler to choose the latter solution.  */
+                      step->_asso_value_max = 2 * step->_asso_value_max;
+                      if (step->_asso_value_max > _asso_value_max)
+                        {
+                          _asso_value_max = step->_asso_value_max;
+                          /* Reinitialize _max_hash_value.  */
+                          _max_hash_value =
+                            (_hash_includes_len ? _max_key_len : 0)
+                            + (_asso_value_max - 1) * _max_selchars_length;
+                          /* Reinitialize _collision_detector.  */
+                          delete _collision_detector;
+                          _collision_detector =
+                            new Bool_Array (_max_hash_value + 1);
+                        }
+                    }
+                }
+              {
+                unsigned int c = step->_changing[ii];
+                iter[ii] = bound;
+                _asso_values[c] =
+                  (_asso_values[c] + bound * _jump)
+                  & (step->_asso_value_max - 1);
+              }
+             found_next: ;
+            }
+          else
+            {
+              /* Random.  */
+              unsigned int c = step->_changing[ii];
+              _asso_values[c] =
+                (_asso_values[c] + rand ()) & (step->_asso_value_max - 1);
+              /* Next time, change the next c.  */
+              ii++;
+              if (ii == k)
+                ii = 0;
+            }
+        }
+      FREE_DYNAMIC_ARRAY (iter);
+
+      if (option[DEBUG])
+        {
+          fprintf (stderr, "Step %u chose _asso_values[", stepno);
+          for (unsigned int i = 0; i < step->_changing_count; i++)
+            {
+              if (i > 0)
+                fprintf (stderr, ",");
+              fprintf (stderr, "'%c'", step->_changing[i]);
+            }
+          fprintf (stderr, "] in %u iterations.\n", iterations);
+        }
+    }
+
+  /* Free allocated memory.  */
+  while (steps != NULL)
+    {
+      Step *step = steps;
+      steps = step->_next;
+      delete[] step->_changing;
+      delete[] step->_undetermined;
+      delete_partition (step->_partition);
+      delete step;
+    }
+}
+
+/* Computes a keyword's hash value, relative to the current _asso_values[],
+   and stores it in keyword->_hash_value.  */
+
+inline int
+Search::compute_hash (KeywordExt *keyword) const
+{
+  int sum = _hash_includes_len ? keyword->_allchars_length : 0;
+
+  const unsigned int *p = keyword->_selchars;
+  int i = keyword->_selchars_length;
+  for (; i > 0; p++, i--)
+    sum += _asso_values[*p];
+
+  return keyword->_hash_value = sum;
+}
+
+/* Finds good _asso_values[].  */
+
+void
+Search::find_good_asso_values ()
+{
+  prepare_asso_values ();
+
+  /* Search for good _asso_values[].  */
+  int asso_iteration;
+  if ((asso_iteration = option.get_asso_iterations ()) == 0)
+    /* Try only the given _initial_asso_value and _jump.  */
+    find_asso_values ();
+  else
+    {
+      /* Try different pairs of _initial_asso_value and _jump, in the
+         following order:
+           (0, 1)
+           (1, 1)
+           (2, 1) (0, 3)
+           (3, 1) (1, 3)
+           (4, 1) (2, 3) (0, 5)
+           (5, 1) (3, 3) (1, 5)
+           ..... */
+      KeywordExt_List *saved_head = _head;
+      int best_initial_asso_value = 0;
+      int best_jump = 1;
+      int *best_asso_values = new int[_alpha_size];
+      int best_collisions = INT_MAX;
+      int best_max_hash_value = INT_MAX;
+
+      _initial_asso_value = 0; _jump = 1;
+      for (;;)
+        {
+          /* Restore the keyword list in its original order.  */
+          _head = copy_list (saved_head);
+          /* Find good _asso_values[].  */
+          find_asso_values ();
+          /* Test whether it is the best solution so far.  */
+          int collisions = 0;
+          int max_hash_value = INT_MIN;
+          _collision_detector->clear ();
+          for (KeywordExt_List *ptr = _head; ptr; ptr = ptr->rest())
+            {
+              KeywordExt *keyword = ptr->first();
+              int hashcode = compute_hash (keyword);
+              if (max_hash_value < hashcode)
+                max_hash_value = hashcode;
+              if (_collision_detector->set_bit (hashcode))
+                collisions++;
+            }
+          if (collisions < best_collisions
+              || (collisions == best_collisions
+                  && max_hash_value < best_max_hash_value))
+            {
+              memcpy (best_asso_values, _asso_values,
+                      _alpha_size * sizeof (_asso_values[0]));
+              best_collisions = collisions;
+              best_max_hash_value = max_hash_value;
+            }
+          /* Delete the copied keyword list.  */
+          delete_list (_head);
+
+          if (--asso_iteration == 0)
+            break;
+          /* Prepare for next iteration.  */
+          if (_initial_asso_value >= 2)
+            _initial_asso_value -= 2, _jump += 2;
+          else
+            _initial_asso_value += _jump, _jump = 1;
+        }
+      _head = saved_head;
+      /* Install the best found asso_values.  */
+      _initial_asso_value = best_initial_asso_value;
+      _jump = best_jump;
+      memcpy (_asso_values, best_asso_values,
+              _alpha_size * sizeof (_asso_values[0]));
+      delete[] best_asso_values;
+      /* The keywords' _hash_value fields are recomputed below.  */
+    }
+}
+
+/* ========================================================================= */
+
+/* Comparison function for sorting by increasing _hash_value.  */
+static bool
+less_by_hash_value (KeywordExt *keyword1, KeywordExt *keyword2)
+{
+  return keyword1->_hash_value < keyword2->_hash_value;
+}
+
+/* Sorts the keyword list by hash value.  */
+
+void
+Search::sort ()
+{
+  _head = mergesort_list (_head, less_by_hash_value);
+}
+
+void
+Search::optimize ()
+{
+  /* Preparations.  */
+  prepare ();
+
+  /* Step 1: Finding good byte positions.  */
+  find_positions ();
+
+  /* Step 2: Finding good alpha increments.  */
+  find_alpha_inc ();
+
+  /* Step 3: Finding good asso_values.  */
+  find_good_asso_values ();
+
+  /* Make one final check, just to make sure nothing weird happened.... */
+  _collision_detector->clear ();
+  for (KeywordExt_List *curr_ptr = _head; curr_ptr; curr_ptr = curr_ptr->rest())
+    {
+      KeywordExt *curr = curr_ptr->first();
+      unsigned int hashcode = compute_hash (curr);
+      if (_collision_detector->set_bit (hashcode))
+        {
+          /* This shouldn't happen.  proj1, proj2, proj3 must have been
+             computed to be injective on the given keyword set.  */
+          fprintf (stderr,
+                   "\nInternal error, unexpected duplicate hash code\n");
+          if (option[POSITIONS])
+            fprintf (stderr, "try options -m or -r, or use new key positions.\n\n");
+          else
+            fprintf (stderr, "try options -m or -r.\n\n");
+          exit (1);
+        }
+    }
+
+  /* Sorts the keyword list by hash value.  */
+  sort ();
+
+  /* Set unused asso_values[c] to max_hash_value + 1.  This is not absolutely
+     necessary, but speeds up the lookup function in many cases of lookup
+     failure: no string comparison is needed once the hash value of a string
+     is larger than the hash value of any keyword.  */
+  int max_hash_value;
+  {
+    KeywordExt_List *temp;
+    for (temp = _head; temp->rest(); temp = temp->rest())
+      ;
+    max_hash_value = temp->first()->_hash_value;
+  }
+  for (unsigned int c = 0; c < _alpha_size; c++)
+    if (_occurrences[c] == 0)
+      _asso_values[c] = max_hash_value + 1;
+
+  /* Propagate unified asso_values.  */
+  if (_alpha_unify)
+    for (unsigned int c = 0; c < _alpha_size; c++)
+      if (_alpha_unify[c] != c)
+        _asso_values[c] = _asso_values[_alpha_unify[c]];
+}
+
+/* Prints out some diagnostics upon completion.  */
+
+Search::~Search ()
+{
+  delete _collision_detector;
+  if (option[DEBUG])
+    {
+      fprintf (stderr, "\ndumping occurrence and associated values tables\n");
+
+      for (unsigned int i = 0; i < _alpha_size; i++)
+        if (_occurrences[i])
+          fprintf (stderr, "asso_values[%c] = %6d, occurrences[%c] = %6d\n",
+                   i, _asso_values[i], i, _occurrences[i]);
+
+      fprintf (stderr, "end table dumping\n");
+
+      fprintf (stderr, "\nDumping key list information:\ntotal non-static linked keywords = %d"
+               "\ntotal keywords = %d\ntotal duplicates = %d\nmaximum key length = %d\n",
+               _list_len, _total_keys, _total_duplicates, _max_key_len);
+
+      int field_width = _max_selchars_length;
+      fprintf (stderr, "\nList contents are:\n(hash value, key length, index, %*s, keyword):\n",
+               field_width, "selchars");
+      for (KeywordExt_List *ptr = _head; ptr; ptr = ptr->rest())
+        {
+          fprintf (stderr, "%11d,%11d,%6d, ",
+                   ptr->first()->_hash_value, ptr->first()->_allchars_length, ptr->first()->_final_index);
+          if (field_width > ptr->first()->_selchars_length)
+            fprintf (stderr, "%*s", field_width - ptr->first()->_selchars_length, "");
+          for (int j = 0; j < ptr->first()->_selchars_length; j++)
+            putc (ptr->first()->_selchars[j], stderr);
+          fprintf (stderr, ", %.*s\n",
+                   ptr->first()->_allchars_length, ptr->first()->_allchars);
+        }
+
+      fprintf (stderr, "End dumping list.\n\n");
+    }
+  delete[] _asso_values;
+  delete[] _occurrences;
+  delete[] _alpha_unify;
+  delete[] _alpha_inc;
+}
diff --git a/src/search.h b/src/search.h
new file mode 100644 (file)
index 0000000..d9af416
--- /dev/null
@@ -0,0 +1,166 @@
+/* This may look like C code, but it is really -*- C++ -*- */
+
+/* Search algorithm.
+
+   Copyright (C) 1989-1998, 2000, 2002, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef search_h
+#define search_h 1
+
+#include "keyword-list.h"
+#include "positions.h"
+#include "bool-array.h"
+
+struct EquivalenceClass;
+
+class Search
+{
+public:
+                        Search (KeywordExt_List *list);
+                        ~Search ();
+  void                  optimize ();
+private:
+  void                  prepare ();
+
+  /* Computes the upper bound on the indices passed to asso_values[],
+     assuming no alpha_increments.  */
+  unsigned int          compute_alpha_size () const;
+
+  /* Computes the unification rules between different asso_values[c],
+     assuming no alpha_increments.  */
+  unsigned int *        compute_alpha_unify () const;
+
+  /* Initializes each keyword's _selchars array.  */
+  void                  init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify) const;
+  /* Deletes each keyword's _selchars array.  */
+  void                  delete_selchars () const;
+
+  /* Count the duplicate keywords that occur with a given set of positions.  */
+  unsigned int          count_duplicates_tuple (const Positions& positions, const unsigned int *alpha_unify) const;
+
+  /* Find good key positions.  */
+  void                  find_positions ();
+
+  /* Count the duplicate keywords that occur with the found set of positions.  */
+  unsigned int          count_duplicates_tuple () const;
+
+  /* Computes the upper bound on the indices passed to asso_values[].  */
+  unsigned int          compute_alpha_size (const unsigned int *alpha_inc) const;
+
+  /* Computes the unification rules between different asso_values[c].  */
+  unsigned int *        compute_alpha_unify (const Positions& positions, const unsigned int *alpha_inc) const;
+
+  /* Initializes each keyword's _selchars array.  */
+  void                  init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) const;
+
+  /* Count the duplicate keywords that occur with the given set of positions
+     and a given alpha_inc[] array.  */
+  unsigned int          count_duplicates_multiset (const unsigned int *alpha_inc) const;
+
+  /* Find good _alpha_inc[].  */
+  void                  find_alpha_inc ();
+
+  /* Initializes the asso_values[] related parameters.  */
+  void                  prepare_asso_values ();
+
+  EquivalenceClass *    compute_partition (bool *undetermined) const;
+
+  unsigned int          count_possible_collisions (EquivalenceClass *partition, unsigned int c) const;
+
+  bool                  unchanged_partition (EquivalenceClass *partition, unsigned int c) const;
+
+  /* Finds some _asso_values[] that fit.  */
+  void                  find_asso_values ();
+
+  /* Computes a keyword's hash value, relative to the current _asso_values[],
+     and stores it in keyword->_hash_value.  */
+  int                   compute_hash (KeywordExt *keyword) const;
+
+  /* Finds good _asso_values[].  */
+  void                  find_good_asso_values ();
+
+  /* Sorts the keyword list by hash value.  */
+  void                  sort ();
+
+public:
+
+  /* Linked list of keywords.  */
+  KeywordExt_List *     _head;
+
+  /* Total number of keywords, counting duplicates.  */
+  int                   _total_keys;
+
+  /* Maximum length of the longest keyword.  */
+  int                   _max_key_len;
+
+  /* Minimum length of the shortest keyword.  */
+  int                   _min_key_len;
+
+  /* Whether the hash function includes the length.  */
+  bool                  _hash_includes_len;
+
+  /* User-specified or computed key positions.  */
+  Positions             _key_positions;
+
+  /* Adjustments to add to bytes add specific key positions.  */
+  unsigned int *        _alpha_inc;
+
+  /* Size of alphabet.  */
+  unsigned int          _alpha_size;
+
+  /* Alphabet character unification, either the identity or a mapping from
+     upper case characters to lower case characters (and maybe more).  */
+  unsigned int *        _alpha_unify;
+
+  /* Maximum _selchars_length over all keywords.  */
+  unsigned int          _max_selchars_length;
+
+  /* Total number of duplicates that have been moved to _duplicate_link lists
+     (not counting their representatives which stay on the main list).  */
+  int                   _total_duplicates;
+
+  /* Counts occurrences of each key set character.
+     _occurrences[c] is the number of times that c occurs among the _selchars
+     of a keyword.  */
+  int *                 _occurrences;
+  /* Value associated with each character. */
+  int *                 _asso_values;
+
+private:
+
+  /* Length of _head list.  Number of keywords, not counting duplicates.  */
+  int                   _list_len;
+
+  /* Exclusive upper bound for every _asso_values[c].  A power of 2.  */
+  unsigned int          _asso_value_max;
+
+  /* Initial value for asso_values table.  -1 means random.  */
+  int                   _initial_asso_value;
+  /* Jump length when trying alternative values.  0 means random.  */
+  int                   _jump;
+
+  /* Maximal possible hash value.  */
+  int                   _max_hash_value;
+
+  /* Sparse bit vector for collision detection.  */
+  Bool_Array *          _collision_detector;
+};
+
+#endif
diff --git a/src/version.cc b/src/version.cc
new file mode 100644 (file)
index 0000000..1e0a633
--- /dev/null
@@ -0,0 +1,26 @@
+/* Current program version number.
+
+   Copyright (C) 1989-1998, 2000, 2002-2003, 2005, 2007, 2009 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Specification. */
+#include "version.h"
+
+/* Current release version. */
+const char *version_string = "3.0.4";
diff --git a/src/version.h b/src/version.h
new file mode 100644 (file)
index 0000000..f30870a
--- /dev/null
@@ -0,0 +1,23 @@
+/* Current program version number.
+
+   Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc.
+   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+   and Bruno Haible <bruno@clisp.org>.
+
+   This file is part of GNU GPERF.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Current release version. */
+extern const char *version_string;
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644 (file)
index 0000000..25890a6
--- /dev/null
@@ -0,0 +1,341 @@
+# Makefile for gperf/tests
+
+# Copyright (C) 1989, 1992-1993, 1995, 1998, 2000, 2002-2004, 2007-2009 Free Software Foundation, Inc.
+# Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+# and Bruno Haible <bruno@clisp.org>.
+#
+# This file is part of GNU GPERF.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#### Start of system configuration section. ####
+
+# Directories used by "make":
+srcdir = @srcdir@
+
+# Programs used by "make":
+# C compiler
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+# C++ compiler
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CXXCPP = @CXXCPP@
+# Both C and C++ compiler
+LDFLAGS = @LDFLAGS@
+OBJEXT = @OBJEXT@
+EXEEXT = @EXEEXT@
+# Other
+MV = mv
+LN = ln
+RM = rm -f
+@SET_MAKE@
+
+#### End of system configuration section. ####
+
+SHELL = /bin/sh
+
+VPATH = $(srcdir)
+
+GPERF = ../src/gperf
+#GPERF = valgrind --num-callers=20 --leak-check=yes --leak-resolution=high --show-reachable=yes ../src/gperf
+
+all :
+
+install : all
+
+installdirs :
+
+uninstall :
+
+check : check-link-c check-link-c++ check-c check-ada check-modula3 check-pascal check-lang-utf8 check-lang-ucs2 check-smtp check-test
+       @true
+
+extracheck : @CHECK_LANG_SYNTAX@
+       @true
+
+check-link-c: force
+       @echo "performing some tests of the perfect hash generator"
+       $(CC) -c $(CFLAGS) $(srcdir)/test.c
+       $(GPERF) -c -l -S1 -I -o $(srcdir)/c.gperf > cinset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o cout cinset.c test.$(OBJEXT)
+
+check-link-c++: force
+
+check-c:
+       @echo "testing ANSI C reserved words, all items should be found in the set"
+       ./cout -v < $(srcdir)/c.gperf | LC_ALL=C tr -d '\r' > c.out
+       diff $(srcdir)/c.exp c.out
+
+check-ada:
+       $(GPERF) -k1,4,'$$' -I $(srcdir)/ada.gperf > adainset.c
+# double '$$' is only there since make gets confused; program wants only 1 '$'
+       $(CC) $(CFLAGS) $(LDFLAGS) -o aout adainset.c test.$(OBJEXT)
+       @echo "testing Ada reserved words, all items should be found in the set"
+       ./aout -v < $(srcdir)/ada.gperf | LC_ALL=C tr -d '\r' > ada-res.out
+       diff $(srcdir)/ada-res.exp ada-res.out
+       $(GPERF) -D -k1,'$$' -s 2 -I -o $(srcdir)/adadefs.gperf > preinset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o preout preinset.c test.$(OBJEXT)
+       @echo "testing Ada predefined words, all items should be found in the set"
+       ./preout -v < $(srcdir)/adadefs.gperf | LC_ALL=C tr -d '\r' > ada-pred.out
+       diff $(srcdir)/ada-pred.exp ada-pred.out
+
+check-modula3:
+       $(GPERF) -k1,2,'$$' -I -o $(srcdir)/modula3.gperf > m3inset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o m3out m3inset.c test.$(OBJEXT)
+       @echo "testing Modula3 reserved words, all items should be found in the set"
+       ./m3out -v < $(srcdir)/modula3.gperf | LC_ALL=C tr -d '\r' > modula.out
+       diff $(srcdir)/modula.exp modula.out
+
+check-pascal:
+       $(GPERF) -o -S2 -I < $(srcdir)/pascal.gperf > pinset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o pout pinset.c test.$(OBJEXT)
+       @echo "testing Pascal reserved words, all items should be found in the set"
+       ./pout -v < $(srcdir)/pascal.gperf | LC_ALL=C tr -d '\r' > pascal.out
+       diff $(srcdir)/pascal.exp pascal.out
+
+# check for 8-bit cleanliness
+check-lang-utf8:
+       $(GPERF) -k1 -t -I -K foreign_name < $(srcdir)/lang-utf8.gperf > lu8inset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o lu8out lu8inset.c test.$(OBJEXT)
+       @echo "testing UTF-8 encoded languages, all items should be found in the set"
+       sed -e '1,6d' -e 's/,.*//' < $(srcdir)/lang-utf8.gperf | ./lu8out -v | LC_ALL=C tr -d '\r' > lang-utf8.out
+       diff $(srcdir)/lang-utf8.exp lang-utf8.out
+
+# check for binary keywords with NUL bytes
+check-lang-ucs2:
+       $(CC) -c $(CFLAGS) $(srcdir)/test2.c
+       $(GPERF) -k4 -t -l -I -K foreign_name < $(srcdir)/lang-ucs2.gperf > lu2inset.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o lu2out lu2inset.c test2.$(OBJEXT)
+       @echo "testing UCS-2 encoded languages, all items should be found in the set"
+       ./lu2out -v < $(srcdir)/lang-ucs2.in | LC_ALL=C tr -d '\r' > lang-ucs2.out
+       diff $(srcdir)/lang-ucs2.exp lang-ucs2.out
+
+# check case-insensitive lookup
+check-smtp:
+       @echo "testing SMTP keywords, case-insensitive"
+       $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case $(srcdir)/smtp.gperf > smtp.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o smtp smtp.c
+       ./smtp
+       $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case --compare-strncmp $(srcdir)/smtp.gperf > smtp.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o smtp smtp.c
+       ./smtp
+       $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case --compare-lengths $(srcdir)/smtp.gperf > smtp.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -o smtp smtp.c
+       ./smtp
+
+# these next 5 are demos that show off the generated code
+POSTPROCESS_FOR_MINGW = LC_ALL=C tr -d '\r' | sed -e 's|[^ ]*[/\\][\\]*src[/\\][\\]*gperf[^ ]*|../src/gperf|'
+check-test:
+       $(GPERF) -L C -F ', 0, 0' -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,'$$' < $(srcdir)/c-parse.gperf | $(POSTPROCESS_FOR_MINGW) > c-parse.out
+       diff $(srcdir)/c-parse.exp c-parse.out
+       $(GPERF) -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,'$$' < $(srcdir)/objc.gperf | $(POSTPROCESS_FOR_MINGW) > objc.out
+       diff $(srcdir)/objc.exp objc.out
+       $(GPERF) -L C -F ', 0, 0, 0' -D -E -S1 -j1 -i 1 -g -o -t -k'*' < $(srcdir)/chill.gperf | $(POSTPROCESS_FOR_MINGW) > chill.out
+       diff $(srcdir)/chill.exp chill.out
+       $(GPERF) -L C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,7,'$$' < $(srcdir)/cplusplus.gperf | $(POSTPROCESS_FOR_MINGW) > cplusplus.out
+       diff $(srcdir)/cplusplus.exp cplusplus.out
+       $(GPERF) -L C -F ', 0' -t -j1 -i 1 -g -o -N java_keyword -k1,3,'$$' < $(srcdir)/java.gperf | $(POSTPROCESS_FOR_MINGW) > java.out
+       diff $(srcdir)/java.exp java.out
+       $(GPERF) -n -k1-8 -l < $(srcdir)/modula2.gperf | $(POSTPROCESS_FOR_MINGW) > modula2.out
+       diff $(srcdir)/modula2.exp modula2.out
+       $(GPERF) -D -t -k1,'$$' < $(srcdir)/c-parse.gperf | $(POSTPROCESS_FOR_MINGW) > test-4.out
+       diff $(srcdir)/test-4.exp test-4.out
+       $(GPERF) -g -o -j1 -t -N is_reserved_word < $(srcdir)/gpc.gperf | $(POSTPROCESS_FOR_MINGW) > gpc.out
+       diff $(srcdir)/gpc.exp gpc.out
+       $(GPERF) -m5 < $(srcdir)/permut2.gperf | $(POSTPROCESS_FOR_MINGW) > permut2.out
+       diff $(srcdir)/permut2.exp permut2.out
+       $(GPERF) -m5 < $(srcdir)/permut3.gperf | $(POSTPROCESS_FOR_MINGW) > permut3.out
+       diff $(srcdir)/permut3.exp permut3.out
+       $(GPERF) -m5 --ignore-case < $(srcdir)/permutc2.gperf | $(POSTPROCESS_FOR_MINGW) > permutc2.out
+       diff $(srcdir)/permutc2.exp permutc2.out
+       $(GPERF) -C -E -G -I -t < $(srcdir)/charsets.gperf | $(POSTPROCESS_FOR_MINGW) > charsets.out
+       diff $(srcdir)/charsets.exp charsets.out
+       $(GPERF) -C -E -G -I -t < $(srcdir)/languages.gperf | $(POSTPROCESS_FOR_MINGW) > languages.out
+       diff $(srcdir)/languages.exp languages.out
+       $(GPERF) -t < $(srcdir)/incomplete.gperf | $(POSTPROCESS_FOR_MINGW) > incomplete.out
+       diff $(srcdir)/incomplete.exp incomplete.out
+# prints out the help message
+       -$(GPERF) -h | $(POSTPROCESS_FOR_MINGW) > test-6.out
+       diff $(srcdir)/test-6.exp test-6.out
+       @echo "only if, do, for, case, goto, else, while, and return should be found "
+       ./aout -v < $(srcdir)/c.gperf | $(POSTPROCESS_FOR_MINGW) > test-7.out
+       diff $(srcdir)/test-7.exp test-7.out
+
+# The following validates valid language syntax with different parameters.
+# Works only with gcc and g++, and only on platforms where "gcc -ansi" is
+# usable. (There are still platforms where gcc-2.8.0's fixincludes does not
+# work well enough.)
+
+VALIDATE = CC='$(CC)' CFLAGS='$(CFLAGS)' CXX='$(CXX)' CXXFLAGS='$(CXXFLAGS)' GPERF='$(GPERF)' $(srcdir)/validate
+
+check-lang-syntax : force
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 1000
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -P -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -P -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -P -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest1.gperf -P -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 1000
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings -S 10
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -K key_name
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -H hash_function_name
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -W word_list_name
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -l --length-table-name=length_table_name
+       sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -N lookup_function_name
+       sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -Z class_name
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest2.gperf -t -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest2.gperf -t -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -c
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -C
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -E
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -G
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest2.gperf -t -S 10 -D
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k2   $(srcdir)/jstest2.gperf -t -S 10 -D -l
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 1000
+       sed -e 's,name,key_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -K key_name
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -H hash_function_name
+       sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -N lookup_function_name
+       sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
+       $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -Z class_name
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -c
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest3.gperf -t -D
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest3.gperf -t -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -c
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -G
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest3.gperf -t -S 10 -D
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest3.gperf -t -S 10 -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 1000
+       sed -e 's,name,key_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -K key_name
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -H hash_function_name
+       sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -N lookup_function_name
+       sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -Z class_name
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -c
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest4.gperf -t -P -D
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest4.gperf -t -P -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -c
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -C
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -E
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -G
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest4.gperf -t -P -S 10 -D
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k2   $(srcdir)/jstest4.gperf -t -P -S 10 -D -l
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 1000
+       sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings
+       sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \
+       $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings -S 10
+
+mostlyclean : clean
+
+clean : force
+       $(RM) *.$(OBJEXT) core *inset.c output.* *.out aout$(EXEEXT) cout$(EXEEXT) lu2out$(EXEEXT) lu8out$(EXEEXT) m3out$(EXEEXT) pout$(EXEEXT) preout$(EXEEXT) smtp.c smtp$(EXEEXT) tmp-* valitest*
+       $(RM) -r *.dSYM
+
+distclean : clean
+       $(RM) config.status config.log config.cache Makefile
+
+maintainer-clean : distclean
+
+force :
+
diff --git a/tests/ada-pred.exp b/tests/ada-pred.exp
new file mode 100644 (file)
index 0000000..33caaa3
--- /dev/null
@@ -0,0 +1,54 @@
+in word set boolean
+in word set character
+in word set constraint_error
+in word set false
+in word set float
+in word set integer
+in word set natural
+in word set numeric_error
+in word set positive
+in word set program_error
+in word set storage_error
+in word set string
+in word set tasking_error
+in word set true
+in word set address
+in word set aft
+in word set base
+in word set callable
+in word set constrained
+in word set count
+in word set delta
+in word set digits
+in word set emax
+in word set epsilon
+in word set first
+in word set firstbit
+in word set fore
+in word set image
+in word set large
+in word set last
+in word set lastbit
+in word set length
+in word set machine_emax
+in word set machine_emin
+in word set machine_mantissa
+in word set machine_overflows
+in word set machine_radix
+in word set machine_rounds
+in word set mantissa
+in word set pos
+in word set position
+in word set pred
+in word set range
+in word set safe_emax
+in word set safe_large
+in word set safe_small
+in word set size
+in word set small
+in word set storage_size
+in word set succ
+in word set terminated
+in word set val
+in word set value
+in word set width
diff --git a/tests/ada-res.exp b/tests/ada-res.exp
new file mode 100644 (file)
index 0000000..8134fe8
--- /dev/null
@@ -0,0 +1,63 @@
+in word set else
+in word set exit
+in word set terminate
+in word set type
+in word set raise
+in word set range
+in word set reverse
+in word set declare
+in word set end
+in word set record
+in word set exception
+in word set not
+in word set then
+in word set return
+in word set separate
+in word set select
+in word set digits
+in word set renames
+in word set subtype
+in word set elsif
+in word set function
+in word set for
+in word set package
+in word set procedure
+in word set private
+in word set while
+in word set when
+in word set new
+in word set entry
+in word set delay
+in word set case
+in word set constant
+in word set at
+in word set abort
+in word set accept
+in word set and
+in word set delta
+in word set access
+in word set abs
+in word set pragma
+in word set array
+in word set use
+in word set out
+in word set do
+in word set others
+in word set of
+in word set or
+in word set all
+in word set limited
+in word set loop
+in word set null
+in word set task
+in word set in
+in word set is
+in word set if
+in word set rem
+in word set mod
+in word set begin
+in word set body
+in word set xor
+in word set goto
+in word set generic
+in word set with
diff --git a/tests/ada.gperf b/tests/ada.gperf
new file mode 100644 (file)
index 0000000..332bdc7
--- /dev/null
@@ -0,0 +1,63 @@
+else
+exit
+terminate
+type
+raise
+range
+reverse
+declare
+end
+record
+exception
+not
+then
+return
+separate
+select
+digits
+renames
+subtype
+elsif
+function
+for
+package
+procedure
+private
+while
+when
+new
+entry
+delay
+case
+constant
+at
+abort
+accept
+and
+delta
+access
+abs
+pragma
+array
+use
+out
+do
+others
+of
+or
+all
+limited
+loop
+null
+task
+in
+is
+if
+rem
+mod
+begin
+body
+xor
+goto
+generic
+with
diff --git a/tests/adadefs.gperf b/tests/adadefs.gperf
new file mode 100644 (file)
index 0000000..875be69
--- /dev/null
@@ -0,0 +1,54 @@
+boolean
+character
+constraint_error
+false
+float
+integer
+natural
+numeric_error
+positive
+program_error
+storage_error
+string
+tasking_error
+true
+address
+aft
+base
+callable
+constrained
+count
+delta
+digits
+emax
+epsilon
+first
+firstbit
+fore
+image
+large
+last
+lastbit
+length
+machine_emax
+machine_emin
+machine_mantissa
+machine_overflows
+machine_radix
+machine_rounds
+mantissa
+pos
+position
+pred
+range
+safe_emax
+safe_large
+safe_small
+size
+small
+storage_size
+succ
+terminated
+val
+value
+width
diff --git a/tests/c++.gperf b/tests/c++.gperf
new file mode 100644 (file)
index 0000000..650d32d
--- /dev/null
@@ -0,0 +1,47 @@
+asm
+auto
+break
+case
+catch
+char
+class
+const
+continue
+default
+delete
+do
+double
+else
+enum
+extern
+float
+for
+friend
+goto
+if
+inline
+int
+long
+new
+operator
+overload
+private
+protected
+public
+register
+return
+short
+signed
+sizeof
+static
+struct
+switch
+template
+this
+typedef
+union
+unsigned
+virtual
+void
+volatile
+while
diff --git a/tests/c-parse.exp b/tests/c-parse.exp
new file mode 100644 (file)
index 0000000..260589b
--- /dev/null
@@ -0,0 +1,224 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -L C -F ', 0, 0' -j1 -i 1 -g -o -t -G -N is_reserved_word -k'1,3,$'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf  */ 
+struct resword { const char *name; short token; enum rid rid; };
+
+#define TOTAL_KEYWORDS 83
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 20
+#define MIN_HASH_VALUE 12
+#define MAX_HASH_VALUE 125
+/* maximum key range = 114, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126,  19, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126,   1, 126,  12,  50,  17,
+       22,  18,  51,  37,   5,  10, 126,  15,  35,  49,
+       27,  40,  28, 126,   2,  20,   1,  33,  64,   7,
+       11,   4,   7, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+      126, 126, 126, 126, 126, 126
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+static struct resword wordlist[] =
+  {
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"__real__", REALPART, NORID},
+    {"__typeof__", TYPEOF, NORID},
+    {"__restrict", TYPE_QUAL, RID_RESTRICT},
+    {"int", TYPESPEC, RID_INT},
+    {"__restrict__", TYPE_QUAL, RID_RESTRICT},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"__imag__", IMAGPART, NORID},
+    {"__asm__", ASM_KEYWORD, NORID},
+    {"__inline__", SCSPEC, RID_INLINE},
+    {"__iterator", SCSPEC, RID_ITERATOR},
+    {"__iterator__", SCSPEC, RID_ITERATOR},
+    {"__alignof__", ALIGNOF, NORID},
+    {"__const", TYPE_QUAL, RID_CONST},
+    {"__attribute__", ATTRIBUTE, NORID},
+    {"__const__", TYPE_QUAL, RID_CONST},
+    {"struct", STRUCT, NORID},
+    {"__complex__", TYPESPEC, RID_COMPLEX},
+    {"restrict", TYPE_QUAL, RID_RESTRICT},
+    {"__signed__", TYPESPEC, RID_SIGNED},
+    {"__extension__", EXTENSION, NORID},
+    {"id", OBJECTNAME, RID_ID},
+    {"char", TYPESPEC, RID_CHAR},
+    {"return", RETURN, NORID},
+    {"__inline", SCSPEC, RID_INLINE},
+    {"__complex", TYPESPEC, RID_COMPLEX},
+    {"in", TYPE_QUAL, RID_IN},
+    {"while", WHILE, NORID},
+    {"switch", SWITCH, NORID},
+    {"__attribute", ATTRIBUTE, NORID},
+    {"", 0, 0},
+    {"__real", REALPART, NORID},
+    {"out", TYPE_QUAL, RID_OUT},
+    {"__label__", LABEL, NORID},
+    {"@private", PRIVATE, NORID},
+    {"@selector", SELECTOR, NORID},
+    {"register", SCSPEC, RID_REGISTER},
+    {"const", TYPE_QUAL, RID_CONST},
+    {"__signed", TYPESPEC, RID_SIGNED},
+    {"extern", SCSPEC, RID_EXTERN},
+    {"@protected", PROTECTED, NORID},
+    {"__imag", IMAGPART, NORID},
+    {"static", SCSPEC, RID_STATIC},
+    {"inout", TYPE_QUAL, RID_INOUT},
+    {"auto", SCSPEC, RID_AUTO},
+    {"for", FOR, NORID},
+    {"case", CASE, NORID},
+    {"else", ELSE, NORID},
+    {"__typeof", TYPEOF, NORID},
+    {"@defs", DEFS, NORID},
+    {"if", IF, NORID},
+    {"do", DO, NORID},
+    {"@protocol", PROTOCOL, NORID},
+    {"short", TYPESPEC, RID_SHORT},
+    {"__asm", ASM_KEYWORD, NORID},
+    {"oneway", TYPE_QUAL, RID_ONEWAY},
+    {"inline", SCSPEC, RID_INLINE},
+    {"continue", CONTINUE, NORID},
+    {"@encode", ENCODE, NORID},
+    {"@end", END, NORID},
+    {"__alignof", ALIGNOF, NORID},
+    {"@interface", INTERFACE, NORID},
+    {"union", UNION, NORID},
+    {"@public", PUBLIC, NORID},
+    {"bycopy", TYPE_QUAL, RID_BYCOPY},
+    {"__volatile__", TYPE_QUAL, RID_VOLATILE},
+    {"double", TYPESPEC, RID_DOUBLE},
+    {"@class", CLASS, NORID},
+    {"default", DEFAULT, NORID},
+    {"goto", GOTO, NORID},
+    {"unsigned", TYPESPEC, RID_UNSIGNED},
+    {"sizeof", SIZEOF, NORID},
+    {"signed", TYPESPEC, RID_SIGNED},
+    {"typeof", TYPEOF, NORID},
+    {"typedef", SCSPEC, RID_TYPEDEF},
+    {"break", BREAK, NORID},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"__volatile", TYPE_QUAL, RID_VOLATILE},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"float", TYPESPEC, RID_FLOAT},
+    {"", 0, 0},
+    {"@compatibility_alias", ALIAS, NORID},
+    {"void", TYPESPEC, RID_VOID},
+    {"", 0, 0}, {"", 0, 0},
+    {"long", TYPESPEC, RID_LONG},
+    {"enum", ENUM, NORID},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"byref", TYPE_QUAL, RID_BYREF},
+    {"", 0, 0},
+    {"@implementation", IMPLEMENTATION, NORID},
+    {"", 0, 0}, {"", 0, 0},
+    {"asm", ASM_KEYWORD, NORID},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+    {"volatile", TYPE_QUAL, RID_VOLATILE}
+  };
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+is_reserved_word (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/c-parse.gperf b/tests/c-parse.gperf
new file mode 100644 (file)
index 0000000..efedfb9
--- /dev/null
@@ -0,0 +1,88 @@
+%{
+/* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf  */ 
+%}
+struct resword { const char *name; short token; enum rid rid; };
+%%
+@class, CLASS, NORID
+@compatibility_alias, ALIAS, NORID
+@defs, DEFS, NORID
+@encode, ENCODE, NORID
+@end, END, NORID
+@implementation, IMPLEMENTATION, NORID
+@interface, INTERFACE, NORID
+@private, PRIVATE, NORID
+@protected, PROTECTED, NORID
+@protocol, PROTOCOL, NORID
+@public, PUBLIC, NORID
+@selector, SELECTOR, NORID
+__alignof, ALIGNOF, NORID
+__alignof__, ALIGNOF, NORID
+__asm, ASM_KEYWORD, NORID
+__asm__, ASM_KEYWORD, NORID
+__attribute, ATTRIBUTE, NORID
+__attribute__, ATTRIBUTE, NORID
+__complex, TYPESPEC, RID_COMPLEX
+__complex__, TYPESPEC, RID_COMPLEX
+__const, TYPE_QUAL, RID_CONST
+__const__, TYPE_QUAL, RID_CONST
+__extension__, EXTENSION, NORID
+__imag, IMAGPART, NORID
+__imag__, IMAGPART, NORID
+__inline, SCSPEC, RID_INLINE
+__inline__, SCSPEC, RID_INLINE
+__iterator, SCSPEC, RID_ITERATOR
+__iterator__, SCSPEC, RID_ITERATOR
+__label__, LABEL, NORID
+__real, REALPART, NORID
+__real__, REALPART, NORID
+__restrict, TYPE_QUAL, RID_RESTRICT
+__restrict__, TYPE_QUAL, RID_RESTRICT
+__signed, TYPESPEC, RID_SIGNED
+__signed__, TYPESPEC, RID_SIGNED
+__typeof, TYPEOF, NORID
+__typeof__, TYPEOF, NORID
+__volatile, TYPE_QUAL, RID_VOLATILE
+__volatile__, TYPE_QUAL, RID_VOLATILE
+asm, ASM_KEYWORD, NORID
+auto, SCSPEC, RID_AUTO
+break, BREAK, NORID
+bycopy, TYPE_QUAL, RID_BYCOPY
+byref, TYPE_QUAL, RID_BYREF
+case, CASE, NORID
+char, TYPESPEC, RID_CHAR
+const, TYPE_QUAL, RID_CONST
+continue, CONTINUE, NORID
+default, DEFAULT, NORID
+do, DO, NORID
+double, TYPESPEC, RID_DOUBLE
+else, ELSE, NORID
+enum, ENUM, NORID
+extern, SCSPEC, RID_EXTERN
+float, TYPESPEC, RID_FLOAT
+for, FOR, NORID
+goto, GOTO, NORID
+id, OBJECTNAME, RID_ID
+if, IF, NORID
+in, TYPE_QUAL, RID_IN
+inout, TYPE_QUAL, RID_INOUT
+inline, SCSPEC, RID_INLINE
+int, TYPESPEC, RID_INT
+long, TYPESPEC, RID_LONG
+oneway, TYPE_QUAL, RID_ONEWAY
+out, TYPE_QUAL, RID_OUT
+register, SCSPEC, RID_REGISTER
+restrict, TYPE_QUAL, RID_RESTRICT
+return, RETURN, NORID
+short, TYPESPEC, RID_SHORT
+signed, TYPESPEC, RID_SIGNED
+sizeof, SIZEOF, NORID
+static, SCSPEC, RID_STATIC
+struct, STRUCT, NORID
+switch, SWITCH, NORID
+typedef, SCSPEC, RID_TYPEDEF
+typeof, TYPEOF, NORID
+union, UNION, NORID
+unsigned, TYPESPEC, RID_UNSIGNED
+void, TYPESPEC, RID_VOID
+volatile, TYPE_QUAL, RID_VOLATILE
+while, WHILE, NORID
diff --git a/tests/c.exp b/tests/c.exp
new file mode 100644 (file)
index 0000000..10c8b7f
--- /dev/null
@@ -0,0 +1,32 @@
+in word set if
+in word set do
+in word set int
+in word set for
+in word set case
+in word set char
+in word set auto
+in word set goto
+in word set else
+in word set long
+in word set void
+in word set enum
+in word set float
+in word set short
+in word set union
+in word set break
+in word set while
+in word set const
+in word set double
+in word set static
+in word set extern
+in word set struct
+in word set return
+in word set sizeof
+in word set switch
+in word set signed
+in word set typedef
+in word set default
+in word set unsigned
+in word set continue
+in word set register
+in word set volatile
diff --git a/tests/c.gperf b/tests/c.gperf
new file mode 100644 (file)
index 0000000..8672d6c
--- /dev/null
@@ -0,0 +1,32 @@
+if
+do
+int
+for
+case
+char
+auto
+goto
+else
+long
+void
+enum
+float
+short
+union
+break
+while
+const
+double
+static
+extern
+struct
+return
+sizeof
+switch
+signed
+typedef
+default
+unsigned
+continue
+register
+volatile
diff --git a/tests/charsets.exp b/tests/charsets.exp
new file mode 100644 (file)
index 0000000..9256f89
--- /dev/null
@@ -0,0 +1,1831 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -C -E -G -I -t  */
+/* Computed positions: -k'1-11,22,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Generated from IANA charset data from http://www.iana.org/assignments/character-sets by charsets.awk */
+/* last updated 2002-06-14 */
+/* process with:
+       gperf -CDEGTlot -H charset_hash -K name -L ANSI-C -N charset_entry
+*/
+struct charset { const char *name; /* name or alias */ int mib; /* MIBenum for name, -1 * MIBenum for alias */ };
+#include <string.h>
+enum
+  {
+    TOTAL_KEYWORDS = 790,
+    MIN_WORD_LENGTH = 2,
+    MAX_WORD_LENGTH = 45,
+    MIN_HASH_VALUE = 29,
+    MAX_HASH_VALUE = 5045
+  };
+
+/* maximum key range = 5017, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static const unsigned short asso_values[] =
+    {
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046,    0, 5046, 5046, 5046,    0,  930,   70,   90,   20,
+        15,  500,   40,    5,    0,  120,   85,  300,  906, 1334,
+       140, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046,  515,    0,  190,  210,   15,
+       175,   15,  415,  330,  775,    0,   70,  795,  155,   10,
+       545,    0,  750,  205,    5,   75,    5,  510,  963,  745,
+       845,   15,   80,    0,    0, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046,
+      5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[21]];
+      /*FALLTHROUGH*/
+      case 21:
+      case 20:
+      case 19:
+      case 18:
+      case 17:
+      case 16:
+      case 15:
+      case 14:
+      case 13:
+      case 12:
+      case 11:
+        hval += asso_values[(unsigned char)str[10]+1];
+      /*FALLTHROUGH*/
+      case 10:
+        hval += asso_values[(unsigned char)str[9]];
+      /*FALLTHROUGH*/
+      case 9:
+        hval += asso_values[(unsigned char)str[8]+1];
+      /*FALLTHROUGH*/
+      case 8:
+        hval += asso_values[(unsigned char)str[7]+3];
+      /*FALLTHROUGH*/
+      case 7:
+        hval += asso_values[(unsigned char)str[6]];
+      /*FALLTHROUGH*/
+      case 6:
+        hval += asso_values[(unsigned char)str[5]];
+      /*FALLTHROUGH*/
+      case 5:
+        hval += asso_values[(unsigned char)str[4]];
+      /*FALLTHROUGH*/
+      case 4:
+        hval += asso_values[(unsigned char)str[3]];
+      /*FALLTHROUGH*/
+      case 3:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+        hval += asso_values[(unsigned char)str[1]+1];
+      /*FALLTHROUGH*/
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+static const struct charset wordlist[] =
+  {
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"iso-ir-25",      -46},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-2",       -30},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"mnem",   2081},
+    {""}, {""}, {""},
+    {"es2",    61},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-21",      -24},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-15",      -22},
+    {"iso-ir-146",     -89},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-155",     -96},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso-ir-152",     -93},
+    {""}, {""}, {""},
+    {"iso-ir-11",      -21},
+    {"iso-ir-142",     -14},
+    {""},
+    {"es",     23},
+    {"855",    -2046},
+    {""},
+    {"iso-ir-151",     -92},
+    {""}, {""}, {""},
+    {"iso-ir-14",      -42},
+    {"iso-ir-141",     -87},
+    {""}, {""}, {""},
+    {"iso-ir-55",      -55},
+    {"iso-ir-102",     -75},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-111",     -77},
+    {"ibm866", 2086},
+    {""},
+    {"852",    -2010},
+    {"t.61",   -76},
+    {"iso-ir-101",     -5},
+    {""}, {""}, {""},
+    {"iso646-fi",      -35},
+    {""},
+    {"ibm865", 2052},
+    {""},
+    {"851",    -2045},
+    {""}, {""},
+    {"ibm855", 2046},
+    {""}, {""},
+    {"iso646-fr",      -26},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-51",      -53},
+    {"iso-ir-154",     -95},
+    {"ibm285", 2038},
+    {""}, {""}, {""},
+    {"iso-ir-144",     -8},
+    {"ibm862", 2013},
+    {""}, {""},
+    {"iso-ir-54",      -54},
+    {""},
+    {"ibm852", 2010},
+    {"js",     -87},
+    {""},
+    {"inis",   51},
+    {""},
+    {"ibm861", 2049},
+    {"ibm1026",        2063},
+    {""}, {""}, {""},
+    {"ibm851", 2045},
+    {"l5",     -12},
+    {""},
+    {"iso-ir-95",      -71},
+    {""},
+    {"ibm424", 2043},
+    {""}, {""},
+    {"iso-ir-10",      -35},
+    {"iso646-fr1",     -46},
+    {"ibm281", 2036},
+    {""}, {""}, {""}, {""},
+    {"ibm275", 2032},
+    {""},
+    {"iso-ir-4",       -20},
+    {"iso-ir-16",      -43},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"l1",     -4},
+    {""},
+    {"iso-ir-91",      -67},
+    {""},
+    {"ibm864", 2051},
+    {""}, {""}, {""}, {""}, {""},
+    {"l4",     -7},
+    {""},
+    {"iso-ir-94",      -70},
+    {""}, {""}, {""},
+    {"866",    -2086},
+    {""}, {""},
+    {"ibm284", 2037},
+    {""}, {""},
+    {"iso-ir-50",      -52},
+    {"ascii",  -3},
+    {""}, {""},
+    {"865",    -2052},
+    {""}, {""}, {""}, {""},
+    {"ibm01142",       2093},
+    {"iso-ir-37",      -48},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-27",      -47},
+    {"iso-ir-158",     -97},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-148",     -12},
+    {""}, {""},
+    {"862",    -2013},
+    {""},
+    {"iso-ir-150",     -91},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm274", 2031},
+    {""},
+    {"861",    -2049},
+    {""}, {""},
+    {"inis-8", 52},
+    {""},
+    {"mac",    -2027},
+    {""},
+    {"iso-ir-110",     -7},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-100",     -4},
+    {""}, {""},
+    {"ibm01141",       2092},
+    {"iso-ir-17",      -23},
+    {""},
+    {"ibm420", 2041},
+    {""},
+    {"850",    -2009},
+    {"iso-ir-90",      66},
+    {"iso-ir-138",     -11},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm871", 2056},
+    {"l6",     -13},
+    {""},
+    {"iso-ir-96",      -72},
+    {""},
+    {"ibm775", 2087},
+    {""}, {""}, {""}, {""},
+    {"ibm868", 2053},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ibm01145",       2096},
+    {""}, {""},
+    {"ibm860", 2048},
+    {""}, {""}, {""},
+    {"iso-ir-157",     -13},
+    {"ibm850", 2009},
+    {""}, {""}, {""},
+    {"iso-ir-147",     -90},
+    {"ibm500", 2044},
+    {"csascii",        -3},
+    {""},
+    {"iso-ir-57",      -56},
+    {"cp866",  -2086},
+    {"ibm280", 2035},
+    {""}, {""},
+    {"csiso51iniscyrillic",    -53},
+    {""}, {""}, {""},
+    {"iso-ir-6",       -3},
+    {""},
+    {"cp865",  -2052},
+    {""}, {""},
+    {"437",    -2011},
+    {"ebcdic-fr",      2071},
+    {"cp855",  -2046},
+    {""}, {""},
+    {"857",    -2047},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"cp285",  -2038},
+    {"ibm278", 2034},
+    {"ebcdic-fi-se",   2069},
+    {""},
+    {"ebcdic-br",      -2032},
+    {"cp862",  -2013},
+    {""}, {""}, {""},
+    {"iso-ir-47",      -50},
+    {"cp852",  -2010},
+    {""}, {""}, {""},
+    {"iso646-gb",      -20},
+    {"cp861",  -2049},
+    {"cp1026", -2063},
+    {"tis-620",        2259},
+    {""},
+    {"iso-ir-61",      -58},
+    {"cp851",  -2045},
+    {""},
+    {"csiso5427cyrillic",      -48},
+    {""}, {""},
+    {"cp424",  -2043},
+    {"ibm857", 2047},
+    {""},
+    {"ibm01144",       2095},
+    {"iso-10646",      -1003},
+    {"cp281",  -2036},
+    {"csa7-2", -79},
+    {""}, {""}, {""},
+    {"cp275",  -2032},
+    {""}, {""}, {""}, {""},
+    {"cp-is",  -2049},
+    {"csa7-1", -78},
+    {""}, {""}, {""}, {""},
+    {"ibm880", 2057},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"860",    -2048},
+    {""},
+    {"cp864",  -2051},
+    {""},
+    {"r8",     -2004},
+    {"csibm861",       -2049},
+    {""}, {""}, {""},
+    {"cp01146",        -2097},
+    {"csibm851",       -2045},
+    {""}, {""}, {""}, {""},
+    {"904",    -2060},
+    {""},
+    {"cp284",  -2037},
+    {"ibm277", 2033},
+    {"cp01145",        -2096},
+    {"csibm281",       -2036},
+    {""},
+    {"ebcdic-int",     -2029},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm870", 2055},
+    {"ca",     -78},
+    {""}, {""}, {""}, {""}, {""},
+    {"csibm865",       -2052},
+    {""},
+    {"cp-ar",  -2053},
+    {""},
+    {"cp01142",        -2093},
+    {"csibm855",       -2046},
+    {"iso-ir-60",      -25},
+    {"csiso58gb231280",        -57},
+    {"ibm905", 2061},
+    {""}, {""}, {""}, {""}, {""},
+    {"cp01141",        -2092},
+    {"csibm285",       -2038},
+    {""},
+    {"cp274",  -2031},
+    {""}, {""}, {""},
+    {"iso-ir-18",      -44},
+    {""}, {""},
+    {"csiso50inis8",   -52},
+    {""}, {""},
+    {"csiso143iecp271",        -88},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm891", 2058},
+    {""}, {""}, {""},
+    {"cp420",  -2041},
+    {""}, {""},
+    {"csibm424",       -2043},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"cp871",  -2056},
+    {""}, {""},
+    {"csibm275",       -2032},
+    {""},
+    {"cp775",  -2087},
+    {""},
+    {"cp01144",        -2095},
+    {""}, {""},
+    {"cp868",  -2053},
+    {""}, {""}, {""},
+    {"csibm1026",      -2063},
+    {""}, {""},
+    {"fi",     -35},
+    {""},
+    {"iso-ir-58",      -57},
+    {"cp860",  -2048},
+    {""}, {""},
+    {"csibm864",       -2051},
+    {""},
+    {"cp850",  -2009},
+    {""},
+    {"fr",     -26},
+    {""}, {""},
+    {"cp500",  -2044},
+    {"ibm904", 2060},
+    {"csiso14jisc6220ro",      -42},
+    {"ibm01146",       2097},
+    {""},
+    {"cp280",  -2035},
+    {""},
+    {"se",     -35},
+    {"csibm284",       -2037},
+    {""}, {""}, {""}, {""},
+    {"csibm871",       -2056},
+    {"ebcdic-fi-se-a", 2070},
+    {""}, {""},
+    {"it",     22},
+    {""}, {""}, {""},
+    {"ibm918", 2062},
+    {""},
+    {"se2",    -21},
+    {""}, {""},
+    {"ibm290", 2039},
+    {""},
+    {"jp-ocr-b",       -68},
+    {""},
+    {"cp278",  -2034},
+    {""},
+    {"csiso122canadian2",      -79},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-latin9--euro",    -2090},
+    {""}, {""},
+    {"l8",     -110},
+    {"csibm274",       -2031},
+    {"iso-ir-98",      -73},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso27latingreek1",     -47},
+    {""},
+    {"cp857",  -2047},
+    {""},
+    {"gb",     -20},
+    {""}, {""},
+    {"iso-ir-126",     -10},
+    {""},
+    {"cn",     -56},
+    {"t.101-g2",       83},
+    {""},
+    {"cp-gr",  -2054},
+    {""},
+    {"cp01148",        -2099},
+    {""}, {""},
+    {"csiso87jisx0208",        -63},
+    {""},
+    {"csiso121canadian1",      -78},
+    {""}, {""},
+    {"cp880",  -2057},
+    {"csbig5", -2026},
+    {"cp01140",        -2091},
+    {""}, {""}, {""}, {""},
+    {"csiso90",        -66},
+    {""},
+    {"csiso42jisc62261978",    -49},
+    {""},
+    {"ibm297", 2040},
+    {""}, {""}, {""},
+    {"iso-ir-122",     -79},
+    {""},
+    {"us",     -3},
+    {""}, {""}, {""}, {""}, {""},
+    {"ecma-114",       -9},
+    {"iso-ir-13",      -41},
+    {"iso-ir-121",     -78},
+    {""}, {""}, {""}, {""},
+    {"ccsid01146",     -2097},
+    {""},
+    {"de",     -24},
+    {""}, {""},
+    {"cp870",  -2055},
+    {""}, {""}, {""}, {""},
+    {"ccsid01145",     -2096},
+    {"csmnem", -2081},
+    {""}, {""}, {""}, {""}, {""},
+    {"csiso123csaz24341985gr", -80},
+    {"dec",    -2008},
+    {"big5",   2026},
+    {"cp905",  -2061},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csibm866",       -2086},
+    {""},
+    {"ccsid01142",     -2093},
+    {""},
+    {"cp01147",        -2098},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm01149",       2100},
+    {"iso646-pt",      -43},
+    {"ccsid01141",     -2092},
+    {""}, {""}, {""}, {""},
+    {"cp891",  -2058},
+    {""}, {""}, {""},
+    {"iso-ir-42",      -49},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-159",     -98},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-149",     -36},
+    {""},
+    {"cp00858",        -2089},
+    {"jp-ocr-a",       -67},
+    {""},
+    {"iso646-pt2",     -60},
+    {""},
+    {"l2",     -5},
+    {""},
+    {"iso-ir-92",      -68},
+    {""}, {""}, {""}, {""},
+    {"iso646-kr",      -102},
+    {"iso-ir-109",     -6},
+    {"csiso49inis",    -51},
+    {""}, {""}, {""},
+    {"ccsid01144",     -2095},
+    {""},
+    {"chinese",        -57},
+    {"ibm00924",       2090},
+    {"ebcdic-be",      -2031},
+    {""}, {""}, {""},
+    {"csibm891",       -2058},
+    {""},
+    {"cp904",  -2060},
+    {""},
+    {"l3",     -6},
+    {""},
+    {"iso-ir-93",      -69},
+    {"iso-ir-139",     -86},
+    {"arabic", -9},
+    {""},
+    {"ibm01143",       2094},
+    {""}, {""},
+    {"csucs4", -1001},
+    {""}, {""}, {""},
+    {"iso646-ca2",     -79},
+    {""}, {""},
+    {"ebcdic-is-871+euro",     -2100},
+    {""},
+    {"cp918",  -2062},
+    {"ibm869", 2054},
+    {""},
+    {"csiso150",       -91},
+    {""},
+    {"cp290",  -2039},
+    {""}, {""}, {""},
+    {"iso646-it",      -22},
+    {""}, {""}, {""},
+    {"csibm905",       -2061},
+    {""},
+    {"iso-ir-128",     -83},
+    {""},
+    {"ebcdic-dk-no",   2067},
+    {""}, {""}, {""},
+    {"ibm819", -4},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"csiso2033",      -73},
+    {"csiso103t618bit",        -76},
+    {""}, {""}, {""}, {""},
+    {"csiso102t617bit",        -75},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ibm367", -3},
+    {""},
+    {"csibm869",       -2054},
+    {""},
+    {"ccsid01148",     -2099},
+    {""}, {""}, {""}, {""},
+    {"cp297",  -2040},
+    {""}, {""}, {""}, {""},
+    {"ccsid01140",     -2091},
+    {""},
+    {"dec-mcs",        2008},
+    {""}, {""}, {""},
+    {"ibm038", 2029},
+    {""},
+    {"ibm01140",       2091},
+    {"iso5427cyrillic1981",    -54},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-127",     -9},
+    {""},
+    {"cp00924",        -2090},
+    {"csibm423",       -2042},
+    {""}, {""}, {""}, {""},
+    {"869",    -2054},
+    {"ebcdic-jp-kana", -2039},
+    {""},
+    {"ibm437", 2011},
+    {""}, {""},
+    {"iso646-de",      -24},
+    {""}, {""},
+    {"jis_c6220-1969-ro",      42},
+    {""}, {""},
+    {"ms936",  -113},
+    {""}, {""},
+    {"ebcdic-fi-278+euro",     -2094},
+    {""}, {""}, {""}, {""},
+    {"ebcdic-fr-297+euro",     -2098},
+    {""}, {""}, {""}, {""},
+    {"csibm863",       -2050},
+    {"ebcdic-pt",      2073},
+    {"ebcdic-cyrillic",        -2057},
+    {""}, {""},
+    {"ebcdic-gb-285+euro",     -2097},
+    {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-international-500+euro",  -2099},
+    {"ccsid01147",     -2098},
+    {""}, {""},
+    {"cyrillic",       -8},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"ibm037", 2028},
+    {""}, {""}, {""},
+    {"iso646-es2",     -61},
+    {"unicode-1-1",    1010},
+    {"ebcdic-cp-no",   -2033},
+    {""},
+    {"iso646-ca",      -78},
+    {""}, {""},
+    {"csiso6937add",   -93},
+    {""}, {""}, {""}, {""}, {""},
+    {"inis-cyrillic",  53},
+    {""}, {""}, {""},
+    {"ebcdic-cp-he",   -2043},
+    {"csibm273",       -2030},
+    {""}, {""}, {""},
+    {"ebcdic-cp-se",   -2034},
+    {""}, {""}, {""},
+    {"ebcdic-jp-e",    -2036},
+    {""},
+    {"csibm420",       -2041},
+    {""}, {""}, {""},
+    {"ebcdic-cp-be",   -2044},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"iso646-es",      -23},
+    {"cp869",  -2054},
+    {""}, {""}, {""},
+    {"ebcdic-it",      2072},
+    {"csmnemonic",     -2080},
+    {"gb2312", 2025},
+    {"cskoi8r",        -2084},
+    {""}, {""}, {""},
+    {"latin6", -13},
+    {""},
+    {"csibm860",       -2048},
+    {"ebcdic-dk-no-a", 2068},
+    {""}, {""},
+    {"arabic7",        -65},
+    {""}, {""},
+    {"cp819",  -4},
+    {"latin5", -12},
+    {""},
+    {"csibm500",       -2044},
+    {""},
+    {"x0212",  -98},
+    {""}, {""},
+    {"csibm280",       -2035},
+    {""},
+    {"csebcdicit",     -2072},
+    {""},
+    {"ebcdic-cp-it",   -2035},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"latin2", -5},
+    {""}, {""},
+    {"e13b",   -73},
+    {"csiso91jisc62291984a",   -67},
+    {""}, {""},
+    {"us-ascii",       -3},
+    {"csiso153gost1976874",    -94},
+    {"ebcdic-cp-roece",        -2055},
+    {"latin1", -4},
+    {"ebcdic-at-de",   2064},
+    {""}, {""},
+    {"cp367",  -3},
+    {"csiso18greek7old",       -44},
+    {""}, {""}, {""},
+    {"csiso92jisc62991984b",   -68},
+    {""},
+    {"unicode-1-1-utf-7",      103},
+    {"csiso88greek7",  -64},
+    {""}, {""},
+    {"ds2089", -99},
+    {""}, {""},
+    {"iso646-us",      -3},
+    {""}, {""}, {""}, {""}, {""},
+    {"cp038",  -2029},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso25french",  -46},
+    {""},
+    {"dk-us",  101},
+    {""},
+    {"cp01149",        -2100},
+    {""},
+    {"jis_c6226-1978", 49},
+    {""},
+    {"latin4", -7},
+    {""}, {""},
+    {"nats-sefi",      31},
+    {"cp437",  -2011},
+    {""},
+    {"csiso2022jp2",   -40},
+    {"csibm880",       -2057},
+    {"iso646-no",      -25},
+    {""}, {""},
+    {"ebcdic-cp-is",   -2056},
+    {""},
+    {"iso646-cn",      -56},
+    {"x0201",  -15},
+    {""}, {""},
+    {"mnemonic",       2080},
+    {"iso646-jp",      -42},
+    {"csiso70videotexsupp1",   -59},
+    {""},
+    {"ebcdic-cp-nl",   -2028},
+    {""}, {""},
+    {"cp936",  -113},
+    {""},
+    {"jp",     -42},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-70",      -59},
+    {""}, {""}, {""},
+    {"csksc5636",      -102},
+    {"iso646-no2",     -58},
+    {""}, {""},
+    {"csibm870",       -2055},
+    {""},
+    {"iso-celtic",     -110},
+    {""}, {""}, {""}, {""},
+    {"csiso95jis62291984handadd",      -71},
+    {""}, {""}, {""}, {""},
+    {"cp037",  -2028},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-153",     -94},
+    {""},
+    {"csiso151cuba",   -92},
+    {""}, {""},
+    {"iso-ir-143",     -88},
+    {""}, {""}, {""},
+    {"t.61-8bit",      76},
+    {""}, {""}, {""}, {""}, {""},
+    {"csebcdicpt",     -2073},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-103",     -76},
+    {""},
+    {"csiso94jis62291984hand", -70},
+    {""}, {""}, {""},
+    {"ibm423", 2042},
+    {""}, {""}, {""}, {""},
+    {"latin8", -110},
+    {""},
+    {"ebcdic-cp-ar2",  -2062},
+    {""},
+    {"iso-2022-cn-ext",        105},
+    {""}, {""},
+    {"ebcdic-cp-ar1",  -2041},
+    {"ebcdic-es",      2074},
+    {"csibmebcdicatde",        -2064},
+    {""}, {""}, {""},
+    {"t.61-7bit",      75},
+    {""},
+    {"ebcdic-es-s",    2076},
+    {""}, {""}, {""},
+    {"csiso146serbian",        -89},
+    {""}, {""}, {""},
+    {"jis_c6220-1969", -41},
+    {""},
+    {"ibm863", 2050},
+    {""}, {""}, {""},
+    {"iso-ir-9-2",     -34},
+    {""}, {""},
+    {"csgb2312",       -2025},
+    {""}, {""}, {""},
+    {"dk",     -99},
+    {""},
+    {"viscii", 2082},
+    {"iso-ir-9-1",     -33},
+    {""}, {""}, {""}, {""}, {""},
+    {"ibm-symbols",    2015},
+    {""},
+    {"csibm903",       -2059},
+    {"ebcdic-at-de-a", 2065},
+    {""}, {""},
+    {"ebcdic-us-37+euro",      -2091},
+    {""}, {""},
+    {"x0208",  -63},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csibm290",       -2039},
+    {""}, {""}, {""}, {""},
+    {"ibm-thai",       2016},
+    {""}, {""}, {""},
+    {"csiso646basic1983",      -28},
+    {""}, {""}, {""},
+    {"ibm273", 2030},
+    {""}, {""},
+    {"ebcdic-us",      2078},
+    {"csiso159jisx02121990",   -98},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"iso-10646-j-1",  0},
+    {""},
+    {"csiso111ecmacyrillic",   -77},
+    {""}, {""}, {""}, {""}, {""},
+    {"cesu-8", 1016},
+    {"csibmsymbols",   -2015},
+    {"ecma-cyrillic",  77},
+    {""},
+    {"csnatsdano",     -33},
+    {""},
+    {"ebcdic-cp-fi",   -2034},
+    {""}, {""},
+    {"csebcdicfr",     -2071},
+    {""},
+    {"ebcdic-cp-fr",   -2040},
+    {""},
+    {"csviqr", -2083},
+    {"ccsid01149",     -2100},
+    {""},
+    {"ebcdic-ca-fr",   2066},
+    {"863",    -2050},
+    {""}, {""}, {""},
+    {"csebcdicfise",   -2069},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"gb18030",        114},
+    {""},
+    {"ibm01147",       2098},
+    {""}, {""},
+    {"ebcdic-cp-ca",   -2028},
+    {""}, {""},
+    {"iso646-jp-ocr-b",        -68},
+    {"csviscii",       -2082},
+    {"x0201-7",        -41},
+    {"ebcdic-dk-277+euro",     -2093},
+    {""},
+    {"microsoft-publishing",   2023},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"asmo_449",       65},
+    {""}, {""}, {""},
+    {"viqr",   2083},
+    {"ref",    -28},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-8859-6",     -9},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-19",      -45},
+    {""},
+    {"pt",     43},
+    {""},
+    {"ns_4551-1",      25},
+    {"iso-8859-5",     -8},
+    {""}, {""},
+    {"csiso69french",  -26},
+    {"csibmthai",      -2016},
+    {""}, {""}, {""}, {""}, {""},
+    {"cp423",  -2042},
+    {""}, {""},
+    {"csebcdicatdea",  -2065},
+    {""}, {""},
+    {"iso-8859-15",    111},
+    {""}, {""}, {""},
+    {"iso-8859-2",     -5},
+    {""}, {""},
+    {"pt2",    60},
+    {""}, {""},
+    {"csdecmcs",       -2008},
+    {"no",     -25},
+    {""}, {""},
+    {"iso-8859-1",     -4},
+    {""}, {""}, {""},
+    {"csibbm904",      -2060},
+    {""}, {""}, {""},
+    {"iso_646.basic:1983",     28},
+    {""},
+    {"cp863",  -2050},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso10367box",  -96},
+    {""}, {""}, {""}, {""}, {""},
+    {"shift_jis",      17},
+    {""},
+    {"iso-8859-14",    110},
+    {"ksc5636",        102},
+    {"no2",    -58},
+    {"csiso57gb1988",  -56},
+    {""}, {""}, {""}, {""},
+    {"iso646-dk",      -99},
+    {""}, {""},
+    {"csiso88596i",    -82},
+    {""}, {""},
+    {"iso-8859-4",     -7},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-49",      -51},
+    {""}, {""},
+    {"iso-10646-ucs-2",        1000},
+    {"scsu",   1011},
+    {"ccsid00924",     -2090},
+    {""},
+    {"iso-10646-ucs-basic",    1002},
+    {"iso-10646-utf-1",        27},
+    {""}, {""}, {""},
+    {"ebcdic-cp-es",   -2037},
+    {"iso-ir-85",      -61},
+    {""},
+    {"cp273",  -2030},
+    {""},
+    {"iso-10646-unicode-latin1",       1003},
+    {"iso-2022-jp-2",  40},
+    {"csibm857",       -2047},
+    {"iso-ir-99",      -74},
+    {""}, {""}, {""},
+    {"csiso4unitedkingdom",    -20},
+    {""}, {""},
+    {"cseuckr",        -38},
+    {"iso-10646-ucs-4",        1001},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-cp-tr",   -2061},
+    {""}, {""},
+    {"hz-gb-2312",     2085},
+    {""}, {""},
+    {"csebcdicfisea",  -2070},
+    {""}, {""},
+    {"iso-8859-10",    13},
+    {""},
+    {"nats-sefi-add",  32},
+    {""}, {""}, {""},
+    {"cp01143",        -2094},
+    {"iso-ir-84",      -60},
+    {""}, {""},
+    {"iso-8859-16",    112},
+    {""}, {""}, {""}, {""},
+    {"greek8", -10},
+    {""}, {""},
+    {"csibm277",       -2033},
+    {""}, {""}, {""},
+    {"csisotextcomm",  -14},
+    {"jis_c6226-1983", 63},
+    {""}, {""}, {""},
+    {"ebcdic-it-280+euro",     -2095},
+    {""}, {""},
+    {"ibm903", 2059},
+    {"csiso88598i",    -85},
+    {""}, {""},
+    {"csebcdices",     -2074},
+    {"ebcdic-es-a",    2075},
+    {""}, {""},
+    {"csiso646danish", -99},
+    {"iso-8859-8",     -11},
+    {"csebcdicess",    -2076},
+    {""}, {""}, {""}, {""},
+    {"iso_646.irv:1991",       -3},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso646-se",      -35},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-cp-yu",   -2055},
+    {""}, {""}, {""},
+    {"utf-16", 1015},
+    {"uk",     -20},
+    {"iso646-se2",     -21},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-86",      -62},
+    {""}, {""},
+    {"greek7", 64},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso96jisc62291984kana",        -72},
+    {""}, {""}, {""},
+    {"csiso16portuguese",      -43},
+    {""}, {""},
+    {"yu",     -87},
+    {""},
+    {"ds_2089",        99},
+    {"ksc_5601",       -36},
+    {""}, {""}, {""}, {""},
+    {"ebcdic-de-273+euro",     -2092},
+    {""},
+    {"iso-8859-7",     -10},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso10646utf1", -27},
+    {""}, {""}, {""}, {""},
+    {"csiso19latingreek",      -45},
+    {""}, {""},
+    {"csiso47bsviewdata",      -50},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso139csn369103",      -86},
+    {""}, {""},
+    {"iso-ir-69",      -26},
+    {""},
+    {"iso646-yu",      -87},
+    {""}, {""},
+    {"csshiftjis",     -17},
+    {""}, {""},
+    {"ebcdic-es-284+euro",     -2096},
+    {""}, {""}, {""},
+    {"csiso141jusib1002",      -87},
+    {""}, {""}, {""}, {""},
+    {"csiso93jis62291984badd", -69},
+    {""},
+    {"csiso15italian", -22},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"iso-ir-87",      -63},
+    {""},
+    {"iso-ir-123",     -80},
+    {""},
+    {"csebcdiccafr",   -2066},
+    {""}, {""}, {""},
+    {"iso-ir-199",     -110},
+    {"jis_c6220-1969-jp",      41},
+    {""}, {""}, {""}, {""},
+    {"cuba",   -92},
+    {"csiso85spanish2",        -61},
+    {""}, {""}, {""},
+    {"bs_4730",        20},
+    {""}, {""}, {""}, {""}, {""},
+    {"csnatsdanoadd",  -34},
+    {""}, {""}, {""}, {""}, {""},
+    {"csibm297",       -2040},
+    {""},
+    {"csiso2022kr",    -37},
+    {""},
+    {"csiso84portuguese2",     -60},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"ccsid01143",     -2094},
+    {""}, {""}, {""}, {""},
+    {"utf-8",  106},
+    {""}, {""}, {""},
+    {"iso_5427",       48},
+    {"cp903",  -2059},
+    {""}, {""}, {""}, {""},
+    {"csiso2intlrefversion",   -30},
+    {""},
+    {"ibm01148",       2099},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-2022-cn",    104},
+    {"jp-ocr-b-add",   -69},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"koi8-r", 2084},
+    {"ebcdic-cp-gr",   -2042},
+    {""}, {""}, {""}, {""}, {""},
+    {"cspcp852",       -2010},
+    {""}, {""},
+    {"csdkus", -101},
+    {""}, {""},
+    {"csiso5428greek", -55},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"jis_encoding",   16},
+    {""}, {""}, {""}, {""},
+    {"csebcdicdkno",   -2067},
+    {""}, {""}, {""},
+    {"roman8", -2004},
+    {"ebcdic-cp-dk",   -2033},
+    {""}, {""},
+    {"utf-7",  1012},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso88596e",    -81},
+    {""}, {""},
+    {"extended_unix_code_packed_format_for_japanese",  18},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-no-277+euro",     -2093},
+    {""}, {""}, {""},
+    {"csiso13jisc6220jp",      -41},
+    {""}, {""}, {""}, {""},
+    {"ebcdic-cp-wt",   -2028},
+    {"iso_9036",       -65},
+    {""}, {""}, {""},
+    {"ibm00858",       2089},
+    {"csiso21german",  -24},
+    {""},
+    {"greek7-old",     44},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso89asmo449", -65},
+    {""}, {""}, {""},
+    {"iso-ir-88",      -64},
+    {""}, {""},
+    {"csiso2022jp",    -39},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ns_4551-2",      58},
+    {""},
+    {"csebcdicesa",    -2075},
+    {"csibm868",       -2053},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"iso_8859-6",     -9},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso88598e",    -84},
+    {""},
+    {"hp-roman8",      2004},
+    {"iso_8859-5",     -8},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-15",    -111},
+    {"csibm278",       -2034},
+    {""},
+    {"euc-kr", 38},
+    {"iso_8859-2",     -5},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-1",     -4},
+    {"csisolatin5",    -12},
+    {"ebcdic-cp-ch",   -2044},
+    {""}, {""}, {""},
+    {"iso-8859-13",    109},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"hp-legal",       2017},
+    {""}, {""},
+    {"iso_8859-10:1992",       -13},
+    {""},
+    {"csiso150greekccitt",     -91},
+    {""}, {""},
+    {"iso_8859-14",    -110},
+    {"asmo-708",       -9},
+    {""}, {""}, {""},
+    {"csisolatin1",    -4},
+    {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-cp-gb",   -2038},
+    {""}, {""},
+    {"iso_8859-4",     -7},
+    {"csisolatin4",    -7},
+    {"ecma-118",       -10},
+    {""},
+    {"csunicode",      -1000},
+    {"iso-8859-9",     -12},
+    {""}, {""},
+    {"csebcdicdknoa",  -2068},
+    {"csibm037",       -2028},
+    {""},
+    {"csunicodeibm1276",       -1007},
+    {""},
+    {"lap",    -97},
+    {"cseucfixwidjapanese",    -19},
+    {""},
+    {"csunicodeibm1265",       -1009},
+    {"sen_850200_c",   21},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"jis_c6229-1984-hand",    70},
+    {"jis_c6229-1984-b-add",   69},
+    {""}, {""}, {""}, {""},
+    {"csunicodeibm1261",       -1005},
+    {""}, {""}, {""},
+    {"latin1-2-5",     -95},
+    {"iso_8859-14:1998",       -110},
+    {"jis_c6229-1984-a",       67},
+    {""}, {""},
+    {"jis_c6229-1984-kana",    72},
+    {""}, {""}, {""}, {""}, {""},
+    {"csunicode11",    -1010},
+    {""}, {""}, {""},
+    {"ebcdic-cp-us",   -2028},
+    {"csunicodeibm1264",       -1008},
+    {""}, {""}, {""}, {""}, {""},
+    {"jis_c6229-1984-b",       68},
+    {""}, {""},
+    {"cshproman8",     -2004},
+    {"iso_646.irv:1983",       30},
+    {""}, {""}, {""}, {""},
+    {"latin3", -6},
+    {""},
+    {"csa_z243.4-1985-gr",     80},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"gb_1988-80",     56},
+    {"csisolatin6",    -13},
+    {"csa_z243.4-1985-2",      79},
+    {"cspc862latinhebrew",     -2013},
+    {""}, {""}, {""},
+    {"csa_z243.4-1985-1",      78},
+    {"gbk",    113},
+    {""}, {""}, {""},
+    {"iso646-cu",      -92},
+    {""}, {""},
+    {"iso_8859-8",     -11},
+    {"iso-2022-kr",    37},
+    {""},
+    {"cspc775baltic",  -2087},
+    {""}, {""},
+    {"csunicodeibm1268",       -1006},
+    {"csiso61norwegian2",      -58},
+    {""}, {""}, {""}, {""}, {""},
+    {"csiso99naplps",  -74},
+    {""}, {""}, {""}, {""}, {""},
+    {"iec_p27-1",      88},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"utf-32", 1017},
+    {""},
+    {"csebcdicus",     -2078},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"csibm918",       -2062},
+    {""}, {""},
+    {"gb_2312-80",     57},
+    {""},
+    {"serbian",        -89},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"irv",    -30},
+    {"csunicode11utf7",        -103},
+    {""}, {""},
+    {"csisolatincyrillic",     -8},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-7",     -10},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csnatssefi",     -31},
+    {""},
+    {"csiso60norwegian1",      -25},
+    {""}, {""},
+    {"greek",  -10},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ebcdic-uk",      2077},
+    {""},
+    {"csisolatinarabic",       -9},
+    {""},
+    {"csiso128t101g2", -83},
+    {"csunicodeascii", -1002},
+    {""},
+    {"jp-ocr-hand",    -70},
+    {""}, {""}, {""},
+    {"jp-ocr-hand-add",        -71},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"jis_c6229-1984-hand-add",        71},
+    {""}, {""},
+    {"cscesu-8",       -1016},
+    {""}, {""}, {""}, {""},
+    {"sen_850200_b",   35},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"invariant",      29},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-2022-jp",    39},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"cswindows31latin5",      -2003},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cswindows31latin2",      -2002},
+    {""}, {""}, {""}, {""},
+    {"cswindows31latin1",      -2001},
+    {""}, {""}, {""}, {""},
+    {"cswindows30latin1",      -2000},
+    {""}, {""}, {""},
+    {"ebcdic-se-278+euro",     -2094},
+    {""}, {""},
+    {"ccsid00858",     -2089},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"csiso11swedishfornames", -21},
+    {""}, {""}, {""}, {""},
+    {"cspc8danishnorwegian",   -2012},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"nats-dano",      33},
+    {""}, {""},
+    {"cswindows31j",   -2024},
+    {"nf_z_62-010_(1973)",     46},
+    {""},
+    {"hp-pi-font",     2018},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ansi_x3.4-1986", -3},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"iso-8859-6-i",   -82},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-8859-6-e",   -81},
+    {""},
+    {"latin-lap",      97},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"jis_x0201",      15},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"csunicodelatin1",        -1003},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-8859-2-windows-latin-2",     2002},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"hu",     -62},
+    {"nf_z_62-010",    26},
+    {""}, {""}, {""}, {""}, {""},
+    {"csibm038",       -2029},
+    {""}, {""},
+    {"iso-8859-3",     -6},
+    {"greek-ccitt",    91},
+    {""}, {""},
+    {"ansi_x3.4-1968", 3},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-8859-1-windows-3.1-latin-1", 2001},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-8859-8-i",   -85},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"us-dk",  100},
+    {""},
+    {"elot_928",       -10},
+    {""}, {""}, {""}, {""},
+    {"iso-8859-8-e",   -84},
+    {"ms_kanji",       -17},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"pc-multilingual-850+euro",       -2089},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-8-2",     -32},
+    {"msz_7795.3",     62},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso646-hu",      -62},
+    {""},
+    {"iso-ir-8-1",     -31},
+    {""},
+    {"csisolatin2",    -5},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"jis_x0212-1990", 98},
+    {"iso-8859-1-windows-3.0-latin-1", 2000},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"csisolatin3",    -6},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"adobe-symbol-encoding",  2020},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"latin-greek-1",  47},
+    {""},
+    {"iso_8859-9",     -12},
+    {"csusdk", -100},
+    {""}, {""}, {""}, {""}, {""},
+    {"csiso17spanish", -23},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_10367-box",  96},
+    {""}, {""}, {""}, {""}, {""},
+    {"cshplegal",      -2017},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"utf-16le",       1014},
+    {""}, {""}, {""}, {""},
+    {"csnatssefiadd",  -32},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"macedonian",     -90},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"din_66003",      24},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso60danishnorwegian", -25},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"utf-16be",       1013},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"csjisencoding",  -16},
+    {""}, {""}, {""}, {""}, {""},
+    {"csksc56011987",  -36},
+    {""}, {""},
+    {"windows-1256",   2256},
+    {""}, {""}, {""}, {""},
+    {"windows-1255",   2255},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"windows-1252",   2252},
+    {""}, {""}, {""}, {""},
+    {"windows-1251",   2251},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ks_c_5601-1987", 36},
+    {""},
+    {"iso-8859-9-windows-latin-5",     2003},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"windows-1254",   2254},
+    {"extended_unix_code_fixed_width_for_japanese",    19},
+    {""}, {""}, {""},
+    {"macintosh",      2027},
+    {""},
+    {"csiso147macedonian",     -90},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"nats-dano-add",  34},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso-ir-89",      -65},
+    {""},
+    {"csisolatinhebrew",       -11},
+    {""}, {""}, {""}, {""},
+    {"naplps", -74},
+    {""}, {""},
+    {"euc-jp", -18},
+    {""}, {""},
+    {"windows-1258",   2258},
+    {""}, {""}, {""}, {""},
+    {"windows-1250",   2250},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"windows-1257",   2257},
+    {""}, {""}, {""}, {""}, {""},
+    {"csunknown8bit",  -2079},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso158lap",    -97},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"koi8-u", 2088},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cshalfwidthkatakana",    -15},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ks_c_5601-1989", -36},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"iso_8859-6-i",   82},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ansi_x3.110-1983",       74},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-6-e",   81},
+    {""}, {""}, {""},
+    {"cspc8codepage437",       -2011},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cshppifont",     -2018},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"iso_8859-3",     -6},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-8-i",   85},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-8-e",   84},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso10swedish", -35},
+    {""}, {""},
+    {"iso-unicode-ibm-1276",   1007},
+    {""}, {""}, {""}, {""},
+    {"iso-unicode-ibm-1265",   1009},
+    {""},
+    {"cspc8turkish",   -2014},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"korean", -36},
+    {""}, {""}, {""},
+    {"iso-unicode-ibm-1261",   1005},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso-unicode-ibm-1264",   1008},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"utf-32le",       1019},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"hebrew", -11},
+    {""},
+    {"adobe-standard-encoding",        2005},
+    {""},
+    {"iso-unicode-ibm-1268",   1006},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cshpmath8",      -2019},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"csn_369103",     86},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"utf-32be",       1018},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"windows-1253",   2253},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"pc8-turkish",    2014},
+    {""}, {""},
+    {"jis_x0208-1983", -63},
+    {"jus_i.b1.002",   87},
+    {""}, {""}, {""},
+    {"jus_i.b1.003-mac",       90},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csmicrosoftpublishing",  -2023},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csiso8859supp",  -95},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"katakana",       -41},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csventurainternational", -2007},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"csmacintosh",    -2027},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"latin-greek",    45},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"csinvariant",    -29},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"csadobestandardencoding",        -2005},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-5:1988",        8},
+    {""}, {""}, {""}, {""}, {""},
+    {"jus_i.b1.003-serb",      89},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-6:1987",        9},
+    {""}, {""}, {""}, {""},
+    {"iso_8859-4:1988",        7},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-2:1987",        5},
+    {""}, {""}, {""}, {""},
+    {"iso_8859-1:1987",        4},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"iso_8859-8:1988",        11},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cseucpkdfmtjapanese",    -18},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-7:1987",        10},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"csventuraus",    -2006},
+    {"videotex-suppl", 59},
+    {"windows-31j",    2024},
+    {""}, {""}, {""},
+    {"csisolatingreek",        -10},
+    {""},
+    {"hp-math8",       2019},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"bs_viewdata",    50},
+    {""}, {""}, {""},
+    {"csebcdicuk",     -2077},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"big5-hkscs",     2101},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso_2033-1983",  73},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"cspc850multilingual",    -2009},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"nc_nc00-10:81",  92},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso_8859-supp",  95},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"csa_t500-1983",  -74},
+    {""}, {""}, {""}, {""},
+    {"iso_8859-3:1988",        6},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"iso_8859-9:1989",        12},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iso_5427:1981",  54},
+    {""},
+    {"st_sev_358-88",  -94},
+    {""}, {""}, {""}, {""},
+    {"csventuramath",  -2022},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"csiso86hungarian",       -62},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"unknown-8bit",   2079},
+    {""}, {""}, {""},
+    {"cshpdesktop",    -2021},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"ventura-us",     2006},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"windows-936",    -113},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"ventura-international",  2007},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"gost_19768-74",  94},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"iso_6937-2-25",  93},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"iso_5428:1980",  55},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"iso_6937-2-add", 14},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"pc8-danish-norwegian",   2012},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"cshppsmath",     -2020},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"ventura-math",   2022},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"hp-desktop",     2021}
+  };
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct charset *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
+
diff --git a/tests/charsets.gperf b/tests/charsets.gperf
new file mode 100644 (file)
index 0000000..506480f
--- /dev/null
@@ -0,0 +1,800 @@
+%{
+/* Generated from IANA charset data from http://www.iana.org/assignments/character-sets by charsets.awk */
+/* last updated 2002-06-14 */
+/* process with:
+       gperf -CDEGTlot -H charset_hash -K name -L ANSI-C -N charset_entry
+*/
+%}
+struct charset { const char *name; /* name or alias */ int mib; /* MIBenum for name, -1 * MIBenum for alias */ };
+%%
+437,   -2011
+850,   -2009
+851,   -2045
+852,   -2010
+855,   -2046
+857,   -2047
+860,   -2048
+861,   -2049
+862,   -2013
+863,   -2050
+865,   -2052
+866,   -2086
+869,   -2054
+904,   -2060
+adobe-standard-encoding,       2005
+adobe-symbol-encoding, 2020
+ansi_x3.110-1983,      74
+ansi_x3.4-1968,        3
+ansi_x3.4-1986,        -3
+arabic,        -9
+arabic7,       -65
+ascii, -3
+asmo-708,      -9
+asmo_449,      65
+big5,  2026
+big5-hkscs,    2101
+bs_4730,       20
+bs_viewdata,   50
+ca,    -78
+ccsid00858,    -2089
+ccsid00924,    -2090
+ccsid01140,    -2091
+ccsid01141,    -2092
+ccsid01142,    -2093
+ccsid01143,    -2094
+ccsid01144,    -2095
+ccsid01145,    -2096
+ccsid01146,    -2097
+ccsid01147,    -2098
+ccsid01148,    -2099
+ccsid01149,    -2100
+cesu-8,        1016
+chinese,       -57
+cn,    -56
+cp-ar, -2053
+cp-gr, -2054
+cp-is, -2049
+cp00858,       -2089
+cp00924,       -2090
+cp01140,       -2091
+cp01141,       -2092
+cp01142,       -2093
+cp01143,       -2094
+cp01144,       -2095
+cp01145,       -2096
+cp01146,       -2097
+cp01147,       -2098
+cp01148,       -2099
+cp01149,       -2100
+cp037, -2028
+cp038, -2029
+cp1026,        -2063
+cp273, -2030
+cp274, -2031
+cp275, -2032
+cp278, -2034
+cp280, -2035
+cp281, -2036
+cp284, -2037
+cp285, -2038
+cp290, -2039
+cp297, -2040
+cp367, -3
+cp420, -2041
+cp423, -2042
+cp424, -2043
+cp437, -2011
+cp500, -2044
+cp775, -2087
+cp819, -4
+cp850, -2009
+cp851, -2045
+cp852, -2010
+cp855, -2046
+cp857, -2047
+cp860, -2048
+cp861, -2049
+cp862, -2013
+cp863, -2050
+cp864, -2051
+cp865, -2052
+cp866, -2086
+cp868, -2053
+cp869, -2054
+cp870, -2055
+cp871, -2056
+cp880, -2057
+cp891, -2058
+cp903, -2059
+cp904, -2060
+cp905, -2061
+cp918, -2062
+cp936, -113
+csa7-1,        -78
+csa7-2,        -79
+csa_t500-1983, -74
+csa_z243.4-1985-1,     78
+csa_z243.4-1985-2,     79
+csa_z243.4-1985-gr,    80
+csadobestandardencoding,       -2005
+csascii,       -3
+csbig5,        -2026
+cscesu-8,      -1016
+csdecmcs,      -2008
+csdkus,        -101
+csebcdicatdea, -2065
+csebcdiccafr,  -2066
+csebcdicdkno,  -2067
+csebcdicdknoa, -2068
+csebcdices,    -2074
+csebcdicesa,   -2075
+csebcdicess,   -2076
+csebcdicfise,  -2069
+csebcdicfisea, -2070
+csebcdicfr,    -2071
+csebcdicit,    -2072
+csebcdicpt,    -2073
+csebcdicuk,    -2077
+csebcdicus,    -2078
+cseucfixwidjapanese,   -19
+cseuckr,       -38
+cseucpkdfmtjapanese,   -18
+csgb2312,      -2025
+cshalfwidthkatakana,   -15
+cshpdesktop,   -2021
+cshplegal,     -2017
+cshpmath8,     -2019
+cshppifont,    -2018
+cshppsmath,    -2020
+cshproman8,    -2004
+csibbm904,     -2060
+csibm037,      -2028
+csibm038,      -2029
+csibm1026,     -2063
+csibm273,      -2030
+csibm274,      -2031
+csibm275,      -2032
+csibm277,      -2033
+csibm278,      -2034
+csibm280,      -2035
+csibm281,      -2036
+csibm284,      -2037
+csibm285,      -2038
+csibm290,      -2039
+csibm297,      -2040
+csibm420,      -2041
+csibm423,      -2042
+csibm424,      -2043
+csibm500,      -2044
+csibm851,      -2045
+csibm855,      -2046
+csibm857,      -2047
+csibm860,      -2048
+csibm861,      -2049
+csibm863,      -2050
+csibm864,      -2051
+csibm865,      -2052
+csibm866,      -2086
+csibm868,      -2053
+csibm869,      -2054
+csibm870,      -2055
+csibm871,      -2056
+csibm880,      -2057
+csibm891,      -2058
+csibm903,      -2059
+csibm905,      -2061
+csibm918,      -2062
+csibmebcdicatde,       -2064
+csibmsymbols,  -2015
+csibmthai,     -2016
+csinvariant,   -29
+csiso102t617bit,       -75
+csiso10367box, -96
+csiso103t618bit,       -76
+csiso10646utf1,        -27
+csiso10swedish,        -35
+csiso111ecmacyrillic,  -77
+csiso11swedishfornames,        -21
+csiso121canadian1,     -78
+csiso122canadian2,     -79
+csiso123csaz24341985gr,        -80
+csiso128t101g2,        -83
+csiso139csn369103,     -86
+csiso13jisc6220jp,     -41
+csiso141jusib1002,     -87
+csiso143iecp271,       -88
+csiso146serbian,       -89
+csiso147macedonian,    -90
+csiso14jisc6220ro,     -42
+csiso150,      -91
+csiso150greekccitt,    -91
+csiso151cuba,  -92
+csiso153gost1976874,   -94
+csiso158lap,   -97
+csiso159jisx02121990,  -98
+csiso15italian,        -22
+csiso16portuguese,     -43
+csiso17spanish,        -23
+csiso18greek7old,      -44
+csiso19latingreek,     -45
+csiso2022jp,   -39
+csiso2022jp2,  -40
+csiso2022kr,   -37
+csiso2033,     -73
+csiso21german, -24
+csiso25french, -46
+csiso27latingreek1,    -47
+csiso2intlrefversion,  -30
+csiso42jisc62261978,   -49
+csiso47bsviewdata,     -50
+csiso49inis,   -51
+csiso4unitedkingdom,   -20
+csiso50inis8,  -52
+csiso51iniscyrillic,   -53
+csiso5427cyrillic,     -48
+csiso5428greek,        -55
+csiso57gb1988, -56
+csiso58gb231280,       -57
+csiso60danishnorwegian,        -25
+csiso60norwegian1,     -25
+csiso61norwegian2,     -58
+csiso646basic1983,     -28
+csiso646danish,        -99
+csiso6937add,  -93
+csiso69french, -26
+csiso70videotexsupp1,  -59
+csiso84portuguese2,    -60
+csiso85spanish2,       -61
+csiso86hungarian,      -62
+csiso87jisx0208,       -63
+csiso88596e,   -81
+csiso88596i,   -82
+csiso88598e,   -84
+csiso88598i,   -85
+csiso8859supp, -95
+csiso88greek7, -64
+csiso89asmo449,        -65
+csiso90,       -66
+csiso91jisc62291984a,  -67
+csiso92jisc62991984b,  -68
+csiso93jis62291984badd,        -69
+csiso94jis62291984hand,        -70
+csiso95jis62291984handadd,     -71
+csiso96jisc62291984kana,       -72
+csiso99naplps, -74
+csisolatin1,   -4
+csisolatin2,   -5
+csisolatin3,   -6
+csisolatin4,   -7
+csisolatin5,   -12
+csisolatin6,   -13
+csisolatinarabic,      -9
+csisolatincyrillic,    -8
+csisolatingreek,       -10
+csisolatinhebrew,      -11
+csisotextcomm, -14
+csjisencoding, -16
+cskoi8r,       -2084
+csksc56011987, -36
+csksc5636,     -102
+csmacintosh,   -2027
+csmicrosoftpublishing, -2023
+csmnem,        -2081
+csmnemonic,    -2080
+csn_369103,    86
+csnatsdano,    -33
+csnatsdanoadd, -34
+csnatssefi,    -31
+csnatssefiadd, -32
+cspc775baltic, -2087
+cspc850multilingual,   -2009
+cspc862latinhebrew,    -2013
+cspc8codepage437,      -2011
+cspc8danishnorwegian,  -2012
+cspc8turkish,  -2014
+cspcp852,      -2010
+csshiftjis,    -17
+csucs4,        -1001
+csunicode,     -1000
+csunicode11,   -1010
+csunicode11utf7,       -103
+csunicodeascii,        -1002
+csunicodeibm1261,      -1005
+csunicodeibm1264,      -1008
+csunicodeibm1265,      -1009
+csunicodeibm1268,      -1006
+csunicodeibm1276,      -1007
+csunicodelatin1,       -1003
+csunknown8bit, -2079
+csusdk,        -100
+csventurainternational,        -2007
+csventuramath, -2022
+csventuraus,   -2006
+csviqr,        -2083
+csviscii,      -2082
+cswindows30latin1,     -2000
+cswindows31j,  -2024
+cswindows31latin1,     -2001
+cswindows31latin2,     -2002
+cswindows31latin5,     -2003
+cuba,  -92
+cyrillic,      -8
+de,    -24
+dec,   -2008
+dec-mcs,       2008
+din_66003,     24
+dk,    -99
+dk-us, 101
+ds2089,        -99
+ds_2089,       99
+e13b,  -73
+ebcdic-at-de,  2064
+ebcdic-at-de-a,        2065
+ebcdic-be,     -2031
+ebcdic-br,     -2032
+ebcdic-ca-fr,  2066
+ebcdic-cp-ar1, -2041
+ebcdic-cp-ar2, -2062
+ebcdic-cp-be,  -2044
+ebcdic-cp-ca,  -2028
+ebcdic-cp-ch,  -2044
+ebcdic-cp-dk,  -2033
+ebcdic-cp-es,  -2037
+ebcdic-cp-fi,  -2034
+ebcdic-cp-fr,  -2040
+ebcdic-cp-gb,  -2038
+ebcdic-cp-gr,  -2042
+ebcdic-cp-he,  -2043
+ebcdic-cp-is,  -2056
+ebcdic-cp-it,  -2035
+ebcdic-cp-nl,  -2028
+ebcdic-cp-no,  -2033
+ebcdic-cp-roece,       -2055
+ebcdic-cp-se,  -2034
+ebcdic-cp-tr,  -2061
+ebcdic-cp-us,  -2028
+ebcdic-cp-wt,  -2028
+ebcdic-cp-yu,  -2055
+ebcdic-cyrillic,       -2057
+ebcdic-de-273+euro,    -2092
+ebcdic-dk-277+euro,    -2093
+ebcdic-dk-no,  2067
+ebcdic-dk-no-a,        2068
+ebcdic-es,     2074
+ebcdic-es-284+euro,    -2096
+ebcdic-es-a,   2075
+ebcdic-es-s,   2076
+ebcdic-fi-278+euro,    -2094
+ebcdic-fi-se,  2069
+ebcdic-fi-se-a,        2070
+ebcdic-fr,     2071
+ebcdic-fr-297+euro,    -2098
+ebcdic-gb-285+euro,    -2097
+ebcdic-int,    -2029
+ebcdic-international-500+euro, -2099
+ebcdic-is-871+euro,    -2100
+ebcdic-it,     2072
+ebcdic-it-280+euro,    -2095
+ebcdic-jp-e,   -2036
+ebcdic-jp-kana,        -2039
+ebcdic-latin9--euro,   -2090
+ebcdic-no-277+euro,    -2093
+ebcdic-pt,     2073
+ebcdic-se-278+euro,    -2094
+ebcdic-uk,     2077
+ebcdic-us,     2078
+ebcdic-us-37+euro,     -2091
+ecma-114,      -9
+ecma-118,      -10
+ecma-cyrillic, 77
+elot_928,      -10
+es,    23
+es2,   61
+euc-jp,        -18
+euc-kr,        38
+extended_unix_code_fixed_width_for_japanese,   19
+extended_unix_code_packed_format_for_japanese, 18
+fi,    -35
+fr,    -26
+gb,    -20
+gb18030,       114
+gb2312,        2025
+gb_1988-80,    56
+gb_2312-80,    57
+gbk,   113
+gost_19768-74, 94
+greek, -10
+greek-ccitt,   91
+greek7,        64
+greek7-old,    44
+greek8,        -10
+hebrew,        -11
+hp-desktop,    2021
+hp-legal,      2017
+hp-math8,      2019
+hp-pi-font,    2018
+hp-roman8,     2004
+hu,    -62
+hz-gb-2312,    2085
+ibm-symbols,   2015
+ibm-thai,      2016
+ibm00858,      2089
+ibm00924,      2090
+ibm01140,      2091
+ibm01141,      2092
+ibm01142,      2093
+ibm01143,      2094
+ibm01144,      2095
+ibm01145,      2096
+ibm01146,      2097
+ibm01147,      2098
+ibm01148,      2099
+ibm01149,      2100
+ibm037,        2028
+ibm038,        2029
+ibm1026,       2063
+ibm273,        2030
+ibm274,        2031
+ibm275,        2032
+ibm277,        2033
+ibm278,        2034
+ibm280,        2035
+ibm281,        2036
+ibm284,        2037
+ibm285,        2038
+ibm290,        2039
+ibm297,        2040
+ibm367,        -3
+ibm420,        2041
+ibm423,        2042
+ibm424,        2043
+ibm437,        2011
+ibm500,        2044
+ibm775,        2087
+ibm819,        -4
+ibm850,        2009
+ibm851,        2045
+ibm852,        2010
+ibm855,        2046
+ibm857,        2047
+ibm860,        2048
+ibm861,        2049
+ibm862,        2013
+ibm863,        2050
+ibm864,        2051
+ibm865,        2052
+ibm866,        2086
+ibm868,        2053
+ibm869,        2054
+ibm870,        2055
+ibm871,        2056
+ibm880,        2057
+ibm891,        2058
+ibm903,        2059
+ibm904,        2060
+ibm905,        2061
+ibm918,        2062
+iec_p27-1,     88
+inis,  51
+inis-8,        52
+inis-cyrillic, 53
+invariant,     29
+irv,   -30
+iso-10646,     -1003
+iso-10646-j-1, 0
+iso-10646-ucs-2,       1000
+iso-10646-ucs-4,       1001
+iso-10646-ucs-basic,   1002
+iso-10646-unicode-latin1,      1003
+iso-10646-utf-1,       27
+iso-2022-cn,   104
+iso-2022-cn-ext,       105
+iso-2022-jp,   39
+iso-2022-jp-2, 40
+iso-2022-kr,   37
+iso-8859-1,    -4
+iso-8859-1-windows-3.0-latin-1,        2000
+iso-8859-1-windows-3.1-latin-1,        2001
+iso-8859-10,   13
+iso-8859-13,   109
+iso-8859-14,   110
+iso-8859-15,   111
+iso-8859-16,   112
+iso-8859-2,    -5
+iso-8859-2-windows-latin-2,    2002
+iso-8859-3,    -6
+iso-8859-4,    -7
+iso-8859-5,    -8
+iso-8859-6,    -9
+iso-8859-6-e,  -81
+iso-8859-6-i,  -82
+iso-8859-7,    -10
+iso-8859-8,    -11
+iso-8859-8-e,  -84
+iso-8859-8-i,  -85
+iso-8859-9,    -12
+iso-8859-9-windows-latin-5,    2003
+iso-celtic,    -110
+iso-ir-10,     -35
+iso-ir-100,    -4
+iso-ir-101,    -5
+iso-ir-102,    -75
+iso-ir-103,    -76
+iso-ir-109,    -6
+iso-ir-11,     -21
+iso-ir-110,    -7
+iso-ir-111,    -77
+iso-ir-121,    -78
+iso-ir-122,    -79
+iso-ir-123,    -80
+iso-ir-126,    -10
+iso-ir-127,    -9
+iso-ir-128,    -83
+iso-ir-13,     -41
+iso-ir-138,    -11
+iso-ir-139,    -86
+iso-ir-14,     -42
+iso-ir-141,    -87
+iso-ir-142,    -14
+iso-ir-143,    -88
+iso-ir-144,    -8
+iso-ir-146,    -89
+iso-ir-147,    -90
+iso-ir-148,    -12
+iso-ir-149,    -36
+iso-ir-15,     -22
+iso-ir-150,    -91
+iso-ir-151,    -92
+iso-ir-152,    -93
+iso-ir-153,    -94
+iso-ir-154,    -95
+iso-ir-155,    -96
+iso-ir-157,    -13
+iso-ir-158,    -97
+iso-ir-159,    -98
+iso-ir-16,     -43
+iso-ir-17,     -23
+iso-ir-18,     -44
+iso-ir-19,     -45
+iso-ir-199,    -110
+iso-ir-2,      -30
+iso-ir-21,     -24
+iso-ir-25,     -46
+iso-ir-27,     -47
+iso-ir-37,     -48
+iso-ir-4,      -20
+iso-ir-42,     -49
+iso-ir-47,     -50
+iso-ir-49,     -51
+iso-ir-50,     -52
+iso-ir-51,     -53
+iso-ir-54,     -54
+iso-ir-55,     -55
+iso-ir-57,     -56
+iso-ir-58,     -57
+iso-ir-6,      -3
+iso-ir-60,     -25
+iso-ir-61,     -58
+iso-ir-69,     -26
+iso-ir-70,     -59
+iso-ir-8-1,    -31
+iso-ir-8-2,    -32
+iso-ir-84,     -60
+iso-ir-85,     -61
+iso-ir-86,     -62
+iso-ir-87,     -63
+iso-ir-88,     -64
+iso-ir-89,     -65
+iso-ir-9-1,    -33
+iso-ir-9-2,    -34
+iso-ir-90,     66
+iso-ir-91,     -67
+iso-ir-92,     -68
+iso-ir-93,     -69
+iso-ir-94,     -70
+iso-ir-95,     -71
+iso-ir-96,     -72
+iso-ir-98,     -73
+iso-ir-99,     -74
+iso-unicode-ibm-1261,  1005
+iso-unicode-ibm-1264,  1008
+iso-unicode-ibm-1265,  1009
+iso-unicode-ibm-1268,  1006
+iso-unicode-ibm-1276,  1007
+iso5427cyrillic1981,   -54
+iso646-ca,     -78
+iso646-ca2,    -79
+iso646-cn,     -56
+iso646-cu,     -92
+iso646-de,     -24
+iso646-dk,     -99
+iso646-es,     -23
+iso646-es2,    -61
+iso646-fi,     -35
+iso646-fr,     -26
+iso646-fr1,    -46
+iso646-gb,     -20
+iso646-hu,     -62
+iso646-it,     -22
+iso646-jp,     -42
+iso646-jp-ocr-b,       -68
+iso646-kr,     -102
+iso646-no,     -25
+iso646-no2,    -58
+iso646-pt,     -43
+iso646-pt2,    -60
+iso646-se,     -35
+iso646-se2,    -21
+iso646-us,     -3
+iso646-yu,     -87
+iso_10367-box, 96
+iso_2033-1983, 73
+iso_5427,      48
+iso_5427:1981, 54
+iso_5428:1980, 55
+iso_646.basic:1983,    28
+iso_646.irv:1983,      30
+iso_646.irv:1991,      -3
+iso_6937-2-25, 93
+iso_6937-2-add,        14
+iso_8859-1,    -4
+iso_8859-10:1992,      -13
+iso_8859-14,   -110
+iso_8859-14:1998,      -110
+iso_8859-15,   -111
+iso_8859-1:1987,       4
+iso_8859-2,    -5
+iso_8859-2:1987,       5
+iso_8859-3,    -6
+iso_8859-3:1988,       6
+iso_8859-4,    -7
+iso_8859-4:1988,       7
+iso_8859-5,    -8
+iso_8859-5:1988,       8
+iso_8859-6,    -9
+iso_8859-6-e,  81
+iso_8859-6-i,  82
+iso_8859-6:1987,       9
+iso_8859-7,    -10
+iso_8859-7:1987,       10
+iso_8859-8,    -11
+iso_8859-8-e,  84
+iso_8859-8-i,  85
+iso_8859-8:1988,       11
+iso_8859-9,    -12
+iso_8859-9:1989,       12
+iso_8859-supp, 95
+iso_9036,      -65
+it,    22
+jis_c6220-1969,        -41
+jis_c6220-1969-jp,     41
+jis_c6220-1969-ro,     42
+jis_c6226-1978,        49
+jis_c6226-1983,        63
+jis_c6229-1984-a,      67
+jis_c6229-1984-b,      68
+jis_c6229-1984-b-add,  69
+jis_c6229-1984-hand,   70
+jis_c6229-1984-hand-add,       71
+jis_c6229-1984-kana,   72
+jis_encoding,  16
+jis_x0201,     15
+jis_x0208-1983,        -63
+jis_x0212-1990,        98
+jp,    -42
+jp-ocr-a,      -67
+jp-ocr-b,      -68
+jp-ocr-b-add,  -69
+jp-ocr-hand,   -70
+jp-ocr-hand-add,       -71
+js,    -87
+jus_i.b1.002,  87
+jus_i.b1.003-mac,      90
+jus_i.b1.003-serb,     89
+katakana,      -41
+koi8-r,        2084
+koi8-u,        2088
+korean,        -36
+ks_c_5601-1987,        36
+ks_c_5601-1989,        -36
+ksc5636,       102
+ksc_5601,      -36
+l1,    -4
+l2,    -5
+l3,    -6
+l4,    -7
+l5,    -12
+l6,    -13
+l8,    -110
+lap,   -97
+latin-greek,   45
+latin-greek-1, 47
+latin-lap,     97
+latin1,        -4
+latin1-2-5,    -95
+latin2,        -5
+latin3,        -6
+latin4,        -7
+latin5,        -12
+latin6,        -13
+latin8,        -110
+mac,   -2027
+macedonian,    -90
+macintosh,     2027
+microsoft-publishing,  2023
+mnem,  2081
+mnemonic,      2080
+ms936, -113
+ms_kanji,      -17
+msz_7795.3,    62
+naplps,        -74
+nats-dano,     33
+nats-dano-add, 34
+nats-sefi,     31
+nats-sefi-add, 32
+nc_nc00-10:81, 92
+nf_z_62-010,   26
+nf_z_62-010_(1973),    46
+no,    -25
+no2,   -58
+ns_4551-1,     25
+ns_4551-2,     58
+pc-multilingual-850+euro,      -2089
+pc8-danish-norwegian,  2012
+pc8-turkish,   2014
+pt,    43
+pt2,   60
+r8,    -2004
+ref,   -28
+roman8,        -2004
+scsu,  1011
+se,    -35
+se2,   -21
+sen_850200_b,  35
+sen_850200_c,  21
+serbian,       -89
+shift_jis,     17
+st_sev_358-88, -94
+t.101-g2,      83
+t.61,  -76
+t.61-7bit,     75
+t.61-8bit,     76
+tis-620,       2259
+uk,    -20
+unicode-1-1,   1010
+unicode-1-1-utf-7,     103
+unknown-8bit,  2079
+us,    -3
+us-ascii,      -3
+us-dk, 100
+utf-16,        1015
+utf-16be,      1013
+utf-16le,      1014
+utf-32,        1017
+utf-32be,      1018
+utf-32le,      1019
+utf-7, 1012
+utf-8, 106
+ventura-international, 2007
+ventura-math,  2022
+ventura-us,    2006
+videotex-suppl,        59
+viqr,  2083
+viscii,        2082
+windows-1250,  2250
+windows-1251,  2251
+windows-1252,  2252
+windows-1253,  2253
+windows-1254,  2254
+windows-1255,  2255
+windows-1256,  2256
+windows-1257,  2257
+windows-1258,  2258
+windows-31j,   2024
+windows-936,   -113
+x0201, -15
+x0201-7,       -41
+x0208, -63
+x0212, -98
+yu,    -87
+%%
diff --git a/tests/chill.exp b/tests/chill.exp
new file mode 100644 (file)
index 0000000..5a87301
--- /dev/null
@@ -0,0 +1,1425 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -L C -F ', 0, 0, 0' -D -E -S1 -j1 -i 1 -g -o -t -k'*'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+struct resword {
+  const char  *name;
+  short        token;
+  enum rid     rid;
+  enum toktype { RESERVED, DIRECTIVE, PREDEF } flags;
+};
+extern tree ridpointers [];
+/* maximum key range = 1046, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned short asso_values[] =
+    {
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050,   40,   45,   59,   88,   61,
+        11,  128,    5,    2,  199,    8,  102,  101,    8,   11,
+        24,   33,   11,   13,    4,   34,   10,  105,   83,   75,
+       155, 1050, 1050, 1050, 1050,    5, 1050,   10,   33,   19,
+        43,   14,    4,   52,    1,    1,  232,  116,   28,   78,
+         7,    2,    1,   63,    5,    3,    1,   10,  143,  186,
+       244,   75,  139, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+      1050, 1050, 1050, 1050, 1050, 1050, 1050
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[29]];
+      /*FALLTHROUGH*/
+      case 29:
+        hval += asso_values[(unsigned char)str[28]];
+      /*FALLTHROUGH*/
+      case 28:
+        hval += asso_values[(unsigned char)str[27]];
+      /*FALLTHROUGH*/
+      case 27:
+        hval += asso_values[(unsigned char)str[26]];
+      /*FALLTHROUGH*/
+      case 26:
+        hval += asso_values[(unsigned char)str[25]];
+      /*FALLTHROUGH*/
+      case 25:
+        hval += asso_values[(unsigned char)str[24]];
+      /*FALLTHROUGH*/
+      case 24:
+        hval += asso_values[(unsigned char)str[23]];
+      /*FALLTHROUGH*/
+      case 23:
+        hval += asso_values[(unsigned char)str[22]];
+      /*FALLTHROUGH*/
+      case 22:
+        hval += asso_values[(unsigned char)str[21]];
+      /*FALLTHROUGH*/
+      case 21:
+        hval += asso_values[(unsigned char)str[20]];
+      /*FALLTHROUGH*/
+      case 20:
+        hval += asso_values[(unsigned char)str[19]];
+      /*FALLTHROUGH*/
+      case 19:
+        hval += asso_values[(unsigned char)str[18]];
+      /*FALLTHROUGH*/
+      case 18:
+        hval += asso_values[(unsigned char)str[17]];
+      /*FALLTHROUGH*/
+      case 17:
+        hval += asso_values[(unsigned char)str[16]];
+      /*FALLTHROUGH*/
+      case 16:
+        hval += asso_values[(unsigned char)str[15]];
+      /*FALLTHROUGH*/
+      case 15:
+        hval += asso_values[(unsigned char)str[14]];
+      /*FALLTHROUGH*/
+      case 14:
+        hval += asso_values[(unsigned char)str[13]];
+      /*FALLTHROUGH*/
+      case 13:
+        hval += asso_values[(unsigned char)str[12]];
+      /*FALLTHROUGH*/
+      case 12:
+        hval += asso_values[(unsigned char)str[11]];
+      /*FALLTHROUGH*/
+      case 11:
+        hval += asso_values[(unsigned char)str[10]];
+      /*FALLTHROUGH*/
+      case 10:
+        hval += asso_values[(unsigned char)str[9]];
+      /*FALLTHROUGH*/
+      case 9:
+        hval += asso_values[(unsigned char)str[8]];
+      /*FALLTHROUGH*/
+      case 8:
+        hval += asso_values[(unsigned char)str[7]];
+      /*FALLTHROUGH*/
+      case 7:
+        hval += asso_values[(unsigned char)str[6]];
+      /*FALLTHROUGH*/
+      case 6:
+        hval += asso_values[(unsigned char)str[5]];
+      /*FALLTHROUGH*/
+      case 5:
+        hval += asso_values[(unsigned char)str[4]];
+      /*FALLTHROUGH*/
+      case 4:
+        hval += asso_values[(unsigned char)str[3]];
+      /*FALLTHROUGH*/
+      case 3:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+        hval += asso_values[(unsigned char)str[1]+1];
+      /*FALLTHROUGH*/
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  enum
+    {
+      TOTAL_KEYWORDS = 300,
+      MIN_WORD_LENGTH = 2,
+      MAX_WORD_LENGTH = 30,
+      MIN_HASH_VALUE = 4,
+      MAX_HASH_VALUE = 1049
+    };
+
+  static struct resword wordlist[] =
+    {
+      {"to",                   TO,                     NORID,  RESERVED},
+      {"in",                   IN,                     RID_IN, RESERVED},
+      {"on",                   ON,                     NORID,  RESERVED},
+      {"or",                   OR,                     NORID,  RESERVED},
+      {"pos",                  POS,                    NORID,  RESERVED},
+      {"init",                 INIT,                   NORID,  RESERVED},
+      {"this",                 THIS,                   NORID,  RESERVED},
+      {"set",                  SET,                    NORID,  RESERVED},
+      {"not",                  NOT,                    NORID,  RESERVED},
+      {"for",                  FOR,                    NORID,  RESERVED},
+      {"orif",                 ORIF,                   NORID,  RESERVED},
+      {"IN",                   IN,                     RID_IN, RESERVED},
+      {"ref",                  REF,                    NORID,  RESERVED},
+      {"od",                   OD,                     NORID,  RESERVED},
+      {"stop",                 STOP,                   NORID,  RESERVED},
+      {"inout",                        PARAMATTR,              RID_INOUT,      RESERVED},
+      {"at",                   AT,                     NORID,  RESERVED},
+      {"INIT",                 INIT,                   NORID,  RESERVED},
+      {"ON",                   ON,                     NORID,  RESERVED},
+      {"THIS",                 THIS,                   NORID,  RESERVED},
+      {"OR",                   OR,                     NORID,  RESERVED},
+      {"then",                 THEN,                   NORID,  RESERVED},
+      {"OUT",                  PARAMATTR,              RID_OUT,        RESERVED},
+      {"proc",                 PROC,                   NORID,  RESERVED},
+      {"TO",                   TO,                     NORID,  RESERVED},
+      {"SET",                  SET,                    NORID,  RESERVED},
+      {"step",                 STEP,                   NORID,  RESERVED},
+      {"start",                        START,                  NORID,  RESERVED},
+      {"REF",                  REF,                    NORID,  RESERVED},
+      {"return",                       RETURN,                 NORID,  RESERVED},
+      {"NOT",                  NOT,                    NORID,  RESERVED},
+      {"assert",                       ASSERT,                 NORID,  RESERVED},
+      {"ORIF",                 ORIF,                   NORID,  RESERVED},
+      {"returns",              RETURNS,                NORID,  RESERVED},
+      {"chars",                        CHARS,                  NORID,  RESERVED},
+      {"nonref",                       NONREF,                 NORID,  RESERVED},
+      {"far",                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"do",                   DO,                     NORID,  RESERVED},
+      {"nolist",                       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"esac",                 ESAC,                   NORID,  RESERVED},
+      {"FOR",                  FOR,                    NORID,  RESERVED},
+      {"static",                       STATIC,                 NORID,  RESERVED},
+      {"loc",                  LOC,                    NORID,  RESERVED},
+      {"process",              PROCESS,                NORID,  RESERVED},
+      {"struct",                       STRUCT,                 NORID,  RESERVED},
+      {"if",                   IF,                     NORID,  RESERVED},
+      {"of",                   OF,                     NORID,  RESERVED},
+      {"result",                       RESULT,                 NORID,  RESERVED},
+      {"and",                  AND,                    NORID,  RESERVED},
+      {"inline",                       INLINE,                 RID_INLINE,     RESERVED},
+      {"goto",                 GOTO,                   NORID,  RESERVED},
+      {"send",                 SEND,                   NORID,  RESERVED},
+      {"end",                  END,                    NORID,  RESERVED},
+      {"reentrant",            IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"POS",                  POS,                    NORID,  RESERVED},
+      {"andif",                        ANDIF,                  NORID,  RESERVED},
+      {"read",                 READ,                   RID_READ,       RESERVED},
+      {"INOUT",                        PARAMATTR,              RID_INOUT,      RESERVED},
+      {"continue",             CONTINUE,               NORID,  RESERVED},
+      {"UP",                   UP,                     NORID,  RESERVED},
+      {"FAR",                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"bools",                        BOOLS,                  RID_BOOLS,      RESERVED},
+      {"case",                 CASE,                   NORID,  RESERVED},
+      {"OD",                   OD,                     NORID,  RESERVED},
+      {"up",                   UP,                     NORID,  RESERVED},
+      {"AT",                   AT,                     NORID,  RESERVED},
+      {"region",                       REGION,                 NORID,  RESERVED},
+      {"grant",                        GRANT,                  NORID,  RESERVED},
+      {"THEN",                 THEN,                   NORID,  RESERVED},
+      {"small",                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ccitt_os",             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"cause",                        CAUSE,                  NORID,  RESERVED},
+      {"RETURN",                       RETURN,                 NORID,  RESERVED},
+      {"STOP",                 STOP,                   NORID,  RESERVED},
+      {"after",                        AFTER,                  NORID,  RESERVED},
+      {"rem",                  REM,                    NORID,  RESERVED},
+      {"asm",                  ASM_KEYWORD,            NORID,  RESERVED},
+      {"forbid",                       FORBID,                 NORID,  RESERVED},
+      {"exit",                 EXIT,                   NORID,  RESERVED},
+      {"state_routine",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"priority",             PRIORITY,               NORID,  RESERVED},
+      {"access",                       ACCESS,                 NORID,  RESERVED},
+      {"RETURNS",              RETURNS,                NORID,  RESERVED},
+      {"begin",                        BEGINTOKEN,             NORID,  RESERVED},
+      {"spec",                 SPEC,                   NORID,  RESERVED},
+      {"page",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"elsif",                        ELSIF,                  NORID,  RESERVED},
+      {"TEXT",                 TEXT,                   NORID,  RESERVED},
+      {"START",                        START,                  NORID,  RESERVED},
+      {"array",                        ARRAY,                  NORID,  RESERVED},
+      {"remote",                       REMOTE,                 NORID,  RESERVED},
+      {"PROC",                 PROC,                   NORID,  RESERVED},
+      {"call",                 CALL,                   NORID,  RESERVED},
+      {"else",                 ELSE,                   NORID,  RESERVED},
+      {"DO",                   DO,                     NORID,  RESERVED},
+      {"print_o_code",         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"range",                        RANGE,                  NORID,  RESERVED},
+      {"dcl",                  DCL,                    NORID,  RESERVED},
+      {"all",                  ALL,                    NORID,  RESERVED},
+      {"empty_on",             EMPTY_ON,               NORID,  DIRECTIVE},
+      {"XOR",                  XOR,                    NORID,  RESERVED},
+      {"empty_off",            EMPTY_OFF,              NORID,  DIRECTIVE},
+      {"SEND",                 SEND,                   NORID,  RESERVED},
+      {"mod",                  MOD,                    NORID,  RESERVED},
+      {"REM",                  REM,                    NORID,  RESERVED},
+      {"general",              GENERAL,                NORID,  RESERVED},
+      {"NONREF",                       NONREF,                 NORID,  RESERVED},
+      {"CHARS",                        CHARS,                  NORID,  RESERVED},
+      {"based",                        BASED,                  NORID,  RESERVED},
+      {"IF",                   IF,                     NORID,  RESERVED},
+      {"range_on",             RANGE_ON,               NORID,  DIRECTIVE},
+      {"range_off",            RANGE_OFF,              NORID,  DIRECTIVE},
+      {"STEP",                 STEP,                   NORID,  RESERVED},
+      {"large",                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"reentrant_all",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ASSERT",                       ASSERT,                 NORID,  RESERVED},
+      {"PACK",                 PACK,                   NORID,  RESERVED},
+      {"OF",                   OF,                     NORID,  RESERVED},
+      {"AND",                  AND,                    NORID,  RESERVED},
+      {"ROW",                  ROW,                    NORID,  RESERVED},
+      {"EXIT",                 EXIT,                   NORID,  RESERVED},
+      {"exceptions",           EXCEPTIONS,             NORID,  RESERVED},
+      {"ASM",                  ASM_KEYWORD,            NORID,  RESERVED},
+      {"out",                  PARAMATTR,              RID_OUT,        RESERVED},
+      {"PRIORITY",             PRIORITY,               NORID,  RESERVED},
+      {"short_pred_succ",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"syn",                  SYN,                    NORID,  RESERVED},
+      {"process_type",         PROCESS_TYPE_TOKEN,     NORID,  DIRECTIVE},
+      {"READ",                 READ,                   RID_READ,       RESERVED},
+      {"BUFFER",                       BUFFER,                 NORID,  RESERVED},
+      {"body",                 BODY,                   NORID,  RESERVED},
+      {"ANDIF",                        ANDIF,                  NORID,  RESERVED},
+      {"STATIC",                       STATIC,                 NORID,  RESERVED},
+      {"NOLIST",                       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"nopack",                       NOPACK,                 NORID,  RESERVED},
+      {"STRUCT",                       STRUCT,                 NORID,  RESERVED},
+      {"END",                  END,                    NORID,  RESERVED},
+      {"delay",                        DELAY,                  NORID,  RESERVED},
+      {"seize",                        SEIZE,                  NORID,  RESERVED},
+      {"REENTRANT",            IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ESAC",                 ESAC,                   NORID,  RESERVED},
+      {"NOPACK",                       NOPACK,                 NORID,  RESERVED},
+      {"SPEC",                 SPEC,                   NORID,  RESERVED},
+      {"GOTO",                 GOTO,                   NORID,  RESERVED},
+      {"pack",                 PACK,                   NORID,  RESERVED},
+      {"by",                   BY,                     NORID,  RESERVED},
+      {"REGION",                       REGION,                 NORID,  RESERVED},
+      {"SYN",                  SYN,                    NORID,  RESERVED},
+      {"module",                       MODULE,                 NORID,  RESERVED},
+      {"RESULT",                       RESULT,                 NORID,  RESERVED},
+      {"CASE",                 CASE,                   NORID,  RESERVED},
+      {"all_static_on",                ALL_STATIC_ON,          NORID,  DIRECTIVE},
+      {"ARRAY",                        ARRAY,                  NORID,  RESERVED},
+      {"all_static_off",               ALL_STATIC_OFF,         NORID,  DIRECTIVE},
+      {"FORBID",                       FORBID,                 NORID,  RESERVED},
+      {"LOC",                  LOC,                    NORID,  RESERVED},
+      {"INLINE",                       INLINE,                 RID_INLINE,     RESERVED},
+      {"ELSIF",                        ELSIF,                  NORID,  RESERVED},
+      {"CCITT_OS",             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"row",                  ROW,                    NORID,  RESERVED},
+      {"GRANT",                        GRANT,                  NORID,  RESERVED},
+      {"BEGIN",                        BEGINTOKEN,             NORID,  RESERVED},
+      {"BOOLS",                        BOOLS,                  RID_BOOLS,      RESERVED},
+      {"PROCESS",              PROCESS,                NORID,  RESERVED},
+      {"BY",                   BY,                     NORID,  RESERVED},
+      {"EMPTY_ON",             EMPTY_ON,               NORID,  DIRECTIVE},
+      {"REMOTE",                       REMOTE,                 NORID,  RESERVED},
+      {"receive",              RECEIVE,                NORID,  RESERVED},
+      {"CONTINUE",             CONTINUE,               NORID,  RESERVED},
+      {"buffer",                       BUFFER,                 NORID,  RESERVED},
+      {"debug_lines",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"FI",                   FI,                     NORID,  RESERVED},
+      {"recursive",            RECURSIVE,              NORID,  RESERVED},
+      {"MOD",                  MOD,                    NORID,  RESERVED},
+      {"CAUSE",                        CAUSE,                  NORID,  RESERVED},
+      {"EMPTY_OFF",            EMPTY_OFF,              NORID,  DIRECTIVE},
+      {"medium",                       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"RECURSIVE",            RECURSIVE,              NORID,  RESERVED},
+      {"RECEIVE",              RECEIVE,                NORID,  RESERVED},
+      {"ever",                 EVER,                   NORID,  RESERVED},
+      {"cycle",                        CYCLE,                  NORID,  RESERVED},
+      {"even",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"only_for_target",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"event",                        EVENT,                  NORID,  RESERVED},
+      {"DOWN",                 DOWN,                   NORID,  RESERVED},
+      {"extra_const_seg",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"powerset",             POWERSET,               NORID,  RESERVED},
+      {"while",                        WHILE,                  NORID,  RESERVED},
+      {"BODY",                 BODY,                   NORID,  RESERVED},
+      {"fi",                   FI,                     NORID,  RESERVED},
+      {"EVEN",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ELSE",                 ELSE,                   NORID,  RESERVED},
+      {"down",                 DOWN,                   NORID,  RESERVED},
+      {"EVER",                 EVER,                   NORID,  RESERVED},
+      {"EVENT",                        EVENT,                  NORID,  RESERVED},
+      {"ALL",                  ALL,                    NORID,  RESERVED},
+      {"SEIZE",                        SEIZE,                  NORID,  RESERVED},
+      {"AFTER",                        AFTER,                  NORID,  RESERVED},
+      {"CONTEXT",              CONTEXT,                NORID,  RESERVED},
+      {"BIT",                  BOOLS,                  RID_BOOLS,      PREDEF},
+      {"debug_types",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"xor",                  XOR,                    NORID,  RESERVED},
+      {"text",                 TEXT,                   NORID,  RESERVED},
+      {"BIN",                  BIN,                    NORID,  RESERVED},
+      {"BASED",                        BASED,                  NORID,  RESERVED},
+      {"RANGE",                        RANGE,                  NORID,  RESERVED},
+      {"PAGE",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"generate_set_names",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"use_seize_file",               USE_SEIZE_FILE,         NORID,  DIRECTIVE},
+      {"list",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"bit",                  BOOLS,                  RID_BOOLS,      PREDEF},
+      {"SMALL",                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"bin",                  BIN,                    NORID,  RESERVED},
+      {"WHILE",                        WHILE,                  NORID,  RESERVED},
+      {"ACCESS",                       ACCESS,                 NORID,  RESERVED},
+      {"DCL",                  DCL,                    NORID,  RESERVED},
+      {"RANGE_ON",             RANGE_ON,               NORID,  DIRECTIVE},
+      {"VARYING",              VARYING,                NORID,  RESERVED},
+      {"only_for_simulation",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"synmode",              SYNMODE,                NORID,  RESERVED},
+      {"context",              CONTEXT,                NORID,  RESERVED},
+      {"buffer_code",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"RANGE_OFF",            RANGE_OFF,              NORID,  DIRECTIVE},
+      {"STATE_ROUTINE",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"grant_file_size",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"PRINT_O_CODE",         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"dynamic",              DYNAMIC,                RID_DYNAMIC,    RESERVED},
+      {"optimize",             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"POWERSET",             POWERSET,               NORID,  RESERVED},
+      {"CALL",                 CALL,                   NORID,  RESERVED},
+      {"event_code",           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"WITH",                 WITH,                   NORID,  RESERVED},
+      {"DELAY",                        DELAY,                  NORID,  RESERVED},
+      {"LIST",                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"varying",              VARYING,                NORID,  RESERVED},
+      {"EXCEPTIONS",           EXCEPTIONS,             NORID,  RESERVED},
+      {"prefixed",             PREFIXED,               NORID,  RESERVED},
+      {"signal",                       SIGNAL,                 NORID,  RESERVED},
+      {"generate_all_set_names",       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"newmode",              NEWMODE,                NORID,  RESERVED},
+      {"MEDIUM",                       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"timeout",              TIMEOUT,                NORID,  RESERVED},
+      {"print_symbol_table",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"PREFIXED",             PREFIXED,               NORID,  RESERVED},
+      {"LARGE",                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"simple",                       SIMPLE,                 NORID,  RESERVED},
+      {"GENERAL",              GENERAL,                NORID,  RESERVED},
+      {"send_buffer_default_priority", SEND_BUFFER_DEFAULT_PRIORITY,   NORID,  DIRECTIVE},
+      {"PROCESS_TYPE",         PROCESS_TYPE_TOKEN,     NORID,  DIRECTIVE},
+      {"OPTIMIZE",             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"debug_symbols",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"BUFFER_CODE",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"use_seize_file_restricted",    USE_SEIZE_FILE_RESTRICTED,      NORID,  DIRECTIVE},
+      {"NEWMODE",              NEWMODE,                NORID,  RESERVED},
+      {"send_signal_default_priority", SEND_SIGNAL_DEFAULT_PRIORITY,   NORID,  DIRECTIVE},
+      {"no_overlap_check",     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ALL_STATIC_ON",                ALL_STATIC_ON,          NORID,  DIRECTIVE},
+      {"support_causing_address",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SHORT_PRED_SUCC",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"MODULE",                       MODULE,                 NORID,  RESERVED},
+      {"REENTRANT_ALL",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"TIMEOUT",              TIMEOUT,                NORID,  RESERVED},
+      {"ALL_STATIC_OFF",               ALL_STATIC_OFF,         NORID,  DIRECTIVE},
+      {"with",                 WITH,                   NORID,  RESERVED},
+      {"signal_code",          SIGNAL_CODE,            NORID,  DIRECTIVE},
+      {"multiple_const_segs",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"optimize_runtime",     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"CYCLE",                        CYCLE,                  NORID,  RESERVED},
+      {"SYNMODE",              SYNMODE,                NORID,  RESERVED},
+      {"multiple_data_segs",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"DYNAMIC",              DYNAMIC,                RID_DYNAMIC,    RESERVED},
+      {"EVENT_CODE",           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SIGNAL",                       SIGNAL,                 NORID,  RESERVED},
+      {"DEBUG_TYPES",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ONLY_FOR_TARGET",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SIMPLE",                       SIMPLE,                 NORID,  RESERVED},
+      {"DEBUG_LINES",          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"NO_OVERLAP_CHECK",     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"EXTRA_CONST_SEG",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"ONLY_FOR_SIMULATION",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"make_publics_for_discrete_syns",       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"USE_SEIZE_FILE",               USE_SEIZE_FILE,         NORID,  DIRECTIVE},
+      {"OPTIMIZE_RUNTIME",     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"GRANT_FILE_SIZE",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"GENERATE_SET_NAMES",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"PRINT_SYMBOL_TABLE",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"DEBUG_SYMBOLS",                IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"OPTIMIZATION_WINDOW",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SIGNAL_CODE",          SIGNAL_CODE,            NORID,  DIRECTIVE},
+      {"SUPPORT_CAUSING_ADDRESS",      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"MULTIPLE_CONST_SEGS",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"optimization_window",  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"signal_max_length",    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SEND_BUFFER_DEFAULT_PRIORITY", SEND_BUFFER_DEFAULT_PRIORITY,   NORID,  DIRECTIVE},
+      {"MULTIPLE_DATA_SEGS",   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"GENERATE_ALL_SET_NAMES",       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"USE_SEIZE_FILE_RESTRICTED",    USE_SEIZE_FILE_RESTRICTED,      NORID,  DIRECTIVE},
+      {"SEND_SIGNAL_DEFAULT_PRIORITY", SEND_SIGNAL_DEFAULT_PRIORITY,   NORID,  DIRECTIVE},
+      {"MAKE_PUBLICS_FOR_DISCRETE_SYNS",       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE},
+      {"SIGNAL_MAX_LENGTH",    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+        {
+          register struct resword *resword;
+
+          switch (key - 4)
+            {
+              case 0:
+                resword = &wordlist[0];
+                goto compare;
+              case 1:
+                resword = &wordlist[1];
+                goto compare;
+              case 2:
+                resword = &wordlist[2];
+                goto compare;
+              case 3:
+                resword = &wordlist[3];
+                goto compare;
+              case 4:
+                resword = &wordlist[4];
+                goto compare;
+              case 5:
+                resword = &wordlist[5];
+                goto compare;
+              case 6:
+                resword = &wordlist[6];
+                goto compare;
+              case 7:
+                resword = &wordlist[7];
+                goto compare;
+              case 8:
+                resword = &wordlist[8];
+                goto compare;
+              case 9:
+                resword = &wordlist[9];
+                goto compare;
+              case 10:
+                resword = &wordlist[10];
+                goto compare;
+              case 11:
+                resword = &wordlist[11];
+                goto compare;
+              case 12:
+                resword = &wordlist[12];
+                goto compare;
+              case 14:
+                resword = &wordlist[13];
+                goto compare;
+              case 16:
+                resword = &wordlist[14];
+                goto compare;
+              case 17:
+                resword = &wordlist[15];
+                goto compare;
+              case 18:
+                resword = &wordlist[16];
+                goto compare;
+              case 19:
+                resword = &wordlist[17];
+                goto compare;
+              case 20:
+                resword = &wordlist[18];
+                goto compare;
+              case 21:
+                resword = &wordlist[19];
+                goto compare;
+              case 22:
+                resword = &wordlist[20];
+                goto compare;
+              case 23:
+                resword = &wordlist[21];
+                goto compare;
+              case 24:
+                resword = &wordlist[22];
+                goto compare;
+              case 25:
+                resword = &wordlist[23];
+                goto compare;
+              case 26:
+                resword = &wordlist[24];
+                goto compare;
+              case 27:
+                resword = &wordlist[25];
+                goto compare;
+              case 28:
+                resword = &wordlist[26];
+                goto compare;
+              case 30:
+                resword = &wordlist[27];
+                goto compare;
+              case 32:
+                resword = &wordlist[28];
+                goto compare;
+              case 34:
+                resword = &wordlist[29];
+                goto compare;
+              case 35:
+                resword = &wordlist[30];
+                goto compare;
+              case 36:
+                resword = &wordlist[31];
+                goto compare;
+              case 37:
+                resword = &wordlist[32];
+                goto compare;
+              case 38:
+                resword = &wordlist[33];
+                goto compare;
+              case 39:
+                resword = &wordlist[34];
+                goto compare;
+              case 40:
+                resword = &wordlist[35];
+                goto compare;
+              case 41:
+                resword = &wordlist[36];
+                goto compare;
+              case 42:
+                resword = &wordlist[37];
+                goto compare;
+              case 43:
+                resword = &wordlist[38];
+                goto compare;
+              case 44:
+                resword = &wordlist[39];
+                goto compare;
+              case 45:
+                resword = &wordlist[40];
+                goto compare;
+              case 46:
+                resword = &wordlist[41];
+                goto compare;
+              case 47:
+                resword = &wordlist[42];
+                goto compare;
+              case 48:
+                resword = &wordlist[43];
+                goto compare;
+              case 50:
+                resword = &wordlist[44];
+                goto compare;
+              case 51:
+                resword = &wordlist[45];
+                goto compare;
+              case 52:
+                resword = &wordlist[46];
+                goto compare;
+              case 53:
+                resword = &wordlist[47];
+                goto compare;
+              case 54:
+                resword = &wordlist[48];
+                goto compare;
+              case 55:
+                resword = &wordlist[49];
+                goto compare;
+              case 56:
+                resword = &wordlist[50];
+                goto compare;
+              case 57:
+                resword = &wordlist[51];
+                goto compare;
+              case 58:
+                resword = &wordlist[52];
+                goto compare;
+              case 59:
+                resword = &wordlist[53];
+                goto compare;
+              case 60:
+                resword = &wordlist[54];
+                goto compare;
+              case 61:
+                resword = &wordlist[55];
+                goto compare;
+              case 62:
+                resword = &wordlist[56];
+                goto compare;
+              case 63:
+                resword = &wordlist[57];
+                goto compare;
+              case 64:
+                resword = &wordlist[58];
+                goto compare;
+              case 65:
+                resword = &wordlist[59];
+                goto compare;
+              case 66:
+                resword = &wordlist[60];
+                goto compare;
+              case 68:
+                resword = &wordlist[61];
+                goto compare;
+              case 69:
+                resword = &wordlist[62];
+                goto compare;
+              case 70:
+                resword = &wordlist[63];
+                goto compare;
+              case 71:
+                resword = &wordlist[64];
+                goto compare;
+              case 72:
+                resword = &wordlist[65];
+                goto compare;
+              case 73:
+                resword = &wordlist[66];
+                goto compare;
+              case 74:
+                resword = &wordlist[67];
+                goto compare;
+              case 75:
+                resword = &wordlist[68];
+                goto compare;
+              case 77:
+                resword = &wordlist[69];
+                goto compare;
+              case 79:
+                resword = &wordlist[70];
+                goto compare;
+              case 80:
+                resword = &wordlist[71];
+                goto compare;
+              case 81:
+                resword = &wordlist[72];
+                goto compare;
+              case 82:
+                resword = &wordlist[73];
+                goto compare;
+              case 83:
+                resword = &wordlist[74];
+                goto compare;
+              case 86:
+                resword = &wordlist[75];
+                goto compare;
+              case 88:
+                resword = &wordlist[76];
+                goto compare;
+              case 89:
+                resword = &wordlist[77];
+                goto compare;
+              case 91:
+                resword = &wordlist[78];
+                goto compare;
+              case 92:
+                resword = &wordlist[79];
+                goto compare;
+              case 93:
+                resword = &wordlist[80];
+                goto compare;
+              case 94:
+                resword = &wordlist[81];
+                goto compare;
+              case 95:
+                resword = &wordlist[82];
+                goto compare;
+              case 98:
+                resword = &wordlist[83];
+                goto compare;
+              case 99:
+                resword = &wordlist[84];
+                goto compare;
+              case 100:
+                resword = &wordlist[85];
+                goto compare;
+              case 101:
+                resword = &wordlist[86];
+                goto compare;
+              case 102:
+                resword = &wordlist[87];
+                goto compare;
+              case 103:
+                resword = &wordlist[88];
+                goto compare;
+              case 104:
+                resword = &wordlist[89];
+                goto compare;
+              case 106:
+                resword = &wordlist[90];
+                goto compare;
+              case 107:
+                resword = &wordlist[91];
+                goto compare;
+              case 108:
+                resword = &wordlist[92];
+                goto compare;
+              case 109:
+                resword = &wordlist[93];
+                goto compare;
+              case 110:
+                resword = &wordlist[94];
+                goto compare;
+              case 111:
+                resword = &wordlist[95];
+                goto compare;
+              case 112:
+                resword = &wordlist[96];
+                goto compare;
+              case 113:
+                resword = &wordlist[97];
+                goto compare;
+              case 115:
+                resword = &wordlist[98];
+                goto compare;
+              case 116:
+                resword = &wordlist[99];
+                goto compare;
+              case 117:
+                resword = &wordlist[100];
+                goto compare;
+              case 118:
+                resword = &wordlist[101];
+                goto compare;
+              case 120:
+                resword = &wordlist[102];
+                goto compare;
+              case 121:
+                resword = &wordlist[103];
+                goto compare;
+              case 122:
+                resword = &wordlist[104];
+                goto compare;
+              case 123:
+                resword = &wordlist[105];
+                goto compare;
+              case 125:
+                resword = &wordlist[106];
+                goto compare;
+              case 126:
+                resword = &wordlist[107];
+                goto compare;
+              case 127:
+                resword = &wordlist[108];
+                goto compare;
+              case 128:
+                resword = &wordlist[109];
+                goto compare;
+              case 129:
+                resword = &wordlist[110];
+                goto compare;
+              case 131:
+                resword = &wordlist[111];
+                goto compare;
+              case 132:
+                resword = &wordlist[112];
+                goto compare;
+              case 133:
+                resword = &wordlist[113];
+                goto compare;
+              case 134:
+                resword = &wordlist[114];
+                goto compare;
+              case 135:
+                resword = &wordlist[115];
+                goto compare;
+              case 136:
+                resword = &wordlist[116];
+                goto compare;
+              case 137:
+                resword = &wordlist[117];
+                goto compare;
+              case 138:
+                resword = &wordlist[118];
+                goto compare;
+              case 139:
+                resword = &wordlist[119];
+                goto compare;
+              case 142:
+                resword = &wordlist[120];
+                goto compare;
+              case 143:
+                resword = &wordlist[121];
+                goto compare;
+              case 144:
+                resword = &wordlist[122];
+                goto compare;
+              case 145:
+                resword = &wordlist[123];
+                goto compare;
+              case 146:
+                resword = &wordlist[124];
+                goto compare;
+              case 147:
+                resword = &wordlist[125];
+                goto compare;
+              case 148:
+                resword = &wordlist[126];
+                goto compare;
+              case 149:
+                resword = &wordlist[127];
+                goto compare;
+              case 150:
+                resword = &wordlist[128];
+                goto compare;
+              case 151:
+                resword = &wordlist[129];
+                goto compare;
+              case 152:
+                resword = &wordlist[130];
+                goto compare;
+              case 153:
+                resword = &wordlist[131];
+                goto compare;
+              case 154:
+                resword = &wordlist[132];
+                goto compare;
+              case 155:
+                resword = &wordlist[133];
+                goto compare;
+              case 156:
+                resword = &wordlist[134];
+                goto compare;
+              case 157:
+                resword = &wordlist[135];
+                goto compare;
+              case 159:
+                resword = &wordlist[136];
+                goto compare;
+              case 161:
+                resword = &wordlist[137];
+                goto compare;
+              case 162:
+                resword = &wordlist[138];
+                goto compare;
+              case 163:
+                resword = &wordlist[139];
+                goto compare;
+              case 164:
+                resword = &wordlist[140];
+                goto compare;
+              case 165:
+                resword = &wordlist[141];
+                goto compare;
+              case 166:
+                resword = &wordlist[142];
+                goto compare;
+              case 167:
+                resword = &wordlist[143];
+                goto compare;
+              case 169:
+                resword = &wordlist[144];
+                goto compare;
+              case 170:
+                resword = &wordlist[145];
+                goto compare;
+              case 173:
+                resword = &wordlist[146];
+                goto compare;
+              case 175:
+                resword = &wordlist[147];
+                goto compare;
+              case 176:
+                resword = &wordlist[148];
+                goto compare;
+              case 177:
+                resword = &wordlist[149];
+                goto compare;
+              case 178:
+                resword = &wordlist[150];
+                goto compare;
+              case 179:
+                resword = &wordlist[151];
+                goto compare;
+              case 180:
+                resword = &wordlist[152];
+                goto compare;
+              case 181:
+                resword = &wordlist[153];
+                goto compare;
+              case 183:
+                resword = &wordlist[154];
+                goto compare;
+              case 184:
+                resword = &wordlist[155];
+                goto compare;
+              case 188:
+                resword = &wordlist[156];
+                goto compare;
+              case 189:
+                resword = &wordlist[157];
+                goto compare;
+              case 190:
+                resword = &wordlist[158];
+                goto compare;
+              case 191:
+                resword = &wordlist[159];
+                goto compare;
+              case 194:
+                resword = &wordlist[160];
+                goto compare;
+              case 195:
+                resword = &wordlist[161];
+                goto compare;
+              case 196:
+                resword = &wordlist[162];
+                goto compare;
+              case 197:
+                resword = &wordlist[163];
+                goto compare;
+              case 198:
+                resword = &wordlist[164];
+                goto compare;
+              case 200:
+                resword = &wordlist[165];
+                goto compare;
+              case 201:
+                resword = &wordlist[166];
+                goto compare;
+              case 203:
+                resword = &wordlist[167];
+                goto compare;
+              case 204:
+                resword = &wordlist[168];
+                goto compare;
+              case 205:
+                resword = &wordlist[169];
+                goto compare;
+              case 207:
+                resword = &wordlist[170];
+                goto compare;
+              case 208:
+                resword = &wordlist[171];
+                goto compare;
+              case 209:
+                resword = &wordlist[172];
+                goto compare;
+              case 212:
+                resword = &wordlist[173];
+                goto compare;
+              case 213:
+                resword = &wordlist[174];
+                goto compare;
+              case 215:
+                resword = &wordlist[175];
+                goto compare;
+              case 216:
+                resword = &wordlist[176];
+                goto compare;
+              case 217:
+                resword = &wordlist[177];
+                goto compare;
+              case 218:
+                resword = &wordlist[178];
+                goto compare;
+              case 219:
+                resword = &wordlist[179];
+                goto compare;
+              case 220:
+                resword = &wordlist[180];
+                goto compare;
+              case 221:
+                resword = &wordlist[181];
+                goto compare;
+              case 222:
+                resword = &wordlist[182];
+                goto compare;
+              case 223:
+                resword = &wordlist[183];
+                goto compare;
+              case 225:
+                resword = &wordlist[184];
+                goto compare;
+              case 227:
+                resword = &wordlist[185];
+                goto compare;
+              case 229:
+                resword = &wordlist[186];
+                goto compare;
+              case 231:
+                resword = &wordlist[187];
+                goto compare;
+              case 232:
+                resword = &wordlist[188];
+                goto compare;
+              case 234:
+                resword = &wordlist[189];
+                goto compare;
+              case 235:
+                resword = &wordlist[190];
+                goto compare;
+              case 236:
+                resword = &wordlist[191];
+                goto compare;
+              case 237:
+                resword = &wordlist[192];
+                goto compare;
+              case 238:
+                resword = &wordlist[193];
+                goto compare;
+              case 240:
+                resword = &wordlist[194];
+                goto compare;
+              case 242:
+                resword = &wordlist[195];
+                goto compare;
+              case 243:
+                resword = &wordlist[196];
+                goto compare;
+              case 245:
+                resword = &wordlist[197];
+                goto compare;
+              case 246:
+                resword = &wordlist[198];
+                goto compare;
+              case 247:
+                resword = &wordlist[199];
+                goto compare;
+              case 248:
+                resword = &wordlist[200];
+                goto compare;
+              case 249:
+                resword = &wordlist[201];
+                goto compare;
+              case 250:
+                resword = &wordlist[202];
+                goto compare;
+              case 251:
+                resword = &wordlist[203];
+                goto compare;
+              case 253:
+                resword = &wordlist[204];
+                goto compare;
+              case 254:
+                resword = &wordlist[205];
+                goto compare;
+              case 258:
+                resword = &wordlist[206];
+                goto compare;
+              case 261:
+                resword = &wordlist[207];
+                goto compare;
+              case 263:
+                resword = &wordlist[208];
+                goto compare;
+              case 264:
+                resword = &wordlist[209];
+                goto compare;
+              case 265:
+                resword = &wordlist[210];
+                goto compare;
+              case 266:
+                resword = &wordlist[211];
+                goto compare;
+              case 271:
+                resword = &wordlist[212];
+                goto compare;
+              case 273:
+                resword = &wordlist[213];
+                goto compare;
+              case 276:
+                resword = &wordlist[214];
+                goto compare;
+              case 277:
+                resword = &wordlist[215];
+                goto compare;
+              case 281:
+                resword = &wordlist[216];
+                goto compare;
+              case 282:
+                resword = &wordlist[217];
+                goto compare;
+              case 284:
+                resword = &wordlist[218];
+                goto compare;
+              case 289:
+                resword = &wordlist[219];
+                goto compare;
+              case 290:
+                resword = &wordlist[220];
+                goto compare;
+              case 293:
+                resword = &wordlist[221];
+                goto compare;
+              case 296:
+                resword = &wordlist[222];
+                goto compare;
+              case 297:
+                resword = &wordlist[223];
+                goto compare;
+              case 298:
+                resword = &wordlist[224];
+                goto compare;
+              case 299:
+                resword = &wordlist[225];
+                goto compare;
+              case 300:
+                resword = &wordlist[226];
+                goto compare;
+              case 303:
+                resword = &wordlist[227];
+                goto compare;
+              case 307:
+                resword = &wordlist[228];
+                goto compare;
+              case 308:
+                resword = &wordlist[229];
+                goto compare;
+              case 311:
+                resword = &wordlist[230];
+                goto compare;
+              case 313:
+                resword = &wordlist[231];
+                goto compare;
+              case 317:
+                resword = &wordlist[232];
+                goto compare;
+              case 318:
+                resword = &wordlist[233];
+                goto compare;
+              case 319:
+                resword = &wordlist[234];
+                goto compare;
+              case 324:
+                resword = &wordlist[235];
+                goto compare;
+              case 328:
+                resword = &wordlist[236];
+                goto compare;
+              case 334:
+                resword = &wordlist[237];
+                goto compare;
+              case 336:
+                resword = &wordlist[238];
+                goto compare;
+              case 337:
+                resword = &wordlist[239];
+                goto compare;
+              case 339:
+                resword = &wordlist[240];
+                goto compare;
+              case 341:
+                resword = &wordlist[241];
+                goto compare;
+              case 342:
+                resword = &wordlist[242];
+                goto compare;
+              case 347:
+                resword = &wordlist[243];
+                goto compare;
+              case 348:
+                resword = &wordlist[244];
+                goto compare;
+              case 358:
+                resword = &wordlist[245];
+                goto compare;
+              case 364:
+                resword = &wordlist[246];
+                goto compare;
+              case 367:
+                resword = &wordlist[247];
+                goto compare;
+              case 371:
+                resword = &wordlist[248];
+                goto compare;
+              case 373:
+                resword = &wordlist[249];
+                goto compare;
+              case 378:
+                resword = &wordlist[250];
+                goto compare;
+              case 380:
+                resword = &wordlist[251];
+                goto compare;
+              case 385:
+                resword = &wordlist[252];
+                goto compare;
+              case 388:
+                resword = &wordlist[253];
+                goto compare;
+              case 398:
+                resword = &wordlist[254];
+                goto compare;
+              case 402:
+                resword = &wordlist[255];
+                goto compare;
+              case 403:
+                resword = &wordlist[256];
+                goto compare;
+              case 408:
+                resword = &wordlist[257];
+                goto compare;
+              case 411:
+                resword = &wordlist[258];
+                goto compare;
+              case 412:
+                resword = &wordlist[259];
+                goto compare;
+              case 416:
+                resword = &wordlist[260];
+                goto compare;
+              case 417:
+                resword = &wordlist[261];
+                goto compare;
+              case 418:
+                resword = &wordlist[262];
+                goto compare;
+              case 420:
+                resword = &wordlist[263];
+                goto compare;
+              case 422:
+                resword = &wordlist[264];
+                goto compare;
+              case 423:
+                resword = &wordlist[265];
+                goto compare;
+              case 432:
+                resword = &wordlist[266];
+                goto compare;
+              case 437:
+                resword = &wordlist[267];
+                goto compare;
+              case 440:
+                resword = &wordlist[268];
+                goto compare;
+              case 454:
+                resword = &wordlist[269];
+                goto compare;
+              case 456:
+                resword = &wordlist[270];
+                goto compare;
+              case 469:
+                resword = &wordlist[271];
+                goto compare;
+              case 492:
+                resword = &wordlist[272];
+                goto compare;
+              case 495:
+                resword = &wordlist[273];
+                goto compare;
+              case 501:
+                resword = &wordlist[274];
+                goto compare;
+              case 502:
+                resword = &wordlist[275];
+                goto compare;
+              case 504:
+                resword = &wordlist[276];
+                goto compare;
+              case 505:
+                resword = &wordlist[277];
+                goto compare;
+              case 509:
+                resword = &wordlist[278];
+                goto compare;
+              case 574:
+                resword = &wordlist[279];
+                goto compare;
+              case 581:
+                resword = &wordlist[280];
+                goto compare;
+              case 587:
+                resword = &wordlist[281];
+                goto compare;
+              case 607:
+                resword = &wordlist[282];
+                goto compare;
+              case 621:
+                resword = &wordlist[283];
+                goto compare;
+              case 649:
+                resword = &wordlist[284];
+                goto compare;
+              case 674:
+                resword = &wordlist[285];
+                goto compare;
+              case 680:
+                resword = &wordlist[286];
+                goto compare;
+              case 712:
+                resword = &wordlist[287];
+                goto compare;
+              case 721:
+                resword = &wordlist[288];
+                goto compare;
+              case 724:
+                resword = &wordlist[289];
+                goto compare;
+              case 741:
+                resword = &wordlist[290];
+                goto compare;
+              case 751:
+                resword = &wordlist[291];
+                goto compare;
+              case 790:
+                resword = &wordlist[292];
+                goto compare;
+              case 812:
+                resword = &wordlist[293];
+                goto compare;
+              case 817:
+                resword = &wordlist[294];
+                goto compare;
+              case 902:
+                resword = &wordlist[295];
+                goto compare;
+              case 917:
+                resword = &wordlist[296];
+                goto compare;
+              case 932:
+                resword = &wordlist[297];
+                goto compare;
+              case 981:
+                resword = &wordlist[298];
+                goto compare;
+              case 1045:
+                resword = &wordlist[299];
+                goto compare;
+            }
+          return 0;
+        compare:
+          {
+            register const char *s = resword->name;
+
+            if (*str == *s && !strcmp (str + 1, s + 1))
+              return resword;
+          }
+        }
+    }
+  return 0;
+}
diff --git a/tests/chill.gperf b/tests/chill.gperf
new file mode 100644 (file)
index 0000000..4461bdf
--- /dev/null
@@ -0,0 +1,308 @@
+struct resword {
+  const char  *name;
+  short        token;
+  enum rid     rid;
+  enum toktype { RESERVED, DIRECTIVE, PREDEF } flags;
+};
+extern tree ridpointers [];
+%%
+access,                        ACCESS,                 NORID,  RESERVED
+after,                 AFTER,                  NORID,  RESERVED
+all,                   ALL,                    NORID,  RESERVED
+all_static_off,                ALL_STATIC_OFF,         NORID,  DIRECTIVE
+all_static_on,         ALL_STATIC_ON,          NORID,  DIRECTIVE
+and,                   AND,                    NORID,  RESERVED
+andif,                 ANDIF,                  NORID,  RESERVED
+array,                 ARRAY,                  NORID,  RESERVED
+asm,                   ASM_KEYWORD,            NORID,  RESERVED
+assert,                        ASSERT,                 NORID,  RESERVED
+at,                    AT,                     NORID,  RESERVED
+based,                 BASED,                  NORID,  RESERVED
+begin,                 BEGINTOKEN,             NORID,  RESERVED
+bin,                   BIN,                    NORID,  RESERVED
+bit,                   BOOLS,                  RID_BOOLS,      PREDEF
+body,                  BODY,                   NORID,  RESERVED
+bools,                 BOOLS,                  RID_BOOLS,      RESERVED
+buffer,                        BUFFER,                 NORID,  RESERVED
+buffer_code,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+by,                    BY,                     NORID,  RESERVED
+call,                  CALL,                   NORID,  RESERVED
+case,                  CASE,                   NORID,  RESERVED
+cause,                 CAUSE,                  NORID,  RESERVED
+ccitt_os,              IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+chars,                 CHARS,                  NORID,  RESERVED
+context,               CONTEXT,                NORID,  RESERVED
+continue,              CONTINUE,               NORID,  RESERVED
+cycle,                 CYCLE,                  NORID,  RESERVED
+dcl,                   DCL,                    NORID,  RESERVED
+debug_lines,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+debug_symbols,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+debug_types,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+delay,                 DELAY,                  NORID,  RESERVED
+do,                    DO,                     NORID,  RESERVED
+down,                  DOWN,                   NORID,  RESERVED
+dynamic,               DYNAMIC,                RID_DYNAMIC,    RESERVED
+else,                  ELSE,                   NORID,  RESERVED
+elsif,                 ELSIF,                  NORID,  RESERVED
+empty_off,             EMPTY_OFF,              NORID,  DIRECTIVE
+empty_on,              EMPTY_ON,               NORID,  DIRECTIVE
+end,                   END,                    NORID,  RESERVED
+esac,                  ESAC,                   NORID,  RESERVED
+even,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+event,                 EVENT,                  NORID,  RESERVED
+event_code,            IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+ever,                  EVER,                   NORID,  RESERVED
+exceptions,            EXCEPTIONS,             NORID,  RESERVED
+exit,                  EXIT,                   NORID,  RESERVED
+extra_const_seg,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+far,                   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+fi,                    FI,                     NORID,  RESERVED
+for,                   FOR,                    NORID,  RESERVED
+forbid,                        FORBID,                 NORID,  RESERVED
+general,               GENERAL,                NORID,  RESERVED
+generate_all_set_names,        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+generate_set_names,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+goto,                  GOTO,                   NORID,  RESERVED
+grant,                 GRANT,                  NORID,  RESERVED
+grant_file_size,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+if,                    IF,                     NORID,  RESERVED
+in,                    IN,                     RID_IN, RESERVED
+init,                  INIT,                   NORID,  RESERVED
+inline,                        INLINE,                 RID_INLINE,     RESERVED
+inout,                 PARAMATTR,              RID_INOUT,      RESERVED
+large,                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+list,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+loc,                   LOC,                    NORID,  RESERVED
+make_publics_for_discrete_syns,        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+medium,                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+mod,                   MOD,                    NORID,  RESERVED
+module,                        MODULE,                 NORID,  RESERVED
+multiple_const_segs,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+multiple_data_segs,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+newmode,               NEWMODE,                NORID,  RESERVED
+nolist,                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+no_overlap_check,      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+nonref,                        NONREF,                 NORID,  RESERVED
+nopack,                        NOPACK,                 NORID,  RESERVED
+not,                   NOT,                    NORID,  RESERVED
+od,                    OD,                     NORID,  RESERVED
+of,                    OF,                     NORID,  RESERVED
+on,                    ON,                     NORID,  RESERVED
+only_for_simulation,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+only_for_target,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+optimize,              IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+optimize_runtime,      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+optimization_window,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+or,                    OR,                     NORID,  RESERVED
+orif,                  ORIF,                   NORID,  RESERVED
+out,                   PARAMATTR,              RID_OUT,        RESERVED
+pack,                  PACK,                   NORID,  RESERVED
+page,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+pos,                   POS,                    NORID,  RESERVED
+powerset,              POWERSET,               NORID,  RESERVED
+prefixed,              PREFIXED,               NORID,  RESERVED
+print_o_code,          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+print_symbol_table,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+priority,              PRIORITY,               NORID,  RESERVED
+proc,                  PROC,                   NORID,  RESERVED
+process,               PROCESS,                NORID,  RESERVED
+process_type,          PROCESS_TYPE_TOKEN,     NORID,  DIRECTIVE
+range,                 RANGE,                  NORID,  RESERVED
+range_off,             RANGE_OFF,              NORID,  DIRECTIVE
+range_on,              RANGE_ON,               NORID,  DIRECTIVE
+read,                  READ,                   RID_READ,       RESERVED
+receive,               RECEIVE,                NORID,  RESERVED
+recursive,             RECURSIVE,              NORID,  RESERVED
+reentrant,             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+reentrant_all,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+ref,                   REF,                    NORID,  RESERVED
+region,                        REGION,                 NORID,  RESERVED
+rem,                   REM,                    NORID,  RESERVED
+remote,                        REMOTE,                 NORID,  RESERVED
+result,                        RESULT,                 NORID,  RESERVED
+return,                        RETURN,                 NORID,  RESERVED
+returns,               RETURNS,                NORID,  RESERVED
+row,                   ROW,                    NORID,  RESERVED
+seize,                 SEIZE,                  NORID,  RESERVED
+send,                  SEND,                   NORID,  RESERVED
+send_buffer_default_priority,  SEND_BUFFER_DEFAULT_PRIORITY,   NORID,  DIRECTIVE
+send_signal_default_priority,  SEND_SIGNAL_DEFAULT_PRIORITY,   NORID,  DIRECTIVE
+set,                   SET,                    NORID,  RESERVED
+short_pred_succ,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+signal,                        SIGNAL,                 NORID,  RESERVED
+signal_code,           SIGNAL_CODE,            NORID,  DIRECTIVE
+signal_max_length,     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+simple,                        SIMPLE,                 NORID,  RESERVED
+small,                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+spec,                  SPEC,                   NORID,  RESERVED
+start,                 START,                  NORID,  RESERVED
+state_routine,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+static,                        STATIC,                 NORID,  RESERVED
+step,                  STEP,                   NORID,  RESERVED
+stop,                  STOP,                   NORID,  RESERVED
+struct,                        STRUCT,                 NORID,  RESERVED
+support_causing_address,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+syn,                   SYN,                    NORID,  RESERVED
+synmode,               SYNMODE,                NORID,  RESERVED
+text,                  TEXT,                   NORID,  RESERVED
+then,                  THEN,                   NORID,  RESERVED
+this,                  THIS,                   NORID,  RESERVED
+timeout,               TIMEOUT,                NORID,  RESERVED
+to,                    TO,                     NORID,  RESERVED
+up,                    UP,                     NORID,  RESERVED
+use_seize_file,                USE_SEIZE_FILE,         NORID,  DIRECTIVE
+use_seize_file_restricted,     USE_SEIZE_FILE_RESTRICTED,      NORID,  DIRECTIVE
+varying,               VARYING,                NORID,  RESERVED
+while,                 WHILE,                  NORID,  RESERVED
+with,                  WITH,                   NORID,  RESERVED
+xor,                   XOR,                    NORID,  RESERVED
+ACCESS,                        ACCESS,                 NORID,  RESERVED
+AFTER,                 AFTER,                  NORID,  RESERVED
+ALL,                   ALL,                    NORID,  RESERVED
+ALL_STATIC_OFF,                ALL_STATIC_OFF,         NORID,  DIRECTIVE
+ALL_STATIC_ON,         ALL_STATIC_ON,          NORID,  DIRECTIVE
+AND,                   AND,                    NORID,  RESERVED
+ANDIF,                 ANDIF,                  NORID,  RESERVED
+ARRAY,                 ARRAY,                  NORID,  RESERVED
+ASM,                   ASM_KEYWORD,            NORID,  RESERVED
+ASSERT,                        ASSERT,                 NORID,  RESERVED
+AT,                    AT,                     NORID,  RESERVED
+BASED,                 BASED,                  NORID,  RESERVED
+BEGIN,                 BEGINTOKEN,             NORID,  RESERVED
+BIN,                   BIN,                    NORID,  RESERVED
+BIT,                   BOOLS,                  RID_BOOLS,      PREDEF
+BODY,                  BODY,                   NORID,  RESERVED
+BOOLS,                 BOOLS,                  RID_BOOLS,      RESERVED
+BUFFER,                        BUFFER,                 NORID,  RESERVED
+BUFFER_CODE,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+BY,                    BY,                     NORID,  RESERVED
+CALL,                  CALL,                   NORID,  RESERVED
+CASE,                  CASE,                   NORID,  RESERVED
+CAUSE,                 CAUSE,                  NORID,  RESERVED
+CCITT_OS,              IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+CHARS,                 CHARS,                  NORID,  RESERVED
+CONTEXT,               CONTEXT,                NORID,  RESERVED
+CONTINUE,              CONTINUE,               NORID,  RESERVED
+CYCLE,                 CYCLE,                  NORID,  RESERVED
+DCL,                   DCL,                    NORID,  RESERVED
+DEBUG_LINES,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+DEBUG_SYMBOLS,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+DEBUG_TYPES,           IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+DELAY,                 DELAY,                  NORID,  RESERVED
+DO,                    DO,                     NORID,  RESERVED
+DOWN,                  DOWN,                   NORID,  RESERVED
+DYNAMIC,               DYNAMIC,                RID_DYNAMIC,    RESERVED
+ELSE,                  ELSE,                   NORID,  RESERVED
+ELSIF,                 ELSIF,                  NORID,  RESERVED
+EMPTY_OFF,             EMPTY_OFF,              NORID,  DIRECTIVE
+EMPTY_ON,              EMPTY_ON,               NORID,  DIRECTIVE
+END,                   END,                    NORID,  RESERVED
+ESAC,                  ESAC,                   NORID,  RESERVED
+EVEN,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+EVENT,                 EVENT,                  NORID,  RESERVED
+EVENT_CODE,            IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+EVER,                  EVER,                   NORID,  RESERVED
+EXCEPTIONS,            EXCEPTIONS,             NORID,  RESERVED
+EXIT,                  EXIT,                   NORID,  RESERVED
+EXTRA_CONST_SEG,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+FAR,                   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+FI,                    FI,                     NORID,  RESERVED
+FOR,                   FOR,                    NORID,  RESERVED
+FORBID,                        FORBID,                 NORID,  RESERVED
+GENERAL,               GENERAL,                NORID,  RESERVED
+GENERATE_ALL_SET_NAMES,        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+GENERATE_SET_NAMES,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+GOTO,                  GOTO,                   NORID,  RESERVED
+GRANT,                 GRANT,                  NORID,  RESERVED
+GRANT_FILE_SIZE,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+IF,                    IF,                     NORID,  RESERVED
+IN,                    IN,                     RID_IN, RESERVED
+INIT,                  INIT,                   NORID,  RESERVED
+INLINE,                        INLINE,                 RID_INLINE,     RESERVED
+INOUT,                 PARAMATTR,              RID_INOUT,      RESERVED
+LARGE,                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+LIST,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+LOC,                   LOC,                    NORID,  RESERVED
+MAKE_PUBLICS_FOR_DISCRETE_SYNS,        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+MEDIUM,                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+MOD,                   MOD,                    NORID,  RESERVED
+MODULE,                        MODULE,                 NORID,  RESERVED
+MULTIPLE_CONST_SEGS,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+MULTIPLE_DATA_SEGS,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+NEWMODE,               NEWMODE,                NORID,  RESERVED
+NOLIST,                        IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+NO_OVERLAP_CHECK,      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+NONREF,                        NONREF,                 NORID,  RESERVED
+NOPACK,                        NOPACK,                 NORID,  RESERVED
+NOT,                   NOT,                    NORID,  RESERVED
+OD,                    OD,                     NORID,  RESERVED
+OF,                    OF,                     NORID,  RESERVED
+ON,                    ON,                     NORID,  RESERVED
+ONLY_FOR_SIMULATION,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+ONLY_FOR_TARGET,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+OPTIMIZE,              IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+OPTIMIZE_RUNTIME,      IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+OPTIMIZATION_WINDOW,   IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+OR,                    OR,                     NORID,  RESERVED
+ORIF,                  ORIF,                   NORID,  RESERVED
+OUT,                   PARAMATTR,              RID_OUT,        RESERVED
+PACK,                  PACK,                   NORID,  RESERVED
+PAGE,                  IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+POS,                   POS,                    NORID,  RESERVED
+POWERSET,              POWERSET,               NORID,  RESERVED
+PREFIXED,              PREFIXED,               NORID,  RESERVED
+PRINT_O_CODE,          IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+PRINT_SYMBOL_TABLE,    IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+PRIORITY,              PRIORITY,               NORID,  RESERVED
+PROC,                  PROC,                   NORID,  RESERVED
+PROCESS,               PROCESS,                NORID,  RESERVED
+PROCESS_TYPE,          PROCESS_TYPE_TOKEN,     NORID,  DIRECTIVE
+RANGE,                 RANGE,                  NORID,  RESERVED
+RANGE_OFF,             RANGE_OFF,              NORID,  DIRECTIVE
+RANGE_ON,              RANGE_ON,               NORID,  DIRECTIVE
+READ,                  READ,                   RID_READ,       RESERVED
+RECEIVE,               RECEIVE,                NORID,  RESERVED
+RECURSIVE,             RECURSIVE,              NORID,  RESERVED
+REENTRANT,             IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+REENTRANT_ALL,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+REF,                   REF,                    NORID,  RESERVED
+REGION,                        REGION,                 NORID,  RESERVED
+REM,                   REM,                    NORID,  RESERVED
+REMOTE,                        REMOTE,                 NORID,  RESERVED
+RESULT,                        RESULT,                 NORID,  RESERVED
+RETURN,                        RETURN,                 NORID,  RESERVED
+RETURNS,               RETURNS,                NORID,  RESERVED
+ROW,                   ROW,                    NORID,  RESERVED
+SEIZE,                 SEIZE,                  NORID,  RESERVED
+SEND,                  SEND,                   NORID,  RESERVED
+SEND_BUFFER_DEFAULT_PRIORITY,  SEND_BUFFER_DEFAULT_PRIORITY,   NORID,  DIRECTIVE
+SEND_SIGNAL_DEFAULT_PRIORITY,  SEND_SIGNAL_DEFAULT_PRIORITY,   NORID,  DIRECTIVE
+SET,                   SET,                    NORID,  RESERVED
+SHORT_PRED_SUCC,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+SIGNAL,                        SIGNAL,                 NORID,  RESERVED
+SIGNAL_CODE,           SIGNAL_CODE,            NORID,  DIRECTIVE
+SIGNAL_MAX_LENGTH,     IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+SIMPLE,                        SIMPLE,                 NORID,  RESERVED
+SMALL,                 IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+SPEC,                  SPEC,                   NORID,  RESERVED
+START,                 START,                  NORID,  RESERVED
+STATE_ROUTINE,         IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+STATIC,                        STATIC,                 NORID,  RESERVED
+STEP,                  STEP,                   NORID,  RESERVED
+STOP,                  STOP,                   NORID,  RESERVED
+STRUCT,                        STRUCT,                 NORID,  RESERVED
+SUPPORT_CAUSING_ADDRESS,       IGNORED_DIRECTIVE,      NORID,  DIRECTIVE
+SYN,                   SYN,                    NORID,  RESERVED
+SYNMODE,               SYNMODE,                NORID,  RESERVED
+TEXT,                  TEXT,                   NORID,  RESERVED
+THEN,                  THEN,                   NORID,  RESERVED
+THIS,                  THIS,                   NORID,  RESERVED
+TIMEOUT,               TIMEOUT,                NORID,  RESERVED
+TO,                    TO,                     NORID,  RESERVED
+UP,                    UP,                     NORID,  RESERVED
+USE_SEIZE_FILE,                USE_SEIZE_FILE,         NORID,  DIRECTIVE
+USE_SEIZE_FILE_RESTRICTED,     USE_SEIZE_FILE_RESTRICTED,      NORID,  DIRECTIVE
+VARYING,               VARYING,                NORID,  RESERVED
+WHILE,                 WHILE,                  NORID,  RESERVED
+WITH,                  WITH,                   NORID,  RESERVED
+XOR,                   XOR,                    NORID,  RESERVED
diff --git a/tests/configure b/tests/configure
new file mode 100755 (executable)
index 0000000..1019d62
--- /dev/null
@@ -0,0 +1,4433 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="c-parse.gperf"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+SET_MAKE
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+CPP
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXCPP
+CHECK_LANG_SYNTAX
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                      if test $ac_cv_c_compiler_gnu = yes -a $ac_cv_cxx_compiler_gnu = yes; then
+  CHECK_LANG_SYNTAX='check-lang-syntax'
+else
+  CHECK_LANG_SYNTAX=''
+fi
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+CPP!$CPP$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXCPP!$CXXCPP$ac_delim
+CHECK_LANG_SYNTAX!$CHECK_LANG_SYNTAX$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 53; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+
+
+
+  esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/tests/configure.ac b/tests/configure.ac
new file mode 100644 (file)
index 0000000..47723d8
--- /dev/null
@@ -0,0 +1,45 @@
+dnl autoconf configuration for gperf/tests
+
+dnl Copyright (C) 1998, 2002, 2007, 2009 Free Software Foundation, Inc.
+dnl Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
+dnl and Bruno Haible <bruno@clisp.org>.
+dnl
+dnl This file is part of GNU GPERF.
+dnl
+dnl This program is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (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 You should have received a copy of the GNU General Public License
+dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_PREREQ([2.60])
+AC_INIT([c-parse.gperf])
+AC_PROG_MAKE_SET
+dnl
+dnl           checks for programs
+dnl
+AC_PROG_CC
+                      dnl sets variable CC
+AC_PROG_CPP
+                      dnl sets variable CPP
+AC_PROG_CXX
+                      dnl sets variable CXX
+AC_PROG_CXXCPP
+                      dnl sets variable CXXCPP
+if test $ac_cv_prog_gcc = yes -a $ac_cv_prog_gxx = yes; then
+  CHECK_LANG_SYNTAX='check-lang-syntax'
+else
+  CHECK_LANG_SYNTAX=''
+fi
+AC_SUBST([CHECK_LANG_SYNTAX])
+dnl
+dnl           That's it.
+dnl
+AC_OUTPUT([Makefile])
diff --git a/tests/cplusplus.exp b/tests/cplusplus.exp
new file mode 100644 (file)
index 0000000..119f344
--- /dev/null
@@ -0,0 +1,269 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -L C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k'1,4,7,$'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf  */
+struct resword { const char *name; short token; enum rid rid;};
+
+#define TOTAL_KEYWORDS 106
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 16
+#define MIN_HASH_VALUE 4
+#define MAX_HASH_VALUE 163
+/* maximum key range = 160, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164,   0, 164,  44,  58,  15,
+       55,   0,  24,  23,  25,   2, 164,   4,  26,  75,
+       36,  11,  40,  74,  14,  23,   1,  45,  45,  90,
+       50,  50, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+      164, 164, 164, 164, 164, 164
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[6]];
+      /*FALLTHROUGH*/
+      case 6:
+      case 5:
+      case 4:
+        hval += asso_values[(unsigned char)str[3]];
+      /*FALLTHROUGH*/
+      case 3:
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+is_reserved_word (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct resword wordlist[] =
+    {
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"else", ELSE, NORID,},
+      {"true", CXX_TRUE, NORID,},
+      {"int", TYPESPEC, RID_INT,},
+      {"", 0, 0},
+      {"__real__", REALPART, NORID},
+      {"", 0, 0},
+      {"inline", SCSPEC, RID_INLINE,},
+      {"", 0, 0},
+      {"__signed__", TYPESPEC, RID_SIGNED},
+      {"", 0, 0},
+      {"__attribute", ATTRIBUTE, NORID},
+      {"", 0, 0},
+      {"__attribute__", ATTRIBUTE, NORID},
+      {"", 0, 0},
+      {"export", SCSPEC, RID_EXPORT,},
+      {"case", CASE, NORID,},
+      {"__const", CV_QUALIFIER, RID_CONST},
+      {"__const__", CV_QUALIFIER, RID_CONST},
+      {"__volatile", CV_QUALIFIER, RID_VOLATILE},
+      {"", 0, 0},
+      {"__volatile__", CV_QUALIFIER, RID_VOLATILE},
+      {"__restrict", CV_QUALIFIER, RID_RESTRICT},
+      {"__restrict__", CV_QUALIFIER, RID_RESTRICT},
+      {"or", OROR, NORID,},
+      {"if", IF, NORID,},
+      {"", 0, 0},
+      {"__asm__", ASM_KEYWORD, NORID},
+      {"typeof", TYPEOF, NORID,},
+      {"__real", REALPART, NORID},
+      {"", 0, 0}, {"", 0, 0},
+      {"__sigof__", SIGOF, NORID               /* Extension */,},
+      {"static_cast", STATIC_CAST, NORID,},
+      {"explicit", SCSPEC, RID_EXPLICIT,},
+      {"register", SCSPEC, RID_REGISTER,},
+      {"__wchar_t", TYPESPEC, RID_WCHAR  /* Unique to ANSI C++ */,},
+      {"not", '!', NORID,},
+      {"for", FOR, NORID,},
+      {"extern", SCSPEC, RID_EXTERN,},
+      {"short", TYPESPEC, RID_SHORT,},
+      {"const", CV_QUALIFIER, RID_CONST,},
+      {"static", SCSPEC, RID_STATIC,},
+      {"", 0, 0},
+      {"char", TYPESPEC, RID_CHAR,},
+      {"__complex__", TYPESPEC, RID_COMPLEX},
+      {"goto", GOTO, NORID,},
+      {"template", TEMPLATE, RID_TEMPLATE,},
+      {"this", THIS, NORID,},
+      {"false", CXX_FALSE, NORID,},
+      {"sizeof", SIZEOF, NORID,},
+      {"try", TRY, NORID,},
+      {"switch", SWITCH, NORID,},
+      {"typedef", SCSPEC, RID_TYPEDEF,},
+      {"", 0, 0},
+      {"operator", OPERATOR, NORID,},
+      {"__signature__", AGGR, RID_SIGNATURE    /* Extension */,},
+      {"catch", CATCH, NORID,},
+      {"delete", DELETE, NORID,},
+      {"typeid", TYPEID, NORID,},
+      {"sigof", SIGOF, NORID           /* Extension */,},
+      {"const_cast", CONST_CAST, NORID,},
+      {"__signed", TYPESPEC, RID_SIGNED},
+      {"class", AGGR, RID_CLASS,},
+      {"xor", '^', NORID,},
+      {"do", DO, NORID,},
+      {"continue", CONTINUE, NORID,},
+      {"auto", SCSPEC, RID_AUTO,},
+      {"__typeof__", TYPEOF, NORID},
+      {"", 0, 0},
+      {"__alignof__", ALIGNOF, NORID},
+      {"float", TYPESPEC, RID_FLOAT,},
+      {"struct", AGGR, RID_RECORD,},
+      {"long", TYPESPEC, RID_LONG,},
+      {"__null", CONSTANT, RID_NULL},
+      {"", 0, 0},
+      {"__label__", LABEL, NORID},
+      {"__inline", SCSPEC, RID_INLINE},
+      {"reinterpret_cast", REINTERPRET_CAST, NORID,},
+      {"__inline__", SCSPEC, RID_INLINE},
+      {"__imag__", IMAGPART, NORID},
+      {"typename", TYPENAME_KEYWORD, NORID,},
+      {"friend", SCSPEC, RID_FRIEND,},
+      {"compl", '~', NORID,},
+      {"public", VISSPEC, RID_PUBLIC,},
+      {"bitor", '|', NORID,},
+      {"namespace", NAMESPACE, NORID,},
+      {"or_eq", ASSIGN, NORID,},
+      {"", 0, 0},
+      {"private", VISSPEC, RID_PRIVATE,},
+      {"__typeof", TYPEOF, NORID},
+      {"", 0, 0},
+      {"__alignof", ALIGNOF, NORID},
+      {"__complex", TYPESPEC, RID_COMPLEX},
+      {"union", AGGR, RID_UNION,},
+      {"", 0, 0},
+      {"__extension__", EXTENSION, NORID},
+      {"", 0, 0},
+      {"return", RETURN_KEYWORD, NORID,},
+      {"and", ANDAND, NORID,},
+      {"__asm", ASM_KEYWORD, NORID},
+      {"__imag", IMAGPART, NORID},
+      {"virtual", SCSPEC, RID_VIRTUAL,},
+      {"protected", VISSPEC, RID_PROTECTED,},
+      {"throw", THROW, NORID,},
+      {"default", DEFAULT, NORID,},
+      {"using", USING, NORID,},
+      {"unsigned", TYPESPEC, RID_UNSIGNED,},
+      {"break", BREAK, NORID,},
+      {"", 0, 0},
+      {"signature", AGGR, RID_SIGNATURE        /* Extension */,},
+      {"bool", TYPESPEC, RID_BOOL,},
+      {"", 0, 0},
+      {"not_eq", EQCOMPARE, NORID,},
+      {"", 0, 0}, {"", 0, 0},
+      {"double", TYPESPEC, RID_DOUBLE,},
+      {"signed", TYPESPEC, RID_SIGNED,},
+      {"while", WHILE, NORID,},
+      {"asm", ASM_KEYWORD, NORID,},
+      {"volatile", CV_QUALIFIER, RID_VOLATILE,},
+      {"and_eq", ASSIGN, NORID,},
+      {"", 0, 0},
+      {"mutable", SCSPEC, RID_MUTABLE,},
+      {"dynamic_cast", DYNAMIC_CAST, NORID,},
+      {"", 0, 0},
+      {"new", NEW, NORID,},
+      {"xor_eq", ASSIGN, NORID,},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"enum", ENUM, NORID,},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"void", TYPESPEC, RID_VOID,},
+      {"", 0, 0}, {"", 0, 0}, {"", 0, 0},
+      {"bitand", '&', NORID,}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/cplusplus.gperf b/tests/cplusplus.gperf
new file mode 100644 (file)
index 0000000..8139e28
--- /dev/null
@@ -0,0 +1,111 @@
+%{
+/* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf  */
+%}
+struct resword { const char *name; short token; enum rid rid;};
+%%
+__alignof, ALIGNOF, NORID
+__alignof__, ALIGNOF, NORID
+__asm, ASM_KEYWORD, NORID
+__asm__, ASM_KEYWORD, NORID
+__attribute, ATTRIBUTE, NORID
+__attribute__, ATTRIBUTE, NORID
+__complex, TYPESPEC, RID_COMPLEX
+__complex__, TYPESPEC, RID_COMPLEX
+__const, CV_QUALIFIER, RID_CONST
+__const__, CV_QUALIFIER, RID_CONST
+__extension__, EXTENSION, NORID
+__imag, IMAGPART, NORID
+__imag__, IMAGPART, NORID
+__inline, SCSPEC, RID_INLINE
+__inline__, SCSPEC, RID_INLINE
+__label__, LABEL, NORID
+__null, CONSTANT, RID_NULL
+__real, REALPART, NORID
+__real__, REALPART, NORID
+__restrict, CV_QUALIFIER, RID_RESTRICT
+__restrict__, CV_QUALIFIER, RID_RESTRICT
+__signature__, AGGR, RID_SIGNATURE     /* Extension */,
+__signed, TYPESPEC, RID_SIGNED
+__signed__, TYPESPEC, RID_SIGNED
+__sigof__, SIGOF, NORID                /* Extension */,
+__typeof, TYPEOF, NORID
+__typeof__, TYPEOF, NORID
+__volatile, CV_QUALIFIER, RID_VOLATILE
+__volatile__, CV_QUALIFIER, RID_VOLATILE
+__wchar_t, TYPESPEC, RID_WCHAR  /* Unique to ANSI C++ */,
+asm, ASM_KEYWORD, NORID,
+and, ANDAND, NORID,
+and_eq, ASSIGN, NORID,
+auto, SCSPEC, RID_AUTO,
+bitand, '&', NORID,
+bitor, '|', NORID,
+bool, TYPESPEC, RID_BOOL,
+break, BREAK, NORID,
+case, CASE, NORID,
+catch, CATCH, NORID,
+char, TYPESPEC, RID_CHAR,
+class, AGGR, RID_CLASS,
+compl, '~', NORID,
+const, CV_QUALIFIER, RID_CONST,
+const_cast, CONST_CAST, NORID,
+continue, CONTINUE, NORID,
+default, DEFAULT, NORID,
+delete, DELETE, NORID,
+do, DO, NORID,
+double, TYPESPEC, RID_DOUBLE,
+dynamic_cast, DYNAMIC_CAST, NORID,
+else, ELSE, NORID,
+enum, ENUM, NORID,
+explicit, SCSPEC, RID_EXPLICIT,
+export, SCSPEC, RID_EXPORT,
+extern, SCSPEC, RID_EXTERN,
+false, CXX_FALSE, NORID,
+float, TYPESPEC, RID_FLOAT,
+for, FOR, NORID,
+friend, SCSPEC, RID_FRIEND,
+goto, GOTO, NORID,
+if, IF, NORID,
+inline, SCSPEC, RID_INLINE,
+int, TYPESPEC, RID_INT,
+long, TYPESPEC, RID_LONG,
+mutable, SCSPEC, RID_MUTABLE,
+namespace, NAMESPACE, NORID,
+new, NEW, NORID,
+not, '!', NORID,
+not_eq, EQCOMPARE, NORID,
+operator, OPERATOR, NORID,
+or, OROR, NORID,
+or_eq, ASSIGN, NORID,
+private, VISSPEC, RID_PRIVATE,
+protected, VISSPEC, RID_PROTECTED,
+public, VISSPEC, RID_PUBLIC,
+register, SCSPEC, RID_REGISTER,
+reinterpret_cast, REINTERPRET_CAST, NORID,
+return, RETURN_KEYWORD, NORID,
+short, TYPESPEC, RID_SHORT,
+signature, AGGR, RID_SIGNATURE /* Extension */,
+signed, TYPESPEC, RID_SIGNED,
+sigof, SIGOF, NORID            /* Extension */,
+sizeof, SIZEOF, NORID,
+static, SCSPEC, RID_STATIC,
+static_cast, STATIC_CAST, NORID,
+struct, AGGR, RID_RECORD,
+switch, SWITCH, NORID,
+template, TEMPLATE, RID_TEMPLATE,
+this, THIS, NORID,
+throw, THROW, NORID,
+true, CXX_TRUE, NORID,
+try, TRY, NORID,
+typedef, SCSPEC, RID_TYPEDEF,
+typename, TYPENAME_KEYWORD, NORID,
+typeid, TYPEID, NORID,
+typeof, TYPEOF, NORID,
+union, AGGR, RID_UNION,
+unsigned, TYPESPEC, RID_UNSIGNED,
+using, USING, NORID,
+virtual, SCSPEC, RID_VIRTUAL,
+void, TYPESPEC, RID_VOID,
+volatile, CV_QUALIFIER, RID_VOLATILE,
+while, WHILE, NORID,
+xor, '^', NORID,
+xor_eq, ASSIGN, NORID,
diff --git a/tests/gpc.exp b/tests/gpc.exp
new file mode 100644 (file)
index 0000000..a2ea16f
--- /dev/null
@@ -0,0 +1,160 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -g -o -j1 -t -N is_reserved_word  */
+/* Computed positions: -k'1,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* ISO Pascal 7185 reserved words.
+ *
+ * For GNU Pascal compiler (GPC) by jtv@hut.fi
+ *
+ * run this through the Doug Schmidt's gperf program
+ * with command
+ * gperf  -g -o -j1 -t -p -N is_reserved_word
+ *
+ */
+struct resword { char *name; short token; short iclass;};
+
+#define TOTAL_KEYWORDS 35
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 9
+#define MIN_HASH_VALUE 2
+#define MAX_HASH_VALUE 37
+/* maximum key range = 36, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 14, 32, 16, 13,  9,
+       1, 32, 38,  9, 38, 38, 22, 26, 16,  3,
+       2, 38,  7, 23,  0, 19, 25, 23, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+       5,  1,  5, 38,  3, 38, 38, 38,  8, 16,
+       0,  0, 38, 38,  3, 38,  7, 38,  8, 38,
+      38,  4, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+      38, 38, 38, 38, 38, 38
+    };
+  return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+is_reserved_word (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct resword wordlist[] =
+    {
+      {""}, {""},
+      {"To", TO, PASCAL_ISO},
+      {""},
+      {"Then", THEN, PASCAL_ISO},
+      {"Type", TYPE, PASCAL_ISO},
+      {"File", FILE_,  PASCAL_ISO},
+      {"For",  FOR,  PASCAL_ISO},
+      {"Or", OR, PASCAL_ISO},
+      {"Function", FUNCTION, PASCAL_ISO},
+      {"Of", OF, PASCAL_ISO},
+      {"In", IN, PASCAL_ISO},
+      {"Procedure", PROCEDURE, PASCAL_ISO},
+      {"Packed", PACKED, PASCAL_ISO},
+      {"Else", ELSE, PASCAL_ISO},
+      {"Do", DO, PASCAL_ISO},
+      {"If", IF, PASCAL_ISO},
+      {"End",  END,  PASCAL_ISO},
+      {"Record", RECORD, PASCAL_ISO},
+      {"Downto", DOWNTO, PASCAL_ISO},
+      {"Repeat", REPEAT, PASCAL_ISO},
+      {"Case", CASE, PASCAL_ISO},
+      {"And",  AND,  PASCAL_ISO},
+      {"Array",  ARRAY,  PASCAL_ISO},
+      {"Div",  DIV,  PASCAL_ISO},
+      {"Program",PROGRAM,PASCAL_ISO},
+      {"Not",  NOT,  PASCAL_ISO},
+      {"Nil",  NIL,  PASCAL_ISO},
+      {"Const",  CONST,  PASCAL_ISO},
+      {"While",  WHILE,  PASCAL_ISO},
+      {"With", WITH, PASCAL_ISO},
+      {"Var",  VAR,  PASCAL_ISO},
+      {"Until",  UNTIL,  PASCAL_ISO},
+      {"Set",  SET,  PASCAL_ISO},
+      {"Mod",  MOD,  PASCAL_ISO},
+      {"Label",  LABEL,  PASCAL_ISO},
+      {"Goto", GOTO, PASCAL_ISO},
+      {"Begin",  BEGIN_, PASCAL_ISO}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/gpc.gperf b/tests/gpc.gperf
new file mode 100644 (file)
index 0000000..8fb469e
--- /dev/null
@@ -0,0 +1,48 @@
+%{
+/* ISO Pascal 7185 reserved words.
+ *
+ * For GNU Pascal compiler (GPC) by jtv@hut.fi
+ *
+ * run this through the Doug Schmidt's gperf program
+ * with command
+ * gperf  -g -o -j1 -t -p -N is_reserved_word
+ *
+ */
+%}
+struct resword { char *name; short token; short iclass;};
+%%
+And,  AND,  PASCAL_ISO
+Array,  ARRAY,  PASCAL_ISO
+Begin,  BEGIN_, PASCAL_ISO
+Case, CASE, PASCAL_ISO
+Const,  CONST,  PASCAL_ISO
+Div,  DIV,  PASCAL_ISO
+Do, DO, PASCAL_ISO
+Downto, DOWNTO, PASCAL_ISO
+Else, ELSE, PASCAL_ISO
+End,  END,  PASCAL_ISO
+File, FILE_,  PASCAL_ISO
+For,  FOR,  PASCAL_ISO
+Function, FUNCTION, PASCAL_ISO
+Goto, GOTO, PASCAL_ISO
+If, IF, PASCAL_ISO
+In, IN, PASCAL_ISO
+Label,  LABEL,  PASCAL_ISO
+Mod,  MOD,  PASCAL_ISO
+Nil,  NIL,  PASCAL_ISO
+Not,  NOT,  PASCAL_ISO
+Of, OF, PASCAL_ISO
+Or, OR, PASCAL_ISO
+Packed, PACKED, PASCAL_ISO
+Procedure, PROCEDURE, PASCAL_ISO
+Program,PROGRAM,PASCAL_ISO
+Record, RECORD, PASCAL_ISO
+Repeat, REPEAT, PASCAL_ISO
+Set,  SET,  PASCAL_ISO
+Then, THEN, PASCAL_ISO
+To, TO, PASCAL_ISO
+Type, TYPE, PASCAL_ISO
+Until,  UNTIL,  PASCAL_ISO
+Var,  VAR,  PASCAL_ISO
+While,  WHILE,  PASCAL_ISO
+With, WITH, PASCAL_ISO
diff --git a/tests/incomplete.exp b/tests/incomplete.exp
new file mode 100644 (file)
index 0000000..1f951af
--- /dev/null
@@ -0,0 +1,128 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -t  */
+/* Computed positions: -k'1,3' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+struct month;
+
+#define TOTAL_KEYWORDS 12
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 9
+#define MIN_HASH_VALUE 3
+#define MAX_HASH_VALUE 18
+/* maximum key range = 16, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19,  5,  5,  5,
+       0, 19,  5,  0, 19, 19,  0, 19, 10,  0,
+       0,  5,  0, 19,  0,  0,  0, 19,  0, 19,
+      19,  0, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19
+    };
+  return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct month *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct month wordlist[] =
+    {
+      {""}, {""}, {""},
+      {"may",       5, 31, 31},
+      {"june",      6, 30, 30},
+      {"march",     3, 31, 31},
+      {""},
+      {"january",   1, 31, 31},
+      {"november", 11, 30, 30},
+      {"september", 9, 30, 30},
+      {"april",     4, 30, 30},
+      {"august",    8, 31, 31},
+      {"october",  10, 31, 31},
+      {"december", 12, 31, 31},
+      {"july",      7, 31, 31},
+      {""}, {""}, {""},
+      {"february",  2, 28, 29}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/incomplete.gperf b/tests/incomplete.gperf
new file mode 100644 (file)
index 0000000..f5296b1
--- /dev/null
@@ -0,0 +1,14 @@
+struct month;
+%%
+january,   1, 31, 31
+february,  2, 28, 29
+march,     3, 31, 31
+april,     4, 30, 30
+may,       5, 31, 31
+june,      6, 30, 30
+july,      7, 31, 31
+august,    8, 31, 31
+september, 9, 30, 30
+october,  10, 31, 31
+november, 11, 30, 30
+december, 12, 31, 31
diff --git a/tests/irc.gperf b/tests/irc.gperf
new file mode 100644 (file)
index 0000000..afe53c5
--- /dev/null
@@ -0,0 +1,63 @@
+%{
+extern int m_text(), m_private(), m_who(), m_whois(), m_user(), m_list();
+extern int m_topic(), m_invite(), m_channel(), m_version(), m_quit();
+extern int m_server(), m_kill(), m_info(), m_links(), m_summon(), m_stats();
+extern int m_users(), m_nick(), m_error(), m_help(), m_whoreply();
+extern int m_squit(), m_restart(), m_away(), m_die(), m_connect();
+extern int m_ping(), m_pong(), m_oper(), m_pass(), m_wall(), m_trace();
+extern int m_time(), m_rehash(), m_names(), m_namreply(), m_admin();
+extern int m_linreply(), m_notice(), m_lusers(), m_voice(), m_grph();
+extern int m_xtra(), m_motd();
+%}
+struct Message {
+  char *cmd;
+  int (* func)();
+  int count;
+  int parameters;
+};
+%%
+NICK,    m_nick,     0, 1
+MSG,     m_text,     0, 1
+PRIVMSG, m_private,  0, 2
+WHO,     m_who,      0, 1
+WHOIS,   m_whois,    0, 4
+USER,    m_user,     0, 4
+SERVER,  m_server,   0, 2
+LIST,    m_list,     0, 1
+TOPIC,   m_topic,    0, 1
+INVITE,  m_invite,   0, 2
+CHANNEL, m_channel,  0, 1
+VERSION, m_version,  0, 1
+QUIT,    m_quit,     0, 2
+SQUIT,   m_squit,    0, 2
+KILL,    m_kill,     0, 2
+INFO,    m_info,     0, 1
+LINKS,   m_links,    0, 1
+SUMMON,  m_summon,   0, 1
+STATS,   m_stats,    0, 1
+USERS,   m_users,    0, 1
+RESTART, m_restart,  0, 1
+WHOREPLY,m_whoreply, 0, 7
+HELP,    m_help,     0, 2
+ERROR,   m_error,    0, 1
+AWAY,    m_away,     0, 1
+DIE,     m_die,      0, 1
+CONNECT, m_connect,  0, 3
+PING,    m_ping,     0, 2
+PONG,    m_pong,     0, 3
+OPER,    m_oper,     0, 3
+PASS,    m_pass,     0, 2
+WALL,    m_wall,     0, 1
+TIME,    m_time,     0, 1
+REHASH,  m_rehash,   0, 1
+NAMES,   m_names,    0, 1
+NAMREPLY,m_namreply, 0, 3
+ADMIN,   m_admin,    0, 1
+TRACE,   m_trace,    0, 1
+LINREPLY,m_linreply, 0, 2
+NOTICE,  m_notice,   0, 2
+LUSERS,  m_lusers,   0, 1
+VOICE,   m_voice,    0, 2
+GRPH,    m_grph,     0, 2
+XTRA,    m_xtra,     0, 2
+MOTD,    m_motd,     0, 2
diff --git a/tests/java.exp b/tests/java.exp
new file mode 100644 (file)
index 0000000..ffb1bbe
--- /dev/null
@@ -0,0 +1,208 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -L C -F ', 0' -t -j1 -i 1 -g -o -N java_keyword -k'1,3,$'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Keyword definition for the GNU compiler for the Java(TM) language.
+   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC 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.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+Java and all Java-based marks are trademarks or registered trademarks
+of Sun Microsystems, Inc. in the United States and other countries.
+The Free Software Foundation is independent of Sun Microsystems, Inc.  */
+
+struct java_keyword { const char *name; int token; };
+
+#define TOTAL_KEYWORDS 50
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 12
+#define MIN_HASH_VALUE 7
+#define MAX_HASH_VALUE 76
+/* maximum key range = 70, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77,  7, 30,  7,
+      12,  1, 14, 28, 41,  3, 77, 16, 11, 77,
+      16, 23,  1, 77, 15,  1,  1, 34, 30, 18,
+      77, 11, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+      77, 77, 77, 77, 77, 77
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct java_keyword *
+java_keyword (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct java_keyword wordlist[] =
+    {
+      {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0},
+      {"", 0},
+      {"else", ELSE_TK},
+      {"int", INT_TK},
+      {"this", THIS_TK},
+      {"extends", EXTENDS_TK},
+      {"import", IMPORT_TK},
+      {"private", PRIVATE_TK},
+      {"case", CASE_TK},
+      {"interface", INTERFACE_TK},
+      {"implements", IMPLEMENTS_TK},
+      {"package", PACKAGE_TK},
+      {"abstract", ABSTRACT_TK},
+      {"transient", TRANSIENT_TK},
+      {"if", IF_TK},
+      {"class", CLASS_TK},
+      {"static", STATIC_TK},
+      {"super", SUPER_TK},
+      {"throws", THROWS_TK},
+      {"native", NATIVE_TK},
+      {"", 0},
+      {"try", TRY_TK},
+      {"while", WHILE_TK},
+      {"instanceof", INSTANCEOF_TK},
+      {"const", CONST_TK},
+      {"short", SHORT_TK},
+      {"false", FALSE_TK},
+      {"continue", CONTINUE_TK},
+      {"char", CHAR_TK},
+      {"default", DEFAULT_TK},
+      {"", 0},
+      {"byte", BYTE_TK},
+      {"do", DO_TK},
+      {"return", RETURN_TK},
+      {"throw", THROW_TK},
+      {"true", TRUE_TK},
+      {"synchronized", SYNCHRONIZED_TK},
+      {"null", NULL_TK},
+      {"float", FLOAT_TK},
+      {"public", PUBLIC_TK},
+      {"protected", PROTECTED_TK},
+      {"final", FINAL_TK},
+      {"for", FOR_TK},
+      {"finally", FINALLY_TK},
+      {"void", VOID_TK},
+      {"volatile", VOLATILE_TK},
+      {"switch", SWITCH_TK},
+      {"break", BREAK_TK},
+      {"double", DOUBLE_TK},
+      {"catch", CATCH_TK},
+      {"new", NEW_TK},
+      {"goto", GOTO_TK},
+      {"", 0}, {"", 0},
+      {"long", LONG_TK},
+      {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0},
+      {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0},
+      {"", 0}, {"", 0}, {"", 0}, {"", 0},
+      {"boolean", BOOLEAN_TK}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/java.gperf b/tests/java.gperf
new file mode 100644 (file)
index 0000000..2e79332
--- /dev/null
@@ -0,0 +1,80 @@
+%{
+/* Keyword definition for the GNU compiler for the Java(TM) language.
+   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC 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.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+Java and all Java-based marks are trademarks or registered trademarks
+of Sun Microsystems, Inc. in the United States and other countries.
+The Free Software Foundation is independent of Sun Microsystems, Inc.  */
+
+%}
+struct java_keyword { const char *name; int token; };
+%%
+abstract, ABSTRACT_TK
+default, DEFAULT_TK
+if, IF_TK
+private, PRIVATE_TK
+throw, THROW_TK
+boolean, BOOLEAN_TK
+do, DO_TK
+implements, IMPLEMENTS_TK
+protected, PROTECTED_TK
+throws, THROWS_TK
+break, BREAK_TK
+double, DOUBLE_TK
+import, IMPORT_TK
+public, PUBLIC_TK
+transient, TRANSIENT_TK
+byte, BYTE_TK
+else, ELSE_TK
+instanceof, INSTANCEOF_TK
+return, RETURN_TK
+try, TRY_TK
+case, CASE_TK
+extends, EXTENDS_TK
+int, INT_TK
+short, SHORT_TK
+void, VOID_TK
+catch, CATCH_TK
+final, FINAL_TK
+interface, INTERFACE_TK
+static, STATIC_TK
+volatile, VOLATILE_TK
+char, CHAR_TK
+finally, FINALLY_TK
+long, LONG_TK
+super, SUPER_TK
+while, WHILE_TK
+class, CLASS_TK
+float, FLOAT_TK
+native, NATIVE_TK
+switch, SWITCH_TK
+const, CONST_TK
+for, FOR_TK
+new, NEW_TK
+synchronized, SYNCHRONIZED_TK
+continue, CONTINUE_TK
+goto, GOTO_TK
+package, PACKAGE_TK
+this, THIS_TK
+# true, false and null aren't keyword. But we match them easily this way
+true, TRUE_TK
+false, FALSE_TK
+null, NULL_TK
diff --git a/tests/jscript.gperf b/tests/jscript.gperf
new file mode 100644 (file)
index 0000000..6f420d8
--- /dev/null
@@ -0,0 +1,73 @@
+%{
+/* Command-line: gperf -k'1,2,$' -t -p -K 'name' -H 'js_kw_hash' -N 'js_kw_lookup' -a -g jscript.gperf */
+%}
+struct js_keyword {
+  char * name;
+  int token;
+}
+
+%%
+# Javascript reserved words, see "keywords.html"
+abstract, TK_ABSTRACT
+boolean, TK_BOOLEAN
+break, TK_BREAK
+byte, TK_BYTE
+case, TK_CASE
+catch, TK_CATCH
+char, TK_CHAR
+class, TK_CLASS
+const, TK_CONST
+continue, TK_CONTINUE
+default, TK_DEFAULT
+do, TK_DO
+double, TK_DOUBLE
+else, TK_ELSE
+extends, TK_EXTENDS
+false, TK_FALSE
+final, TK_FINAL
+finally, TK_FINALLY
+float, TK_FLOAT
+for, TK_FOR
+function, TK_FUNCTION
+goto, TK_GOTO
+if, TK_IF
+implements, TK_IMPLEMENTS
+import, TK_IMPORT
+in, TK_IN
+instanceof, TK_INSTANCEOF
+int, TK_INT
+interface, TK_INTERFACE
+long, TK_LONG
+native, TK_NATIVE
+new, TK_NEW
+null, TK_NULL
+package, TK_PACKAGE
+private, TK_PRIVATE
+protected, TK_PROTECTED
+public, TK_PUBLIC
+return, TK_RETURN
+short, TK_SHORT
+static, TK_STATIC
+super, TK_SUPER
+switch, TK_SWITCH
+synchronized, TK_SYNCHRONIZED
+this, TK_THIS
+throw, TK_THROW
+throws, TK_THROWS
+transient, TK_TRANSIENT
+true, TK_TRUE
+try, TK_TRY
+var, TK_VAR
+void, TK_VOID
+while, TK_WHILE
+with, TK_WITH
+%%
+
+int js_keyword_lookup (register const char *str, register int len)
+{
+  struct js_keyword * keyword = js_kw_lookup(str,len);
+  if (keyword)
+    return keyword->token;
+  else
+    return TK_IDENT;
+}
diff --git a/tests/jstest1.gperf b/tests/jstest1.gperf
new file mode 100644 (file)
index 0000000..f6696b1
--- /dev/null
@@ -0,0 +1,142 @@
+abstract
+boolean
+break
+byte
+case
+catch
+char
+class
+const
+continue
+default
+do
+double
+else
+extends
+false
+final
+finally
+float
+for
+function
+goto
+if
+implements
+import
+in
+instanceof
+int
+interface
+long
+native
+new
+null
+package
+private
+protected
+public
+return
+short
+static
+super
+switch
+synchronized
+this
+throw
+throws
+transient
+true
+try
+var
+void
+while
+with
+%%
+#include <stdlib.h>
+#include <string.h>
+#if defined(__STDC__) || defined(__cplusplus)
+#define CONST const
+#else
+#define CONST
+#endif
+static CONST char* testdata[] = {
+  "bogus",
+  "abstract",
+  "boolean",
+  "break",
+  "byte",
+  "case",
+  "catch",
+  "char",
+  "class",
+  "const",
+  "continue",
+  "default",
+  "do",
+  "double",
+  "else",
+  "extends",
+  "false",
+  "final",
+  "finally",
+  "float",
+  "for",
+  "function",
+  "goto",
+  "if",
+  "implements",
+  "import",
+  "in",
+  "instanceof",
+  "int",
+  "interface",
+  "long",
+  "native",
+  "new",
+  "null",
+  "package",
+  "private",
+  "protected",
+  "public",
+  "return",
+  "short",
+  "static",
+  "super",
+  "switch",
+  "synchronized",
+  "this",
+  "throw",
+  "throws",
+  "transient",
+  "true",
+  "try",
+  "var",
+  "void",
+  "while",
+  "with"
+};
+int main ()
+{
+  int i;
+  for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
+    {
+#ifdef CPLUSPLUS_TEST
+      CONST char * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
+#else
+      CONST char * resword = in_word_set(testdata[i],strlen(testdata[i]));
+#endif
+      if (i > 0)
+        {
+          if (!resword)
+            exit (1);
+          if (strcmp(testdata[i],resword))
+            exit (1);
+        }
+      else
+        {
+          if (resword)
+            exit (1);
+        }
+    }
+  return 0;
+}
diff --git a/tests/jstest2.gperf b/tests/jstest2.gperf
new file mode 100644 (file)
index 0000000..ee0fa7f
--- /dev/null
@@ -0,0 +1,147 @@
+struct js_keyword {
+  char * name;
+  int token;
+}
+%%
+abstract, 1
+boolean, 2
+break, 3
+byte, 4
+case, 5
+catch, 6
+char, 7
+class, 8
+const, 9
+continue, 10
+default, 11
+do, 12
+double, 13
+else, 14
+extends, 15
+false, 16
+final, 17
+finally, 18
+float, 19
+for, 20
+function, 21
+goto, 22
+if, 23
+implements, 24
+import, 25
+in, 26
+instanceof, 27
+int, 28
+interface, 29
+long, 30
+native, 31
+new, 32
+null, 33
+package, 34
+private, 35
+protected, 36
+public, 37
+return, 38
+short, 39
+static, 40
+super, 41
+switch, 42
+synchronized, 43
+this, 44
+throw, 45
+throws, 46
+transient, 47
+true, 48
+try, 49
+var, 50
+void, 51
+while, 52
+with, 53
+%%
+#include <stdlib.h>
+#include <string.h>
+#if defined(__STDC__) || defined(__cplusplus)
+#define CONST const
+#else
+#define CONST
+#endif
+static CONST char* testdata[] = {
+  "bogus",
+  "abstract",
+  "boolean",
+  "break",
+  "byte",
+  "case",
+  "catch",
+  "char",
+  "class",
+  "const",
+  "continue",
+  "default",
+  "do",
+  "double",
+  "else",
+  "extends",
+  "false",
+  "final",
+  "finally",
+  "float",
+  "for",
+  "function",
+  "goto",
+  "if",
+  "implements",
+  "import",
+  "in",
+  "instanceof",
+  "int",
+  "interface",
+  "long",
+  "native",
+  "new",
+  "null",
+  "package",
+  "private",
+  "protected",
+  "public",
+  "return",
+  "short",
+  "static",
+  "super",
+  "switch",
+  "synchronized",
+  "this",
+  "throw",
+  "throws",
+  "transient",
+  "true",
+  "try",
+  "var",
+  "void",
+  "while",
+  "with"
+};
+int main ()
+{
+  int i;
+  for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
+    {
+#ifdef CPLUSPLUS_TEST
+      CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
+#else
+      CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
+#endif
+      if (i > 0)
+        {
+          if (!resword)
+            exit (1);
+          if (strcmp(testdata[i],resword->name))
+            exit (1);
+        }
+      else
+        {
+          if (resword)
+            exit (1);
+        }
+    }
+  return 0;
+}
diff --git a/tests/jstest3.gperf b/tests/jstest3.gperf
new file mode 100644 (file)
index 0000000..54d37ce
--- /dev/null
@@ -0,0 +1,147 @@
+struct js_keyword {
+  const char * name;
+  int token;
+}
+%%
+abstract, 1
+boolean, 2
+break, 3
+byte, 4
+case, 5
+catch, 6
+char, 7
+class, 8
+const, 9
+continue, 10
+default, 11
+do, 12
+double, 13
+else, 14
+extends, 15
+false, 16
+final, 17
+finally, 18
+float, 19
+for, 20
+function, 21
+goto, 22
+if, 23
+implements, 24
+import, 25
+in, 26
+instanceof, 27
+int, 28
+interface, 29
+long, 30
+native, 31
+new, 32
+null, 33
+package, 34
+private, 35
+protected, 36
+public, 37
+return, 38
+short, 39
+static, 40
+super, 41
+switch, 42
+synchronized, 43
+this, 44
+throw, 45
+throws, 46
+transient, 47
+true, 48
+try, 49
+var, 50
+void, 51
+while, 52
+with, 53
+%%
+#include <stdlib.h>
+#include <string.h>
+#if defined(__STDC__) || defined(__cplusplus)
+#define CONST const
+#else
+#define CONST
+#endif
+static CONST char* testdata[] = {
+  "bogus",
+  "abstract",
+  "boolean",
+  "break",
+  "byte",
+  "case",
+  "catch",
+  "char",
+  "class",
+  "const",
+  "continue",
+  "default",
+  "do",
+  "double",
+  "else",
+  "extends",
+  "false",
+  "final",
+  "finally",
+  "float",
+  "for",
+  "function",
+  "goto",
+  "if",
+  "implements",
+  "import",
+  "in",
+  "instanceof",
+  "int",
+  "interface",
+  "long",
+  "native",
+  "new",
+  "null",
+  "package",
+  "private",
+  "protected",
+  "public",
+  "return",
+  "short",
+  "static",
+  "super",
+  "switch",
+  "synchronized",
+  "this",
+  "throw",
+  "throws",
+  "transient",
+  "true",
+  "try",
+  "var",
+  "void",
+  "while",
+  "with"
+};
+int main ()
+{
+  int i;
+  for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
+    {
+#ifdef CPLUSPLUS_TEST
+      CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
+#else
+      CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
+#endif
+      if (i > 0)
+        {
+          if (!resword)
+            exit (1);
+          if (strcmp(testdata[i],resword->name))
+            exit (1);
+        }
+      else
+        {
+          if (resword)
+            exit (1);
+        }
+    }
+  return 0;
+}
diff --git a/tests/jstest4.gperf b/tests/jstest4.gperf
new file mode 100644 (file)
index 0000000..b02617c
--- /dev/null
@@ -0,0 +1,147 @@
+struct js_keyword {
+  int name;
+  int token;
+}
+%%
+abstract, 1
+boolean, 2
+break, 3
+byte, 4
+case, 5
+catch, 6
+char, 7
+class, 8
+const, 9
+continue, 10
+default, 11
+do, 12
+double, 13
+else, 14
+extends, 15
+false, 16
+final, 17
+finally, 18
+float, 19
+for, 20
+function, 21
+goto, 22
+if, 23
+implements, 24
+import, 25
+in, 26
+instanceof, 27
+int, 28
+interface, 29
+long, 30
+native, 31
+new, 32
+null, 33
+package, 34
+private, 35
+protected, 36
+public, 37
+return, 38
+short, 39
+static, 40
+super, 41
+switch, 42
+synchronized, 43
+this, 44
+throw, 45
+throws, 46
+transient, 47
+true, 48
+try, 49
+var, 50
+void, 51
+while, 52
+with, 53
+%%
+#include <stdlib.h>
+#include <string.h>
+#if defined(__STDC__) || defined(__cplusplus)
+#define CONST const
+#else
+#define CONST
+#endif
+static CONST char* testdata[] = {
+  "bogus",
+  "abstract",
+  "boolean",
+  "break",
+  "byte",
+  "case",
+  "catch",
+  "char",
+  "class",
+  "const",
+  "continue",
+  "default",
+  "do",
+  "double",
+  "else",
+  "extends",
+  "false",
+  "final",
+  "finally",
+  "float",
+  "for",
+  "function",
+  "goto",
+  "if",
+  "implements",
+  "import",
+  "in",
+  "instanceof",
+  "int",
+  "interface",
+  "long",
+  "native",
+  "new",
+  "null",
+  "package",
+  "private",
+  "protected",
+  "public",
+  "return",
+  "short",
+  "static",
+  "super",
+  "switch",
+  "synchronized",
+  "this",
+  "throw",
+  "throws",
+  "transient",
+  "true",
+  "try",
+  "var",
+  "void",
+  "while",
+  "with"
+};
+int main ()
+{
+  int i;
+  for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
+    {
+#ifdef CPLUSPLUS_TEST
+      CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
+#else
+      CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
+#endif
+      if (i > 0)
+        {
+          if (!resword)
+            exit (1);
+          if (strcmp(testdata[i],stringpool+resword->name))
+            exit (1);
+        }
+      else
+        {
+          if (resword)
+            exit (1);
+        }
+    }
+  return 0;
+}
diff --git a/tests/lang-ucs2.exp b/tests/lang-ucs2.exp
new file mode 100644 (file)
index 0000000..8404846
--- /dev/null
@@ -0,0 +1,20 @@
+in word set: 12A0 121B 122D 129B
+in word set: 010D 0065 0073 006B 0079
+in word set: 0044 0061 006E 0073 006B
+in word set: 0045 006E 0067 006C 0069 0073 0068
+in word set: 0053 0075 006F 006D 0069
+in word set: 0046 0072 0061 006E 00E7 0061 0069 0073
+in word set: 0044 0065 0075 0074 0073 0063 0068
+in word set: 0395 03BB 03BB 03B7 03BD 03B9 03BA 03AC
+in word set: 05E2 05D1 05E8 05D9 05EA
+in word set: 0049 0074 0061 006C 0069 0061 006E 006F
+in word set: 004E 006F 0072 0073 006B
+in word set: 0420 0443 0441 0441 043A 0438 0439
+in word set: 0045 0073 0070 0061 00F1 006F 006C
+in word set: 0053 0076 0065 006E 0073 006B 0061
+in word set: 0E20 0E32 0E29 0E32 0E44 0E17 0E22
+in word set: 0054 00FC 0072 006B 00E7 0065
+in word set: 0054 0069 1EBF 006E 0067 0020 0056 0069 1EC7 0074
+in word set: 65E5 672C 8A9E
+in word set: 4E2D 6587
+in word set: D55C AE00
diff --git a/tests/lang-ucs2.gperf b/tests/lang-ucs2.gperf
new file mode 100644 (file)
index 0000000..8f2ac9e
--- /dev/null
@@ -0,0 +1,26 @@
+struct language {
+  const char *foreign_name;
+  const char *english_name;
+  const char *locale;
+};
+%%
+"\x12\xA0\x12\x1B\x12\x2D\x12\x9B",       "Amharic",    NULL
+"\x01\x0D\x00\x65\x00\x73\x00\x6B\x00\x79",      "Czech",      "cs_CZ.UTF-8"
+"\x00\x44\x00\x61\x00\x6E\x00\x73\x00\x6B",      "Danish",     "da_DK.UTF-8"
+"\x00\x45\x00\x6E\x00\x67\x00\x6C\x00\x69\x00\x73\x00\x68",    "English",    "en_GB.UTF-8"
+"\x00\x53\x00\x75\x00\x6F\x00\x6D\x00\x69",      "Finnish",    "fi_FI.UTF-8"
+"\x00\x46\x00\x72\x00\x61\x00\x6E\x00\xE7\x00\x61\x00\x69\x00\x73",   "French",     "fr_FR.UTF-8"
+"\x00\x44\x00\x65\x00\x75\x00\x74\x00\x73\x00\x63\x00\x68",    "German",     "de_DE.UTF-8"
+"\x03\x95\x03\xBB\x03\xBB\x03\xB7\x03\xBD\x03\xB9\x03\xBA\x03\xAC",   "Greek",      "el_GR.UTF-8"
+"\x05\xE2\x05\xD1\x05\xE8\x05\xD9\x05\xEA",      "Hebrew",     "he_IL.UTF-8"
+"\x00\x49\x00\x74\x00\x61\x00\x6C\x00\x69\x00\x61\x00\x6E\x00\x6F",   "Italian",    "it_IT.UTF-8"
+"\x00\x4E\x00\x6F\x00\x72\x00\x73\x00\x6B",      "Norwegian",  "no_NO.UTF-8"
+"\x04\x20\x04\x43\x04\x41\x04\x41\x04\x3A\x04\x38\x04\x39",    "Russian",    "ru_RU.UTF-8"
+"\x00\x45\x00\x73\x00\x70\x00\x61\x00\xF1\x00\x6F\x00\x6C",    "Spanish",    "es_ES.UTF-8"
+"\x00\x53\x00\x76\x00\x65\x00\x6E\x00\x73\x00\x6B\x00\x61",    "Swedish",    "sv_SE.UTF-8"
+"\x0E\x20\x0E\x32\x0E\x29\x0E\x32\x0E\x44\x0E\x17\x0E\x22",    "Thai",       "th_TH.UTF-8"
+"\x00\x54\x00\xFC\x00\x72\x00\x6B\x00\xE7\x00\x65",     "Turkish",    "tr_TR.UTF-8"
+"\x00\x54\x00\x69\x1E\xBF\x00\x6E\x00\x67\x00\x20\x00\x56\x00\x69\x1E\xC7\x00\x74", "Vietnamese", "vi_VN.UTF-8"
+"\x65\xE5\x67\x2C\x8A\x9E",     "Japanese",   "ja_JP.UTF-8"
+"\x4E\x2D\x65\x87",       "Chinese",    "zh_CN.UTF-8"
+"\xD5\x5C\xAE\x00",       "Korean",     "ko_KR.UTF-8"
diff --git a/tests/lang-ucs2.in b/tests/lang-ucs2.in
new file mode 100644 (file)
index 0000000..4766a7d
Binary files /dev/null and b/tests/lang-ucs2.in differ
diff --git a/tests/lang-utf8.exp b/tests/lang-utf8.exp
new file mode 100644 (file)
index 0000000..56d9572
--- /dev/null
@@ -0,0 +1,20 @@
+in word set አማርኛ
+in word set česky
+in word set Dansk
+in word set English
+in word set Suomi
+in word set Français
+in word set Deutsch
+in word set Ελληνικά
+in word set עברית
+in word set Italiano
+in word set Norsk
+in word set Русский
+in word set Español
+in word set Svenska
+in word set ภาษาไทย
+in word set Türkçe
+in word set Tiếng Việt
+in word set 日本語
+in word set 中文
+in word set 한글
diff --git a/tests/lang-utf8.gperf b/tests/lang-utf8.gperf
new file mode 100644 (file)
index 0000000..2beacdd
--- /dev/null
@@ -0,0 +1,26 @@
+struct language {
+  const char *foreign_name;
+  const char *english_name;
+  const char *locale;
+};
+%%
+አማርኛ,       "Amharic",    NULL
+česky,      "Czech",      "cs_CZ.UTF-8"
+Dansk,      "Danish",     "da_DK.UTF-8"
+English,    "English",    "en_GB.UTF-8"
+Suomi,      "Finnish",    "fi_FI.UTF-8"
+Français,   "French",     "fr_FR.UTF-8"
+Deutsch,    "German",     "de_DE.UTF-8"
+Ελληνικά,   "Greek",      "el_GR.UTF-8"
+עברית,      "Hebrew",     "he_IL.UTF-8"
+Italiano,   "Italian",    "it_IT.UTF-8"
+Norsk,      "Norwegian",  "no_NO.UTF-8"
+Русский,    "Russian",    "ru_RU.UTF-8"
+Español,    "Spanish",    "es_ES.UTF-8"
+Svenska,    "Swedish",    "sv_SE.UTF-8"
+ภาษาไทย,    "Thai",       "th_TH.UTF-8"
+Türkçe,     "Turkish",    "tr_TR.UTF-8"
+Tiếng Việt, "Vietnamese", "vi_VN.UTF-8"
+日本語,     "Japanese",   "ja_JP.UTF-8"
+中文,       "Chinese",    "zh_CN.UTF-8"
+한글,       "Korean",     "ko_KR.UTF-8"
diff --git a/tests/languages.exp b/tests/languages.exp
new file mode 100644 (file)
index 0000000..54cbb00
--- /dev/null
@@ -0,0 +1,1489 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -C -E -G -I -t  */
+/* Computed positions: -k'1-3,5,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* gperf -CDEGTlot -H language_hash -K code -L ANSI-C -N language_entry */
+/* Generated from ISO 639 language data from http://lcweb.loc.gov/standards/iso639-2/langhome.html
+   and from IANA registry at http://www.iana.org/assignments/language-tags
+   by %M%
+*/
+/* englangn.html Updated: August 14, 2002 */
+/* frenchlangn.html Updated: August 14, 2002 */
+/* language-tags last updated 2001-07-17 */
+struct language { const char *code; const char *name_en; int num_en; const char *name_fr; int num_fr; };
+#include <string.h>
+enum
+  {
+    TOTAL_KEYWORDS = 685,
+    MIN_WORD_LENGTH = 2,
+    MAX_WORD_LENGTH = 11,
+    MIN_HASH_VALUE = 28,
+    MAX_HASH_VALUE = 3860
+  };
+
+/* maximum key range = 3833, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static const unsigned short asso_values[] =
+    {
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861,  115, 3861, 3861, 3861,   25,
+      3861, 3861, 3861, 3861,   55, 3861, 3861, 3861,    0, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861,  180,  520, 1021,
+        77, 1006,  757,  660,  146,  950,  155,   25,  220,   20,
+         5,  775,  745,  331,   60,    0,   85,  895,  351,  447,
+       965,  866,  585,   87,  877,  480,  670, 1015,  100, 3861,
+       261,   60, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+      3861, 3861, 3861, 3861, 3861
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[4]+1];
+      /*FALLTHROUGH*/
+      case 4:
+      case 3:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+        hval += asso_values[(unsigned char)str[1]+9];
+      /*FALLTHROUGH*/
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+static const struct language wordlist[] =
+  {
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"nds",    "Low Saxon; Low German; Saxon, Low; German, Low",       240,    "saxon, bas; allemand, bas; bas saxon; bas allemand",   363},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"men",    "Mende",        272,    "mendé",        269},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sem",    "Semitic (Other)",      362,    "sémitiques, autres langues",   365},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"sin",    "Sinhalese",    371,    "singhalais",   371},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mis",    "Miscellaneous languages",      275,    "diverses, langues",    106},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"min",    "Minangkabau",  274,    "minangkabau",  271},
+    {""},
+    {"den",    "Slave (Athapascan)",   375,    "esclave (athapascan)", 118},
+    {""}, {""},
+    {"kin",    "Kinyarwanda",  211,    "rwanda",       347},
+    {"sd",     "Sindhi",       370,    "sindhi",       370},
+    {""}, {""}, {""}, {""},
+    {"nd",     "North Ndebele",        301,    "ndébélé du Nord",      285},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sk",     "Slovak",       377,    "slovaque",     375},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"mk",     "Macedonian",   250,    "macédonien",   244},
+    {"tem",    "Timne",        412,    "temne",        402},
+    {""}, {""}, {""},
+    {"kk",     "Kazakh",       204,    "kazakh",       205},
+    {"kik",    "Kikuyu; Gikuyu",       209,    "kikuyu",       210},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"sr",     "Serbian",      363,    "serbe",        366},
+    {"din",    "Dinka",        100,    "dinka",        104},
+    {""}, {""}, {""},
+    {"nr",     "South Ndebele",        388,    "ndébélé du Sud",       286},
+    {""}, {""}, {""},
+    {"sas",    "Sasak",        358,    "sasak",        362},
+    {""}, {""}, {""}, {""},
+    {"mdr",    "Mandar",       260,    "mandar",       256},
+    {""}, {""}, {""}, {""},
+    {"san",    "Sanskrit",     355,    "sanskrit",     359},
+    {"mr",     "Marathi",      266,    "marathe",      263},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mas",    "Masai",        270,    "massaï",       267},
+    {""}, {""}, {""},
+    {"kj",     "Kwanyama, Kuanyama",   225,    "kwanyama; kuanyama",   225},
+    {"kas",    "Kashmiri",     202,    "kashmiri",     203},
+    {""}, {""}, {""}, {""},
+    {"man",    "Mandingo",     261,    "mandingue",    257},
+    {""}, {""}, {""}, {""},
+    {"kan",    "Kannada",      198,    "kannada",      199},
+    {""}, {""}, {""},
+    {"tk",     "Turkmen",      426,    "turkmène",     425},
+    {"sam",    "Samaritan Aramaic",    350,    "samaritain",   349},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kir",    "Kirghiz",      212,    "kirghize",     212},
+    {""},
+    {"srr",    "Serer",        364,    "sérère",       367},
+    {""}, {""},
+    {"ter",    "Tereno",       406,    "tereno",       403},
+    {""}, {""}, {""},
+    {"sid",    "Sidamo",       367,    "sidamo",       369},
+    {""},
+    {"hin",    "Hindi",        165,    "hindi",        165},
+    {""}, {""}, {""},
+    {"kam",    "Kamba",        197,    "kamba",        198},
+    {""}, {""}, {""}, {""},
+    {"mak",    "Makasar",      254,    "makassar",     248},
+    {"de-1901",        "German traditional orthography",       464,    "German traditional orthography",       455},
+    {""}, {""}, {""},
+    {"sit",    "Sino-Tibetan (Other)", 372,    "sino-tibétaines, autres langues",      372},
+    {"tr",     "Turkish",      424,    "turc", 423},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mwr",    "Marwari",      269,    "marvari",      266},
+    {"srd",    "Sardinian",    357,    "sarde",        361},
+    {"dan",    "Danish",       97,     "danois",       101},
+    {""}, {""}, {""},
+    {"him",    "Himachali",    164,    "himachali",    164},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"abk",    "Abkhazian",    1,      "abkhaze",      1},
+    {"de-1996",        "German orthography of 1996",   465,    "German orthography of 1996",   456},
+    {""}, {""},
+    {"mkd",    "Macedonian",   250,    "macédonien",   244},
+    {"tet",    "Tetum",        407,    "tetum",        404},
+    {""}, {""}, {""}, {""},
+    {"tir",    "Tigrinya",     411,    "tigrigna",     409},
+    {""}, {""}, {""}, {""}, {""},
+    {"her",    "Herero",       162,    "herero",       162},
+    {""}, {""}, {""}, {""},
+    {"nyn",    "Nyankole",     308,    "nyankolé",     303},
+    {"arn",    "Araucanian",   20,     "araucan",      25},
+    {""}, {""},
+    {"tam",    "Tamil",        403,    "tamoul",       396},
+    {""},
+    {"dak",    "Dakota",       96,     "dakota",       100},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"lin",    "Lingala",      237,    "lingala",      234},
+    {"myn",    "Mayan languages",      271,    "maya, langues",        268},
+    {"hr",     "Croatian",     93,     "croate",       99},
+    {""}, {""},
+    {"mar",    "Marathi",      266,    "marathe",      263},
+    {""}, {""}, {""}, {""},
+    {"kar",    "Karen",        201,    "karen",        202},
+    {""}, {""}, {""}, {""}, {""},
+    {"nym",    "Nyamwezi",     306,    "nyamwezi",     301},
+    {"arm",    "Armenian",     22,     "arménien",     27},
+    {""},
+    {"sad",    "Sandawe",      353,    "sandawe",      357},
+    {""}, {""}, {""}, {""}, {""},
+    {"akk",    "Akkadian",     10,     "akkadien",     10},
+    {""}, {""}, {""}, {""},
+    {"lim",    "Limburgish; Limburger; Limburgan",     236,    "limbourgeois", 233},
+    {""}, {""}, {""}, {""},
+    {"sat",    "Santali",      356,    "santal",       360},
+    {"ar",     "Arabic",       17,     "arabe",        22},
+    {""}, {""},
+    {"mad",    "Madurese",     251,    "madourais",    245},
+    {""}, {""}, {""}, {""},
+    {"sa",     "Sanskrit",     355,    "sanskrit",     359},
+    {"rar",    "Rarotongan",   343,    "rarotonga",    341},
+    {""}, {""}, {""},
+    {"na",     "Nauru",        285,    "nauruan",      283},
+    {"scr",    "Croatian",     93,     "croate",       99},
+    {"shn",    "Shan", 365,    "chan", 80},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kat",    "Georgian",     141,    "géorgien",     145},
+    {"sms",    "Skolt Sami",   374,    "sami skolt",   355},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ka",     "Georgian",     141,    "géorgien",     145},
+    {""},
+    {"smn",    "Inari Sami",   177,    "sami d'Inari", 352},
+    {""}, {""}, {""}, {""},
+    {"ven",    "Venda",        438,    "venda",        431},
+    {""}, {""}, {""},
+    {"sm",     "Samoan",       352,    "samoan",       356},
+    {""}, {""}, {""}, {""}, {""},
+    {"hit",    "Hittite",      167,    "hittite",      167},
+    {""}, {""}, {""}, {""},
+    {"syr",    "Syriac",       397,    "syriaque",     391},
+    {""}, {""},
+    {"art-lojban",     "Lojban",       462,    "Lojban",       453},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"km",     "Khmer",        206,    "khmer",        207},
+    {"khm",    "Khmer",        206,    "khmer",        207},
+    {"mkh",    "Mon-Khmer (Other)",    278,    "môn-khmer, autres langues",    274},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"tat",    "Tatar",        404,    "tatar",        397},
+    {"da",     "Danish",       97,     "danois",       101},
+    {""}, {""}, {""},
+    {"lam",    "Lamba",        228,    "lamba",        227},
+    {""}, {""}, {""},
+    {"ta",     "Tamil",        403,    "tamoul",       396},
+    {""}, {""}, {""}, {""}, {""},
+    {"nia",    "Nias", 294,    "nias", 292},
+    {""}, {""}, {""}, {""},
+    {"rm",     "Raeto-Romance",        340,    "rhéto-roman",  342},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"art",    "Artificial (Other)",   23,     "artificielles, autres langues",        28},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sel",    "Selkup",       361,    "selkoupe",     364},
+    {""},
+    {"sah",    "Yakut",        450,    "iakoute",      171},
+    {""}, {""},
+    {"lit",    "Lithuanian",   238,    "lituanien",    235},
+    {"sn",     "Shona",        366,    "shona",        368},
+    {"nah",    "Nahuatl",      284,    "nahuatl",      281},
+    {""}, {""},
+    {"aar",    "Afar", 5,      "afar", 5},
+    {"nn",     "Nynorsk, Norwegian; Norwegian Nynorsk",        309,    "nynorsk, norvégien; norvégien nynorsk",        304},
+    {""}, {""}, {""},
+    {"swa",    "Swahili",      394,    "swahili",      389},
+    {""},
+    {"wen",    "Sorbian languages",    383,    "sorabes, langues",     381},
+    {""}, {""}, {""}, {""},
+    {"mah",    "Marshallese",  268,    "marshall",     265},
+    {""}, {""},
+    {"nbl",    "South Ndebele",        388,    "ndébélé du Sud",       286},
+    {"mn",     "Mongolian",    280,    "mongol",       276},
+    {""}, {""}, {""}, {""},
+    {"kn",     "Kannada",      198,    "kannada",      199},
+    {""}, {""}, {""},
+    {"ha",     "Hausa",        159,    "haoussa",      159},
+    {"aym",    "Aymara",       32,     "aymara",       36},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ja",     "Japanese",     190,    "japonais",     191},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"mh",     "Marshallese",  268,    "marshall",     265},
+    {"snk",    "Soninke",      382,    "soninké",      380},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"hmn",    "Hmong",        168,    "hmong",        168},
+    {""}, {""}, {""},
+    {"rn",     "Rundi",        347,    "rundi",        345},
+    {""}, {""},
+    {"aa",     "Afar", 5,      "afar", 5},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"del",    "Delaware",     99,     "delaware",     103},
+    {""},
+    {"dra",    "Dravidian (Other)",    104,    "dravidiennes, autres langues", 111},
+    {"raj",    "Rajasthani",   341,    "rajasthani",   339},
+    {""}, {""}, {""},
+    {"lad",    "Ladino",       226,    "judéo-espagnol",       194},
+    {"tel",    "Telugu",       405,    "télougou",     401},
+    {""},
+    {"tah",    "Tahitian",     399,    "tahitien",     394},
+    {""}, {""},
+    {"ben",    "Bengali",      49,     "bengali",      54},
+    {"tn",     "Tswana",       421,    "tswana",       420},
+    {""}, {""}, {""},
+    {"kaa",    "Kara-Kalpak",  200,    "karakalpak",   201},
+    {""}, {""}, {""}, {""},
+    {"lat",    "Latin",        230,    "latin",        230},
+    {"sw",     "Swahili",      394,    "swahili",      389},
+    {""}, {""},
+    {"nb",     "Norwegian Bokmål; Bokmål, Norwegian",  303,    "norvégien bokmål; bokmål, norvégien",  298},
+    {"am",     "Amharic",      15,     "amharique",    17},
+    {""}, {""}, {""},
+    {"la",     "Latin",        230,    "latin",        230},
+    {""}, {""}, {""}, {""}, {""},
+    {"ada",    "Adangme",      4,      "adangme",      4},
+    {"th",     "Thai", 408,    "thaï", 405},
+    {""}, {""},
+    {"st",     "Sotho, Southern",      385,    "sotho du Sud", 383},
+    {"bem",    "Bemba",        48,     "bemba",        53},
+    {""}, {""}, {""}, {""}, {""},
+    {"kw",     "Cornish",      88,     "cornique",     94},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"bis",    "Bislama",      55,     "bichlamar",    57},
+    {""}, {""}, {""},
+    {"mt",     "Maltese",      258,    "maltais",      254},
+    {""}, {""}, {""}, {""}, {""},
+    {"bin",    "Bini", 54,     "bini", 61},
+    {""}, {""}, {""}, {""},
+    {"sal",    "Salishan languages",   349,    "salish, langues",      348},
+    {""}, {""}, {""}, {""},
+    {"zen",    "Zenaga",       458,    "zenaga",       449},
+    {"snd",    "Sindhi",       370,    "sindhi",       370},
+    {"was",    "Washo",        446,    "washo",        439},
+    {""}, {""}, {""},
+    {"rw",     "Kinyarwanda",  211,    "rwanda",       347},
+    {""}, {""}, {""},
+    {"tkl",    "Tokelau",      416,    "tokelau",      413},
+    {""}, {""}, {""}, {""},
+    {"mal",    "Malayalam",    257,    "malayalam",    250},
+    {""}, {""}, {""}, {""},
+    {"kal",    "Kalaallisut",  196,    "groenlandais", 154},
+    {""}, {""}, {""}, {""},
+    {"aka",    "Akan", 9,      "akan", 9},
+    {"nya",    "Nyanja; Chichewa; Chewa",      307,    "nyanja; chichewa; chewa",      302},
+    {"ara",    "Arabic",       17,     "arabe",        22},
+    {""}, {""},
+    {"bik",    "Bikol",        53,     "bikol",        60},
+    {"tw",     "Twi",  429,    "twi",  427},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"awa",    "Awadhi",       31,     "awadhi",       35},
+    {"mya",    "Burmese",      63,     "birman",       62},
+    {""}, {""}, {""},
+    {"ber",    "Berber (Other)",       50,     "berbères, autres langues",     55},
+    {"hil",    "Hiligaynon",   163,    "hiligaynon",   163},
+    {""}, {""},
+    {"tt",     "Tatar",        404,    "tatar",        397},
+    {""}, {""},
+    {"wak",    "Wakashan languages",   442,    "wakashennes, langues", 435},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"smj",    "Lule Sami",    245,    "sami de Lule", 351},
+    {""}, {""}, {""}, {""},
+    {"br",     "Breton",       59,     "breton",       68},
+    {"lah",    "Lahnda",       227,    "lahnda",       226},
+    {""}, {""},
+    {"sus",    "Susu", 393,    "soussou",      385},
+    {"ln",     "Lingala",      237,    "lingala",      234},
+    {""}, {""}, {""},
+    {"bas",    "Basa", 42,     "basa", 49},
+    {""}, {""}, {""}, {""},
+    {"sun",    "Sundanese",    392,    "soundanais",   384},
+    {""}, {""}, {""}, {""},
+    {"ban",    "Balinese",     35,     "balinais",     40},
+    {""}, {""}, {""}, {""},
+    {"mus",    "Creek",        91,     "muskogee",     280},
+    {""},
+    {"ach",    "Acoli",        3,      "acoli",        3},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mun",    "Munda languages",      283,    "mounda, langues",      278},
+    {""}, {""}, {""}, {""},
+    {"gem",    "Germanic (Other)",     146,    "germaniques, autres langues",  146},
+    {""}, {""}, {""}, {""}, {""},
+    {"sma",    "Southern Sami",        387,    "sami du Sud",  354},
+    {""}, {""}, {""},
+    {"bam",    "Bambara",      38,     "bambara",      43},
+    {"kha",    "Khasi",        205,    "khasi",        206},
+    {""}, {""}, {""},
+    {"suk",    "Sukuma",       390,    "sukuma",       387},
+    {"dz",     "Dzongkha",     109,    "dzongkha",     112},
+    {"war",    "Waray",        445,    "waray",        438},
+    {""},
+    {"ab",     "Abkhazian",    1,      "abkhaze",      1},
+    {"bak",    "Bashkir",      43,     "bachkir",      39},
+    {""}, {""},
+    {"tmh",    "Tamashek",     402,    "tamacheq",     395},
+    {""},
+    {"rus",    "Russian",      348,    "russe",        346},
+    {""}, {""}, {""}, {""},
+    {"kum",    "Kumyk",        221,    "koumyk",       218},
+    {""}, {""}, {""}, {""},
+    {"run",    "Rundi",        347,    "rundi",        345},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"sgn",    "Sign languages",       368,    "langues des signes",   228},
+    {"gd",     "Scottish Gaelic; Gaelic",      360,    "gaélique écossais; gaélique",  138},
+    {"grn",    "Guarani",      155,    "guarani",      155},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"lb",     "Luxembourgish; Letzeburgesch", 249,    "luxembourgeois",       243},
+    {""}, {""}, {""}, {""}, {""},
+    {"rum",    "Romanian",     345,    "roumain",      344},
+    {""}, {""}, {""}, {""}, {""},
+    {"tha",    "Thai", 408,    "thaï", 405},
+    {""}, {""}, {""}, {""},
+    {"wa",     "Walloon",      444,    "wallon",       437},
+    {""}, {""},
+    {"lt",     "Lithuanian",   238,    "lituanien",    235},
+    {"ger",    "German",       142,    "allemand",     14},
+    {""},
+    {"dum",    "Dutch, Middle (ca. 1050-1350)",        107,    "néerlandais moyen (ca. 1050-1350)",    289},
+    {""}, {""},
+    {"hz",     "Herero",       162,    "herero",       162},
+    {""}, {""}, {""}, {""},
+    {"tum",    "Tumbuka",      422,    "tumbuka",      421},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"tuk",    "Turkmen",      426,    "turkmène",     425},
+    {""},
+    {"sna",    "Shona",        366,    "shona",        368},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kur",    "Kurdish",      222,    "kurde",        222},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"amh",    "Amharic",      15,     "amharique",    17},
+    {"az",     "Azerbaijani",  33,     "azéri",        37},
+    {""},
+    {"hun",    "Hungarian",    169,    "hongrois",     169},
+    {"fin",    "Finnish",      125,    "finnois",      129},
+    {""},
+    {"bad",    "Banda",        40,     "banda",        45},
+    {""}, {""}, {""}, {""}, {""},
+    {"bej",    "Beja", 46,     "bedja",        52},
+    {""}, {""}, {""},
+    {"div",    "Divehi",       101,    "maldivien",    252},
+    {""}, {""}, {""}, {""}, {""},
+    {"bat",    "Baltic (Other)",       36,     "baltiques, autres langues",    42},
+    {""},
+    {"tiv",    "Tiv",  413,    "tiv",  410},
+    {""}, {""},
+    {"aus",    "Australian languages", 27,     "australiennes, langues",       32},
+    {""}, {""}, {""},
+    {"ba",     "Bashkir",      43,     "bachkir",      39},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"nav",    "Navajo; Navaho",       287,    "navaho",       284},
+    {""}, {""},
+    {"kut",    "Kutenai",      224,    "kutenai",      224},
+    {""}, {""}, {""}, {""},
+    {"per",    "Persian",      328,    "persan",       327},
+    {""},
+    {"bih",    "Bihari",       52,     "bihari",       59},
+    {""}, {""},
+    {"tur",    "Turkish",      424,    "turc", 423},
+    {"ss",     "Swati",        395,    "swati",        390},
+    {""}, {""}, {""},
+    {"tgk",    "Tajik",        401,    "tadjik",       392},
+    {""}, {""}, {""},
+    {"frm",    "French, Middle (ca.1400-1600)",        129,    "français moyen (1400-1600)",   133},
+    {""}, {""}, {""}, {""}, {""},
+    {"lus",    "Lushai",       248,    "lushai",       242},
+    {""},
+    {"wel",    "Welsh",        447,    "gallois",      141},
+    {""}, {""}, {""},
+    {"ms",     "Malay",        256,    "malais",       249},
+    {""}, {""}, {""},
+    {"lun",    "Lunda",        246,    "lunda",        240},
+    {"ks",     "Kashmiri",     202,    "kashmiri",     203},
+    {"orm",    "Oromo",        315,    "galla",        140},
+    {"fr",     "French",       128,    "français",     131},
+    {"new",    "Newari",       293,    "newari",       291},
+    {""}, {""}, {""}, {""}, {""},
+    {"pan",    "Panjabi",      325,    "pendjabi",     326},
+    {"fj",     "Fijian",       124,    "fidjien",      127},
+    {"fas",    "Persian",      328,    "persan",       327},
+    {""}, {""},
+    {"sq",     "Albanian",     11,     "albanais",     11},
+    {""},
+    {"dut",    "Dutch",        106,    "néerlandais",  288},
+    {""},
+    {"za",     "Zhuang; Chuang",       459,    "zhuang; chuang",       450},
+    {""},
+    {"or",     "Oriya",        314,    "oriya",        309},
+    {"fan",    "Fang", 121,    "fang", 124},
+    {""}, {""},
+    {"tut",    "Altaic (Other)",       14,     "altaïques, autres langues",    16},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"hrv",    "Croatian",     93,     "croate",       99},
+    {""}, {""}, {""}, {""},
+    {"pam",    "Pampanga",     323,    "pampangan",    322},
+    {""},
+    {"dgr",    "Dogrib",       103,    "dogrib",       109},
+    {""}, {""},
+    {"slk",    "Slovak",       377,    "slovaque",     375},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ath",    "Athapascan languages", 26,     "athapascanes, langues",        31},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"sgn-gr", "Greek Sign Language",  498,    "Greek Sign Language",  489},
+    {""},
+    {"ts",     "Tsonga",       420,    "tsonga",       419},
+    {""}, {""}, {""},
+    {"bel",    "Belarusian",   47,     "biélorusse",   58},
+    {""},
+    {"bra",    "Braj", 58,     "braj", 67},
+    {""}, {""}, {""},
+    {"bn",     "Bengali",      49,     "bengali",      54},
+    {"tsn",    "Tswana",       421,    "tswana",       420},
+    {""}, {""},
+    {"son",    "Songhai",      381,    "songhai",      379},
+    {""}, {""}, {""}, {""},
+    {"non",    "Norse, Old",   298,    "norrois, vieux",       296},
+    {""}, {""}, {""}, {""},
+    {"mos",    "Mossi",        281,    "moré", 277},
+    {"de-de-1901",     "German German variant traditional orthography",        470,    "German German variant traditional orthography",        461},
+    {""}, {""}, {""},
+    {"kos",    "Kosraean",     217,    "kosrae",       217},
+    {""}, {""},
+    {"sgn-it", "Italian Sign Language",        500,    "Italian Sign Language",        491},
+    {"ga",     "Irish",        185,    "irlandais",    185},
+    {"mon",    "Mongolian",    280,    "mongol",       276},
+    {"bh",     "Bihari",       52,     "bihari",       59},
+    {""}, {""}, {""},
+    {"kon",    "Kongo",        214,    "kongo",        215},
+    {""}, {""}, {""},
+    {"uk",     "Ukrainian",    432,    "ukrainien",    428},
+    {"som",    "Somali",       380,    "somali",       378},
+    {""}, {""}, {""},
+    {"si",     "Sinhalese",    371,    "singhalais",   371},
+    {"se",     "Northern Sami",        300,    "sami du Nord", 353},
+    {""},
+    {"jav",    "Javanese",     191,    "javanais",     192},
+    {""}, {""},
+    {"ne",     "Nepali",       292,    "népalais",     290},
+    {"de-de-1996",     "German German variant orthography of 1996",    471,    "German German variant orthography of 1996",    462},
+    {""}, {""}, {""},
+    {"sgn-za", "South African Sign Language",  509,    "South African Sign Language",  500},
+    {""}, {""}, {""}, {""}, {""},
+    {"ces",    "Czech",        95,     "tchèque",      398},
+    {""}, {""},
+    {"mi",     "Maori",        265,    "maori",        262},
+    {"kom",    "Komi", 213,    "komi", 214},
+    {"jpn",    "Japanese",     190,    "japonais",     191},
+    {""}, {""},
+    {"ki",     "Kikuyu; Gikuyu",       209,    "kikuyu",       210},
+    {"ron",    "Romanian",     345,    "roumain",      344},
+    {""}, {""}, {""}, {""},
+    {"kok",    "Konkani",      215,    "konkani",      216},
+    {"ur",     "Urdu", 435,    "ourdou",       316},
+    {"wal",    "Walamo",       443,    "walamo",       436},
+    {""}, {""},
+    {"gba",    "Gbaya",        139,    "gbaya",        144},
+    {"id",     "Indonesian",   180,    "indonésien",   180},
+    {""},
+    {"tyv",    "Tuvinian",     428,    "touva",        416},
+    {""},
+    {"btk",    "Batak (Indonesia)",    45,     "batak (Indonésie)",    51},
+    {""}, {""}, {""},
+    {"nld",    "Dutch",        106,    "néerlandais",  288},
+    {"kua",    "Kwanyama, Kuanyama",   225,    "kwanyama; kuanyama",   225},
+    {"as",     "Assamese",     24,     "assamais",     29},
+    {""}, {""},
+    {"ik",     "Inupiaq",      183,    "inupiaq",      183},
+    {"ton",    "Tonga (Tonga Islands)",        418,    "tongan (Îles Tonga)",  415},
+    {"zh",     "Chinese",      80,     "chinois",      86},
+    {""}, {""}, {""},
+    {"rom",    "Romany",       346,    "tsigane",      417},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kaw",    "Kawi", 203,    "kawi", 204},
+    {"afr",    "Afrikaans",    7,      "afrikaans",    7},
+    {""},
+    {"lav",    "Latvian",      231,    "letton",       231},
+    {""},
+    {"pa",     "Panjabi",      325,    "pendjabi",     326},
+    {"yid",    "Yiddish",      453,    "yiddish",      444},
+    {""},
+    {"fat",    "Fanti",        122,    "fanti",        125},
+    {""}, {""},
+    {"mlt",    "Maltese",      258,    "maltais",      254},
+    {"phn",    "Phoenician",   331,    "phénicien",    330},
+    {"de",     "German",       142,    "allemand",     14},
+    {""}, {""},
+    {"nor",    "Norwegian",    302,    "norvégien",    297},
+    {"fa",     "Persian",      328,    "persan",       327},
+    {""}, {""},
+    {"ti",     "Tigrinya",     411,    "tigrigna",     409},
+    {"te",     "Telugu",       405,    "télougou",     401},
+    {""},
+    {"asm",    "Assamese",     24,     "assamais",     29},
+    {""}, {""},
+    {"ukr",    "Ukrainian",    432,    "ukrainien",    428},
+    {""}, {""}, {""},
+    {"sgn-us", "American Sign Language",       508,    "American Sign Language",       499},
+    {"sga",    "Irish, Old (to 900)",  187,    "irlandais ancien (jusqu'à 900)",       186},
+    {""},
+    {"dua",    "Duala",        105,    "douala",       110},
+    {""}, {""},
+    {"kor",    "Korean",       216,    "coréen",       93},
+    {"gn",     "Guarani",      155,    "guarani",      155},
+    {""}, {""},
+    {"sl",     "Slovenian",    378,    "slovène",      376},
+    {"bal",    "Baluchi",      37,     "baloutchi",    41},
+    {""}, {""}, {""},
+    {"nl",     "Dutch",        106,    "néerlandais",  288},
+    {""}, {""}, {""}, {""},
+    {"de-at-1901",     "German Austrian variant traditional orthography",      466,    "German Austrian variant traditional orthography",      457},
+    {"mga",    "Irish, Middle (900-1200)",     186,    "irlandais moyen (900-1200)",   187},
+    {""},
+    {"fij",    "Fijian",       124,    "fidjien",      127},
+    {""}, {""},
+    {"mul",    "Multiple languages",   282,    "multilingue",  279},
+    {"ny",     "Nyanja; Chichewa; Chewa",      307,    "nyanja; chichewa; chewa",      302},
+    {""}, {""},
+    {"ml",     "Malayalam",    257,    "malayalam",    250},
+    {"sot",    "Sotho, Southern",      385,    "sotho du Sud", 383},
+    {"urd",    "Urdu", 435,    "ourdou",       316},
+    {"bnt",    "Bantu (Other)",        41,     "bantoues, autres langues",     46},
+    {""},
+    {"kl",     "Kalaallisut",  196,    "groenlandais", 154},
+    {""},
+    {"jpr",    "Judeo-Persian",        193,    "judéo-persan", 195},
+    {""}, {""}, {""},
+    {"om",     "Oromo",        315,    "galla",        140},
+    {"my",     "Burmese",      63,     "birman",       62},
+    {""}, {""}, {""}, {""},
+    {"ky",     "Kirghiz",      212,    "kirghize",     212},
+    {""}, {""},
+    {"de-at-1996",     "German Austrian variant orthography of 1996",  467,    "German Austrian variant orthography of 1996",  458},
+    {"hi",     "Hindi",        165,    "hindi",        165},
+    {"he",     "Hebrew",       161,    "hébreu",       161},
+    {""}, {""}, {""},
+    {"gil",    "Gilbertese",   148,    "kiribati",     213},
+    {"arw",    "Arawak",       21,     "arawak",       26},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sgn-pt", "Portuguese Sign Language",     506,    "Portuguese Sign Language",     497},
+    {""}, {""}, {""}, {""}, {""},
+    {"gaa",    "Ga",   134,    "ga",   136},
+    {""}, {""}, {""},
+    {"de-ch-1901",     "German Swiss variant traditional orthography", 468,    "German Swiss variant traditional orthography", 459},
+    {""}, {""}, {""}, {""}, {""},
+    {"tib",    "Tibetan",      409,    "tibétain",     407},
+    {"znd",    "Zande",        456,    "zandé",        447},
+    {""}, {""}, {""},
+    {"ae",     "Avestan",      30,     "avestique",    34},
+    {"heb",    "Hebrew",       161,    "hébreu",       161},
+    {"pra",    "Prakrit languages",    335,    "prâkrit",      335},
+    {""},
+    {"zh-min", "Min Fuzhou Hokkien Amoy or Taiwanese", 513,    "Min Fuzhou Hokkien Amoy or Taiwanese", 504},
+    {"haw",    "Hawaiian",     160,    "hawaïen",      160},
+    {"i-klingon",      "Klingon",      478,    "Klingon",      469},
+    {""},
+    {"zh-min-nan",     "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo",       514,    "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo",       505},
+    {"tl",     "Tagalog",      398,    "tagalog",      393},
+    {""}, {""}, {""}, {""},
+    {"fra",    "French",       128,    "français",     131},
+    {""}, {""}, {""}, {""},
+    {"de-ch-1996",     "German Swiss variant orthography of 1996",     469,    "German Swiss variant orthography of 1996",     460},
+    {""},
+    {"ty",     "Tahitian",     399,    "tahitien",     394},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kab",    "Kabyle",       194,    "kabyle",       196},
+    {""}, {""}, {""}, {""}, {""},
+    {"spa",    "Spanish; Castilian",   389,    "espagnol; castillan",  119},
+    {"ast",    "Bable; Asturian",      34,     "bable; asturien",      38},
+    {""},
+    {"li",     "Limburgish; Limburger; Limburgan",     236,    "limbourgeois", 233},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ssa",    "Nilo-Saharan (Other)", 296,    "nilo-sahariennes, autres langues",     294},
+    {""}, {""},
+    {"sc",     "Sardinian",    357,    "sarde",        361},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"afh",    "Afrihili",     6,      "afrihili",     6},
+    {""}, {""},
+    {"lua",    "Luba-Lulua",   243,    "luba-lulua",   238},
+    {""}, {""}, {""}, {""},
+    {"sla",    "Slavic (Other)",       376,    "slaves, autres langues",       374},
+    {""},
+    {"msa",    "Malay",        256,    "malais",       249},
+    {""}, {""},
+    {"paa",    "Papuan (Other)",       327,    "papoues, autres langues",      325},
+    {""}, {""}, {""}, {""},
+    {"zun",    "Zuni", 461,    "Zuni", 452},
+    {""}, {""}, {""}, {""},
+    {"tgl",    "Tagalog",      398,    "tagalog",      393},
+    {""},
+    {"hy",     "Armenian",     22,     "arménien",     27},
+    {""}, {""}, {""},
+    {"zha",    "Zhuang; Chuang",       459,    "zhuang; chuang",       450},
+    {"moh",    "Mohawk",       276,    "mohawk",       272},
+    {""}, {""}, {""}, {""},
+    {"jrb",    "Judeo-Arabic", 192,    "judéo-arabe",  193},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"car",    "Carib",        65,     "caribe",       72},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"gmh",    "German, Middle High (ca.1050-1500)",   144,    "",     0},
+    {""}, {""},
+    {"ay",     "Aymara",       32,     "aymara",       36},
+    {""}, {""},
+    {"pt",     "Portuguese",   334,    "portugais",    334},
+    {"bur",    "Burmese",      63,     "birman",       62},
+    {""}, {""}, {""}, {""},
+    {"afa",    "Afro-Asiatic (Other)", 8,      "afro-asiatiques, autres langues",      8},
+    {""},
+    {"roh",    "Raeto-Romance",        340,    "rhéto-roman",  342},
+    {""}, {""}, {""}, {""},
+    {"cym",    "Welsh",        447,    "gallois",      141},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cad",    "Caddo",        64,     "caddo",        71},
+    {""}, {""}, {""}, {""},
+    {"iba",    "Iban", 171,    "iban", 172},
+    {""},
+    {"baq",    "Basque",       44,     "basque",       50},
+    {""}, {""},
+    {"pal",    "Pahlavi",      320,    "pahlavi",      319},
+    {""}, {""}, {""}, {""}, {""},
+    {"cat",    "Catalan",      67,     "catalan",      74},
+    {""}, {""}, {""},
+    {"kaz",    "Kazakh",       204,    "kazakh",       205},
+    {""},
+    {"wln",    "Walloon",      444,    "wallon",       437},
+    {""}, {""},
+    {"ca",     "Catalan",      67,     "catalan",      74},
+    {""}, {""}, {""}, {""},
+    {"vi",     "Vietnamese",   439,    "vietnamien",   432},
+    {""},
+    {"chn",    "Chinook jargon",       81,     "chinook, jargon",      87},
+    {""}, {""},
+    {"sv",     "Swedish",      396,    "suédois",      386},
+    {""}, {""}, {""}, {""},
+    {"nv",     "Navajo; Navaho",       287,    "navaho",       284},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"roa",    "Romance (Other)",      344,    "romanes, autres langues",      343},
+    {""}, {""}, {""}, {""},
+    {"kv",     "Komi", 213,    "komi", 214},
+    {""},
+    {"chm",    "Mari", 267,    "mari", 264},
+    {""}, {""},
+    {"lez",    "Lezghian",     233,    "lezghien",     232},
+    {"bs",     "Bosnian",      57,     "bosniaque",    65},
+    {"ira",    "Iranian (Other)",      184,    "iraniennes, autres langues",   184},
+    {"i-hak",  "Hakka Deprecated use IETF zh-hakka registered Jan. 102000",    477,    "Hakka Deprecated use IETF zh-hakka registered Jan. 102000",    468},
+    {""}, {""}, {""},
+    {"chk",    "Chuukese",     85,     "chuuk",        91},
+    {""},
+    {"sg",     "Sango",        354,    "sango",        358},
+    {""},
+    {"apa",    "Apache languages",     16,     "apache",       21},
+    {""}, {""},
+    {"ng",     "Ndonga",       290,    "ndonga",       287},
+    {""}, {""}, {""}, {""}, {""},
+    {"pus",    "Pushto",       338,    "pachto",       318},
+    {"kmb",    "Kimbundu",     210,    "kimbundu",     211},
+    {""}, {""},
+    {"sgn-gb", "British Sign Language",        497,    "British Sign Language",        488},
+    {""}, {""}, {""}, {""},
+    {"mg",     "Malagasy",     255,    "malgache",     253},
+    {"mol",    "Moldavian",    277,    "moldave",      273},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"xh",     "Xhosa",        449,    "xhosa",        441},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"eka",    "Ekajuk",       112,    "ekajuk",       116},
+    {""}, {""}, {""}, {""}, {""},
+    {"en",     "English",      114,    "anglais",      18},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"tig",    "Tigre",        410,    "tigré",        408},
+    {"cel",    "Celtic (Other)",       70,     "celtiques, autres langues",    77},
+    {""}, {""}, {""}, {""}, {""},
+    {"chr",    "Cherokee",     75,     "cherokee",     81},
+    {"sgn-fr", "French Sign Language", 496,    "French Sign Language", 487},
+    {""},
+    {"sag",    "Sango",        354,    "sango",        358},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"bos",    "Bosnian",      57,     "bosniaque",    65},
+    {"vot",    "Votic",        441,    "vote", 434},
+    {""}, {""},
+    {"tg",     "Tajik",        401,    "tadjik",       392},
+    {""}, {""}, {""},
+    {"enm",    "English, Middle (1100-1500)",  115,    "anglais moyen (1100-1500)",    19},
+    {""},
+    {"mag",    "Magahi",       252,    "magahi",       246},
+    {"und",    "Undetermined", 434,    "indéterminée", 177},
+    {"ch",     "Chamorro",     73,     "chamorro",     79},
+    {""}, {""},
+    {"nep",    "Nepali",       292,    "népalais",     290},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sgn-es", "Spanish Sign Language",        495,    "Spanish Sign Language",        486},
+    {""}, {""}, {""},
+    {"it",     "Italian",      189,    "italien",      190},
+    {""}, {""}, {""}, {""}, {""},
+    {"jv",     "Javanese",     191,    "javanais",     192},
+    {""}, {""},
+    {"sgn-jp", "Japanese Sign Language",       501,    "Japanese Sign Language",       492},
+    {""}, {""}, {""}, {""}, {""},
+    {"bi",     "Bislama",      55,     "bichlamar",    57},
+    {"be",     "Belarusian",   47,     "biélorusse",   58},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"uz",     "Uzbek",        436,    "ouszbek",      317},
+    {"tvl",    "Tuvalu",       427,    "tuvalu",       426},
+    {""}, {""}, {""}, {""}, {""},
+    {"cel-gaulish",    "Gaulish",      463,    "Gaulish",      454},
+    {"fur",    "Friulian",     132,    "frioulan",     134},
+    {""}, {""},
+    {"bua",    "Buriat",       62,     "bouriate",     66},
+    {"ind",    "Indonesian",   180,    "indonésien",   180},
+    {""}, {""}, {""},
+    {"ava",    "Avaric",       29,     "avar", 33},
+    {""}, {""}, {""},
+    {"zh-gan", "Kan or Gan",   510,    "Kan or Gan",   501},
+    {""}, {""}, {""}, {""},
+    {"su",     "Sundanese",    392,    "soundanais",   384},
+    {""}, {""}, {""}, {""}, {""},
+    {"et",     "Estonian",     118,    "estonien",     121},
+    {""}, {""}, {""}, {""},
+    {"ndo",    "Ndonga",       290,    "ndonga",       287},
+    {""},
+    {"srp",    "Serbian",      363,    "serbe",        366},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"lv",     "Latvian",      231,    "letton",       231},
+    {""}, {""}, {""},
+    {"ku",     "Kurdish",      222,    "kurde",        222},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"slv",    "Slovenian",    378,    "slovène",      376},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sgn-co", "Colombian Sign Language",      492,    "Colombian Sign Language",      483},
+    {""}, {""}, {""}, {""},
+    {"sio",    "Siouan languages",     373,    "sioux, langues",       373},
+    {""}, {""}, {""}, {""},
+    {"ota",    "Turkish, Ottoman (1500-1928)", 425,    "turc ottoman (1500-1928)",     424},
+    {""}, {""}, {""}, {""}, {""},
+    {"ps",     "Pushto",       338,    "pachto",       318},
+    {""}, {""},
+    {"ru",     "Russian",      348,    "russe",        346},
+    {"lol",    "Mongo",        279,    "mongo",        275},
+    {""}, {""}, {""}, {""},
+    {"bul",    "Bulgarian",    61,     "bulgare",      70},
+    {""}, {""}, {""}, {""},
+    {"gon",    "Gondi",        149,    "gond", 147},
+    {""}, {""}, {""},
+    {"bod",    "Tibetan",      409,    "tibétain",     407},
+    {"guj",    "Gujarati",     156,    "goudjrati",    150},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"nap",    "Neapolitan",   291,    "napolitain",   282},
+    {"os",     "Ossetic; Ossetian",    318,    "ossète",       312},
+    {"oss",    "Ossetic; Ossetian",    318,    "ossète",       312},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"kro",    "Kru",  219,    "krou", 220},
+    {""}, {""},
+    {"map",    "Austronesian (Other)", 28,     "malayo-polynésiennes, autres langues", 251},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"eus",    "Basque",       44,     "basque",       50},
+    {""},
+    {"no-nyn", "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000",    487,    "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000",    478},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"dzo",    "Dzongkha",     109,    "dzongkha",     112},
+    {""}, {""}, {""},
+    {"cus",    "Cushitic (Other)",     94,     "couchitiques, autres langues", 96},
+    {""}, {""}, {""},
+    {"zul",    "Zulu", 460,    "zoulou",       451},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"rap",    "Rapanui",      342,    "rapanui",      340},
+    {""}, {""}, {""}, {""},
+    {"hu",     "Hungarian",    169,    "hongrois",     169},
+    {"af",     "Afrikaans",    7,      "afrikaans",    7},
+    {"cha",    "Chamorro",     73,     "chamorro",     79},
+    {""}, {""},
+    {"nub",    "Nubian languages",     305,    "nubiennes, langues",   300},
+    {""}, {""}, {""}, {""},
+    {"pon",    "Pohnpeian",    332,    "pohnpei",      332},
+    {""}, {""},
+    {"sgn-mx", "Mexican Sign Language",        502,    "Mexican Sign Language",        493},
+    {""},
+    {"mao",    "Maori",        265,    "maori",        262},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"fon",    "Fon",  127,    "fon",  130},
+    {""}, {""}, {""},
+    {"zh-hakka",       "Hakka",        512,    "Hakka",        503},
+    {""}, {""},
+    {"so",     "Somali",       380,    "somali",       378},
+    {""}, {""}, {""}, {""},
+    {"no",     "Norwegian",    302,    "norvégien",    297},
+    {"gor",    "Gorontalo",    150,    "gorontalo",    148},
+    {""}, {""},
+    {"sgn-nl", "Dutch Sign Language",  504,    "Dutch Sign Language",  495},
+    {""}, {""}, {""}, {""}, {""},
+    {"pi",     "Pali", 322,    "pali", 321},
+    {""},
+    {"vol",    "Volapük",      440,    "volapük",      433},
+    {"arp",    "Arapaho",      19,     "arapaho",      24},
+    {""},
+    {"mo",     "Moldavian",    277,    "moldave",      273},
+    {""}, {""}, {""}, {""},
+    {"ko",     "Korean",       216,    "coréen",       93},
+    {""},
+    {"fi",     "Finnish",      125,    "finnois",      129},
+    {""}, {""}, {""},
+    {"sco",    "Scots",        359,    "écossais",     113},
+    {"ssw",    "Swati",        395,    "swati",        390},
+    {""}, {""},
+    {"gl",     "Gallegan",     136,    "galicien",     139},
+    {"bla",    "Siksika",      369,    "blackfoot",    63},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ypk",    "Yupik languages",      455,    "yupik, langues",       446},
+    {""},
+    {"sgn-dk", "Danish Sign Language", 494,    "Danish Sign Language", 485},
+    {""}, {""},
+    {"grb",    "Grebo",        152,    "grebo",        151},
+    {""}, {""},
+    {"ita",    "Italian",      189,    "italien",      190},
+    {""}, {""}, {""}, {""},
+    {"got",    "Gothic",       151,    "gothique",     149},
+    {""}, {""}, {""},
+    {"ro",     "Romanian",     345,    "roumain",      344},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"nyo",    "Nyoro",        310,    "nyoro",        305},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"to",     "Tonga (Tonga Islands)",        418,    "tongan (Îles Tonga)",  415},
+    {""},
+    {"is",     "Icelandic",    172,    "islandais",    189},
+    {""}, {""}, {""},
+    {"por",    "Portuguese",   334,    "portugais",    334},
+    {""}, {""},
+    {"i-default",      "Default Language Context",     475,    "Default Language Context",     466},
+    {"sgn-br", "Brazilian Sign Language",      490,    "Brazilian Sign Language",      481},
+    {"gez",    "Geez", 140,    "guèze",        156},
+    {""},
+    {"sgn-be-fr",      "Belgian-French Sign Language", 488,    "Belgian-French Sign Language", 479},
+    {""},
+    {"sgn-ch-de",      "Swiss German Sign Language",   491,    "Swiss German Sign Language",   482},
+    {""}, {""}, {""}, {""},
+    {"sgn-se", "Swedish Sign Language",        507,    "Swedish Sign Language",        498},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"zh-xiang",       "Xiang or Hunanese",    516,    "Xiang or Hunanese",    507},
+    {"wol",    "Wolof",        448,    "wolof",        440},
+    {""}, {""},
+    {"niu",    "Niuean",       297,    "niué", 295},
+    {""}, {""},
+    {"no-bok", "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000",    486,    "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000",    477},
+    {"pl",     "Polish",       333,    "polonais",     333},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ipk",    "Inupiaq",      183,    "inupiaq",      183},
+    {"ful",    "Fulah",        133,    "peul", 329},
+    {""}, {""},
+    {"ltz",    "Luxembourgish; Letzeburgesch", 249,    "luxembourgeois",       243},
+    {""},
+    {"deu",    "German",       142,    "allemand",     14},
+    {""}, {""},
+    {"yi",     "Yiddish",      453,    "yiddish",      444},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"es",     "Spanish; Castilian",   389,    "espagnol; castillan",  119},
+    {"fy",     "Frisian",      131,    "frison",       135},
+    {""},
+    {"ho",     "Hiri Motu",    166,    "hiri motu",    166},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"qu",     "Quechua",      339,    "quechua",      338},
+    {""},
+    {"cs",     "Czech",        95,     "tchèque",      398},
+    {""}, {""}, {""},
+    {"smo",    "Samoan",       352,    "samoan",       356},
+    {"kru",    "Kurukh",       223,    "kurukh",       223},
+    {""}, {""}, {""},
+    {"kho",    "Khotanese",    208,    "khotanais",    209},
+    {"may",    "Malay",        256,    "malais",       249},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"sgn-ie", "Irish Sign Language",  499,    "Irish Sign Language",  490},
+    {"gla",    "Scottish Gaelic; Gaelic",      360,    "gaélique écossais; gaélique",  138},
+    {""},
+    {"goh",    "German, Old High (ca.750-1050)",       145,    "",     0},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"bg",     "Bulgarian",    61,     "bulgare",      70},
+    {"lao",    "Lao",  229,    "lao",  229},
+    {""}, {""}, {""}, {""},
+    {"lub",    "Luba-Katanga", 242,    "luba-katanga", 237},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ang",    "English, Old (ca.450-1100)",   116,    "anglo-saxon (ca.450-1100)",    20},
+    {""}, {""},
+    {"nau",    "Nauru",        285,    "nauruan",      283},
+    {"yor",    "Yoruba",       454,    "yoruba",       445},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"lo",     "Lao",  229,    "lao",  229},
+    {"ie",     "Interlingue",  181,    "interlingue",  181},
+    {""}, {""}, {""},
+    {"day",    "Dayak",        98,     "dayak",        102},
+    {"nzi",    "Nzima",        311,    "nzema",        306},
+    {""}, {""}, {""}, {""},
+    {"kau",    "Kanuri",       199,    "kanouri",      200},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"cos",    "Corsican",     89,     "corse",        95},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"uzb",    "Uzbek",        436,    "ouszbek",      317},
+    {""},
+    {"sgn-be-nl",      "Belgian-Flemish Sign Language",        489,    "Belgian-Flemish Sign Language",        480},
+    {""}, {""},
+    {"uga",    "Ugaritic",     430,    "ougaritique",  314},
+    {""},
+    {"nno",    "Nynorsk, Norwegian; Norwegian Nynorsk",        309,    "nynorsk, norvégien; norvégien nynorsk",        304},
+    {""}, {""}, {""}, {""},
+    {"mri",    "Maori",        265,    "maori",        262},
+    {""}, {""},
+    {"nob",    "Norwegian Bokmål; Bokmål, Norwegian",  303,    "norvégien bokmål; bokmål, norvégien",  298},
+    {""},
+    {"osa",    "Osage",        316,    "osage",        310},
+    {""}, {""},
+    {"oc",     "Provençal; Occitan (post 1500)",       336,    "provençal; occitan (après 1500)",      336},
+    {""},
+    {"mno",    "Manobo languages",     263,    "manobo, langues",      260},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"gv",     "Manx", 264,    "manx; mannois",        261},
+    {""}, {""}, {""}, {""}, {""},
+    {"ce",     "Chechen",      74,     "tchÉtchène",   399},
+    {""}, {""}, {""}, {""}, {""},
+    {"nde",    "North Ndebele",        301,    "ndébélé du Nord",      285},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"hmo",    "Hiri Motu",    166,    "hiri motu",    166},
+    {""}, {""}, {""}, {""}, {""},
+    {"est",    "Estonian",     118,    "estonien",     121},
+    {"chv",    "Chuvash",      86,     "tchouvache",   400},
+    {"sai",    "South American Indian (Other)",        386,    "",     0},
+    {""}, {""}, {""}, {""},
+    {"nai",    "North American Indian (Other)",        299,    "",     0},
+    {""}, {""}, {""}, {""}, {""},
+    {"ceb",    "Cebuano",      69,     "cebuano",      76},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mai",    "Maithili",     253,    "maithili",     247},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"twi",    "Twi",  429,    "twi",  427},
+    {""}, {""}, {""}, {""},
+    {"vo",     "Volapük",      440,    "volapük",      433},
+    {"hau",    "Hausa",        159,    "haoussa",      159},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"cor",    "Cornish",      88,     "cornique",     94},
+    {"nic",    "Niger-Kordofanian (Other)",    295,    "nigéro-congolaises, autres langues",   293},
+    {""}, {""}, {""}, {""},
+    {"swe",    "Swedish",      396,    "suédois",      386},
+    {""}, {""},
+    {"alb",    "Albanian",     11,     "albanais",     11},
+    {""}, {""}, {""}, {""},
+    {"el",     "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153},
+    {""},
+    {"mic",    "Micmac",       273,    "micmac",       270},
+    {""}, {""}, {""}, {""}, {""},
+    {"dyu",    "Dyula",        108,    "dioula",       105},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"tai",    "Tai (Other)",  400,    "thaïes, autres langues",       406},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"cy",     "Welsh",        447,    "gallois",      141},
+    {""},
+    {"zu",     "Zulu", 460,    "zoulou",       451},
+    {"pol",    "Polish",       333,    "polonais",     333},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"wo",     "Wolof",        448,    "wolof",        440},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"hai",    "Haida",        158,    "haida",        158},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"lug",    "Ganda",        137,    "ganda",        142},
+    {""}, {""}, {""}, {""},
+    {"geo",    "Georgian",     141,    "géorgien",     145},
+    {""},
+    {"mac",    "Macedonian",   250,    "macédonien",   244},
+    {""}, {""},
+    {"pag",    "Pangasinan",   324,    "pangasinan",   323},
+    {""},
+    {"kac",    "Kachin",       195,    "kachin",       197},
+    {""},
+    {"gu",     "Gujarati",     156,    "goudjrati",    150},
+    {""}, {""}, {""}, {""}, {""},
+    {"zap",    "Zapotec",      457,    "zapotèque",    448},
+    {""}, {""}, {""}, {""},
+    {"mlg",    "Malagasy",     255,    "malgache",     253},
+    {""},
+    {"i-navajo",       "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000",     481,    "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000",     472},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"tup",    "Tupi languages",       423,    "tupi, langues",        422},
+    {""}, {""}, {""}, {""}, {""},
+    {"smi",    "Sami languages (Other)",       351,    "sami, autres langues", 350},
+    {"aze",    "Azerbaijani",  33,     "azéri",        37},
+    {""}, {""}, {""},
+    {"khi",    "Khoisan (Other)",      207,    "khoisan, autres langues",      208},
+    {"glv",    "Manx", 264,    "manx; mannois",        261},
+    {""},
+    {"bo",     "Tibetan",      409,    "tibétain",     407},
+    {""}, {""},
+    {"scc",    "Serbian",      363,    "serbe",        366},
+    {""}, {""}, {""}, {""},
+    {"isl",    "Icelandic",    172,    "islandais",    189},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"uig",    "Uighur",       431,    "ouïgour",      315},
+    {""}, {""}, {""}, {""},
+    {"zh-wuu", "Shanghaiese or Wu",    515,    "Shanghaiese or Wu",    506},
+    {""},
+    {"zh-guoyu",       "Mandarin or Standard Chinese", 511,    "Mandarin or Standard Chinese", 502},
+    {""}, {""},
+    {"sog",    "Sogdian",      379,    "sogdien",      377},
+    {"umb",    "Umbundu",      433,    "umbundu",      429},
+    {""}, {""}, {""}, {""}, {""},
+    {"i-ami",  "Amis", 473,    "Amis", 464},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ug",     "Uighur",       431,    "ouïgour",      315},
+    {"peo",    "Persian, Old (ca.600-400 B.C.)",       329,    "perse, vieux (ca. 600-400 av. J.-C.)", 328},
+    {""}, {""},
+    {"sgn-no", "Norwegian Sign Language",      505,    "Norwegian Sign Language",      496},
+    {""}, {""},
+    {"hup",    "Hupa", 170,    "hupa", 170},
+    {"i-bnn",  "Bunun",        474,    "Bunun",        465},
+    {""},
+    {"arc",    "Aramaic",      18,     "araméen",      23},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"i-tsu",  "Tsou", 485,    "Tsou", 476},
+    {""}, {""},
+    {"ell",    "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"loz",    "Lozi", 241,    "lozi", 236},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"sme",    "Northern Sami",        300,    "sami du Nord", 353},
+    {""}, {""}, {""},
+    {"mni",    "Manipuri",     262,    "manipuri",     258},
+    {""}, {""},
+    {"tog",    "Tonga (Nyasa)",        417,    "tonga (Nyasa)",        414},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"pro",    "Provençal, Old (to 1500)",     337,    "provençal ancien (jusqu'à 1500)",      337},
+    {""}, {""}, {""},
+    {"cv",     "Chuvash",      86,     "tchouvache",   400},
+    {""}, {""}, {""},
+    {"pap",    "Papiamento",   326,    "papiamento",   324},
+    {"zh-yue", "Cantonese",    517,    "Cantonese",    508},
+    {"chb",    "Chibcha",      78,     "chibcha",      84},
+    {""},
+    {"fro",    "French, Old (842-ca.1400)",    130,    "français ancien (842-ca.1400)",        132},
+    {"alg",    "Algonquian languages", 13,     "algonquines, langues", 13},
+    {""}, {""}, {""}, {""}, {""},
+    {"bho",    "Bhojpuri",     51,     "bhojpuri",     56},
+    {""}, {""}, {""}, {""},
+    {"vai",    "Vai",  437,    "vaï",  430},
+    {""}, {""}, {""}, {""}, {""},
+    {"ace",    "Achinese",     2,      "aceh", 2},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"hye",    "Armenian",     22,     "arménien",     27},
+    {""}, {""}, {""},
+    {"vie",    "Vietnamese",   439,    "vietnamien",   432},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"nso",    "Sotho, Northern",      384,    "sotho du Nord",        382},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"luo",    "Luo (Kenya and Tanzania)",     247,    "luo (Kenya et Tanzanie)",      241},
+    {""}, {""}, {""}, {""},
+    {"slo",    "Slovak",       377,    "slovaque",     375},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"fao",    "Faroese",      123,    "féroïen",      126},
+    {""}, {""}, {""},
+    {"zho",    "Chinese",      80,     "chinois",      86},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"sgn-ni", "Nicaraguan Sign Language",     503,    "Nicaraguan Sign Language",     494},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"sqi",    "Albanian",     11,     "albanais",     11},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"fo",     "Faroese",      123,    "féroïen",      126},
+    {""}, {""}, {""},
+    {"ijo",    "Ijo",  175,    "ijo",  175},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"mnc",    "Manchu",       259,    "mandchou",     255},
+    {"bug",    "Buginese",     60,     "bugi", 69},
+    {"yap",    "Yapese",       452,    "yapois",       443},
+    {"tso",    "Tsonga",       420,    "tsonga",       419},
+    {""},
+    {"iu",     "Inuktitut",    182,    "inuktitut",    182},
+    {""}, {""}, {""}, {""}, {""},
+    {"ido",    "Ido",  173,    "ido",  173},
+    {""}, {""}, {""}, {""},
+    {"ibo",    "Igbo", 174,    "igbo", 174},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"i-pwn",  "Paiwan",       482,    "Paiwan",       473},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"i-tay",  "Tayal",        484,    "Tayal",        475},
+    {""}, {""}, {""},
+    {"gay",    "Gayo", 138,    "gayo", 143},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"eu",     "Basque",       44,     "basque",       50},
+    {"yao",    "Yao",  451,    "yao",  442},
+    {""}, {""}, {""},
+    {"bai",    "Bamileke languages",   39,     "bamilékés, langues",   44},
+    {"fry",    "Frisian",      131,    "frison",       135},
+    {""}, {""},
+    {"i-mingo",        "Mingo",        480,    "Mingo",        471},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"iro",    "Iroquoian languages",  188,    "iroquoises, langues (famille)",        188},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"crp",    "Creoles and pidgins (Other)",  92,     "créoles et pidgins divers",    98},
+    {""},
+    {"sux",    "Sumerian",     391,    "sumérien",     388},
+    {""}, {""}, {""}, {""},
+    {"yo",     "Yoruba",       454,    "yoruba",       445},
+    {""},
+    {"fiu",    "Finno-Ugrian (Other)", 126,    "finno-ougriennes, autres langues",     128},
+    {""}, {""}, {""}, {""},
+    {"i-tao",  "Tao",  483,    "Tao",  474},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"bre",    "Breton",       59,     "breton",       68},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ewo",    "Ewondo",       120,    "éwondo",       123},
+    {"en-scouse",      "English Liverpudlian dialect known as 'Scouse'",       472,    "English Liverpudlian dialect known as 'Scouse'",       463},
+    {""}, {""},
+    {"gwi",    "Gwich'in",     157,    "gwich'in",     157},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"chg",    "Chagatai",     71,     "djaghataï",    107},
+    {""}, {""},
+    {"oji",    "Ojibwa",       313,    "ojibwa",       308},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"io",     "Ido",  173,    "ido",  173},
+    {"pau",    "Palauan",      321,    "palau",        320},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"eo",     "Esperanto",    117,    "espéranto",    120},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"gre",    "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153},
+    {"co",     "Corsican",     89,     "corse",        95},
+    {""},
+    {"ori",    "Oriya",        314,    "oriya",        309},
+    {""}, {""},
+    {"sgn-de", "German Sign Language", 493,    "German Sign Language", 484},
+    {""}, {""},
+    {"i-enochian",     "Enochian",     476,    "Enochian",     467},
+    {""}, {""}, {""}, {""},
+    {"eng",    "English",      114,    "anglais",      18},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"grc",    "Greek, Ancient (to 1453)",     153,    "grec ancien (jusqu'à 1453)",   152},
+    {"lui",    "Luiseno",      244,    "luiseno",      239},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"oto",    "Otomian languages",    319,    "otomangue, langues",   313},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""},
+    {"iku",    "Inuktitut",    182,    "inuktitut",    182},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"chp",    "Chipewyan",    82,     "chipewyan",    88},
+    {""}, {""}, {""},
+    {"xho",    "Xhosa",        449,    "xhosa",        441},
+    {""}, {""}, {""}, {""},
+    {"tpi",    "Tok Pisin",    415,    "tok pisin",    412},
+    {""}, {""}, {""}, {""},
+    {"fre",    "French",       128,    "français",     131},
+    {""}, {""}, {""}, {""}, {""},
+    {"tsi",    "Tsimshian",    419,    "tsimshian",    418},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"glg",    "Gallegan",     136,    "galicien",     139},
+    {""}, {""}, {""}, {""},
+    {"tli",    "Tlingit",      414,    "tlingit",      411},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"oci",    "Provençal; Occitan (post 1500)",       336,    "provençal; occitan (après 1500)",      336},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"cho",    "Choctaw",      83,     "choctaw",      89},
+    {"kpe",    "Kpelle",       218,    "kpellé",       219},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"doi",    "Dogri",        102,    "dogri",        108},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"cau",    "Caucasian (Other)",    68,     "caucasiennes, autres langues", 75},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"phi",    "Philippine (Other)",   330,    "philippines, autres langues",  331},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"que",    "Quechua",      339,    "quechua",      338},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"i-lux",  "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998",      479,    "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998",      470},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"chy",    "Cheyenne",     77,     "cheyenne",     83},
+    {""}, {""},
+    {"ale",    "Aleut",        12,     "aléoute",      12},
+    {""}, {""}, {""}, {""}, {""},
+    {"cze",    "Czech",        95,     "tchèque",      398},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ewe",    "Ewe",  119,    "éwé",  122},
+    {""},
+    {"cre",    "Cree", 90,     "cree", 97},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ice",    "Icelandic",    172,    "islandais",    189},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"ave",    "Avestan",      30,     "avestique",    34},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"chi",    "Chinese",      80,     "chinois",      86},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"che",    "Chechen",      74,     "tchÉtchène",   399},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""},
+    {"ilo",    "Iloko",        176,    "ilocano",      176},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""},
+    {"ine",    "Indo-European (Other)",        179,    "indo-européennes, autres langues",     179},
+    {""}, {""}, {""}, {""},
+    {"cmc",    "Chamic languages",     72,     "chames, langues",      78},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"epo",    "Esperanto",    117,    "espéranto",    120},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"inc",    "Indic (Other)",        178,    "indo-aryennes, autres langues",        178},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"cop",    "Coptic",       87,     "copte",        92},
+    {""}, {""}, {""}, {""}, {""}, {""},
+    {"egy",    "Egyptian (Ancient)",   111,    "égyptien",     115},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""},
+    {"pli",    "Pali", 322,    "pali", 321},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"gle",    "Irish",        185,    "irlandais",    185},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"efi",    "Efik", 110,    "efik", 114},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""},
+    {"elx",    "Elamite",      113,    "élamite",      117},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {""}, {""}, {""}, {""}, {""}, {""}, {""},
+    {"ile",    "Interlingue",  181,    "interlingue",  181}
+  };
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct language *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
+
+
diff --git a/tests/languages.gperf b/tests/languages.gperf
new file mode 100644 (file)
index 0000000..2400a2d
--- /dev/null
@@ -0,0 +1,699 @@
+%{
+/* gperf -CDEGTlot -H language_hash -K code -L ANSI-C -N language_entry */
+/* Generated from ISO 639 language data from http://lcweb.loc.gov/standards/iso639-2/langhome.html
+   and from IANA registry at http://www.iana.org/assignments/language-tags
+   by %M%
+*/
+/* englangn.html Updated: August 14, 2002 */
+/* frenchlangn.html Updated: August 14, 2002 */
+/* language-tags last updated 2001-07-17 */
+%}
+struct language { const char *code; const char *name_en; int num_en; const char *name_fr; int num_fr; };
+%%
+cel-gaulish,   "Gaulish",      463,    "Gaulish",      454
+uig,   "Uighur",       431,    "ouïgour",      315
+ton,   "Tonga (Tonga Islands)",        418,    "tongan (Îles Tonga)",  415
+rm,    "Raeto-Romance",        340,    "rhéto-roman",  342
+pt,    "Portuguese",   334,    "portugais",    334
+mri,   "Maori",        265,    "maori",        262
+ilo,   "Iloko",        176,    "ilocano",      176
+hrv,   "Croatian",     93,     "croate",       99
+i-navajo,      "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000",     481,    "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000",     472
+tg,    "Tajik",        401,    "tadjik",       392
+rn,    "Rundi",        347,    "rundi",        345
+kom,   "Komi", 213,    "komi", 214
+i-tao, "Tao",  483,    "Tao",  474
+de-at-1901,    "German Austrian variant traditional orthography",      466,    "German Austrian variant traditional orthography",      457
+vai,   "Vai",  437,    "vaï",  430
+th,    "Thai", 408,    "thaï", 405
+ro,    "Romanian",     345,    "roumain",      344
+mag,   "Magahi",       252,    "magahi",       246
+kon,   "Kongo",        214,    "kongo",        215
+nld,   "Dutch",        106,    "néerlandais",  288
+ces,   "Czech",        95,     "tchèque",      398
+afh,   "Afrihili",     6,      "afrihili",     6
+aus,   "Australian languages", 27,     "australiennes, langues",       32
+sgn-pt,        "Portuguese Sign Language",     506,    "Portuguese Sign Language",     497
+ti,    "Tigrinya",     411,    "tigrigna",     409
+sux,   "Sumerian",     391,    "sumérien",     388
+mah,   "Marshallese",  268,    "marshall",     265
+hau,   "Hausa",        159,    "haoussa",      159
+ce,    "Chechen",      74,     "tchÉtchène",   399
+mai,   "Maithili",     253,    "maithili",     247
+gmh,   "German, Middle High (ca.1050-1500)",   144,    "",     0
+am,    "Amharic",      15,     "amharique",    17
+sgn-be-nl,     "Belgian-Flemish Sign Language",        489,    "Belgian-Flemish Sign Language",        480
+tk,    "Turkmen",      426,    "turkmène",     425
+haw,   "Hawaiian",     160,    "hawaïen",      160
+zen,   "Zenaga",       458,    "zenaga",       449
+tl,    "Tagalog",      398,    "tagalog",      393
+oss,   "Ossetic; Ossetian",    318,    "ossète",       312
+mak,   "Makasar",      254,    "makassar",     248
+kor,   "Korean",       216,    "coréen",       93
+ch,    "Chamorro",     73,     "chamorro",     79
+mal,   "Malayalam",    257,    "malayalam",    250
+lez,   "Lezghian",     233,    "lezghien",     232
+kos,   "Kosraean",     217,    "kosrae",       217
+ira,   "Iranian (Other)",      184,    "iraniennes, autres langues",   184
+zh-xiang,      "Xiang or Hunanese",    516,    "Xiang or Hunanese",    507
+tn,    "Tswana",       421,    "tswana",       420
+ru,    "Russian",      348,    "russe",        346
+lim,   "Limburgish; Limburger; Limburgan",     236,    "limbourgeois", 233
+ful,   "Fulah",        133,    "peul", 329
+dak,   "Dakota",       96,     "dakota",       100
+umb,   "Umbundu",      433,    "umbundu",      429
+tsi,   "Tsimshian",    419,    "tsimshian",    418
+to,    "Tonga (Tonga Islands)",        418,    "tongan (Îles Tonga)",  415
+man,   "Mandingo",     261,    "mandingue",    257
+lin,   "Lingala",      237,    "lingala",      234
+ar,    "Arabic",       17,     "arabe",        22
+bos,   "Bosnian",      57,     "bosniaque",    65
+wln,   "Walloon",      444,    "wallon",       437
+vi,    "Vietnamese",   439,    "vietnamien",   432
+mao,   "Maori",        265,    "maori",        262
+kua,   "Kwanyama, Kuanyama",   225,    "kwanyama; kuanyama",   225
+rw,    "Kinyarwanda",  211,    "rwanda",       347
+ipk,   "Inupiaq",      183,    "inupiaq",      183
+as,    "Assamese",     24,     "assamais",     29
+aym,   "Aymara",       32,     "aymara",       36
+syr,   "Syriac",       397,    "syriaque",     391
+shn,   "Shan", 365,    "chan", 80
+goh,   "German, Old High (ca.750-1050)",       145,    "",     0
+dan,   "Danish",       97,     "danois",       101
+map,   "Austronesian (Other)", 28,     "malayo-polynésiennes, autres langues", 251
+i-tay, "Tayal",        484,    "Tayal",        475
+tr,    "Turkish",      424,    "turc", 423
+sla,   "Slavic (Other)",       376,    "slaves, autres langues",       374
+ell,   "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153
+afr,   "Afrikaans",    7,      "afrikaans",    7
+bua,   "Buriat",       62,     "bouriate",     66
+ts,    "Tsonga",       420,    "tsonga",       419
+pol,   "Polish",       333,    "polonais",     333
+mar,   "Marathi",      266,    "marathe",      263
+ga,    "Irish",        185,    "irlandais",    185
+co,    "Corsican",     89,     "corse",        95
+i-ami, "Amis", 473,    "Amis", 464
+tsn,   "Tswana",       421,    "tswana",       420
+tt,    "Tatar",        404,    "tatar",        397
+mas,   "Masai",        270,    "massaï",       267
+ita,   "Italian",      189,    "italien",      190
+her,   "Herero",       162,    "herero",       162
+fur,   "Friulian",     132,    "frioulan",     134
+eng,   "English",      114,    "anglais",      18
+cmc,   "Chamic languages",     72,     "chames, langues",      78
+tso,   "Tsonga",       420,    "tsonga",       419
+pon,   "Pohnpeian",    332,    "pohnpei",      332
+lit,   "Lithuanian",   238,    "lituanien",    235
+sgn-co,        "Colombian Sign Language",      492,    "Colombian Sign Language",      483
+de-1901,       "German traditional orthography",       464,    "German traditional orthography",       455
+xh,    "Xhosa",        449,    "xhosa",        441
+vo,    "Volapük",      440,    "volapük",      433
+gd,    "Scottish Gaelic; Gaelic",      360,    "gaélique écossais; gaélique",  138
+za,    "Zhuang; Chuang",       459,    "zhuang; chuang",       450
+ay,    "Aymara",       32,     "aymara",       36
+sgn-gb,        "British Sign Language",        497,    "British Sign Language",        488
+yor,   "Yoruba",       454,    "yoruba",       445
+tw,    "Twi",  429,    "twi",  427
+mga,   "Irish, Middle (900-1200)",     186,    "irlandais moyen (900-1200)",   187
+el,    "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153
+gon,   "Gondi",        149,    "gond", 147
+az,    "Azerbaijani",  33,     "azéri",        37
+cs,    "Czech",        95,     "tchèque",      398
+alb,   "Albanian",     11,     "albanais",     11
+ukr,   "Ukrainian",    432,    "ukrainien",    428
+tuk,   "Turkmen",      426,    "turkmène",     425
+raj,   "Rajasthani",   341,    "rajasthani",   339
+bug,   "Buginese",     60,     "bugi", 69
+sgn-za,        "South African Sign Language",  509,    "South African Sign Language",  500
+ty,    "Tahitian",     399,    "tahitien",     394
+sna,   "Shona",        366,    "shona",        368
+por,   "Portuguese",   334,    "portugais",    334
+en,    "English",      114,    "anglais",      18
+tum,   "Tumbuka",      422,    "tumbuka",      421
+nno,   "Nynorsk, Norwegian; Norwegian Nynorsk",        309,    "nynorsk, norvégien; norvégien nynorsk",        304
+may,   "Malay",        256,    "malais",       249
+eo,    "Esperanto",    117,    "espéranto",    120
+enm,   "English, Middle (1100-1500)",  115,    "anglais moyen (1100-1500)",    19
+cv,    "Chuvash",      86,     "tchouvache",   400
+ale,   "Aleut",        12,     "aléoute",      12
+ven,   "Venda",        438,    "venda",        431
+iro,   "Iroquoian languages",  188,    "iroquoises, langues (famille)",        188
+gor,   "Gorontalo",    150,    "gorontalo",    148
+slk,   "Slovak",       377,    "slovaque",     375
+snd,   "Sindhi",       370,    "sindhi",       370
+kum,   "Kumyk",        221,    "koumyk",       218
+ice,   "Icelandic",    172,    "islandais",    189
+hil,   "Hiligaynon",   163,    "hiligaynon",   163
+gba,   "Gbaya",        139,    "gbaya",        144
+alg,   "Algonquian languages", 13,     "algonquines, langues", 13
+day,   "Dayak",        98,     "dayak",        102
+cy,    "Welsh",        447,    "gallois",      141
+twi,   "Twi",  429,    "twi",  427
+tup,   "Tupi languages",       423,    "tupi, langues",        422
+men,   "Mende",        272,    "mendé",        269
+id,    "Indonesian",   180,    "indonésien",   180
+him,   "Himachali",    164,    "himachali",    164
+got,   "Gothic",       151,    "gothique",     149
+del,   "Delaware",     99,     "delaware",     103
+zh,    "Chinese",      80,     "chinois",      86
+bul,   "Bulgarian",    61,     "bulgare",      70
+rap,   "Rapanui",      342,    "rapanui",      340
+ie,    "Interlingue",  181,    "interlingue",  181
+hin,   "Hindi",        165,    "hindi",        165
+gl,    "Gallegan",     136,    "galicien",     139
+elx,   "Elamite",      113,    "élamite",      117
+es,    "Spanish; Castilian",   389,    "espagnol; castillan",  119
+zh-yue,        "Cantonese",    517,    "Cantonese",    508
+xho,   "Xhosa",        449,    "xhosa",        441
+tur,   "Turkish",      424,    "turc", 423
+den,   "Slave (Athapascan)",   375,    "esclave (athapascan)", 118
+et,    "Estonian",     118,    "estonien",     121
+vie,   "Vietnamese",   439,    "vietnamien",   432
+tha,   "Thai", 408,    "thaï", 405
+slo,   "Slovak",       377,    "slovaque",     375
+rar,   "Rarotongan",   343,    "rarotonga",    341
+mic,   "Micmac",       273,    "micmac",       270
+gn,    "Guarani",      155,    "guarani",      155
+eu,    "Basque",       44,     "basque",       50
+spa,   "Spanish; Castilian",   389,    "espagnol; castillan",  119
+sgn-ie,        "Irish Sign Language",  499,    "Irish Sign Language",  490
+sgn-es,        "Spanish Sign Language",        495,    "Spanish Sign Language",        486
+kur,   "Kurdish",      222,    "kurde",        222
+ka,    "Georgian",     141,    "géorgien",     145
+tut,   "Altaic (Other)",       14,     "altaïques, autres langues",    16
+oji,   "Ojibwa",       313,    "ojibwa",       308
+lol,   "Mongo",        279,    "mongo",        275
+kha,   "Khasi",        205,    "khasi",        206
+snk,   "Soninke",      382,    "soninké",      380
+kut,   "Kutenai",      224,    "kutenai",      224
+epo,   "Esperanto",    117,    "espéranto",    120
+ang,   "English, Old (ca.450-1100)",   116,    "anglo-saxon (ca.450-1100)",    20
+bur,   "Burmese",      63,     "birman",       62
+ik,    "Inupiaq",      183,    "inupiaq",      183
+hit,   "Hittite",      167,    "hittite",      167
+apa,   "Apache languages",     16,     "apache",       21
+nah,   "Nahuatl",      284,    "nahuatl",      281
+wak,   "Wakashan languages",   442,    "wakashennes, langues", 435
+nai,   "North American Indian (Other)",        299,    "",     0
+deu,   "German",       142,    "allemand",     14
+sgn-gr,        "Greek Sign Language",  498,    "Greek Sign Language",  489
+wal,   "Walamo",       443,    "walamo",       436
+slv,   "Slovenian",    378,    "slovène",      376
+gu,    "Gujarati",     156,    "goudjrati",    150
+de-ch-1996,    "German Swiss variant orthography of 1996",     469,    "German Swiss variant orthography of 1996",     460
+gv,    "Manx", 264,    "manx; mannois",        261
+mkd,   "Macedonian",   250,    "macédonien",   244
+io,    "Ido",  173,    "ido",  173
+guj,   "Gujarati",     156,    "goudjrati",    150
+cop,   "Coptic",       87,     "copte",        92
+ki,    "Kikuyu; Gikuyu",       209,    "kikuyu",       210
+zu,    "Zulu", 460,    "zoulou",       451
+srd,   "Sardinian",    357,    "sarde",        361
+kj,    "Kwanyama, Kuanyama",   225,    "kwanyama; kuanyama",   225
+khi,   "Khoisan (Other)",      207,    "khoisan, autres langues",      208
+jrb,   "Judeo-Arabic", 192,    "judéo-arabe",  193
+dzo,   "Dzongkha",     109,    "dzongkha",     112
+dgr,   "Dogrib",       103,    "dogrib",       109
+cor,   "Cornish",      88,     "cornique",     94
+zh-min,        "Min Fuzhou Hokkien Amoy or Taiwanese", 513,    "Min Fuzhou Hokkien Amoy or Taiwanese", 504
+min,   "Minangkabau",  274,    "minangkabau",  271
+kk,    "Kazakh",       204,    "kazakh",       205
+ara,   "Arabic",       17,     "arabe",        22
+cos,   "Corsican",     89,     "corse",        95
+mkh,   "Mon-Khmer (Other)",    278,    "môn-khmer, autres langues",    274
+lua,   "Luba-Lulua",   243,    "luba-lulua",   238
+kl,    "Kalaallisut",  196,    "groenlandais", 154
+is,    "Icelandic",    172,    "islandais",    189
+hmn,   "Hmong",        168,    "hmong",        168
+war,   "Waray",        445,    "waray",        438
+nap,   "Neapolitan",   291,    "napolitain",   282
+lub,   "Luba-Katanga", 242,    "luba-katanga", 237
+km,    "Khmer",        206,    "khmer",        207
+it,    "Italian",      189,    "italien",      190
+hmo,   "Hiri Motu",    166,    "hiri motu",    166
+arc,   "Aramaic",      18,     "araméen",      23
+din,   "Dinka",        100,    "dinka",        104
+was,   "Washo",        446,    "washo",        439
+sad,   "Sandawe",      353,    "sandawe",      357
+mg,    "Malagasy",     255,    "malgache",     253
+khm,   "Khmer",        206,    "khmer",        207
+kn,    "Kannada",      198,    "kannada",      199
+iu,    "Inuktitut",    182,    "inuktitut",    182
+gwi,   "Gwich'in",     157,    "gwich'in",     157
+de-de-1996,    "German German variant orthography of 1996",    471,    "German German variant orthography of 1996",    462
+pus,   "Pushto",       338,    "pachto",       318
+mh,    "Marshallese",  268,    "marshall",     265
+ko,    "Korean",       216,    "coréen",       93
+jpn,   "Japanese",     190,    "japonais",     191
+sgn-it,        "Italian Sign Language",        500,    "Italian Sign Language",        491
+mis,   "Miscellaneous languages",      275,    "diverses, langues",    106
+mi,    "Maori",        265,    "maori",        262
+loz,   "Lozi", 241,    "lozi", 236
+kho,   "Khotanese",    208,    "khotanais",    209
+i-hak, "Hakka Deprecated use IETF zh-hakka registered Jan. 102000",    477,    "Hakka Deprecated use IETF zh-hakka registered Jan. 102000",    468
+tyv,   "Tuvinian",     428,    "touva",        416
+sag,   "Sango",        354,    "sango",        358
+oc,    "Provençal; Occitan (post 1500)",       336,    "provençal; occitan (après 1500)",      336
+sah,   "Yakut",        450,    "iakoute",      171
+bla,   "Siksika",      369,    "blackfoot",    63
+nau,   "Nauru",        285,    "nauruan",      283
+mk,    "Macedonian",   250,    "macédonien",   244
+lug,   "Ganda",        137,    "ganda",        142
+bho,   "Bhojpuri",     51,     "bhojpuri",     56
+sai,   "South American Indian (Other)",        386,    "",     0
+nav,   "Navajo; Navaho",       287,    "navaho",       284
+ml,    "Malayalam",    257,    "malayalam",    250
+ks,    "Kashmiri",     202,    "kashmiri",     203
+jpr,   "Judeo-Persian",        193,    "judéo-persan", 195
+scc,   "Serbian",      363,    "serbe",        366
+lui,   "Luiseno",      244,    "luiseno",      239
+zh-min-nan,    "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo",       514,    "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo",       505
+wel,   "Welsh",        447,    "gallois",      141
+mn,    "Mongolian",    280,    "mongol",       276
+ku,    "Kurdish",      222,    "kurde",        222
+div,   "Divehi",       101,    "maldivien",    252
+tli,   "Tlingit",      414,    "tlingit",      411
+srp,   "Serbian",      363,    "serbe",        366
+sal,   "Salishan languages",   349,    "salish, langues",      348
+mo,    "Moldavian",    277,    "moldave",      273
+kv,    "Komi", 213,    "komi", 214
+no-nyn,        "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000",    487,    "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000",    478
+wen,   "Sorbian languages",    383,    "sorabes, langues",     381
+sam,   "Samaritan Aramaic",    350,    "samaritain",   349
+phi,   "Philippine (Other)",   330,    "philippines, autres langues",  331
+arm,   "Armenian",     22,     "arménien",     27
+kw,    "Cornish",      88,     "cornique",     94
+srr,   "Serer",        364,    "sérère",       367
+san,   "Sanskrit",     355,    "sanskrit",     359
+fra,   "French",       128,    "français",     131
+arn,   "Araucanian",   20,     "araucan",      25
+mr,    "Marathi",      266,    "marathe",      263
+lun,   "Lunda",        246,    "lunda",        240
+ky,    "Kirghiz",      212,    "kirghize",     212
+ava,   "Avaric",       29,     "avar", 33
+ath,   "Athapascan languages", 26,     "athapascanes, langues",        31
+zh-guoyu,      "Mandarin or Standard Chinese", 511,    "Mandarin or Standard Chinese", 502
+i-enochian,    "Enochian",     476,    "Enochian",     467
+nia,   "Nias", 294,    "nias", 292
+moh,   "Mohawk",       276,    "mohawk",       272
+ms,    "Malay",        256,    "malais",       249
+luo,   "Luo (Kenya and Tanzania)",     247,    "luo (Kenya et Tanzanie)",      241
+ace,   "Achinese",     2,      "aceh", 2
+arp,   "Arapaho",      19,     "arapaho",      24
+om,    "Oromo",        315,    "galla",        140
+nep,   "Nepali",       292,    "népalais",     290
+mt,    "Maltese",      258,    "maltais",      254
+vol,   "Volapük",      440,    "volapük",      433
+phn,   "Phoenician",   331,    "phénicien",    330
+nic,   "Niger-Kordofanian (Other)",    295,    "nigéro-congolaises, autres langues",   293
+fre,   "French",       128,    "français",     131
+sgn-ch-de,     "Swiss German Sign Language",   491,    "Swiss German Sign Language",   482
+ota,   "Turkish, Ottoman (1500-1928)", 425,    "turc ottoman (1500-1928)",     424
+sas,   "Sasak",        358,    "sasak",        362
+sa,    "Sanskrit",     355,    "sanskrit",     359
+que,   "Quechua",      339,    "quechua",      338
+ach,   "Acoli",        3,      "acoli",        3
+ave,   "Avestan",      30,     "avestique",    34
+doi,   "Dogri",        102,    "dogri",        108
+no-bok,        "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000",    486,    "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000",    477
+sat,   "Santali",      356,    "santal",       360
+ori,   "Oriya",        314,    "oriya",        309
+nzi,   "Nzima",        311,    "nzema",        306
+mol,   "Moldavian",    277,    "moldave",      273
+lus,   "Lushai",       248,    "lushai",       242
+art,   "Artificial (Other)",   23,     "artificielles, autres langues",        28
+sc,    "Sardinian",    357,    "sarde",        361
+gla,   "Scottish Gaelic; Gaelic",      360,    "gaélique écossais; gaélique",  138
+sd,    "Sindhi",       370,    "sindhi",       370
+sco,   "Scots",        359,    "écossais",     113
+roa,   "Romance (Other)",      344,    "romanes, autres langues",      343
+or,    "Oriya",        314,    "oriya",        309
+mon,   "Mongolian",    280,    "mongol",       276
+sga,   "Irish, Old (to 900)",  187,    "irlandais ancien (jusqu'à 900)",       186
+cus,   "Cushitic (Other)",     94,     "couchitiques, autres langues", 96
+my,    "Burmese",      63,     "birman",       62
+aar,   "Afar", 5,      "afar", 5
+cha,   "Chamorro",     73,     "chamorro",     79
+os,    "Ossetic; Ossetian",    318,    "ossète",       312
+se,    "Northern Sami",        300,    "sami du Nord", 353
+msa,   "Malay",        256,    "malais",       249
+chb,   "Chibcha",      78,     "chibcha",      84
+arw,   "Arawak",       21,     "arawak",       26
+ba,    "Bashkir",      43,     "bachkir",      39
+sgn-mx,        "Mexican Sign Language",        502,    "Mexican Sign Language",        493
+i-klingon,     "Klingon",      478,    "Klingon",      469
+zul,   "Zulu", 460,    "zoulou",       451
+orm,   "Oromo",        315,    "galla",        140
+new,   "Newari",       293,    "newari",       291
+kpe,   "Kpelle",       218,    "kpellé",       219
+jav,   "Javanese",     191,    "javanais",     192
+de-ch-1901,    "German Swiss variant traditional orthography", 468,    "German Swiss variant traditional orthography", 459
+sg,    "Sango",        354,    "sango",        358
+gle,   "Irish",        185,    "irlandais",    185
+eka,   "Ekajuk",       112,    "ekajuk",       116
+scr,   "Croatian",     93,     "croate",       99
+sgn-se,        "Swedish Sign Language",        507,    "Swedish Sign Language",        498
+zun,   "Zuni", 461,    "Zuni", 452
+vot,   "Votic",        441,    "vote", 434
+tpi,   "Tok Pisin",    415,    "tok pisin",    412
+sel,   "Selkup",       361,    "selkoupe",     364
+frm,   "French, Middle (ca.1400-1600)",        129,    "français moyen (1400-1600)",   133
+che,   "Chechen",      74,     "tchÉtchène",   399
+si,    "Sinhalese",    371,    "singhalais",   371
+sem,   "Semitic (Other)",      362,    "sémitiques, autres langues",   365
+pli,   "Pali", 322,    "pali", 321
+mos,   "Mossi",        281,    "moré", 277
+glg,   "Gallegan",     136,    "galicien",     139
+be,    "Belarusian",   47,     "biélorusse",   58
+fro,   "French, Old (842-ca.1400)",    130,    "français ancien (842-ca.1400)",        132
+chg,   "Chagatai",     71,     "djaghataï",    107
+sk,    "Slovak",       377,    "slovaque",     375
+roh,   "Raeto-Romance",        340,    "rhéto-roman",  342
+bra,   "Braj", 58,     "braj", 67
+bg,    "Bulgarian",    61,     "bulgare",      70
+cym,   "Welsh",        447,    "gallois",      141
+sl,    "Slovenian",    378,    "slovène",      376
+iku,   "Inuktitut",    182,    "inuktitut",    182
+hun,   "Hungarian",    169,    "hongrois",     169
+bh,    "Bihari",       52,     "bihari",       59
+chi,   "Chinese",      80,     "chinois",      86
+da,    "Danish",       97,     "danois",       101
+sm,    "Samoan",       352,    "samoan",       356
+oci,   "Provençal; Occitan (post 1500)",       336,    "provençal; occitan (après 1500)",      336
+kaa,   "Kara-Kalpak",  200,    "karakalpak",   201
+fan,   "Fang", 121,    "fang", 124
+bi,    "Bislama",      55,     "bichlamar",    57
+zha,   "Zhuang; Chuang",       459,    "zhuang; chuang",       450
+de-de-1901,    "German German variant traditional orthography",        470,    "German German variant traditional orthography",        461
+ug,    "Uighur",       431,    "ouïgour",      315
+sid,   "Sidamo",       367,    "sidamo",       369
+sn,    "Shona",        366,    "shona",        368
+qu,    "Quechua",      339,    "quechua",      338
+kab,   "Kabyle",       194,    "kabyle",       196
+hup,   "Hupa", 170,    "hupa", 170
+fao,   "Faroese",      123,    "féroïen",      126
+dua,   "Duala",        105,    "douala",       110
+chk,   "Chuukese",     85,     "chuuk",        91
+wa,    "Walloon",      444,    "wallon",       437
+so,    "Somali",       380,    "somali",       378
+oto,   "Otomian languages",    319,    "otomangue, langues",   313
+kac,   "Kachin",       195,    "kachin",       197
+aze,   "Azerbaijani",  33,     "azéri",        37
+bre,   "Breton",       59,     "breton",       68
+rom,   "Romany",       346,    "tsigane",      417
+chm,   "Mari", 267,    "mari", 264
+de,    "German",       142,    "allemand",     14
+bnt,   "Bantu (Other)",        41,     "bantoues, autres langues",     46
+i-tsu, "Tsou", 485,    "Tsou", 476
+sgn,   "Sign languages",       368,    "langues des signes",   228
+ron,   "Romanian",     345,    "roumain",      344
+egy,   "Egyptian (Ancient)",   111,    "égyptien",     115
+sq,    "Albanian",     11,     "albanais",     11
+chn,   "Chinook jargon",       81,     "chinook, jargon",      87
+hye,   "Armenian",     22,     "arménien",     27
+zh-hakka,      "Hakka",        512,    "Hakka",        503
+uk,    "Ukrainian",    432,    "ukrainien",    428
+tah,   "Tahitian",     399,    "tahitien",     394
+sr,    "Serbian",      363,    "serbe",        366
+fas,   "Persian",      328,    "persan",       327
+niu,   "Niuean",       297,    "niué", 295
+bad,   "Banda",        40,     "banda",        45
+cho,   "Choctaw",      83,     "choctaw",      89
+bn,    "Bengali",      49,     "bengali",      54
+sgn-de,        "German Sign Language", 493,    "German Sign Language", 484
+bo,    "Tibetan",      409,    "tibétain",     407
+tai,   "Tai (Other)",  400,    "thaïes, autres langues",       406
+ss,    "Swati",        395,    "swati",        390
+fa,    "Persian",      328,    "persan",       327
+fat,   "Fanti",        122,    "fanti",        125
+chp,   "Chipewyan",    82,     "chipewyan",    88
+st,    "Sotho, Southern",      385,    "sotho du Sud", 383
+fry,   "Frisian",      131,    "frison",       135
+nob,   "Norwegian Bokmål; Bokmål, Norwegian",  303,    "norvégien bokmål; bokmål, norvégien",  298
+su,    "Sundanese",    392,    "soundanais",   384
+chr,   "Cherokee",     75,     "cherokee",     81
+sv,    "Swedish",      396,    "suédois",      386
+pra,   "Prakrit languages",    335,    "prâkrit",      335
+br,    "Breton",       59,     "breton",       68
+aka,   "Akan", 9,      "akan", 9
+i-default,     "Default Language Context",     475,    "Default Language Context",     466
+ypk,   "Yupik languages",      455,    "yupik, langues",       446
+tam,   "Tamil",        403,    "tamoul",       396
+sw,    "Swahili",      394,    "swahili",      389
+mul,   "Multiple languages",   282,    "multilingue",  279
+kro,   "Kru",  219,    "krou", 220
+bs,    "Bosnian",      57,     "bosniaque",    65
+bai,   "Bamileke languages",   39,     "bamilékés, langues",   44
+und,   "Undetermined", 434,    "indéterminée", 177
+sin,   "Sinhalese",    371,    "singhalais",   371
+glv,   "Manx", 264,    "manx; mannois",        261
+kal,   "Kalaallisut",  196,    "groenlandais", 154
+iba,   "Iban", 171,    "iban", 172
+sgn-dk,        "Danish Sign Language", 494,    "Danish Sign Language", 485
+sgn-br,        "Brazilian Sign Language",      490,    "Brazilian Sign Language",      481
+ur,    "Urdu", 435,    "ourdou",       316
+sma,   "Southern Sami",        387,    "sami du Sud",  354
+sio,   "Siouan languages",     373,    "sioux, langues",       373
+mun,   "Munda languages",      283,    "mounda, langues",      278
+kam,   "Kamba",        197,    "kamba",        198
+grb,   "Grebo",        152,    "grebo",        151
+bak,   "Bashkir",      43,     "bachkir",      39
+chv,   "Chuvash",      86,     "tchouvache",   400
+paa,   "Papuan (Other)",       327,    "papoues, autres langues",      325
+kan,   "Kannada",      198,    "kannada",      199
+ha,    "Hausa",        159,    "haoussa",      159
+grc,   "Greek, Ancient (to 1453)",     153,    "grec ancien (jusqu'à 1453)",   152
+dum,   "Dutch, Middle (ca. 1050-1350)",        107,    "néerlandais moyen (ca. 1050-1350)",    289
+mya,   "Burmese",      63,     "birman",       62
+bal,   "Baluchi",      37,     "baloutchi",    41
+fi,    "Finnish",      125,    "finnois",      129
+bam,   "Bambara",      38,     "bambara",      43
+zho,   "Chinese",      80,     "chinois",      86
+wol,   "Wolof",        448,    "wolof",        440
+gre,   "Greek, Modern (1453-)",        154,    "grec moderne (après 1453)",    153
+gaa,   "Ga",   134,    "ga",   136
+fj,    "Fijian",       124,    "fidjien",      127
+btk,   "Batak (Indonesia)",    45,     "batak (Indonésie)",    51
+ban,   "Balinese",     35,     "balinais",     40
+chy,   "Cheyenne",     77,     "cheyenne",     83
+sgn-us,        "American Sign Language",       508,    "American Sign Language",       499
+wo,    "Wolof",        448,    "wolof",        440
+sme,   "Northern Sami",        300,    "sami du Nord", 353
+kru,   "Kurukh",       223,    "kurukh",       223
+yi,    "Yiddish",      453,    "yiddish",      444
+tat,   "Tatar",        404,    "tatar",        397
+sit,   "Sino-Tibetan (Other)", 372,    "sino-tibétaines, autres langues",      372
+kar,   "Karen",        201,    "karen",        202
+he,    "Hebrew",       161,    "hébreu",       161
+mus,   "Creek",        91,     "muskogee",     280
+kas,   "Kashmiri",     202,    "kashmiri",     203
+isl,   "Icelandic",    172,    "islandais",    189
+baq,   "Basque",       44,     "basque",       50
+tvl,   "Tuvalu",       427,    "tuvalu",       426
+pag,   "Pangasinan",   324,    "pangasinan",   323
+non,   "Norse, Old",   298,    "norrois, vieux",       296
+kat,   "Georgian",     141,    "géorgien",     145
+akk,   "Akkadian",     10,     "akkadien",     10
+i-mingo,       "Mingo",        480,    "Mingo",        471
+en-scouse,     "English Liverpudlian dialect known as 'Scouse'",       472,    "English Liverpudlian dialect known as 'Scouse'",       463
+uz,    "Uzbek",        436,    "ouszbek",      317
+smi,   "Sami languages (Other)",       351,    "sami, autres langues", 350
+mdr,   "Mandar",       260,    "mandar",       256
+kau,   "Kanuri",       199,    "kanouri",      200
+ja,    "Japanese",     190,    "japonais",     191
+fo,    "Faroese",      123,    "féroïen",      126
+dut,   "Dutch",        106,    "néerlandais",  288
+bas,   "Basa", 42,     "basa", 49
+smj,   "Lule Sami",    245,    "sami de Lule", 351
+hi,    "Hindi",        165,    "hindi",        165
+bat,   "Baltic (Other)",       36,     "baltiques, autres langues",    42
+kaw,   "Kawi", 203,    "kawi", 204
+yo,    "Yoruba",       454,    "yoruba",       445
+tel,   "Telugu",       405,    "télougou",     401
+pro,   "Provençal, Old (to 1500)",     337,    "provençal ancien (jusqu'à 1500)",      337
+nor,   "Norwegian",    302,    "norvégien",    297
+mwr,   "Marwari",      269,    "marvari",      266
+fr,    "French",       128,    "français",     131
+amh,   "Amharic",      15,     "amharique",    17
+znd,   "Zande",        456,    "zandé",        447
+tem,   "Timne",        412,    "temne",        402
+rum,   "Romanian",     345,    "roumain",      344
+pal,   "Pahlavi",      320,    "pahlavi",      319
+grn,   "Guarani",      155,    "guarani",      155
+fij,   "Fijian",       124,    "fidjien",      127
+dz,    "Dzongkha",     109,    "dzongkha",     112
+yao,   "Yao",  451,    "yao",  442
+urd,   "Urdu", 435,    "ourdou",       316
+sog,   "Sogdian",      379,    "sogdien",      377
+run,   "Rundi",        347,    "rundi",        345
+pam,   "Pampanga",     323,    "pampangan",    322
+kaz,   "Kazakh",       204,    "kazakh",       205
+smn,   "Inari Sami",   177,    "sami d'Inari", 352
+ibo,   "Igbo", 174,    "igbo", 174
+bej,   "Beja", 46,     "bedja",        52
+sgn-fr,        "French Sign Language", 496,    "French Sign Language", 487
+i-pwn, "Paiwan",       482,    "Paiwan",       473
+yap,   "Yapese",       452,    "yapois",       443
+smo,   "Samoan",       352,    "samoan",       356
+pan,   "Panjabi",      325,    "pendjabi",     326
+myn,   "Mayan languages",      271,    "maya, langues",        268
+tib,   "Tibetan",      409,    "tibétain",     407
+la,    "Latin",        230,    "latin",        230
+ho,    "Hiri Motu",    166,    "hiri motu",    166
+bel,   "Belarusian",   47,     "biélorusse",   58
+zh-gan,        "Kan or Gan",   510,    "Kan or Gan",   501
+pap,   "Papiamento",   326,    "papiamento",   324
+nub,   "Nubian languages",     305,    "nubiennes, langues",   300
+lb,    "Luxembourgish; Letzeburgesch", 249,    "luxembourgeois",       243
+fin,   "Finnish",      125,    "finnois",      129
+bem,   "Bemba",        48,     "bemba",        53
+art-lojban,    "Lojban",       462,    "Lojban",       453
+ter,   "Tereno",       406,    "tereno",       403
+tgk,   "Tajik",        401,    "tadjik",       392
+ben,   "Bengali",      49,     "bengali",      54
+tgl,   "Tagalog",      398,    "tagalog",      393
+sms,   "Skolt Sami",   374,    "sami skolt",   355
+rus,   "Russian",      348,    "russe",        346
+fy,    "Frisian",      131,    "frison",       135
+hr,    "Croatian",     93,     "croate",       99
+cre,   "Cree", 90,     "cree", 97
+tet,   "Tetum",        407,    "tetum",        404
+som,   "Somali",       380,    "somali",       378
+lad,   "Ladino",       226,    "judéo-espagnol",       194
+tig,   "Tigre",        410,    "tigré",        408
+son,   "Songhai",      381,    "songhai",      379
+ido,   "Ido",  173,    "ido",  173
+pau,   "Palauan",      321,    "palau",        320
+ssa,   "Nilo-Saharan (Other)", 296,    "nilo-sahariennes, autres langues",     294
+hu,    "Hungarian",    169,    "hongrois",     169
+ber,   "Berber (Other)",       50,     "berbères, autres langues",     55
+cad,   "Caddo",        64,     "caddo",        71
+nso,   "Sotho, Northern",      384,    "sotho du Nord",        382
+na,    "Nauru",        285,    "nauruan",      283
+sqi,   "Albanian",     11,     "albanais",     11
+de-at-1996,    "German Austrian variant orthography of 1996",  467,    "German Austrian variant orthography of 1996",  458
+nbl,   "South Ndebele",        388,    "ndébélé du Sud",       286
+nde,   "North Ndebele",        301,    "ndébélé du Nord",      285
+li,    "Limburgish; Limburger; Limburgan",     236,    "limbourgeois", 233
+lah,   "Lahnda",       227,    "lahnda",       226
+fiu,   "Finno-Ugrian (Other)", 126,    "finno-ougriennes, autres langues",     128
+dyu,   "Dyula",        108,    "dioula",       105
+nb,    "Norwegian Bokmål; Bokmål, Norwegian",  303,    "norvégien bokmål; bokmål, norvégien",  298
+nd,    "North Ndebele",        301,    "ndébélé du Nord",      285
+mlg,   "Malagasy",     255,    "malgache",     253
+bih,   "Bihari",       52,     "bihari",       59
+hy,    "Armenian",     22,     "arménien",     27
+sgn-jp,        "Japanese Sign Language",       501,    "Japanese Sign Language",       492
+sot,   "Sotho, Southern",      385,    "sotho du Sud", 383
+ne,    "Nepali",       292,    "népalais",     290
+hz,    "Herero",       162,    "herero",       162
+kik,   "Kikuyu; Gikuyu",       209,    "kikuyu",       210
+gay,   "Gayo", 138,    "gayo", 143
+ng,    "Ndonga",       290,    "ndonga",       287
+mnc,   "Manchu",       259,    "mandchou",     255
+ln,    "Lingala",      237,    "lingala",      234
+lam,   "Lamba",        228,    "lamba",        227
+ewe,   "Ewe",  119,    "éwé",  122
+bik,   "Bikol",        53,     "bikol",        60
+peo,   "Persian, Old (ca.600-400 B.C.)",       329,    "perse, vieux (ca. 600-400 av. J.-C.)", 328
+pa,    "Panjabi",      325,    "pendjabi",     326
+lo,    "Lao",  229,    "lao",  229
+kin,   "Kinyarwanda",  211,    "rwanda",       347
+jv,    "Javanese",     191,    "javanais",     192
+gem,   "Germanic (Other)",     146,    "germaniques, autres langues",  146
+est,   "Estonian",     118,    "estonien",     121
+crp,   "Creoles and pidgins (Other)",  92,     "créoles et pidgins divers",    98
+nya,   "Nyanja; Chichewa; Chewa",      307,    "nyanja; chichewa; chewa",      302
+yid,   "Yiddish",      453,    "yiddish",      444
+lao,   "Lao",  229,    "lao",  229
+sgn-be-fr,     "Belgian-French Sign Language", 488,    "Belgian-French Sign Language", 479
+tir,   "Tigrinya",     411,    "tigrigna",     409
+kmb,   "Kimbundu",     210,    "kimbundu",     211
+geo,   "Georgian",     141,    "géorgien",     145
+bin,   "Bini", 54,     "bini", 61
+i-lux, "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998",      479,    "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998",      470
+tkl,   "Tokelau",      416,    "tokelau",      413
+per,   "Persian",      328,    "persan",       327
+zh-wuu,        "Shanghaiese or Wu",    515,    "Shanghaiese or Wu",    506
+sgn-ni,        "Nicaraguan Sign Language",     503,    "Nicaraguan Sign Language",     494
+ndo,   "Ndonga",       290,    "ndonga",       287
+kir,   "Kirghiz",      212,    "kirghize",     212
+nl,    "Dutch",        106,    "néerlandais",  288
+ceb,   "Cebuano",      69,     "cebuano",      76
+mni,   "Manipuri",     262,    "manipuri",     258
+lt,    "Lithuanian",   238,    "lituanien",    235
+ger,   "German",       142,    "allemand",     14
+i-bnn, "Bunun",        474,    "Bunun",        465
+uga,   "Ugaritic",     430,    "ougaritique",  314
+tiv,   "Tiv",  413,    "tiv",  410
+tmh,   "Tamashek",     402,    "tamacheq",     395
+swa,   "Swahili",      394,    "swahili",      389
+nn,    "Nynorsk, Norwegian; Norwegian Nynorsk",        309,    "nynorsk, norvégien; norvégien nynorsk",        304
+lat,   "Latin",        230,    "latin",        230
+eus,   "Basque",       44,     "basque",       50
+car,   "Carib",        65,     "caribe",       72
+sgn-nl,        "Dutch Sign Language",  504,    "Dutch Sign Language",  495
+osa,   "Osage",        316,    "osage",        310
+no,    "Norwegian",    302,    "norvégien",    297
+lv,    "Latvian",      231,    "letton",       231
+efi,   "Efik", 110,    "efik", 114
+bis,   "Bislama",      55,     "bichlamar",    57
+ada,   "Adangme",      4,      "adangme",      4
+de-1996,       "German orthography of 1996",   465,    "German orthography of 1996",   456
+pi,    "Pali", 322,    "pali", 321
+lav,   "Latvian",      231,    "letton",       231
+nds,   "Low Saxon; Low German; Saxon, Low; German, Low",       240,    "saxon, bas; allemand, bas; bas saxon; bas allemand",   363
+fon,   "Fon",  127,    "fon",  130
+asm,   "Assamese",     24,     "assamais",     29
+cat,   "Catalan",      67,     "catalan",      74
+suk,   "Sukuma",       390,    "sukuma",       387
+mlt,   "Maltese",      258,    "maltais",      254
+ile,   "Interlingue",  181,    "interlingue",  181
+ewo,   "Ewondo",       120,    "éwondo",       123
+cau,   "Caucasian (Other)",    68,     "caucasiennes, autres langues", 75
+sgn-no,        "Norwegian Sign Language",      505,    "Norwegian Sign Language",      496
+uzb,   "Uzbek",        436,    "ouszbek",      317
+swe,   "Swedish",      396,    "suédois",      386
+nr,    "South Ndebele",        388,    "ndébélé du Sud",       286
+hai,   "Haida",        158,    "haida",        158
+awa,   "Awadhi",       31,     "awadhi",       35
+abk,   "Abkhazian",    1,      "abkhaze",      1
+pl,    "Polish",       333,    "polonais",     333
+mno,   "Manobo languages",     263,    "manobo, langues",      260
+aa,    "Afar", 5,      "afar", 5
+tog,   "Tonga (Nyasa)",        417,    "tonga (Nyasa)",        414
+sun,   "Sundanese",    392,    "soundanais",   384
+nym,   "Nyamwezi",     306,    "nyamwezi",     301
+ijo,   "Ijo",  175,    "ijo",  175
+ab,    "Abkhazian",    1,      "abkhaze",      1
+zap,   "Zapotec",      457,    "zapotèque",    448
+bod,   "Tibetan",      409,    "tibétain",     407
+nyn,   "Nyankole",     308,    "nyankolé",     303
+gil,   "Gilbertese",   148,    "kiribati",     213
+gez,   "Geez", 140,    "guèze",        156
+dra,   "Dravidian (Other)",    104,    "dravidiennes, autres langues", 111
+ta,    "Tamil",        403,    "tamoul",       396
+ssw,   "Swati",        395,    "swati",        390
+nyo,   "Nyoro",        310,    "nyoro",        305
+nv,    "Navajo; Navaho",       287,    "navaho",       284
+inc,   "Indic (Other)",        178,    "indo-aryennes, autres langues",        178
+afa,   "Afro-Asiatic (Other)", 8,      "afro-asiatiques, autres langues",      8
+cel,   "Celtic (Other)",       70,     "celtiques, autres langues",    77
+ltz,   "Luxembourgish; Letzeburgesch", 249,    "luxembourgeois",       243
+ind,   "Indonesian",   180,    "indonésien",   180
+ae,    "Avestan",      30,     "avestique",    34
+ast,   "Bable; Asturian",      34,     "bable; asturien",      38
+ine,   "Indo-European (Other)",        179,    "indo-européennes, autres langues",     179
+af,    "Afrikaans",    7,      "afrikaans",    7
+sus,   "Susu", 393,    "soussou",      385
+mac,   "Macedonian",   250,    "macédonien",   244
+heb,   "Hebrew",       161,    "hébreu",       161
+ny,    "Nyanja; Chichewa; Chewa",      307,    "nyanja; chichewa; chewa",      302
+cze,   "Czech",        95,     "tchèque",      398
+te,    "Telugu",       405,    "télougou",     401
+ps,    "Pushto",       338,    "pachto",       318
+mad,   "Madurese",     251,    "madourais",    245
+kok,   "Konkani",      215,    "konkani",      216
+ca,    "Catalan",      67,     "catalan",      74
+%%
+
diff --git a/tests/makeinfo.gperf b/tests/makeinfo.gperf
new file mode 100644 (file)
index 0000000..1488b8e
--- /dev/null
@@ -0,0 +1,116 @@
+COMMAND;
+%%
+!, cm_force_sentence_end, false
+', insert_self, false
+*, cm_asterisk, false
+., cm_force_sentence_end, false
+:, cm_force_abbreviated_whitespace, false
+?, cm_force_sentence_end, false
+@, insert_self, false
+TeX, cm_TeX, true
+`, insert_self, false
+appendix, cm_appendix, false
+appendixsec, cm_appendixsec, false
+appendixsubsec, cm_appendixsubsec, false
+asis, cm_asis, true
+b, cm_bold, true
+br, cm_br, false
+bullet, cm_bullet, true
+bye, cm_bye, false
+c, cm_comment, false
+center, cm_center, false
+chapter, cm_chapter, false
+cindex, cm_cindex, false
+cite, cm_cite, true
+code, cm_code, true
+comment, cm_comment, false
+contents, do_nothing, false
+copyright, cm_copyright, true
+ctrl, cm_ctrl, true
+defcodeindex, cm_defindex, false
+defindex, cm_defindex, false
+dfn, cm_dfn, true
+display, cm_display, false
+dots, cm_dots, true
+emph, cm_emph, true
+end, cm_end, false
+enumerate, cm_enumerate, false
+equiv, cm_equiv, true
+error, cm_error, true
+example, cm_example, false
+exdent, cm_exdent, false
+expansion, cm_expansion, true
+file, cm_file, true
+findex, cm_findex, false
+format, cm_format, false
+group, cm_group, false
+i, cm_italic, true
+iappendix, cm_appendix, false
+iappendixsec, cm_appendixsec, false
+iappendixsubsec, cm_appendixsubsec, false
+ichapter, cm_chapter, false
+ifinfo, cm_ifinfo, false
+iftex, cm_iftex, false
+ignore, cm_ignore, false
+include, cm_include, false
+inforef, cm_inforef, true
+input, cm_include, false
+isection, cm_section, false
+isubsection, cm_subsection, false
+isubsubsection, cm_subsubsection, false
+item, cm_item, false
+itemize, cm_itemize, false
+itemx, cm_itemx, false
+iunnumbered, cm_unnumbered, false
+iunnumberedsec, cm_unnumberedsec, false
+iunnumberedsubsec, cm_unnumberedsubsec, false
+kbd, cm_kbd, true
+key, cm_key, true
+kindex, cm_kindex, false
+lisp, cm_lisp, false
+menu, cm_menu
+minus, cm_minus, true
+need, cm_need, false
+node, cm_node, false
+noindent, cm_noindent, false
+page, do_nothing, false
+pindex, cm_pindex, false
+point, cm_point, true
+print, cm_print, true
+printindex, cm_printindex, false
+pxref, cm_pxref, true
+quotation, cm_quotation, false
+r, cm_roman, true
+ref, cm_xref, true
+refill, cm_refill, false
+result, cm_result, true
+samp, cm_samp, true
+sc, cm_sc, true
+section, cm_section, false
+setchapternewpage, cm_setchapternewpage, false
+setfilename, cm_setfilename, false
+settitle, cm_settitle, false
+smallexample, cm_smallexample, false
+sp, cm_sp, false
+strong, cm_strong, true
+subsection, cm_subsection, false
+subsubsection, cm_subsubsection, false
+summarycontents, do_nothing, false
+syncodeindex, cm_synindex, false
+synindex, cm_synindex, false
+t, cm_title, true
+table, cm_table, false
+tex, cm_tex, false
+tindex, cm_tindex, false
+titlepage, cm_titlepage, false
+unnumbered, cm_unnumbered, false
+unnumberedsec, cm_unnumberedsec, false
+unnumberedsubsec, cm_unnumberedsubsec, false
+var, cm_var, true
+vindex, cm_vindex, false
+w, cm_w, true
+xref, cm_xref, true
+{, insert_self, false
+}, insert_self, false
+infoinclude, cm_infoinclude, false
+footnote, cm_footnote, false
diff --git a/tests/modula.exp b/tests/modula.exp
new file mode 100644 (file)
index 0000000..cef7d5a
--- /dev/null
@@ -0,0 +1,106 @@
+in word set AND
+in word set ARRAY
+in word set BEGIN
+in word set BITS
+in word set BY
+in word set CASE
+in word set CONST
+in word set DIV
+in word set DO
+in word set ELSE
+in word set ELSIF
+in word set END
+in word set EVAL
+in word set EXCEPT
+in word set EXCEPTION
+in word set EXIT
+in word set EXPORTS
+in word set FINALLY
+in word set FOR
+in word set FROM
+in word set IF
+in word set IMPORT
+in word set INTERFACE
+in word set IN
+in word set INLINE
+in word set LOCK
+in word set METHODS
+in word set MOD
+in word set MODULE
+in word set NOT
+in word set OBJECT
+in word set OF
+in word set OR
+in word set PROCEDURE
+in word set RAISES
+in word set READONLY
+in word set RECORD
+in word set REF
+in word set REPEAT
+in word set RETURN
+in word set SET
+in word set THEN
+in word set TO
+in word set TRY
+in word set TYPE
+in word set TYPECASE
+in word set UNSAFE
+in word set UNTIL
+in word set UNTRACED
+in word set VALUE
+in word set VAR
+in word set WHILE
+in word set WITH
+in word set and
+in word set array
+in word set begin
+in word set bits
+in word set by
+in word set case
+in word set const
+in word set div
+in word set do
+in word set else
+in word set elsif
+in word set end
+in word set eval
+in word set except
+in word set exception
+in word set exit
+in word set exports
+in word set finally
+in word set for
+in word set from
+in word set if
+in word set import
+in word set interface
+in word set in
+in word set inline
+in word set lock
+in word set methods
+in word set mod
+in word set module
+in word set not
+in word set object
+in word set of
+in word set or
+in word set procedure
+in word set raises
+in word set readonly
+in word set record
+in word set ref
+in word set repeat
+in word set return
+in word set set
+in word set then
+in word set to
+in word set try
+in word set type
+in word set typecase
+in word set unsafe
+in word set until
+in word set untraced
+in word set value
+in word set var
+in word set while
+in word set with
diff --git a/tests/modula2.exp b/tests/modula2.exp
new file mode 100644 (file)
index 0000000..b3b8a92
--- /dev/null
@@ -0,0 +1,225 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -n -k1-8 -l  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+#define TOTAL_KEYWORDS 40
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 14
+#define MIN_HASH_VALUE 1
+#define MAX_HASH_VALUE 155
+/* maximum key range = 155, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156,   1,  10,  30,  25,   0,
+       10,  55,   6,   0, 156, 156,  15,  15,  35,  15,
+       30,   0,   5,   1,   0,  45,  21,  45,   6,   1,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+      156, 156, 156, 156, 156, 156
+    };
+  register int hval = 0;
+
+  switch (len)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[7]];
+      /*FALLTHROUGH*/
+      case 7:
+        hval += asso_values[(unsigned char)str[6]];
+      /*FALLTHROUGH*/
+      case 6:
+        hval += asso_values[(unsigned char)str[5]];
+      /*FALLTHROUGH*/
+      case 5:
+        hval += asso_values[(unsigned char)str[4]];
+      /*FALLTHROUGH*/
+      case 4:
+        hval += asso_values[(unsigned char)str[3]];
+      /*FALLTHROUGH*/
+      case 3:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+        hval += asso_values[(unsigned char)str[1]];
+      /*FALLTHROUGH*/
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const char *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char lengthtable[] =
+    {
+       0,  3,  0,  0,  0,  0,  4,  0,  0,  0,  2,  2,  0,  5,
+       0,  2,  4,  0,  0,  0,  2,  0,  0,  0,  0,  2,  5,  3,
+       0,  0,  3,  4,  4,  0,  0,  2,  6,  0,  0,  0,  2,  4,
+       0,  0,  0,  4,  3,  0,  0,  0,  3,  4,  0,  0,  0,  3,
+       6,  0,  0,  0,  3,  3,  0,  0,  0,  6,  5,  0,  0,  0,
+      10,  9,  0,  0,  0,  4,  0,  0,  0,  0,  6,  5,  0,  0,
+       0,  7,  0,  0,  0,  0,  6,  0,  0,  0,  0,  5,  0,  0,
+       0,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0,
+       0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  9
+    };
+  static const char * wordlist[] =
+    {
+      "",
+      "SET",
+      "", "", "", "",
+      "EXIT",
+      "", "", "",
+      "IF",
+      "BY",
+      "",
+      "ARRAY",
+      "",
+      "TO",
+      "ELSE",
+      "", "", "",
+      "OR",
+      "", "", "", "",
+      "OF",
+      "ELSIF",
+      "VAR",
+      "", "",
+      "FOR",
+      "TYPE",
+      "CASE",
+      "", "",
+      "IN",
+      "REPEAT",
+      "", "", "",
+      "DO",
+      "THEN",
+      "", "", "",
+      "FROM",
+      "DIV",
+      "", "", "",
+      "NOT",
+      "WITH",
+      "", "", "",
+      "MOD",
+      "EXPORT",
+      "", "", "",
+      "END",
+      "AND",
+      "", "", "",
+      "IMPORT",
+      "WHILE",
+      "", "", "",
+      "DEFINITION",
+      "QUALIFIED",
+      "", "", "",
+      "LOOP",
+      "", "", "", "",
+      "RECORD",
+      "CONST",
+      "", "", "",
+      "POINTER",
+      "", "", "", "",
+      "RETURN",
+      "", "", "", "",
+      "UNTIL",
+      "", "", "", "",
+      "BEGIN",
+      "", "", "", "", "", "", "", "", "",
+      "IMPLEMENTATION",
+      "", "", "", "",
+      "MODULE",
+      "", "", "", "", "", "", "", "", "",
+      "", "", "", "", "", "", "", "", "",
+      "", "", "", "", "", "", "", "", "",
+      "", "", "", "", "", "", "", "", "",
+      "", "", "",
+      "PROCEDURE"
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        if (len == lengthtable[key])
+          {
+            register const char *s = wordlist[key];
+
+            if (*str == *s && !memcmp (str + 1, s + 1, len - 1))
+              return s;
+          }
+    }
+  return 0;
+}
diff --git a/tests/modula2.gperf b/tests/modula2.gperf
new file mode 100644 (file)
index 0000000..5ef9c75
--- /dev/null
@@ -0,0 +1,40 @@
+AND
+ARRAY
+BEGIN
+BY
+CASE
+CONST
+DEFINITION
+DIV
+DO
+ELSE
+ELSIF
+END
+EXIT
+EXPORT
+FOR
+FROM
+IF
+IMPLEMENTATION
+IMPORT
+IN
+LOOP
+MOD
+MODULE
+NOT
+OF
+OR
+POINTER
+PROCEDURE
+QUALIFIED
+RECORD
+REPEAT
+RETURN
+SET
+THEN
+TO
+TYPE
+UNTIL
+VAR
+WHILE
+WITH
diff --git a/tests/modula3.gperf b/tests/modula3.gperf
new file mode 100644 (file)
index 0000000..d024346
--- /dev/null
@@ -0,0 +1,106 @@
+AND
+ARRAY
+BEGIN
+BITS
+BY
+CASE
+CONST
+DIV
+DO
+ELSE
+ELSIF
+END
+EVAL
+EXCEPT
+EXCEPTION
+EXIT
+EXPORTS
+FINALLY
+FOR
+FROM
+IF
+IMPORT
+INTERFACE
+IN
+INLINE
+LOCK
+METHODS
+MOD
+MODULE
+NOT
+OBJECT
+OF
+OR
+PROCEDURE
+RAISES
+READONLY
+RECORD
+REF
+REPEAT
+RETURN
+SET
+THEN
+TO
+TRY
+TYPE
+TYPECASE
+UNSAFE
+UNTIL
+UNTRACED
+VALUE
+VAR
+WHILE
+WITH
+and
+array
+begin
+bits
+by
+case
+const
+div
+do
+else
+elsif
+end
+eval
+except
+exception
+exit
+exports
+finally
+for
+from
+if
+import
+interface
+in
+inline
+lock
+methods
+mod
+module
+not
+object
+of
+or
+procedure
+raises
+readonly
+record
+ref
+repeat
+return
+set
+then
+to
+try
+type
+typecase
+unsafe
+until
+untraced
+value
+var
+while
+with
diff --git a/tests/objc.exp b/tests/objc.exp
new file mode 100644 (file)
index 0000000..d03e251
--- /dev/null
@@ -0,0 +1,196 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -j1 -i 1 -g -o -t -N is_reserved_word -k'1,3,$'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Command-line: gperf -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ objc.gperf  */ 
+struct resword { char *name; short token; enum rid rid; };
+
+#define TOTAL_KEYWORDS 59
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 15
+#define MIN_HASH_VALUE 8
+#define MAX_HASH_VALUE 95
+/* maximum key range = 88, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 19, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96,  2, 96,  2,  1, 10,
+      26,  1, 23, 27, 27, 24, 96,  1, 25, 36,
+      10, 34, 23, 96, 10,  6,  8, 11, 41,  2,
+      96, 96, 23, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+      96, 96, 96, 96, 96, 96
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+is_reserved_word (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct resword wordlist[] =
+    {
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {"break", BREAK, NORID},
+      {""}, {""}, {""},
+      {"else", ELSE, NORID},
+      {"__asm__", ASM, NORID},
+      {""}, {""},
+      {"__attribute", ATTRIBUTE, NORID},
+      {"__alignof__", ALIGNOF, NORID},
+      {"__extension__", EXTENSION, NORID},
+      {"__attribute__", ATTRIBUTE, NORID},
+      {"__signed__", TYPESPEC, RID_SIGNED},
+      {"case", CASE, NORID},
+      {"__typeof__", TYPEOF, NORID},
+      {"__const__", TYPE_QUAL, RID_CONST},
+      {"static", SCSPEC, RID_STATIC},
+      {"extern", SCSPEC, RID_EXTERN},
+      {"char", TYPESPEC, RID_CHAR},
+      {"__const", TYPE_QUAL, RID_CONST},
+      {""},
+      {"continue", CONTINUE, NORID},
+      {"struct", STRUCT, NORID},
+      {"@defs", DEFS, NORID},
+      {"while", WHILE, NORID},
+      {"const", TYPE_QUAL, RID_CONST},
+      {"return", RETURN, NORID},
+      {"__inline", SCSPEC, RID_INLINE},
+      {"__alignof", ALIGNOF, NORID},
+      {"@encode", ENCODE, NORID},
+      {"__inline__", SCSPEC, RID_INLINE},
+      {"@selector", SELECTOR, NORID},
+      {"@interface", INTERFACE, NORID},
+      {"__typeof", TYPEOF, NORID},
+      {"__signed", TYPESPEC, RID_SIGNED},
+      {"int", TYPESPEC, RID_INT},
+      {"double", TYPESPEC, RID_DOUBLE},
+      {"__asm", ASM, NORID},
+      {"for", FOR, NORID},
+      {"@public", PUBLIC, NORID},
+      {"auto", SCSPEC, RID_AUTO},
+      {"if", IF, NORID},
+      {"union", UNION, NORID},
+      {"unsigned", TYPESPEC, RID_UNSIGNED},
+      {"enum", ENUM, NORID},
+      {"short", TYPESPEC, RID_SHORT},
+      {"__volatile", TYPE_QUAL, RID_VOLATILE},
+      {"register", SCSPEC, RID_REGISTER},
+      {"inline", SCSPEC, RID_INLINE},
+      {"__volatile__", TYPE_QUAL, RID_VOLATILE},
+      {"sizeof", SIZEOF, NORID},
+      {"@end", END, NORID},
+      {"typeof", TYPEOF, NORID},
+      {"typedef", SCSPEC, RID_TYPEDEF},
+      {"do", DO, NORID},
+      {"switch", SWITCH, NORID},
+      {"default", DEFAULT, NORID},
+      {"signed", TYPESPEC, RID_SIGNED},
+      {"long", TYPESPEC, RID_LONG},
+      {""}, {""}, {""},
+      {"float", TYPESPEC, RID_FLOAT},
+      {""}, {""},
+      {"goto", GOTO, NORID},
+      {""},
+      {"volatile", TYPE_QUAL, RID_VOLATILE},
+      {""},
+      {"asm", ASM, NORID},
+      {""}, {""},
+      {"@implementation", IMPLEMENTATION, NORID},
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+      {""}, {""}, {""}, {""}, {""},
+      {"void", TYPESPEC, RID_VOID}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
diff --git a/tests/objc.gperf b/tests/objc.gperf
new file mode 100644 (file)
index 0000000..f0e3290
--- /dev/null
@@ -0,0 +1,64 @@
+%{
+/* Command-line: gperf -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ objc.gperf  */ 
+%}
+struct resword { char *name; short token; enum rid rid; };
+%%
+@defs, DEFS, NORID
+@encode, ENCODE, NORID
+@end, END, NORID
+@implementation, IMPLEMENTATION, NORID
+@interface, INTERFACE, NORID
+@public, PUBLIC, NORID
+@selector, SELECTOR, NORID
+__alignof, ALIGNOF, NORID
+__alignof__, ALIGNOF, NORID
+__asm, ASM, NORID
+__asm__, ASM, NORID
+__attribute, ATTRIBUTE, NORID
+__attribute__, ATTRIBUTE, NORID
+__const, TYPE_QUAL, RID_CONST
+__const__, TYPE_QUAL, RID_CONST
+__extension__, EXTENSION, NORID
+__inline, SCSPEC, RID_INLINE
+__inline__, SCSPEC, RID_INLINE
+__signed, TYPESPEC, RID_SIGNED
+__signed__, TYPESPEC, RID_SIGNED
+__typeof, TYPEOF, NORID
+__typeof__, TYPEOF, NORID
+__volatile, TYPE_QUAL, RID_VOLATILE
+__volatile__, TYPE_QUAL, RID_VOLATILE
+asm, ASM, NORID
+auto, SCSPEC, RID_AUTO
+break, BREAK, NORID
+case, CASE, NORID
+char, TYPESPEC, RID_CHAR
+const, TYPE_QUAL, RID_CONST
+continue, CONTINUE, NORID
+default, DEFAULT, NORID
+do, DO, NORID
+double, TYPESPEC, RID_DOUBLE
+else, ELSE, NORID
+enum, ENUM, NORID
+extern, SCSPEC, RID_EXTERN
+float, TYPESPEC, RID_FLOAT
+for, FOR, NORID
+goto, GOTO, NORID
+if, IF, NORID
+inline, SCSPEC, RID_INLINE
+int, TYPESPEC, RID_INT
+long, TYPESPEC, RID_LONG
+register, SCSPEC, RID_REGISTER
+return, RETURN, NORID
+short, TYPESPEC, RID_SHORT
+signed, TYPESPEC, RID_SIGNED
+sizeof, SIZEOF, NORID
+static, SCSPEC, RID_STATIC
+struct, STRUCT, NORID
+switch, SWITCH, NORID
+typedef, SCSPEC, RID_TYPEDEF
+typeof, TYPEOF, NORID
+union, UNION, NORID
+unsigned, TYPESPEC, RID_UNSIGNED
+void, TYPESPEC, RID_VOID
+volatile, TYPE_QUAL, RID_VOLATILE
+while, WHILE, NORID
diff --git a/tests/pascal.exp b/tests/pascal.exp
new file mode 100644 (file)
index 0000000..765e44c
--- /dev/null
@@ -0,0 +1,36 @@
+in word set with
+in word set array
+in word set and
+in word set function
+in word set case
+in word set var
+in word set const
+in word set until
+in word set then
+in word set set
+in word set record
+in word set program
+in word set procedure
+in word set or
+in word set packed
+in word set not
+in word set nil
+in word set label
+in word set in
+in word set repeat
+in word set of
+in word set goto
+in word set forward
+in word set for
+in word set while
+in word set file
+in word set else
+in word set downto
+in word set do
+in word set div
+in word set to
+in word set type
+in word set end
+in word set mod
+in word set begin
+in word set if
diff --git a/tests/pascal.gperf b/tests/pascal.gperf
new file mode 100644 (file)
index 0000000..fed3fbb
--- /dev/null
@@ -0,0 +1,36 @@
+with
+array
+and
+function
+case
+var
+const
+until
+then
+set
+record
+program
+procedure
+or
+packed
+not
+nil
+label
+in
+repeat
+of
+goto
+forward
+for
+while
+file
+else
+downto
+do
+div
+to
+type
+end
+mod
+begin
+if
diff --git a/tests/permut2.exp b/tests/permut2.exp
new file mode 100644 (file)
index 0000000..3f818c7
--- /dev/null
@@ -0,0 +1,117 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -m5  */
+/* Computed positions: -k'1-2' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+#define TOTAL_KEYWORDS 4
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 2
+#define MIN_HASH_VALUE 0
+#define MAX_HASH_VALUE 3
+/* maximum key range = 4, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      0, 1, 0, 3, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4
+    };
+  return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const char *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static const char * wordlist[] =
+    {
+      "xy",
+      "zx",
+      "yx",
+      "xz"
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key];
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return s;
+        }
+    }
+  return 0;
+}
diff --git a/tests/permut2.gperf b/tests/permut2.gperf
new file mode 100644 (file)
index 0000000..6f01527
--- /dev/null
@@ -0,0 +1,4 @@
+xy
+yx
+xz
+zx
diff --git a/tests/permut3.exp b/tests/permut3.exp
new file mode 100644 (file)
index 0000000..f0f0c73
--- /dev/null
@@ -0,0 +1,117 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -m5  */
+/* Computed positions: -k'1-2' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+#define TOTAL_KEYWORDS 4
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 3
+#define MIN_HASH_VALUE 0
+#define MAX_HASH_VALUE 3
+/* maximum key range = 4, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 2, 0, 1,
+      0, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4
+    };
+  return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const char *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static const char * wordlist[] =
+    {
+      "bca",
+      "cab",
+      "acb",
+      "abc"
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key];
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return s;
+        }
+    }
+  return 0;
+}
diff --git a/tests/permut3.gperf b/tests/permut3.gperf
new file mode 100644 (file)
index 0000000..f33d272
--- /dev/null
@@ -0,0 +1,4 @@
+abc
+acb
+bca
+cab
diff --git a/tests/permutc2.exp b/tests/permutc2.exp
new file mode 100644 (file)
index 0000000..8f1dc53
--- /dev/null
@@ -0,0 +1,168 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -m5 --ignore-case  */
+/* Computed positions: -k'1-2' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Test of a hash function which has to deal with permutation and
+   case-independence.  Without case-independence, the alpha_inc is 1.
+   With case-independence, the alpha_inc is 3.  */
+
+#define TOTAL_KEYWORDS 8
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 2
+#define MIN_HASH_VALUE 0
+#define MAX_HASH_VALUE 7
+/* maximum key range = 8, duplicates = 0 */
+
+#ifndef GPERF_DOWNCASE
+#define GPERF_DOWNCASE 1
+static unsigned char gperf_downcase[256] =
+  {
+      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
+     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
+     45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
+     60,  61,  62,  63,  64,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
+    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+    122,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104,
+    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+    120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+    135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+    150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
+    165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+    180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+    195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
+    225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
+    255
+  };
+#endif
+
+#ifndef GPERF_CASE_STRCMP
+#define GPERF_CASE_STRCMP 1
+static int
+gperf_case_strcmp (s1, s2)
+     register const char *s1;
+     register const char *s2;
+{
+  for (;;)
+    {
+      unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
+      unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
+      if (c1 != 0 && c1 == c2)
+        continue;
+      return (int)c1 - (int)c2;
+    }
+}
+#endif
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 1, 8, 8, 3, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 3, 1,
+      0, 7, 1, 0, 3, 8, 8, 1, 8, 8,
+      3, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      3, 1, 0, 0, 1, 0, 2, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 8, 8, 8
+    };
+  return asso_values[(unsigned char)str[1]+3] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const char *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static const char * wordlist[] =
+    {
+      "{w",
+      "az",
+      "ay",
+      "za",
+      "ya",
+      "x{",
+      "x[",
+      "[w"
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key];
+
+          if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s))
+            return s;
+        }
+    }
+  return 0;
+}
diff --git a/tests/permutc2.gperf b/tests/permutc2.gperf
new file mode 100644 (file)
index 0000000..223a193
--- /dev/null
@@ -0,0 +1,14 @@
+%{
+/* Test of a hash function which has to deal with permutation and
+   case-independence.  Without case-independence, the alpha_inc is 1.
+   With case-independence, the alpha_inc is 3.  */
+%}
+%%
+az
+za
+ay
+ya
+x{
+x[
+{w
+[w
diff --git a/tests/smtp.gperf b/tests/smtp.gperf
new file mode 100644 (file)
index 0000000..33137b9
--- /dev/null
@@ -0,0 +1,206 @@
+%{
+/* gperf --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case */
+/* Contributed by Bruce Lilly
+   derived from http://users.erols.com/blilly/mailparse/fields.gperf */
+
+#include <string.h>
+
+%}
+struct header_state { const char *field_name; };
+%%
+Accept-Language
+Action
+Alternate-Recipient
+Approved
+Archive
+Arrival-Date
+Autoforwarded
+Autosubmitted
+Bcc
+Cc
+Comments
+Complaints-To
+Content-alternative
+Content-Base
+Content-Description
+Content-Disposition
+Content-Duration
+Content-Features
+Content-ID
+Content-Language
+Content-Location
+Content-MD5
+Content-Transfer-Encoding
+Content-Type
+Control
+Conversion
+Conversion-With-Loss
+DL-Expansion-History
+DSN-Gateway
+Date
+Deferred-Delivery
+Delivery-Date
+Diagnostic-Code
+Discarded-X400-IPMS-Extensions
+Discarded-X400-MTS-Extensions
+Disclose-Recipients
+Disposition
+Disposition-Notification-Options
+Disposition-Notification-To
+Distribution
+Encrypted
+Error
+Expires
+Failure
+Final-Log-ID
+Final-Recipient
+Followup-To
+From
+Generate-Delivery-Report
+Importance
+In-Reply-To
+Incomplete-Copy
+Injector-Info
+Keywords
+Last-Attempt-Date
+Latest-Delivery-Time
+Lines
+List-Archive
+List-Help
+List-ID
+List-Post
+List-Owner
+List-Subscribe
+List-Unsubscribe
+MDN-Gateway
+Media-Accept-Features
+MIME-Version
+Mail-Copies-To
+Message-ID
+Message-Type
+Newsgroups
+Organization
+Original-Encoded-Information-Types
+Original-Envelope-ID
+Original-Message-ID
+Original-Recipient
+Originator-Return-Address
+Path
+Posted-And-Mailed
+Prevent-Nondelivery-Report
+Priority
+Received
+Received-content-MIC
+Received-From-MTA
+References
+Remote-MTA
+Reply-By
+Reply-To
+Reporting-MTA
+Reporting-UA
+Return-Path
+Sender
+Sensitivity
+Status
+Subject
+Summary
+Supersedes
+To
+User-Agent
+Warning
+Will-Retry-Until
+X400-Content-Identifier
+X400-Content-Return
+X400-Content-Type
+X400-MTS-Identifier
+X400-Originator
+X400-Received
+X400-Recipients
+Xref
+%%
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+static int
+my_case_strcmp (s1, s2)
+     register const char *s1;
+     register const char *s2;
+{
+  for (;;)
+    {
+      unsigned char c1 = *s1++;
+      unsigned char c2 = *s2++;
+      if (c1 >= 'A' && c1 <= 'Z')
+        c1 += 'a' - 'A';
+      if (c2 >= 'A' && c2 <= 'Z')
+        c2 += 'a' - 'A';
+      if (c1 != 0 && c1 == c2)
+        continue;
+      return (int)c1 - (int)c2;
+    }
+}
+
+int
+main (argc, argv)
+     int argc;
+     char *argv[];
+{
+  int i, j, k, n, exitcode;
+  unsigned int len;
+  const struct header_state *hs;
+
+  n = 1;
+  if (argc > 1)
+    n = atoi (argv[1]);
+  if (n < 1)
+    n = 1;
+
+  exitcode = 0;
+  for (i = 0; i < n; i++)
+    {
+      for (j = 0; j <= MAX_HASH_VALUE; j++)
+        {
+          const char *s = wordlist[j].field_name;
+          len = strlen (s);
+          if (len)
+            {
+              hs = header_entry (s, len);
+              if (!(hs && strcmp (hs->field_name, s) == 0))
+                {
+                  fprintf (stderr, "%s != %s\n", s, hs ? hs->field_name : "(null)");
+                  exitcode = 1;
+                }
+            }
+        }
+      for (j = 0; j <= MAX_HASH_VALUE; j++)
+        {
+          char s[MAX_WORD_LENGTH+1];
+          /* expensive copy with case conversion (for testing) */
+          strcpy (s, wordlist[j].field_name);
+          len = strlen (s);
+          if (len)
+            {
+              for (k = 0; k < len; k++)
+                if (isupper (s[k]))
+                  s[k] = tolower (s[k]);
+                else if (islower (s[k]))
+                  s[k] = toupper (s[k]);
+              hs = header_entry (s, len);
+              if (!(hs && my_case_strcmp (hs->field_name, s) == 0))
+                {
+                  fprintf (stderr, "%s != %s\n", s, hs ? hs->field_name : "(null)");
+                  exitcode = 1;
+                }
+            }
+        }
+      hs = header_entry ("Dave", 4);
+      if (hs)
+        {
+          fprintf (stderr, "Dave == %s\n", hs->field_name);
+          exitcode = 1;
+        }
+    }
+  return exitcode;
+}
diff --git a/tests/test-4.exp b/tests/test-4.exp
new file mode 100644 (file)
index 0000000..cd39077
--- /dev/null
@@ -0,0 +1,237 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: ../src/gperf -D -t -k'1,$'  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+
+/* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf  */ 
+struct resword { const char *name; short token; enum rid rid; };
+
+#define TOTAL_KEYWORDS 83
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 20
+#define MIN_HASH_VALUE 4
+#define MAX_HASH_VALUE 127
+/* maximum key range = 124, duplicates = 8 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static unsigned char asso_values[] =
+    {
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128,   0, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128,   5, 128,   0,  15,  50,
+       55,   0,  15,  35,  65,  60, 128,  40,   0,  60,
+       65,  10, 128, 128,  15,  20,  30,  20,  40,   0,
+       20,  15, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+      128, 128, 128, 128, 128, 128
+    };
+  return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
+}
+
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+struct resword *
+in_word_set (str, len)
+     register const char *str;
+     register unsigned int len;
+{
+  static struct resword wordlist[] =
+    {
+      {"else", ELSE, NORID},
+      {"while", WHILE, NORID},
+      {"@encode", ENCODE, NORID},
+      {"@private", PRIVATE, NORID},
+      {"@protocol", PROTOCOL, NORID},
+      {"@interface", INTERFACE, NORID},
+      {"__real", REALPART, NORID},
+      {"__inline", SCSPEC, RID_INLINE},
+      {"auto", SCSPEC, RID_AUTO},
+      {"__volatile", TYPE_QUAL, RID_VOLATILE},
+      {"__attribute", ATTRIBUTE, NORID},
+      {"__asm__", ASM_KEYWORD, NORID},
+      {"__imag__", IMAGPART, NORID},
+      {"__real__", REALPART, NORID},
+      {"__const__", TYPE_QUAL, RID_CONST},
+      {"__label__", LABEL, NORID},
+      {"__inline__", SCSPEC, RID_INLINE},
+      {"__typeof__", TYPEOF, NORID},
+      {"__signed__", TYPESPEC, RID_SIGNED},
+      {"__alignof__", ALIGNOF, NORID},
+      {"__complex__", TYPESPEC, RID_COMPLEX},
+      {"__iterator__", SCSPEC, RID_ITERATOR},
+      {"__volatile__", TYPE_QUAL, RID_VOLATILE},
+      {"__restrict__", TYPE_QUAL, RID_RESTRICT},
+      {"__attribute__", ATTRIBUTE, NORID},
+      {"__extension__", EXTENSION, NORID},
+      {"@selector", SELECTOR, NORID},
+      {"@defs", DEFS, NORID},
+      {"@class", CLASS, NORID},
+      {"__typeof", TYPEOF, NORID},
+      {"__alignof", ALIGNOF, NORID},
+      {"__iterator", SCSPEC, RID_ITERATOR},
+      {"oneway", TYPE_QUAL, RID_ONEWAY},
+      {"for", FOR, NORID},
+      {"__complex", TYPESPEC, RID_COMPLEX},
+      {"byref", TYPE_QUAL, RID_BYREF},
+      {"bycopy", TYPE_QUAL, RID_BYCOPY},
+      {"register", SCSPEC, RID_REGISTER},
+      {"long", TYPESPEC, RID_LONG},
+      {"@compatibility_alias", ALIAS, NORID},
+      {"sizeof", SIZEOF, NORID},
+      {"__const", TYPE_QUAL, RID_CONST},
+      {"out", TYPE_QUAL, RID_OUT},
+      {"__restrict", TYPE_QUAL, RID_RESTRICT},
+      {"__imag", IMAGPART, NORID},
+      {"volatile", TYPE_QUAL, RID_VOLATILE},
+      {"goto", GOTO, NORID},
+      {"float", TYPESPEC, RID_FLOAT},
+      {"typeof", TYPEOF, NORID},
+      {"typedef", SCSPEC, RID_TYPEDEF},
+      {"restrict", TYPE_QUAL, RID_RESTRICT},
+      {"case", CASE, NORID},
+      {"short", TYPESPEC, RID_SHORT},
+      {"struct", STRUCT, NORID},
+      {"@public", PUBLIC, NORID},
+      {"continue", CONTINUE, NORID},
+      {"@end", END, NORID},
+      {"break", BREAK, NORID},
+      {"double", TYPESPEC, RID_DOUBLE},
+      {"asm", ASM_KEYWORD, NORID},
+      {"enum", ENUM, NORID},
+      {"@protected", PROTECTED, NORID},
+      {"inline", SCSPEC, RID_INLINE},
+      {"do", DO, NORID},
+      {"__signed", TYPESPEC, RID_SIGNED},
+      {"char", TYPESPEC, RID_CHAR},
+      {"__asm", ASM_KEYWORD, NORID},
+      {"extern", SCSPEC, RID_EXTERN},
+      {"static", SCSPEC, RID_STATIC},
+      {"if", IF, NORID},
+      {"@implementation", IMPLEMENTATION, NORID},
+      {"signed", TYPESPEC, RID_SIGNED},
+      {"unsigned", TYPESPEC, RID_UNSIGNED},
+      {"const", TYPE_QUAL, RID_CONST},
+      {"return", RETURN, NORID},
+      {"union", UNION, NORID},
+      {"switch", SWITCH, NORID},
+      {"default", DEFAULT, NORID},
+      {"int", TYPESPEC, RID_INT},
+      {"inout", TYPE_QUAL, RID_INOUT},
+      {"void", TYPESPEC, RID_VOID},
+      {"id", OBJECTNAME, RID_ID},
+      {"in", TYPE_QUAL, RID_IN}
+    };
+
+  static short lookup[] =
+    {
+        -1,   -1,   -1,   -1,    0,    1,   -1,    2,
+         3,    4,    5,    6,   -1,    7,    8,    9,
+        10,   11, -184, -180, -171, -162, -158, -156,
+        26,   27,   28,   -1,   29,   30,   31,   32,
+        -1,   33,   34,   35,   36,   -1,   37,   38,
+        39,   40,   41,   42,   -1,   43,   44,   -1,
+        45,   46,   47,   48,   49,   50,   51,   52,
+        53,   54,   55,   56,   57,   58,   -1,   59,
+        60,   61,   62,   63,   64,   65,   66,   67,
+       -59,   -2,  -62,   -3,   68,   69,  -64,   -2,
+        70,   71,   -1,   72,   -1,   73,   74,  -67,
+        -3,   -1,   75,   76,   77,   78,   -1,   79,
+       -69,   -2,   -1,   80,  -71,   -2,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   81,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   82
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register int index = lookup[key];
+
+          if (index >= 0)
+            {
+              register const char *s = wordlist[index].name;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &wordlist[index];
+            }
+          else if (index < -TOTAL_KEYWORDS)
+            {
+              register int offset = - 1 - TOTAL_KEYWORDS - index;
+              register struct resword *wordptr = &wordlist[TOTAL_KEYWORDS + lookup[offset]];
+              register struct resword *wordendptr = wordptr + -lookup[offset + 1];
+
+              while (wordptr < wordendptr)
+                {
+                  register const char *s = wordptr->name;
+
+                  if (*str == *s && !strcmp (str + 1, s + 1))
+                    return wordptr;
+                  wordptr++;
+                }
+            }
+        }
+    }
+  return 0;
+}
diff --git a/tests/test-6.exp b/tests/test-6.exp
new file mode 100644 (file)
index 0000000..8a08b8f
--- /dev/null
@@ -0,0 +1,138 @@
+GNU 'gperf' generates perfect hash functions.
+
+Usage: ../src/gperf [OPTION]... [INPUT-FILE]
+
+If a long option shows an argument as mandatory, then it is mandatory
+for the equivalent short option also.
+
+Output file location:
+      --output-file=FILE Write output to specified file.
+The results are written to standard output if no output file is specified
+or if it is -.
+
+Input file interpretation:
+  -e, --delimiters=DELIMITER-LIST
+                         Allow user to provide a string containing delimiters
+                         used to separate keywords from their attributes.
+                         Default is ",".
+  -t, --struct-type      Allows the user to include a structured type
+                         declaration for generated code. Any text before %%
+                         is considered part of the type declaration. Key
+                         words and additional fields may follow this, one
+                         group of fields per line.
+      --ignore-case      Consider upper and lower case ASCII characters as
+                         equivalent. Note that locale dependent case mappings
+                         are ignored.
+
+Language for the output code:
+  -L, --language=LANGUAGE-NAME
+                         Generates code in the specified language. Languages
+                         handled are currently C++, ANSI-C, C, and KR-C. The
+                         default is C.
+
+Details in the output code:
+  -K, --slot-name=NAME   Select name of the keyword component in the keyword
+                         structure.
+  -F, --initializer-suffix=INITIALIZERS
+                         Initializers for additional components in the keyword
+                         structure.
+  -H, --hash-function-name=NAME
+                         Specify name of generated hash function. Default is
+                         'hash'.
+  -N, --lookup-function-name=NAME
+                         Specify name of generated lookup function. Default
+                         name is 'in_word_set'.
+  -Z, --class-name=NAME  Specify name of generated C++ class. Default name is
+                         'Perfect_Hash'.
+  -7, --seven-bit        Assume 7-bit characters.
+  -l, --compare-lengths  Compare key lengths before trying a string
+                         comparison. This is necessary if the keywords
+                         contain NUL bytes. It also helps cut down on the
+                         number of string comparisons made during the lookup.
+  -c, --compare-strncmp  Generate comparison code using strncmp rather than
+                         strcmp.
+  -C, --readonly-tables  Make the contents of generated lookup tables
+                         constant, i.e., readonly.
+  -E, --enum             Define constant values using an enum local to the
+                         lookup function rather than with defines.
+  -I, --includes         Include the necessary system include file <string.h>
+                         at the beginning of the code.
+  -G, --global-table     Generate the static table of keywords as a static
+                         global variable, rather than hiding it inside of the
+                         lookup function (which is the default behavior).
+  -P, --pic              Optimize the generated table for inclusion in shared
+                         libraries.  This reduces the startup time of programs
+                         using a shared library containing the generated code.
+  -Q, --string-pool-name=NAME
+                         Specify name of string pool generated by option --pic.
+                         Default name is 'stringpool'.
+      --null-strings     Use NULL strings instead of empty strings for empty
+                         keyword table entries.
+  -W, --word-array-name=NAME
+                         Specify name of word list array. Default name is
+                         'wordlist'.
+      --length-table-name=NAME
+                         Specify name of length table array. Default name is
+                         'lengthtable'.
+  -S, --switch=COUNT     Causes the generated C code to use a switch
+                         statement scheme, rather than an array lookup table.
+                         This can lead to a reduction in both time and space
+                         requirements for some keyfiles. The COUNT argument
+                         determines how many switch statements are generated.
+                         A value of 1 generates 1 switch containing all the
+                         elements, a value of 2 generates 2 tables with 1/2
+                         the elements in each table, etc. If COUNT is very
+                         large, say 1000000, the generated C code does a
+                         binary search.
+  -T, --omit-struct-type
+                         Prevents the transfer of the type declaration to the
+                         output file. Use this option if the type is already
+                         defined elsewhere.
+
+Algorithm employed by gperf:
+  -k, --key-positions=KEYS
+                         Select the key positions used in the hash function.
+                         The allowable choices range between 1-255, inclusive.
+                         The positions are separated by commas, ranges may be
+                         used, and key positions may occur in any order.
+                         Also, the meta-character '*' causes the generated
+                         hash function to consider ALL key positions, and $
+                         indicates the "final character" of a key, e.g.,
+                         $,1,2,4,6-10.
+  -D, --duplicates       Handle keywords that hash to duplicate values. This
+                         is useful for certain highly redundant keyword sets.
+  -m, --multiple-iterations=ITERATIONS
+                         Perform multiple choices of the -i and -j values,
+                         and choose the best results. This increases the
+                         running time by a factor of ITERATIONS but does a
+                         good job minimizing the generated table size.
+  -i, --initial-asso=N   Provide an initial value for the associate values
+                         array. Default is 0. Setting this value larger helps
+                         inflate the size of the final table.
+  -j, --jump=JUMP-VALUE  Affects the "jump value", i.e., how far to advance
+                         the associated character value upon collisions. Must
+                         be an odd number, default is 5.
+  -n, --no-strlen        Do not include the length of the keyword when
+                         computing the hash function.
+  -r, --random           Utilizes randomness to initialize the associated
+                         values table.
+  -s, --size-multiple=N  Affects the size of the generated hash table. The
+                         numeric argument N indicates "how many times larger
+                         or smaller" the associated value range should be,
+                         in relationship to the number of keys, e.g. a value
+                         of 3 means "allow the maximum associated value to
+                         be about 3 times larger than the number of input
+                         keys". Conversely, a value of 1/3 means "make the
+                         maximum associated value about 3 times smaller than
+                         the number of input keys". A larger table should
+                         decrease the time required for an unsuccessful
+                         search, at the expense of extra table space. Default
+                         value is 1.
+
+Informative output:
+  -h, --help             Print this message.
+  -v, --version          Print the gperf version number.
+  -d, --debug            Enables the debugging option (produces verbose
+                         output to the standard error).
+
+Report bugs to <bug-gnu-gperf@gnu.org>.
diff --git a/tests/test-7.exp b/tests/test-7.exp
new file mode 100644 (file)
index 0000000..c5c942c
--- /dev/null
@@ -0,0 +1,32 @@
+in word set if
+in word set do
+NOT in word set int
+in word set for
+in word set case
+NOT in word set char
+NOT in word set auto
+in word set goto
+in word set else
+NOT in word set long
+NOT in word set void
+NOT in word set enum
+NOT in word set float
+NOT in word set short
+NOT in word set union
+NOT in word set break
+in word set while
+NOT in word set const
+NOT in word set double
+NOT in word set static
+NOT in word set extern
+NOT in word set struct
+in word set return
+NOT in word set sizeof
+NOT in word set switch
+NOT in word set signed
+NOT in word set typedef
+NOT in word set default
+NOT in word set unsigned
+NOT in word set continue
+NOT in word set register
+NOT in word set volatile
diff --git a/tests/test.c b/tests/test.c
new file mode 100644 (file)
index 0000000..6ee16e0
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+   Tests the generated perfect hash function.
+   The -v option prints diagnostics as to whether a word is in
+   the set or not.  Without -v the program is useful for timing.
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#if defined __STDC__ || defined __cplusplus
+extern char * in_word_set (const char *, int);
+#else
+extern char * in_word_set ();
+#endif
+
+#define MAX_LEN 80
+
+int
+main (argc, argv)
+     int   argc;
+     char *argv[];
+{
+  int  verbose = argc > 1 ? 1 : 0;
+  char buf[MAX_LEN];
+
+  while (fgets (buf, MAX_LEN, stdin))
+    {
+      if (strlen (buf) > 0 && buf[strlen (buf) - 1] == '\n')
+        buf[strlen (buf) - 1] = '\0';
+
+      if (in_word_set (buf, strlen (buf)))
+        {
+          if (verbose)
+            printf ("in word set %s\n", buf);
+        }
+      else
+        {
+          if (verbose)
+            printf ("NOT in word set %s\n", buf);
+        }
+    }
+
+  return 0;
+}
diff --git a/tests/test2.c b/tests/test2.c
new file mode 100644 (file)
index 0000000..2a2c36d
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+   Tests the generated perfect hash function.
+   The -v option prints diagnostics as to whether a word is in
+   the set or not.  Without -v the program is useful for timing.
+*/
+
+#include <stdio.h>
+
+/* Support for SET_BINARY. */
+#include <fcntl.h>
+#if !defined O_BINARY && defined _O_BINARY
+# define O_BINARY _O_BINARY
+#endif
+#ifdef __BEOS__
+# undef O_BINARY
+#endif
+#if O_BINARY
+# define SET_BINARY(f) setmode (f, O_BINARY)
+#else
+# define SET_BINARY(f) (void)0
+#endif
+
+#if defined __STDC__ || defined __cplusplus
+extern struct language * in_word_set (const char *, int);
+#else
+extern struct language * in_word_set ();
+#endif
+
+#define MAX_LEN 80
+
+int
+main (argc, argv)
+     int   argc;
+     char *argv[];
+{
+  int  verbose = argc > 1 ? 1 : 0;
+  char buf[2*MAX_LEN];
+  int buflen;
+
+  /* We need to read stdin in binary mode. */
+  SET_BINARY (0);
+
+  for (;;)
+    {
+      /* Simulate gets(buf) with 2 bytes per character. */
+      char *p = buf;
+      while (fread (p, 2, 1, stdin) == 1)
+        {
+          if ((p[0] << 8) + p[1] == '\n')
+            break;
+          p += 2;
+        }
+      buflen = p - buf;
+
+      if (buflen == 0)
+        break;
+
+      if (in_word_set (buf, buflen))
+        {
+          if (verbose)
+            printf ("in word set:");
+        }
+      else
+        {
+          if (verbose)
+            printf ("NOT in word set:");
+        }
+
+      for (p = buf; p < buf + buflen; p += 2)
+        printf (" %02X%02X", (unsigned char) p[0], (unsigned char) p[1]);
+      printf("\n");
+    }
+
+  return 0;
+}
diff --git a/tests/validate b/tests/validate
new file mode 100755 (executable)
index 0000000..502673d
--- /dev/null
@@ -0,0 +1,62 @@
+#! /bin/sh
+# Validate gperf's operation on a given input file.
+# Usage: validate languages input.gperf [more gperf options]
+# Uses the environment variables GPERF, CC, CFLAGS, CXX, CXXFLAGS.
+# Supposes gcc and g++.
+
+# Exit on error
+set -e
+
+verbose () {
+  echo "$@"
+  "$@"
+}
+
+languages=$1
+shift
+
+# On old systems, it's worth trying gcc -traditional.
+# On glibc-2.1 systems, gcc -traditional doesn't work any more.
+use_traditional=false
+
+for lang in `echo $languages | sed -e 's/,/ /g'`; do
+  case "$lang" in
+    KR-C )
+      echo "${GPERF} -I -L KR-C $@ > valitest.c"
+      ${GPERF} -I -L KR-C "$@" > valitest.c
+      grep -n ' const ' valitest.c /dev/null && exit 1
+      if test $use_traditional = true; then
+        verbose ${CC} ${CFLAGS} -traditional valitest.c -o valitest
+        ./valitest
+      fi
+      verbose ${CC} ${CFLAGS} -ansi -pedantic valitest.c -o valitest
+      ./valitest
+      ;;
+    C )
+      echo "${GPERF} -I -L C $@ > valitest.c"
+      ${GPERF} -I -L C "$@" > valitest.c
+      if test $use_traditional = true; then
+        verbose ${CC} ${CFLAGS} -traditional -Dconst= valitest.c -o valitest
+        ./valitest
+      fi
+      verbose ${CC} ${CFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest
+      ./valitest
+      ;;
+    ANSI-C )
+      echo "${GPERF} -I -L ANSI-C $@ > valitest.c"
+      ${GPERF} -I -L ANSI-C "$@" > valitest.c
+      verbose ${CC} ${CFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest
+      ./valitest
+      verbose ${CXX} ${CXXFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest
+      ./valitest
+      ;;
+    "C++" )
+      echo "${GPERF} -I -L C++ $@ > valitest.c"
+      ${GPERF} -I -L C++ "$@" > valitest.c
+      verbose ${CXX} ${CXXFLAGS} -ansi -pedantic -pedantic-errors -DCPLUSPLUS_TEST valitest.c -o valitest
+      ./valitest
+      ;;
+  esac
+done
+
+exit 0